When your sources disagree: GA4, platform and CRM
Each system tells a different story and none of them lies. The five structural reasons, how to pick a canonical source per metric, and the order to reconcile in.
Three systems, three numbers, and a meeting that disappears into arguing which one is right. It is the most repeated scene in any team that has started measuring seriously.
The way out is not finding the true number. It is accepting that each system is telling a different story, and deciding in advance which one you will believe for what.
Three systems, three stories
| System | What it is authoritative for | What NOT to ask it |
|---|---|---|
| Advertising platform | How much was spent and what was shown | How much was billed |
| Site analytics | What people did on the website | How many customers there were |
| CRM or business system | Who bought, when and for how much | Where they came from, if nobody stored it |
The third column prevents half the arguments. Asking an advertising platform how much you billed is asking it something it cannot know: it will answer with its attribution, which is an estimate of credit, not an accounting record. We wrote about that confusion separately in why platform ROAS does not match your revenue.
Five structural reasons they differ
- They define the same word differently. “User” in web analytics is not “contact” in the CRM. A session is not a person, and one person can be three contacts if they wrote from three email addresses. Neither is wrong: they are counting different things.
- They attribute differently. Site analytics tends to reason in terms of the last source that brought the visit; each platform reasons with its own model and window. All three can attribute the same customer to three different origins.
- They measure different moments. The site records when the form was submitted. The CRM records when someone logged or qualified it. Accounting records when the money arrived. Weeks can sit between the first and the last.
- They have their own time zones and currencies. An account configured in another zone shifts every day; a different exchange rate shifts every amount. The dullest cause and the easiest to rule out.
- One of them estimates. With consent denied and browser restrictions, part of what you see is modelled rather than observed. An estimated number and a counted one will never match, and that is fine.
Pick a canonical source per metric
This is the decision that ends the argument permanently, and it costs an hour. For every metric that appears on a board or in a report, define:
- Which system it comes from. One, not “whichever is available”.
- What it includes and excludes. Cancellations, duplicates, internal, tests.
- Which time zone cuts the day.
- Who answers if somebody disputes it.
Written in a one-page document, reachable from the board itself. It is not bureaucracy: it is what turns “this number is wrong” into “this number uses a different definition” — a two-minute conversation instead of a two-day investigation.
And one rule simplifies almost every case: money is owned by the system where the money arrives. Not an ad platform, not web analytics.
The order to reconcile in
When two numbers do not tie out, this order saves most of the work:
- Align the period. Same range, same time zone, same cut-off rule. It is surprising how many differences disappear here.
- Align the definition. Are both counting the same thing? Does one include internal, test or duplicate records?
- Look for duplicates. The same event counted twice through two paths is the most common cause of an inflated number.
- Subtract what fell through. Cancelled, refunded, unpaid, disqualified.
- Only then look at attribution. The most interesting cause and the most time-consuming, so it goes last: half the time you never needed to get there.
When it is an actual bug
Everything above describes normal differences. These three are not, and should be treated as incidents:
- A source goes flat. The number has not changed in days. It is not that nothing happened: the data stopped arriving.
- The difference moves on its own. It sat in one range and now sits in another with nobody having touched anything. Usually a broken tag or a dead integration.
- An impossible value. More conversions than sessions, more sales than leads, a total that does not equal its parts. That is not attribution: it is double counting or a misplaced filter.
All three share something: the failure mode is silent. Which is why the alert that pays best is not one for a value out of range, but one for a value that stopped moving.
FAQ
- Which source is the right one? None of them, universally. Each is authoritative for a different thing: the platform for spend, the site analytics for behaviour, your business system for revenue. The mistake is asking one of them a question it was never built to answer.
- Can I make them match? Not exactly, and chasing that burns months. What you can do is know how big the difference is, why, and whether it is stable. A known, explained gap is a working measurement system.
- Does a data warehouse solve it? It centralises the numbers, which helps a lot with the discussion. It does not make different definitions agree. If “lead” means two things in two systems, the warehouse will store both meanings side by side.
- What do I do about historical data? Do not rewrite it. Mark the date the definition changed and treat the two stretches as different series. Retroactively corrected history that nobody can reproduce is worse than an honest break.