Short answer
They disagree because they measure different events. Your CRM records the moment a deal is won. QuickBooks records the moment money is invoiced and paid. Different moments, often different amounts, sometimes different customers. Some gap is normal. An unexplained gap is the problem. The fix is three rules: every shared field syncs in one direction only, a weekly report names every dollar of the gap, and an alert fires when a won deal has no invoice.
"Quick one. HubSpot says we closed about $50K last month. QuickBooks says we billed quite a bit less. My bookkeeper thinks the CRM is wrong, my sales lead thinks the books are behind, and we spend an afternoon every month debating which number is real. Which one is right?"
Both numbers are right. They answer different questions.
We get this question on first calls all the time, and the framing is usually wrong. Nobody is lying. The CRM total answers "what did sales win this month?" QuickBooks answers "what did we bill and collect?" Those share a topic, not a definition. Even in a business with zero mistakes, timing alone keeps the monthly totals apart.
So the goal is not one matching number. The goal is a gap you can explain in five minutes. Across 600+ workflows we have built, including several quote-to-cash systems, the causes of an unexplained gap rank in a consistent order. Walk them top to bottom and you will usually find your money.
The five causes, ranked by how often we find them
1. Deals marked closed-won that never got invoiced
The most common cause and the only one on this list that is lost revenue, not an accounting wrinkle. The mechanism is almost always human. A rep drags the deal to Closed Won on a Friday. The invoice is supposed to be created by hand, by someone else, after a Slack message that never gets sent. The CRM counts the deal forever. QuickBooks never hears about it.
Quick test: list last month's closed-won deals and ask for an invoice number against each one. Any blank row is found money. Do this test first, before anything else, because it is the one that pays.
2. Currency and tax handling
The HubSpot Amount field is almost always pre-tax. A QuickBooks invoice total almost always includes tax. In Ontario that is 13% HST on most services, so every invoice reads 13% higher than its deal. Compare deal Amount to the invoice subtotal, not the total, or the books will look permanently inflated.
Currency stacks on top. If you sell in USD and keep CAD books, QuickBooks converts at the invoice-date rate while the CRM holds the raw USD figure. Quick test: a gap that is a steady percentage is tax. A gap that wobbles month to month with no pattern is often the exchange rate.
3. Refunds and credits recorded on one side only
A customer pushes back, the bookkeeper issues a credit memo or refund receipt in QuickBooks, and nobody touches the deal. The books go down, the CRM does not. The reverse happens too: sales moves a deal back to negotiation after a dispute, but the original invoice still stands in QuickBooks. Quick test: pull every credit memo and refund receipt for the period and check each one against its deal.
4. Duplicate customers
"ABC Corp" in HubSpot. "ABC Corp." and "ABC Corporation" in QuickBooks. Company totals can still match while every per-customer report disagrees, which destroys trust in both systems anyway. Integrations set to "find or create customer" on a name match will mint a new duplicate on every typo. We wrote up the cleanup playbook in our HubSpot deduplication guide, and the same logic applies on the QuickBooks side.
5. Timing differences
Deal closed June 28. Invoice created July 3. Payment lands July 31. Each system reports its own date, so the monthly totals never line up, and on cash-basis books the payment date is the only one that counts. This is the least harmful cause and the most common source of panicked month-end emails. Quick test: compare a quarter instead of a month. If the gap shrinks a lot, most of it was timing.
| Cause | What it looks like | Quick test |
|---|---|---|
| Never invoiced | CRM higher, money actually missing | Invoice number against every won deal |
| Currency and tax | Steady percentage gap, often 13% | Compare Amount to invoice subtotal |
| Refunds one side | Books drop, CRM does not | Check each credit memo against its deal |
| Duplicate customers | Per-customer reports disagree | Sort customer lists, scan for near-matches |
| Timing | Monthly off, quarterly close | Widen the window and recompare |
A worked example with round numbers
These numbers are invented to show the method. They are not from a client.
Say May looks like this. HubSpot: 12 closed-won deals, $50,000 in the Amount field, pre-tax. QuickBooks: $43,500 invoiced in May, after you strip HST so you are comparing pre-tax to pre-tax. Gap: $6,500. Opaque as one number.
Now walk it deal by deal in a spreadsheet, about an hour of work. A $4,000 deal won May 20 has no invoice at all: cause one, real money, invoice it today. A $2,000 deal won May 30 was invoiced June 2: cause five, it will appear in next month's books. A $500 credit memo against an April invoice landed in May: cause three. That is $4,000 plus $2,000 plus $500, which is the whole $6,500.
Same data, same systems. The gap went from "which system is lying?" to one chase-able invoice and $2,500 of explanation. That walk is the entire diagnostic. The fix is making sure you never have to do it from scratch again.
The fix pattern from our quote-to-cash build
This pattern comes from a quote-to-cash system we built on HubSpot, Typeform, QuickBooks, and Google Sheets, where deal stages trigger QuickBooks invoices, payments reconcile back onto the deal, and 300+ permits are tracked across connected pipelines. Three rules carried the whole thing.
One direction of truth per field
Every shared field gets exactly one writer. Deal amount: the CRM writes it, QuickBooks receives it when the deal hits Closed Won. Invoice status, payments, refunds: QuickBooks writes them, the CRM receives them. Nobody edits the receiving side, ever. Write the field map down on one page.
The detail that makes reconciliation cheap: the moment an invoice is created, write its QuickBooks invoice ID onto a HubSpot deal property. That ID is the join key. Without it you are matching on customer names, which is how cause four takes hold.
A weekly reconciliation report
One sheet, one row per closed-won deal from the last 60 days: deal name, Amount, invoice ID, invoice subtotal, payment status. Three checks, in order. Any deal with a blank invoice ID. Any subtotal that does not equal the Amount. Anything unpaid past its terms. Fifteen to twenty minutes a week. Monthly is too slow: by month-end the rep has forgotten the deal and the trail is cold.
Alerts on drift
The report catches everything eventually. Alerts catch the expensive ones immediately. Two are worth building: a Slack message when a deal has sat in Closed Won for three business days with an empty invoice ID, and a message when a credit memo appears in QuickBooks so someone updates the deal the same day. Both are small Zapier or Make builds, not engineering projects.
What we would ask you next
On a call, these five questions tell us which cause owns your gap before we open a single tool.
- Cash or accrual books? This decides which date is even supposed to match.
- Who creates invoices, and what tells them to? If the answer involves a Slack message, cause one is your leader.
- One currency or several? Multi-currency moves cause two up the list.
- Does anything get invoiced that never went through the pipeline? Renewals and change orders billed directly mean the CRM will always read low, and that can be fine once it is a known rule.
- Is the gap stable as a percentage, or growing? A stable 13% is a definition problem. A growing gap is a process leak.
The honest part: you might not need us
Run the one-hour walk from the worked example first. If the whole gap turns out to be tax and timing, you do not need a consultant. You need a sentence at the top of your dashboard: "CRM shows pre-tax bookings by close date. QuickBooks shows billed revenue by invoice date." Write it, share it, and the question is settled.
If you send fewer than roughly 15 invoices a month, a manual weekly checklist in a sheet beats an automated build. The automation pays for itself on volume, not on principle. And if you want the automated version and have a steady hand, our step-by-step HubSpot to QuickBooks build guide covers the whole thing as a do-it-yourself afternoon.
Call someone like us when the shape gets harder: multiple currencies, deposits and partial payments, refunds at volume, two pipelines feeding one ledger, or a team that has had the same month-end argument three months running. We work at a flat $150 per hour CAD, we quote the scope in writing before we build, and hours never expire. If a one-page field map and two alerts would fix it, that is what we will quote, and nothing more.
FAQ
Should the CRM or QuickBooks be the system of record?
Neither, as a whole. Pick a winner per field, not per system. Money facts like invoice totals, payments, and refunds belong to QuickBooks. Pipeline facts like stage, close date, and owner belong to the CRM. Each field gets one writer and flows one way. Crowning a single system forces someone to re-key data into the other, and re-keying is where the drift starts.
Our totals are off by exactly 13 percent. What is that?
Tax, almost certainly. In Ontario most services carry 13% HST. CRM deal amounts are usually pre-tax, and QuickBooks invoice totals usually include the tax. Compare the deal Amount to the invoice subtotal instead of the total. A gap that holds at a steady percentage is a definition mismatch, not missing money.
Can we just turn on a two-way sync app between HubSpot and QuickBooks?
Be careful. Two-way sync on the same field is how loops and silent overwrites happen: each system "corrects" the other until nobody knows which value was original. Sync tools work well when each field is configured to flow one direction, but several default to keeping both sides editable. Decide your field map first, then configure the tool to match it.
How often should we reconcile the two systems?
Weekly for the operational pass: fifteen to twenty minutes against a report of recent closed-won deals, checking for missing invoices, amount mismatches, and overdue payments. Monthly with your bookkeeper at close. Weekly catches an uninvoiced deal while the rep still remembers it. Waiting for month-end means chasing 30-day-old deals with cold trails.
Want this handled instead of read about?
We scope this exact work in hours, quote it in writing, and ship it in weeks. The 30-minute call is free and useful either way.
Book a 30-minute call$150/hr flat · published pricing · no retainer pitch