- The gap between platform-claimed and store-recorded orders is structural: attribution windows, view-through credit, modeled conversions and double-claiming across platforms.
- Measure the ratio monthly (claimed ÷ recorded). 1.1–1.4× is normal; sudden moves mean something broke.
- Close what's closable with dynamic UTMs, server-side tracking, and click-level order matching — then treat what remains as a known constant, not a mystery.
This is the most common screenshot pair in D2C: Ads Manager showing 98 purchases, the Shopify month showing 54 that mention Meta anywhere in the journey. The instinct is to ask which one is right. The useful move is to understand why both are internally consistent — and then instrument your way to a number you can act on.
Where the gap comes from
| Cause | What happens | Typical size |
|---|---|---|
| Attribution windows | Meta default counts 7-day click + 1-day view; the store's last-click lens sees only the final touch | Large |
| View-through credit | Saw the ad, never clicked, bought later via search/direct — platform claims it | Medium–large |
| Modeled conversions | Post-iOS ATT, platforms statistically estimate conversions they can't observe | Medium, invisible |
| Cross-platform double-claiming | Customer clicked Meta Tuesday, Google Thursday — both claim Friday's order | Medium |
| Tracking loss | Cookie blockers, link-shim strips, checkout redirects (payment gateways!) losing the trail | Medium in India — gateway redirects are brutal |
Note the asymmetry: the first four inflate the platform; the last deflates the store. The gap isn't one lie — it's four exaggerations and one blindness stacked.
Step 1: measure your gap before fixing it
Run it monthly per platform and combined. A stable 1.2× is a personality trait; a jump from 1.2× to 1.8× is an incident — a pixel broke, a window changed, or a platform started modeling more aggressively. You cannot notice the jump if you never wrote the baseline down.
Step 2: UTM discipline (free, boring, decisive)
Do not rely on fbclid as your join key — it's an opaque token that doesn't map to a campaign without Meta's cooperation. Tag every ad URL with dynamic parameters:
Shopify captures these in the order's customer journey (via Admin API: Order.customerJourneySummary). Now every order carries the actual campaign and ad that drove it — your numbers, on your side of the fence, platform-independent.
Step 3: server-side tracking for durability
Browser pixels die to ad blockers, ITP and checkout redirects. Persist UTMs + click IDs server-side into order attributes (your own Conversions-API setup, or tools like Elevar/Analyzify), and send conversions back to Meta/Google server-to-server. Two wins: your attribution survives the browser, and the platforms bid on cleaner signal.
Step 4: reconcile at the order level, not the total level
Comparing monthly totals tells you the gap exists. Matching order-by-order tells you which campaigns the platform flatters most. In practice, retargeting campaigns carry the worst inflation (they claim customers who'd buy anyway), and that finding alone typically re-routes 15–30% of budget.
What you can't close (and that's fine)
Some view-through influence is real. Some journeys genuinely touch three channels. The goal was never a gap of 1.0× — it's a known, stable, order-level-verified gap, so that when a platform says "4.1×," you know your deflator and act on the corrected number without a meeting.