If you run Meta ads into a Shopify store, you have seen it: Ads Manager says your campaign drove 78 purchases, and Shopify shows 100 orders total — with Facebook claiming most of them. The numbers never line up, and the internet is full of vague answers about "attribution differences."
This article gives you the precise mechanism, the numbers to expect, and a worked example so you can tell a normal gap from a broken pixel. It is part of a broader guide to reconciling your ecommerce data across the tools that never agree.
Facebook and Shopify are answering two different questions
Before you chase the gap, understand what each tool is actually measuring. They are not two attempts at the same number.
Shopify answers: did a sale happen, and how much was it worth? It records a completed checkout server-side, so it captures every order regardless of cookies, consent, or ad blockers. Its default credit model is last non-direct click — 100% of an order goes to whatever channel the buyer clicked last.
Meta answers a looser question: did my ad plausibly influence this sale? It claims credit whenever a purchase falls inside its attribution window after someone clicked or merely saw an ad. Those are different questions, so they produce different counts — both internally correct.
This same split shows up across every platform. The pattern is identical for Google Ads overreporting compared to Shopify, and Meta's own reporting quirks are covered in depth in our breakdown of Meta Ads overreporting compared to Shopify.
The five reasons Facebook's number runs high
1. View-through conversions (the biggest inflator)
Meta's default attribution setting is 7-day click + 1-day view (Foreplay, Jon Loomer). That "1-day view" half means Meta claims a purchase made within a day of someone seeing an ad — no click required. Shopify has no concept of a view; it only records checkouts. View-through credit is the single largest source of Facebook-over-Shopify inflation.
2. Modeled conversions
When Meta cannot directly observe a sale — because the pixel was blocked, consent was declined, or the buyer opted out of tracking on iOS — it estimates the conversion with a machine-learning model and reports the estimate as if it were counted. Shopify never models. It reports only real, completed orders.
3. Click-date reporting desyncs your days
Meta reports a conversion on the date of the click or view that earned the credit, not the purchase date. A click on Monday that converts Thursday shows up in Meta on Monday; Shopify logs the order on Thursday. Compare single days and the numbers will never match — always compare on trailing 7–14 day windows.
4. Cross-device attribution
Meta identifies logged-in users across devices. Someone who sees your ad on a phone and buys on a laptop is still credited to Meta. Shopify's last-click ties that same order to whatever landed on the buying device — often "direct" or "organic."
5. Refunds stay on the books
When an order is refunded, Shopify reduces net and total sales. Meta generally does not retroactively remove the original conversion (TrackBee), so its totals stay inflated after refunds while Shopify's drop.
What a normal gap looks like — and what signals a bug
Here is the line most articles skip: there is a healthy range, and there is a broken range.
A 20–35% gap between Meta-reported purchases and Shopify orders is normal on the default window (Vaizle, TrackBee). Most of that excess is view-through plus modeled conversions — structural, not fixable.
A gap approaching 2× is almost always a deduplication misconfiguration, not real inflation. If your browser Pixel and server-side Conversions API both send a Purchase for the same order without a shared event_id, Meta counts it twice. Per Meta's own dedup docs, the two copies collapse into one only when they share an identical event_id and event_name and arrive within 48 hours of each other. Break that key and every order double-counts. A sudden jump in conversions right after you added CAPI is the classic symptom.
Worked example: one week, four different "sales" numbers
Say your print-on-demand store gets 100 real orders in a week. Average order value is $40 subtotal + $5 shipping + $4 tax = $49 total. Of those 100 buyers: 55 clicked a Meta ad within 7 days, 15 only saw a Meta ad within 1 day, 10 clicked Google last, and 20 came via organic or direct. Eight later request refunds. The relationships below are exact; the numbers are illustrative.
Meta Ads Manager reports ~78 purchases.
- 55 click-through + 15 view-through = 70 attributed by window.
- 8 modeled conversions recovering blocked or opted-out buyers.
- Revenue reported at the $40 subtotal only (pixels often pass subtotal, not shipping or tax): 78 × $40 = ~$3,120.
- Refunds are not subtracted, and ~12 conversions land in the prior week on click-date. Meta claims it drove 78 of your 100 sales.
Shopify Analytics reports 100 orders, last-click.
- The 15 view-through buyers are not credited to Facebook here — they clicked nothing, so Shopify files them under their real last referrer.
- Total sales = 100 × $49 = $4,900, then the 8 refunds (8 × $49 = $392) pull net/total sales down to ~$4,508.
The bank payout is different again. Shopify Payments deposits cash after fees, not sales:
Captured charges: 100 × $49 = $4,900.00
Processing fees (Basic plan, 2.9% + 30¢ per order per Webgility): $142.10 + $30.00 = −$172.10
Refunds issued: 8 × $49 = −$392.00
One chargeback fee ($15 US per Webgility): −$15.00
Net payout deposited = $4,320.90.
So one week of 100 real orders produces four numbers: Meta says 78 / $3,120, Shopify says 100 orders / ~$4,508 total sales, and your bank receives $4,320.90. None is wrong. Shopify's order count is the truth for how many sales happened; Meta's is the truth for how many its ads plausibly influenced; the payout is the truth for cash in the bank.
The trap: making budget decisions on Meta's number
Here is why this matters beyond curiosity. If you trust Meta's 78 purchases at $40 each and compute return on ad spend from it, you are optimizing against a number that includes view-through credit, modeled estimates, and pre-refund revenue — and excludes your fees, product cost, and shipping. That is how a campaign looks profitable in Ads Manager while your bank balance quietly shrinks.
The number that actually decides whether an order made money is per-order profit: revenue minus product cost, minus fulfillment, minus the true processing fee, minus the real ad spend that drove it. No single dashboard shows you that, because the revenue lives in Shopify, the ad cost lives in Meta, the item cost lives in Printify or Printful, and the fee lives in the payout.
This is the problem PodVector exists to solve. It connects Shopify, Meta Ads, Google Ads, Printify, Printful, and Stripe, then computes true per-order profit across all of them in one place. Victor, its AI operator, reads your ad data and your store data together, tells you which campaigns are actually profitable after every deduction, and proposes moves — then executes the ones you approve on the Shopify side. Victor is not a dashboard, and he does not touch your ad account; he reads the ad numbers and leaves the writing to you.
For merchants moving a catalog over as they scale — for example, transferring an Etsy shop to Shopify — getting this reconciliation right from day one saves months of second-guessing your ad spend.
FAQs
Is Facebook lying when it reports more sales than Shopify?
No. Meta counts view-through and modeled conversions by design and discloses that it does. It is answering "did my ad influence this sale?" while Shopify answers "did a sale happen?" Neither is dishonest — they measure different things, and both can be internally correct at the same time.
What is a normal gap between Facebook and Shopify?
On Meta's default 7-day-click / 1-day-view window, a 20–35% gap between Meta-reported purchases and Shopify orders is considered normal (Vaizle, TrackBee). Most of the excess is view-through plus modeled conversions, which no amount of tracking work will remove.
My Facebook number is roughly double Shopify — is that attribution?
Almost certainly not. A ~2× gap points to a deduplication problem: your browser Pixel and Conversions API are both sending the same Purchase without a shared event_id, so Meta counts each order twice. Meta only merges copies that share an event_id and event_name within 48 hours (Meta for Developers). Fix the dedup key and the gap should collapse back to the normal range.
Will setting up the Conversions API make the numbers match?
No. CAPI recovers events lost to ad blockers and consent declines, which narrows tracking gaps. It does nothing about the methodology gaps — view-through credit, modeled conversions, last-click versus window, click-date reporting. Even with flawless tracking, expect a structural gap of 20% or more. If your count rises after adding CAPI, that is a dedup bug, not a win.
Can I make Facebook match Shopify by changing the attribution window?
You can narrow it. Switching a campaign from 7-day-click + 1-day-view down to 1-day-click can cut reported conversions by roughly 40% for the same real sales (TrackBee) — it just re-slices credit into a tighter window. It brings Meta closer to Shopify's last-click view but does not make them equal, and it changes what Meta optimizes toward. For a fuller comparison of which source to trust, see which is right: Facebook Ads or Shopify data.
Which number should I use to judge my ads?
Neither, on its own. Use Shopify's order count and total sales as the truth for revenue, and use Meta's number only as a directional signal of influence. To actually decide whether a campaign made money, you need per-order profit — revenue minus product cost, fulfillment, real fees, and the ad spend behind it — which requires stitching Shopify, your ad platforms, your print supplier, and your payout data together.