If your Facebook ads report fewer purchases than Shopify shows in orders, you have one of two very different problems. Telling them apart is the whole game. Chase the wrong one and you either miss a real leak or burn hours "fixing" numbers that were never broken.
The first problem is a tracking gap — events genuinely lost before they reach Meta. That's fixable. The second is a methodology gap — Meta and Shopify measure different things, so their totals diverge no matter how clean your setup is. That's permanent. Most top guides on this topic only cover the first and leave you expecting a match that can't happen.
First, decide which problem you actually have
Open Shopify and pull your order count for a trailing seven-day window. Compare it to Purchase events in Meta Ads Manager for the same window. Never compare single days — Meta reports a conversion on the ad-click date, not the purchase date, so a Monday click that converts Thursday lands in different columns.
Then look at the direction and size of the gap.
- Meta shows more purchases than Shopify has orders. This is usually attribution by design, not a bug. On the default seven-day-click plus one-day-view window, a purchase gap of roughly twenty to thirty-five percent above Shopify is considered normal, per field data from Vaizle and TrackBee.
- Meta shows far fewer purchases than Shopify, or zero. That points to a real tracking break — a disconnected pixel, inactive Conversions API, or a domain mismatch.
- Meta shows roughly double Shopify's orders. That's almost always a deduplication misconfiguration sending each purchase twice, not real inflation.
If your gap sits in the normal band, your tracking is probably fine and you should skip to the methodology section. If Facebook is undercounting badly, keep going.
Why Facebook stops tracking Shopify purchases (the fixable causes)
When Meta genuinely misses purchases, it's almost always one of these. Work them in order.
The pixel or Conversions API isn't connected
The most common cause is the simplest: the connection between Shopify and Meta was never fully established, or an app update broke it. In Shopify, open the Facebook & Instagram sales channel, go to Settings, and confirm the pixel is linked and Customer Data Sharing is on. Setting data sharing to Maximum activates the server-side connection so Shopify sends purchase events even when the shopper's browser blocks the pixel.
Meta's own guidance is to run the browser Pixel and server-side Conversions API together — the server copy recovers events the browser loses. That redundancy is why CAPI matters, and our Facebook Conversions API setup checklist for Shopify walks the connection step by step.
The Purchase event never fires
Even with a connected pixel, the Purchase event can fail to send. Shoppers close the tab before the thank-you page loads, the script fails on a slow connection, or a theme or app conflicts with the snippet. Because the purchase confirmation is the last event in the funnel, it shows the largest client-side loss of any event.
Diagnose it in Meta Events Manager under the Test Events tab. Run a real test order and watch for View Content, Add to Cart, Initiate Checkout, and Purchase to appear live. If everything fires except Purchase, the confirmation-page event is your leak — and server-side CAPI is the fix, because it sends from Shopify's servers regardless of the browser.
Ad blockers, iOS opt-outs, and consent declines
A large share of shoppers never let the browser pixel fire at all. Ad blockers and Safari's tracking prevention block client-side scripts, and users who decline cookie consent or opt out of iOS tracking strip the identifiers Meta needs. Field estimates put ad-blocker and consent-affected traffic at roughly ten to twenty-five percent of users, per Audiense and Elevar.
Shopify still records every one of those orders server-side, which is exactly why it looks like Facebook "lost" them. Server-side CAPI recovers a big chunk, but it can't recover everything — some signal is gone for good.
Duplicate events (the opposite problem)
If Facebook suddenly shows more purchases after you added CAPI, you didn't win — you broke deduplication. When the browser Pixel and the server both send a Purchase without a shared key, Meta counts it twice.
Meta dedupes on a matching event_id plus event_name across both copies, within a forty-eight-hour window, keeping whichever arrived first, per Meta's developer docs. If your count roughly doubled, the shared event_id is missing. Our guide on Facebook ads showing zero conversions but getting sales covers the mirror-image failure modes.
Why the numbers still won't match after you fix everything
Here's what the setup-only guides miss: even with a flawless pixel and CAPI, Meta and Shopify will not agree. They answer different questions.
- Shopify asks "did a sale happen?" It records completed checkouts server-side and credits the last non-direct click. It is the source of truth for how many orders you got and how much revenue came in.
- Meta asks "did my ad plausibly influence this?" It claims credit for purchases inside its attribution window — including view-through conversions, where the shopper only saw the ad and never clicked. Shopify has no concept of a view.
On top of that, Meta reports modeled conversions — statistical estimates of real sales it couldn't directly observe because of iOS opt-outs or blocked pixels. Shopify never models; it only counts real orders. And Meta files conversions on the click date, not the purchase date, which desyncs any day-level comparison.
None of these is dishonest. They're structural. This is why you compare on trailing windows and aim for a stable ratio between the two tools, not a perfect match. For the full picture of how Shopify, Meta, and GA4 each count the same sale differently, see our hub on reconciling your ecommerce data. And if it's Google rather than Meta that's under-reporting, the causes overlap heavily with Google Ads not tracking Shopify purchases.
A worked example: one week, four different "sales" numbers
Say your store gets 100 real orders in a week, each averaging $40 in product plus $5 shipping and $4 tax, for $49 total. Of those 100 buyers, 55 clicked a Meta ad within seven days, 15 only saw one within a day, 10 came from Google, and 20 arrived via organic or direct. Eight later requested refunds.
Here's how each system reports that same week:
- Meta Ads Manager: 55 click-through plus 15 view-through equals 70 window-attributed purchases, plus roughly 8 modeled conversions it couldn't observe directly — about 78 purchases. It doesn't subtract the refunds, and if your pixel passes subtotal only, it reports revenue near 78 × $40 ≈ $3,120.
- Shopify Analytics: 100 orders, last-click. Only ~55 are credited to Facebook; the 15 view-through buyers clicked nothing, so Shopify files them under their real last referrer. After 8 refunds of $49, total sales fall from $4,900 to about $4,508.
- The bank payout: different again. Starting from $4,900 captured, subtract processing fees, refunds, and disputes.
That third number trips up almost everyone. Shopify Payments deducts fees per transaction — around 2.9% plus 30¢ per order on the Basic plan for US cards, per Webgility — plus refunds and any chargeback fees (about $15 per dispute, also per Webgility). So the deposit works out to roughly $4,900 − $172 in fees − $392 in refunds − $15 dispute = about $4,321.
Four numbers — $3,120, $4,508, and $4,321, from one week of $4,900 in real orders — and none is "wrong." They just measure ad influence, booked revenue, and cash deposited. If you're tracing the deposit side, our guide to adding a bank account to Shopify for payouts covers the payout mechanics.
The number that actually matters: profit per order
Chasing a perfect Facebook-to-Shopify match is the wrong goal. Meta's Purchase count is a directional signal for whether an ad is working — not your accounting. What decides whether a campaign is worth running is profit per order after product cost, print or fulfillment cost, shipping, processing fees, and ad spend.
In the example above, a $40 product might carry $16 in print cost and about $1.46 in Shopify fees. Add, say, $12 of ad spend allocated per order and your contribution margin is roughly $40 − $16 − $1.46 − $12 ≈ $10.54 before shipping and refunds. That's the figure that tells you to scale or kill — and no single ad-platform dashboard shows it, because none of them knows your COGS.
This is where a purpose-built layer helps. PodVector connects Shopify, Meta Ads, Google Ads, Printify, and Printful, then computes true per-order profit across all of them. Its AI employee, Victor, reads your ad and store data and proposes moves — and executes approved actions on the Shopify side. Victor does not touch your ad account; he reads Meta's numbers for what they are and reconciles them against Shopify orders and real costs, so you stop comparing mismatched dashboards and start seeing the profit underneath.
FAQs
Why does Facebook show more purchases than Shopify has orders?
Mostly by design. Meta credits view-through conversions (ads seen but not clicked) and modeled conversions (statistical estimates of unobserved sales), and it reports on the click date rather than the purchase date. On the default window, a gap of roughly twenty to thirty-five percent above Shopify is normal, per Vaizle. Shopify counts only completed orders, so it will almost always show fewer "Facebook" sales than Meta claims.
My Facebook pixel shows zero purchases but I'm getting sales — what's wrong?
That's a real tracking break, not a methodology gap. The pixel is likely disconnected, the Purchase event isn't firing on your confirmation page, or a domain mismatch is blocking events. Test it in Meta Events Manager with a live order, and turn on server-side Conversions API so Shopify sends purchases directly. Our zero-conversions guide walks through each cause.
Will the Conversions API make my numbers match Shopify?
No. CAPI recovers events lost to ad blockers, consent declines, and closed tabs, so it narrows the tracking gap. But it does nothing about the methodology gap — view-through credit, modeling, last-click versus attribution window. Even with perfect CAPI, expect a structural gap. Aim for a stable ratio, not equality.
Facebook conversions doubled after I set up CAPI — is that good?
No, it's a deduplication problem. Correct redundant setup should keep your count stable while recovering blocked events, not raise it. Meta dedupes copies that share an event_id and event_name within forty-eight hours, per Meta's docs. A doubled count means that shared key is missing from one of the copies.
How do I compare Facebook and Shopify fairly?
Use a trailing seven-to-fourteen-day window, never single days, because Meta reports on the click date and Shopify on the order date. Expect Meta to run higher on the default window. Then focus on the direction and stability of the gap over time — a sudden swing signals a real break, while a steady offset is just the two systems measuring different things.
What should I actually optimize if the numbers never match?
Profit per order. Ad-platform purchase counts tell you whether an ad has momentum, but they don't include your product cost, fulfillment cost, or fees. Calculate contribution margin per order and let that decide what to scale — a campaign with high reported ROAS can still lose money once real costs are in. Reconciling ad data, store orders, and true costs in one place is the point of the data-reconciliation hub.