Meerkats AI
← All posts
Tracking·9 Jun 2026·9 min read

Meta says 98 orders. Shopify says 54. Who's lying?

Nobody — they're answering different questions. A field guide to the attribution gap: where it comes from, how to measure yours, and the UTM + server-side setup that closes it.

TL;DR
  • 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

CauseWhat happensTypical size
Attribution windowsMeta default counts 7-day click + 1-day view; the store's last-click lens sees only the final touchLarge
View-through creditSaw the ad, never clicked, bought later via search/direct — platform claims itMedium–large
Modeled conversionsPost-iOS ATT, platforms statistically estimate conversions they can't observeMedium, invisible
Cross-platform double-claimingCustomer clicked Meta Tuesday, Google Thursday — both claim Friday's orderMedium
Tracking lossCookie blockers, link-shim strips, checkout redirects (payment gateways!) losing the trailMedium 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

The reconciliation ratiogap = Σ platform-claimed revenue ÷ store-recorded revenue (same period)

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:

?utm_source=facebook&utm_medium=paid&utm_campaign={{campaign.name}}&utm_content={{ad.name}}&utm_term={{adset.name}}

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'll find (a real case)
In the audit that named this post: Meta claimed 98 orders; last-click store data credited 54. Order-level matching showed retargeting claimed at nearly 2× while cold prospecting under-claimed (view-through on top-funnel is partly real). The action wasn't "distrust Meta" — it was "haircut retargeting's claims by ~45% and re-judge every campaign on store-matched orders." Two campaigns flipped from winners to losers.

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.

FAQ

Which number do I report to investors?
Store-recorded revenue, always — it ties to the bank. Platform numbers are internal steering signals.
Will shortening Meta's attribution window fix this?
It shrinks the claim (7-day-click → 1-day-click drops reported conversions a lot), but it also degrades the algorithm's learning signal. Better: leave windows standard, measure the gap, apply the haircut yourself.
Does GA4 solve it?
GA4 is another lens (cross-channel, last-click-ish, sampled) — useful as a third opinion, but it can't see COD RTO or match to margin. It's a witness, not a judge.
Is this iOS-only?
ATT made modeling bigger, but double-claiming, view-through and gateway-redirect loss all predate iOS 14.5 and hit Android/India just as hard. Checkout redirects through Razorpay/PayU-style gateways are a chronically underrated trail-breaker.
How long to implement all four steps?
UTM templates: an afternoon. Server-side: days with a tool, weeks DIY. The monthly ratio: one spreadsheet cell once the data's joined — or automatic if the join is plumbing you own.

See your real numbers, not the platform's.

Connect Shopify, Meta and Google. Reconciled truth in 20 minutes.