Why Meta and Google both claim the same sale
“Why don’t my platform numbers add up to my real revenue?”
Every ad platform is both the player and the referee. Each is asked to report how well it performed, using rules it wrote, on data it collected. The predictable result: sum the reported conversions and the total exceeds the orders in your shop, often by a wide margin.
The four causes, in order of size
| Cause | What happens | Typical size |
|---|---|---|
| Overlapping windows | A customer sees a Meta ad, later clicks a Google ad, then buys. Both claim it inside their own window. | Usually the largest single cause |
| View-through counting | Meta counts a purchase from someone who saw but never clicked, within a day. | Material on retargeting, small on prospecting |
| Modelled conversions | Where tracking is blocked, platforms estimate what probably happened and report it as fact. | Grew substantially after iOS 14.5 |
| Different definitions of “when” | Platforms credit the conversion to the day of the ad interaction; your shop records the day of purchase. | Distorts short windows and daily comparisons |
Why the windows matter more than anything else
A platform's attribution window is how far back it looks for something to take credit for. If Meta uses 7-day click and 1-day view while Google uses a 30-day data-driven model, a purchase eight days after a Meta click and one day after a Google click will be claimed once, twice, or not at all depending on settings neither of them tells you about in the interface you look at daily.
The check that shows you the size of your gap
- 1Take last month's total orders from your shop or payment processor. This is the truth.
- 2Add up reported conversions from every ad platform for the same period.
- 3Divide the second by the first.
sum of platform-reported conversions ÷ actual orders
Meta reports 340, Google reports 180, your shop recorded 400 orders. 520 ÷ 400 = 1.3 — thirty percent more claimed sales than sales.
That ratio is the amount of double-counting sitting under every decision you make from platform reporting. It does not tell you which platform is wrong — usually both are, in different directions — but it tells you how much slack is in the numbers.
What actually closes the gap
Deterministic matching: capture the click identifier the platform attaches to the landing URL, store it with the order, and later reconcile each order against exactly one click. A sale then belongs to one ad or to none — and what cannot be matched is reported as unattributed rather than quietly assigned to whoever shouts loudest.
- Meta appends fbclid, Google appends gclid or wbraid, to the landing URL.
- Capture it first-party at landing, persist it, and store it on the order.
- Match on that identifier, not on a model.
- Keep an explicit unattributed bucket. An honest gap beats a confident guess.
In short
- ✓Reported conversions exceed real orders because each platform judges itself.
- ✓Align attribution windows across platforms today — same click window, no view-through.
- ✓Divide summed platform conversions by real orders to size your gap.
- ✓Deterministic click-id matching is what actually fixes it; an honest unattributed bucket is a feature.
Where this method runs out
Everything above works in a spreadsheet. Keeping it current, and matching every order back to the ad that actually caused it, is the part that does not. That is what Kepra does — and the demo runs on sample data with no signup, so you can judge it before believing any of this.
Open the demo →Read next
How to read a cohort without a data team
First-order ROAS judges a customer on the day you met them. Here is how to build a simple cohort view in a spreadsheet and find out what a channel's customers are actually worth by month six.
Incrementality tests you can actually run as a small business
Most incrementality advice assumes an enterprise budget. Here are three designs that work at SMB scale, what each can and cannot prove, and how to avoid fooling yourself.