
Meta says it drove more purchases than my store recorded. Which one is wrong?
If you have ever put Meta Ads Manager and your Shopify dashboard side by side for the same week and found two different purchase counts, the instinct is to look for the broken one. Most of the time there isn't one. The two reports are answering different questions, and each is answering its own question correctly.
They are counting on different clocks
Your store records an order on the day the order was placed. Meta records a conversion on the day of the click or impression it credits — which can be up to seven days earlier under its default 7-day-click window. A sale placed on Monday off a click from the previous Thursday appears on Monday in your store and on Thursday in Ads Manager. Over a seven-day report those edges are a large share of the total, and they get larger the longer your consideration cycle is.
This is also why day-by-day comparison is the wrong first move. Compare the whole window before you compare any day inside it: a per-day gap is usually a difference of basis, not a difference of measurement.
A view is not a click
Meta's default setting credits a purchase that happened within one day of an impression, with no click anywhere in the journey. That view-through conversion is a real thing — an ad someone scrolled past can genuinely influence a purchase — but it is not a visit you will ever find in your own analytics, because nobody arrived from it. Your store has no row for it and never will. That is not a gap in your data.
Google's equivalents behave the same way: engaged-view conversions on video, and Display impressions that receive credit under data-driven attribution.
Every platform only sees its own touch
This is the one that produces the largest arithmetic surprise. Meta sees the Meta touch. Google sees the Google touch. Neither sees the other. When a buyer clicked a Google search ad on Tuesday and a Meta ad on Thursday and bought on Friday, both platforms have a defensible claim on that single order — and both will report it as one conversion. Add the platforms up and you can exceed the number of orders your store actually took.
GA4 disagrees with both by construction: its acquisition reports default to last non-direct click, which awards the whole order to one channel and gives the other nothing. Three sources, three models, one sale.
Refunds are usually still in the platform's number
A cancelled or fully refunded order stops being revenue in your store the moment it is settled. In the ad platform it generally stays a conversion, because the platform was told about the purchase and never told about the reversal. On a category with high return rates this alone accounts for a persistent gap in one direction, and it is the easiest one to check: pull the same window with cancellations included and see whether the gap closes.
The same purchase can be counted twice
Most stores now send purchase events twice on purpose — once from the browser pixel and once server-side from the order webhook — because the browser event is lost whenever an ad blocker, Safari's protections or a checkout that renders outside the store's domain gets in the way. The redundancy is correct. What makes it safe is that both events carry the same event ID, which is what lets Meta collapse them into one. When the two sides disagree about that ID, or one side omits it, the platform receives two purchases and has no way to know they are the same one. Events Manager reports this directly, under redundant purchase events, and it is worth checking before you conclude anything else.
The test that settles it
Underneath all of this is one asymmetry that makes the question answerable. A platform can legitimately resolve a buyer you never saw — someone who blocked your pixel, or converted from a view. So a platform claiming more than you measured is not, on its own, evidence of inflation. But no platform can resolve an order that does not exist. Your store's total order count for a window is a hard ceiling on what every platform combined can truthfully claim about that window.
So: take the window, take the total number of settled orders your store recorded in it, and take the sum of what every connected platform claims for the same window on the same basis. If the claims exceed the orders, the excess is not a modelling difference or a window artefact. It is double-counting, and it is provable without knowing which platform is responsible.
That comparison is the one Adray runs. Attribution is anchored on your store's own orders rather than on any platform's report, each order is stitched back to the session and the click that produced it, and every claim is shown next to what the store actually recorded — including where the two cannot be reconciled and why. The goal is not to name a winner between Meta and your dashboard. It is to know exactly which of the reasons above accounts for the gap, so the number you budget against is one you can defend.
