Business & Revenue OpsFree
Reconcile Your Pipeline Spreadsheet With CRM
Both files in, every deal-level difference out classified and signed, and the columns that exist on only one side named.
River reads the CRM opportunity export and the spreadsheet side by side rather than deciding in advance which one is wrong. Both files go in as they came out. What comes back is one row per deal-level difference, each classified as a filter, a stage, a date, an amount or a record missing from one side, and signed so the direction is visible. The classified differences are summed against the headline gap, and the residual is published at whatever size it turns out to be.
The published advice on shadow spreadsheets treats them as a compliance problem, and the best of it gets the diagnosis right: ask what the sheet does that the CRM cannot, then close that gap. Correct, and it is advice rather than an instrument. It does not line up 24 CRM deals against 19 spreadsheet rows, and it does not tell you which of two pipeline totals to read out on Thursday. That is the job here, and the same shape covers two dashboards that disagree.
Built for the revenue-operations lead who has both files open an hour before the forecast call, and for the sales manager who has to say one number in it. Reach for it when the rep's sheet and the CRM disagree and the disagreement has reached the forecast. Where the two sides are two CRMs rather than a CRM and a sheet, the HubSpot and Salesforce reconciliation fits, and the fields themselves belong in a CRM field dictionary.
Half the date differences are the CRM's own default
Start with the close dates, because most of those differences were never typed by anyone. HubSpot documents that a deal created in an open stage with no close date gets the last day of the month, and that moving a deal into closed-won or closed-lost overwrites the field with today's date. So a deal the rep has in November and the CRM has on 30 September is not a rep who forgot to update; it is a default sitting where a forecast date should be.
The reflex fix makes it worse. HubSpot sets Deal probability automatically from the stage's win probability, and states that a manual edit stops that, with bulk edits, imports and data-sync integrations all counting as manual. It resumes only at Closed Won or Closed Lost. Import the spreadsheet to reconcile it and every row you touch is detached from its stage permanently, so Weighted amount, which is Amount times Deal probability, quietly stops meaning what the pipeline settings say it means.
Then read the raw file rather than the opened one. Microsoft's own guidance says Excel applies the machine's default data format to every column when it opens a CSV directly, giving MDY against YMD as the example, so a double-click invents date differences that are not in the data. What survives that check is the real finding: the columns on the rep's sheet the CRM has no field for, which is the list that ends the argument.
How it works
Hand over both files
The CRM opportunity export and the spreadsheet, raw, plus each side's filters and date scope.
Match deal by deal
River joins on the strongest key the two share, then finds what sits on one side only.
Classify and sum
Every difference gets a class, a sign and an amount, and the classes add up.
Read the column list
The columns only the sheet has become the build list, each with a verdict attached.
What you get
- One row per deal-level difference, each carrying a class, a sign and an amount
- The columns on the rep's sheet the CRM has no field for, listed individually
- Close dates separated into the ones a person chose and the ones a default wrote
- Deals present in one file and absent from the other, named with their owner
- A residual line that stays on the page until it hits zero or gets a name
- One pipeline number to read out, with the question it answers stated beside it
Common questions
Which pipeline number should I take into the forecast call?
The CRM total with three corrections, which is $1,474,500 on the worked example rather than $1,842,000 or the sheet's $1,317,500. Four date defaults move to Q4, three verbal downgrades come out, and the renewal being worked out of email goes in. Coverage reads list amounts and commit reads signable ones, so the output states which question the number answers.
Should I just ban the spreadsheets?
Banning the sheet removes the evidence and keeps the gap. On the worked example the sheet carries four columns the CRM has no field for, and every one of them is load-bearing in a deal review. The output lists those columns with a verdict each, which is the build list that makes the sheet redundant.
Can I just import the spreadsheet into the CRM and be done?
No, and the reason is documented. HubSpot counts an import as a manual probability edit, which permanently stops Deal probability updating from the stage on every row it touches, and it only resumes at Closed Won or Closed Lost. A bulk import to close a reporting gap breaks the weighted pipeline that reads from it. Fix the fields, then import.
What if the two files share no deal ID?
Most rep sheets have no CRM ID in them, which is expected. River matches on the strongest composite available from account name, amount and close date. It then reports how many rows matched confidently and how many did not, and says which part of the gap the unmatched rows leave unresolvable rather than absorbing it.
Does this work on Salesforce, or only HubSpot?
Both, and Pipedrive or a warehouse table just as well. The five classes are platform independent: a filter, a stage, a date, an amount, a record on one side only. What the platform decides is which differences a system wrote rather than a person, and the output names those. Systemic damage across the whole database is a CRM audit.
How do I stop this recurring every quarter?
Two outputs do it. The columns the sheet has and the CRM lacks become a field build list, which is the cause. The date defaults become a pipeline setting change, because a close date nobody typed keeps producing the same difference, and scoring every hygiene rule on what it separates says which of the rest earn enforcement. The dashboard spec keeps the agreed number on the screen.
The number is fine now, but we still missed the number badly. What next?
That is no longer a reconciliation problem. A single quarter's dollar miss, decomposed into named behaviors like late-stage optimism or one large deal and attached to a specific rep, is what a forecast accuracy review produces. Reconcile the number here first, then use that review to find out why it missed.
Reconcile Your Pipeline Spreadsheet With CRM
Fill in the form and your workspace opens with the work already underway.