flowsk.com
Why attribution is broken

Why your Meta Ads Manager numbers don't match your Stripe revenue

Meta says 40 sales. Stripe says 25. Neither is broken — they are answering different questions with different data. Here are the four mechanics behind the gap and what to do about each.

Aug 3, 2026· 3 min read ·Why attribution is broken
Quick answer

Meta-reported = pixel matches + view-throughs + modelled conversions

Meta typically reports 25–45% more conversions than a first-party server-side count of the same period. Three mechanics do most of it: view-through credit, cross-platform self-attribution, and conversion modelling for traffic the pixel could not observe.

None of this is fraud. It is a measurement system built to justify spend on the platform that runs it.

It is the most common question in performance marketing, and the answers you find are usually either “attribution is hard” or a pitch for something.

Here is the mechanical version.

The four mechanics

1. View-through conversions

Someone scrolls past your ad. They do not click. Three days later they get your email, come back, and buy.

Meta counts that as a conversion its ad caused. Your P&L does not know the impression existed.

With Meta’s default setting — 7-day click and 1-day view — a substantial share of reported conversions come from people who never clicked anything. Switch to 7-day click only and watch reported conversions fall 15–30% immediately. Your actual sales do not change at all.

2. Self-attribution across platforms

Meta claims the sale. Google claims the same sale. Klaviyo claims it too. None of them can see the others and there is no shared ledger.

This is why summed channel reports always exceed real revenue. It is not a bug anyone can fix within a platform, because no platform has the data to resolve it.

3. Conversion modelling

iOS ATT and ad blockers mean the pixel never fires for a meaningful share of your traffic. Meta fills that hole with a statistical estimate, reported in the same column as the observed conversions, with no separate line item.

The estimate is not unreasonable. It is also not a receipt.

4. The seven-day ceiling

Meta’s maximum click window is 7 days. If your buyers take two weeks to decide, the ad that started the journey is invisible to Meta by the time the sale happens — so those conversions are missing from Meta’s number, not extra.

That is why the gap runs in both directions and why the net figure understates the real confusion.

What the gap looks like

Setting Typical over-report vs banked orders
7-day click + 1-day view (default) +25% to +45%
7-day click only +10% to +20%
7-day click + server-side CAPI, no dedup key +60% or more (double counting)
7-day click + CAPI with a shared event id +5% to +15%

That third row catches a lot of teams. Adding the Conversions API alongside the pixel without a shared event_id means every conversion that survives the browser gets counted twice. Revenue looks fantastic, CPA looks impossible, and nothing reconciles.

What to do, in order

1. Turn off view-through for reporting. Ten seconds in Ads Manager. Keep a separate “influenced” report if leadership wants it, but do not make budget decisions on impressions nobody engaged with.

2. Check your CAPI de-duplication. If you run both the pixel and the Conversions API, both events must carry the same event_id. Verify it in Events Manager rather than assuming your app did it.

3. Build one first-party ledger. Something that sees every channel on one identity, records conversions from your own server, and can show you the event sequence behind any of them. That is the only thing that can arbitrate between platforms, because it is the only thing that sees all of them.

4. Use each number for what it is good at. Meta’s figure trains the bidding algorithm and tells you which creative is working. Your ledger tells you where the budget goes. Confusing the two is the actual error.

The reframe

The question is not “which number is right.” Both are internally consistent answers to different questions:

  • Meta asks: did our ad influence this, in a way worth optimising delivery around?
  • Stripe asks: did money arrive?

You need both. You just need to stop putting them in the same column of the same slide.

Run your own numbers through the ghost-conversions checker to see the size of the gap for your account, then read the Meta Ads attribution breakdown for the platform-specific details.

Frequently asked questions

Which number should I trust?

Stripe, for anything involving money. Meta's number is optimised for delivery decisions inside Meta, and it is genuinely good at that. It is not a revenue figure and was never meant to be one.

How do I reduce the gap immediately?

Switch the attribution setting to 7-day click, no view-through. Reported conversions commonly drop 15–30% and land much closer to reality. Nothing about your actual performance changes — only what gets counted.

Does the Conversions API close the gap?

It narrows the signal-loss portion and you should run it. It does not touch view-through credit or cross-platform double claiming, because Meta still applies its own model to whatever you send.

What is a normal gap?

25–45% for accounts on view-through attribution, 10–20% for click-only. Above 50%, check whether your pixel and CAPI events are double counting because they lack a shared event id.

Should I stop using Meta's reporting?

No. Use it for creative testing and campaign optimisation, which it does better than anything you could build. Use a first-party ledger for budget decisions and anything you tell your board.

Price your own gap in two minutes

Enter what each platform claims and what your processor actually banked. The checker returns your over-report percentage and your true CPA.

Find my ghost conversions

Stop guessing which ad made the sale.

Flowsk Signals stitches the anonymous click to the email to the purchase — first-party, server-side, de-duplicated. One snippet, $29/mo, and every conversion comes with a receipt you can inspect.

Keep reading