Meta reports more purchases than Shopify. Here is exactly why, and what to do about it.
Your ad platform and your store disagree about how many orders you got, and nobody can tell you which one is lying.
7 min read
Every D2C operator hits this within the first month of spending real money. Meta Ads Manager says the campaign drove 340 purchases at a 4.1 ROAS. Shopify says the store took 214 orders that day, across every channel including email, organic and direct. The numbers cannot both be describing the same business, and yet neither system is broken.
This is the single most common reason a growing brand loses confidence in its own reporting. It is worth understanding properly, because the wrong response — picking whichever number looks better, or worse, averaging them — leads directly to overspending on channels that are quietly taking credit for sales they did not cause.
Here is what is actually happening, in the order it matters.
First: how big a gap is normal?
On Meta's default attribution setting of 7-day click plus 1-day view, field reporting from ecommerce measurement teams consistently puts the normal gap between Meta-reported purchases and actual store orders at roughly 20% to 35% for a brand spending meaningfully on prospecting.
That range is not a bug. It is the arithmetic consequence of two systems counting different things, on different clocks, with different rules about who gets credit. A gap inside that band tells you nothing is wrong. A gap of 5% probably means your tracking is under-reporting. A gap of 120% means something is genuinely misconfigured, and the sections below will tell you which thing.
20–35%
Typical gap between Meta-reported purchases and store orders on the default 7-day click / 1-day view window
TrackBee ecommerce measurement field data
7d click + 1d view
Meta's default attribution setting, which credits a purchase made within a day of merely seeing the ad
Meta Business Help Center
Cause 1: view-through conversions (the big one)
This is usually 50% or more of the gap on its own.
Meta's default window credits a purchase to an ad if the shopper saw the ad — not clicked it — within the previous day. If somebody scrolled past your ad on Instagram at 9am, ignored it entirely, then searched your brand name on Google at 4pm and bought, Meta counts that as an ad-driven purchase. Shopify counts it as a Google or direct sale.
Both are defensible positions. The ad may genuinely have planted the intent. It may also have been completely irrelevant to a customer who was already going to buy. Meta has no way to tell the difference, and neither do you, from that report alone.
Cause 2: the two systems use opposite attribution models
Shopify's sales-by-channel reporting is fundamentally last-touch. Whatever referred the session in which the order was placed gets the credit, and if the shopper arrived with no referrer — typing your URL, or clicking through from a saved tab — the order lands in direct.
Meta is multi-touch within its own walls, and generous with itself. It sees every impression and click it served that shopper across Facebook, Instagram, Messenger and the Audience Network, and it claims the sale if any of them falls inside the window.
The practical result: a customer who saw three ads, then clicked a Google Shopping listing, then bought, is one purchase in Meta, one session in Google Ads, and one order in Shopify credited to Google. Add up the platform reports and you have counted the order twice. This is why the sum of your channel-reported revenue routinely exceeds your actual revenue, sometimes by 40% or more.
- Meta: multi-touch inside Meta, window-based, includes view-through by default
- Google Ads: data-driven attribution by default, window-based, click-based for Search
- Shopify: last non-direct touch of the converting session, with a large direct bucket
- Your bank account: single-touch, no window, always right
Cause 3: the two systems date the same sale differently
Meta dates a conversion to the day the ad interaction happened. Shopify dates the order to the day the order was placed.
For a business with a same-day purchase cycle this barely matters. For a considered purchase — furniture, supplements on a subscription decision, anything over about $80 — it matters a great deal. A shopper who clicks on Friday and buys on Monday shows up in Friday's Meta column and Monday's Shopify column.
This is why daily comparison is close to useless and weekly comparison is honest. If you are reconciling day by day and tearing your hair out, stop. Compare seven-day blocks, or twenty-eight-day blocks if your average order value is high.
Cause 4: modeled conversions filling in for signal that no longer exists
Since Apple's App Tracking Transparency framework, a large share of iOS shoppers never consent to cross-app tracking. Those purchases still happen; Meta simply cannot observe them directly. Rather than report a hole, Meta models the missing conversions statistically and includes them in your reported numbers.
Modeled conversions are not fabricated — they are a statistical estimate, and at scale they are reasonably good. But they are an estimate, and they are folded into the same number as directly observed conversions with no visual distinction. A small account with low volume gets a worse estimate than a large one, and knows nothing about it.
This cuts both ways, incidentally. Under-configured tracking causes Meta to under-report, which is why some brands see the reverse problem: Shopify shows more orders than Meta claims. That is not good news. It means Meta is optimizing on a partial picture of who converts.
Cause 5: the boring technical causes, ranked by how often they are the culprit
Before you conclude the gap is philosophical, rule these out. In practice one of them is the problem in a meaningful minority of accounts.
- Duplicate events: the browser pixel and the server-side Conversions API both fire a purchase, without a shared event ID to reconcile them. Meta's deduplication requires matching
event_idandevent_nameon both. Get this wrong and every sale counts twice. - Purchase firing on the wrong page: a thank-you page that reloads, or a post-purchase upsell flow, can fire the event more than once per order.
- Currency mismatch: value sent in one currency, ad account set to another. Revenue looks wildly wrong while order counts look fine — a useful fingerprint.
- Refunds and cancellations: Shopify nets them out over time. Meta generally does not. On a high-return category this alone opens a persistent double-digit gap.
- Cash on delivery and undelivered orders: an order placed is not revenue collected. If a quarter of your orders are returned to origin, your real ROAS is not the one on either screen.
So which number do you run the business on?
Neither, exclusively. Use each one for the job it is honest about.
| Question you are asking | Number to use | Why |
|---|---|---|
| Did the business make money this month? | Shopify revenue, net of refunds | It is the only system that observes every order, from every source |
| Which ad set should get more budget? | Meta-reported, held constant across ad sets | Comparing like with like inside one platform is valid even when the absolute number is inflated |
| Is paid media working at all? | Blended MER — total revenue divided by total ad spend | It cannot be gamed by attribution rules, because it ignores them |
| Should we scale this channel? | Incrementality test, or blended MER before and after a spend change | The only way to separate caused sales from claimed sales |
The practical weekly routine
- Compare weekly, never daily.
- Track the ratio between Meta-reported revenue and actual store revenue as its own metric. The absolute gap does not matter; a sudden change in the gap always does.
- When the ratio moves more than a few points week over week, something changed — a tracking break, a window change, a shift in the prospecting-to-retargeting mix. Go find it.
- Judge scaling decisions on blended MER over a fortnight, not on platform ROAS over a day.
Common questions
Is a 30% gap between Meta and Shopify a problem?
No. On Meta's default 7-day click plus 1-day view setting, a 20% to 35% gap is what a correctly configured account looks like. What matters is stability: track the ratio week over week and investigate when it moves, not when it exists.
Should I switch Meta to 7-day click only?
For reporting, comparing the two views is more useful than picking one. For optimization, changing the attribution setting also changes what the delivery system optimizes toward, so treat it as a campaign change rather than a reporting preference, and expect a learning period.
Why does Shopify put so many of my orders in 'direct'?
Because the shopper arrived with no referrer — a typed URL, a saved tab, a link from an app that strips referrers, or a session that started before the current one. Direct is not a channel; it is the bucket for sales whose origin Shopify could not observe.
Do Meta and Google both claim the same sale?
Frequently, yes. Each platform reports conversions it believes it influenced within its own window, and neither knows what the other claimed. Adding channel-reported revenue together will overstate your real revenue.
Does the Conversions API fix the discrepancy?
It reduces the part caused by lost browser signal, and generally improves match quality and optimization. It does not close the gap caused by view-through credit, differing attribution models or timestamp differences, because those are design decisions rather than data loss.
How Glimmio handles this
Glimmio reads Meta, Google Ads and Shopify through their official connections and keeps the three numbers separate on purpose. Every figure is labeled with which platform reported it and when it last synced, so you are never looking at a blended average that hides a disagreement.
Where the platforms conflict, the gap itself is shown rather than resolved silently. That turns the discrepancy from a source of anxiety into a monitored metric — the thing you actually want, because a stable gap is fine and a moving gap is a signal.
- Manual approval by default — nothing runs unattended
- New campaigns and ads are always created paused
- 7-day recovery window on eligible changes
- 48 permissions across 13 roles, scoped per client account
Go deeper on this
The product pages and setup guides that cover what this article describes.
Searches this answers
- meta ads purchases not matching shopify orders
- facebook ads conversions vs shopify sales
- why does facebook show more purchases than shopify
- meta ads attribution discrepancy
- shopify vs meta reported revenue
Read next
Meta Pixel vs Conversions API: What Each One Actually Does
Your tracking setup was configured once, by someone who has left, and nobody can say whether it is still working.
ReadBlended ROAS and MER: The Number That Cannot Be Gamed
Every channel reports a profitable ROAS, the totals do not add up to your actual revenue, and you cannot tell whether spending more is making you money.
ReadThe 20-Minute Tracking Health Audit for Shopify Stores
Performance dropped three weeks ago and you still do not know whether it was the market, the creative, or a tracking break.
Read
