neo
attribution

Why Meta shows more conversions than Shopify

Ads Manager says 47 purchases, Shopify says 31. Neither system is broken — they're answering different questions.

Ads Manager says 47 purchases. Shopify says 31. Nothing is broken and nobody is lying — the two systems are answering different questions, and only one of them is counting.

Four reasons the numbers differ

  • Modelled conversions. When signal is missing — an iOS user who opted out, a blocked pixel — Meta estimates. Its own documentation describes using statistical modelling where data is missing or partial. Those estimates are counted in the number you see, and they are not separated from the observed ones.
  • View-through attribution. Depending on your attribution setting, an impression nobody clicked can receive credit for a sale. Your store has no idea that impression happened.
  • Attribution windows. Meta credits a conversion to the day of the ad interaction, not the day of the purchase. A click on the 3rd and an order on the 9th shows up on the 3rd in Ads Manager and the 9th in Shopify. Compare two date ranges and they will never reconcile.
  • Deduplication. Multiple ads can each claim influence on one order. Your store records one order.
The direction is almost always the same: the ad platform's number is higher. It is optimised to demonstrate that advertising worked, and it is the party being graded.

Which number should you spend against?

Neither, on its own. Meta's number is useful to Meta— its delivery system needs conversion signal, including modelled signal, to optimise. That's a real function and you shouldn't starve it.

But for deciding where your budget goes, you want the number you can audit: orders that exist, joined to clicks that exist. If a campaign reports 3.4x and the counted figure is 1.9x, the difference is not academic — it's the margin between scaling something profitable and scaling something that quietly isn't.

How to measure the real one

The mechanics are the same whichever tool you use:

  • Set a first-party cookiefrom a subdomain of your own domain, so it survives third-party cookie blocking. It still won't survive everything — Safari's ITP caps CNAME'd cookies at about seven days — but it's the durable base.
  • Capture the email at opt-inand match it, hashed, against the email on the order. This is the layer that survives when the cookie doesn't, and for most funnels it does more work than the cookie.
  • Read orders from your store's webhook, not from the pixel. The webhook fires server-to-server and doesn't care about ad blockers or consent banners.
  • Keep the unmatched ones visible.This is the part most tools get wrong. Orders you can't tie to a click should appear as unattributed, not be spread across campaigns by a model. If 28 of 214 orders are unexplained, that is a fact about your tracking, and hiding it doesn't make the campaign decisions better.
  • Send conversions back via CAPI, deduped by order id. You get better delivery from real signal and you stop Meta from having to guess as much in the first place.

What good looks like

A healthy setup ties most orders to a specific click. When that share drops, something concrete broke — the script missing from a new landing page, a checkout on a different domain, a form that never submits. The useful metric is that match rate, tracked over time, because it tells you whether to trust today's numbers at all.

Meta grades its own homework. That's not a conspiracy, it's a structural conflict of interest, and the fix is having a second number you control. neo does this for free — and shows you the unattributed orders instead of quietly assigning them.

Count your own numbers

neo is free — every feature, no card, no trial countdown. Setup is a tracking subdomain, one script tag and one webhook. Roughly five minutes if your store already sends order webhooks.

Start tracking free →