First, confirm the sales are actually from your ads
Before you rebuild anything, prove the gap. Open your Shopify orders (or Stripe payouts) for the exact days your campaign ran and line them up against Ads Manager. If you see paid orders in your store on days Meta reports zero, you have an attribution gap — a plumbing problem — not a performance one.
This distinction matters because the two problems have opposite fixes. A real "no conversions" problem means your creative, offer, or audience is failing. A reporting gap means the ads may be working fine and you simply can't see it. Chasing the wrong one wastes budget.
The cleanest way to tell them apart is to reconcile store-side truth against platform-reported numbers. Shopify records every completed checkout server-side, so its order count is the source of truth for how many sales happened. We walk through that whole reconciliation process in our guide to reconciling your ecommerce data.
Why Facebook reports zero when sales are real
There are two families of cause here. One is genuine data loss — the conversion event never reaches Meta. The other is a settings problem — the event arrives, but Meta files it somewhere you're not looking.
The pixel or Conversions API isn't firing
The most common culprit is a broken purchase event. If the Meta Pixel never fires on your thank-you page — because a theme update wiped the code, an app conflict blocks it, or the script fails on a slow connection — Meta simply never learns the sale occurred. Your Shopify order record is complete; Meta's is empty.
Client-side tracking is fragile by design. Browser ad blockers and Safari or Firefox tracking prevention stop pixels from firing for an estimated 10–25% of users, according to Elevar's analysis of Shopify data discrepancies. Add cookie-consent declines and buyers who close the tab before the confirmation page loads, and purchase events routinely show the largest client-side gap of any event. If your only tracking is the browser pixel, "zero" can just mean "all of it was blocked."
You optimized for the wrong conversion event
Open your ad set and check the conversion event you selected. If your campaign is optimizing for "Add to Cart" or "View Content" but you're reading the "Purchase" column, it will look empty even while the campaign hums along. Sales objective campaigns need the Purchase event selected explicitly.
A related trap: an unverified domain. Meta requires domain verification and an Aggregated Event Measurement configuration for your purchase event to report reliably after the iOS App Tracking Transparency rollout. Skip that setup and post-iOS purchase reporting degrades badly.
Your attribution window credits nothing
Meta only claims a conversion that falls inside its attribution window. The current default is a 7-day click plus 1-day view window, per Foreplay's attribution guide and Jon Loomer. If someone clicks your ad, thinks it over for ten days, then buys, that sale lands outside the window and Meta credits it to no one — even though your ad started the journey.
There's also a timing quirk that makes single days look empty. Meta reports a conversion on the date of the ad click that earned it, not the date of the purchase. A Monday click that converts Thursday shows up in Meta on Monday; Shopify logs it Thursday. Compare a single day and the columns can look wildly out of sync even when the weekly totals agree.
A worked example: where 100 real sales "disappear"
Say your store gets 100 real orders in a week at $49 each. Here's how a genuinely working campaign can still under-report.
Of those 100 buyers, imagine 20 shopped on iPhones with tracking turned off, blocked the pixel with an extension, or bailed before the thank-you page loaded. Their purchase events never reach Meta. That's 100 − 20 = 80 sales Meta could even theoretically see.
Now suppose your Purchase event was never mapped in Events Manager — the pixel fires a generic pageview but no Purchase. Meta receives traffic but records 80 × 0 = 0 purchases. Ads Manager shows zero. Your bank shows $49 × 100 = $4,900 in orders. Both are "correct." One is measuring completed checkouts; the other is measuring events it never received.
Fix the event mapping and add server-side tracking, and Meta might start seeing, say, 70 of those 80 observable purchases plus a handful of modeled ones. The number jumps from zero to roughly seventy overnight — no change in real sales, only in what you can see.
How to fix the tracking (in order)
Work these top to bottom; each rules out a cause.
First, test the pixel. Use Meta's Events Manager "Test Events" tool and run a real checkout. If no Purchase event appears, your pixel isn't firing on the confirmation page — reinstall it through Shopify's native Meta channel rather than pasting code into your theme.
Second, add the Conversions API. Server-side tracking sends the purchase from Shopify's servers, recovering the blocked-browser events that ad blockers and iOS opt-outs kill. This is the single biggest lever for closing a genuine tracking gap.
Third, deduplicate. When both the browser pixel and the server-side Conversions API send the same purchase, Meta must collapse them into one. It matches on a shared event_id plus event_name and only deduplicates events received within 48 hours of each other, per Meta's official deduplication docs. Get this wrong and you swing from zero to double-counting.
Fourth, verify your domain and confirm the Purchase event is your top-priority event in Aggregated Event Measurement. Fifth, widen your comparison window to 7 or 14 days so click-date reporting and delayed purchases have room to reconcile.
Why the numbers will never match perfectly
Here's the part most guides skip: even with flawless tracking, Meta and Shopify won't agree. They measure different things.
Meta counts view-through conversions — sales from people who saw your ad but never clicked — which Shopify has no concept of. It also reports modeled conversions, statistical estimates of iOS and ad-blocked buyers it couldn't observe directly. And it credits sales inside its window regardless of what the customer clicked last, while Shopify uses last-click. A 20–35% gap between Meta's purchase count and Shopify's orders is considered normal on the default window, according to Vaizle and TrackBee.
So your goal isn't to make Meta read zero-to-hero and then match Shopify exactly. It's to get Meta reporting a stable, believable number you can trust for optimization — then judge actual performance from your store's server-side truth. If you also run Google Ads, the same logic applies; see our breakdown of why Google Ads isn't tracking Shopify purchases and why GA4 isn't tracking Shopify purchases. A simple GA4 conversion tracking setup checklist for Shopify closes most of the same gaps.
The number that actually matters: profit per order
A conversion count — even a perfect one — doesn't tell you whether the sale made money. That's where most print-on-demand and dropship sellers get burned.
Say that $49 order carries a $18 print cost, and Shopify Payments takes 2.9% plus 30¢ per transaction, per Webgility's payout breakdown. That's $49 × 0.029 + $0.30 = $1.72 in fees. If your ad cost per purchase was $15, your real profit is $49 − $18 − $1.72 − $15 = $14.28. Now imagine one buyer disputes the charge — a chargeback fee of roughly $15 per dispute, also per Webgility, wipes out that order's entire margin and then some.
None of that shows up in a "conversions" column. This is exactly the gap PodVector is built to close. It connects Shopify, Meta Ads, Google Ads, Printify, and Printful, then computes your true per-order profit after product cost, fees, and ad spend — not a platform's self-credited conversion count. Victor, its AI operator, reads that combined data and proposes moves, taking Shopify-side actions only with your approval. Victor does not touch your ad account; he reads its numbers and hands you the profit picture behind them.
If you sell across marketplaces too, reconciling those channels is its own job — our guide on how to sync Etsy with Shopify walks through keeping order and inventory data straight across both.
FAQs
Why does Facebook show zero conversions but I'm getting sales?
Because the sale is real but the signal that reports it to Meta is getting lost. The usual causes are a pixel that never fires on your confirmation page, the wrong conversion event selected in your ad set, an unverified domain, or an attribution window that credits nothing. Your store records the order server-side; Meta only knows what its tracking successfully transmitted.
Does zero conversions in Ads Manager mean my ads aren't working?
Not necessarily. First reconcile Ads Manager against your Shopify orders for the same dates. If real paid orders exist while Meta shows zero, you have a reporting gap, not a performance problem — the fix is tracking, not new creative. If your store also shows no orders, then it's a genuine performance issue.
Will the Conversions API make my Facebook and Shopify numbers match?
No. The Conversions API recovers events lost to ad blockers, iOS opt-outs, and closed tabs, so it can move you from zero to a real number. But it does nothing about structural differences like view-through credit, modeled conversions, and last-click versus window attribution. Expect a lasting gap of roughly 20–35% on the default window, per Vaizle; aim for a stable ratio, not equality.
Why did my conversions double after I added the Conversions API?
That's a deduplication problem, not a win. When the browser pixel and the server-side event both report the same purchase without a shared event_id, Meta counts both. It only merges duplicates that share an event_id and event_name and arrive within 48 hours of each other, per Meta's documentation. Fix the shared event ID and the count settles back to reality.
Should I switch to a 1-day click attribution window to see cleaner data?
Only if you understand the tradeoff. A narrower window sits closer to Shopify's last-click view, but switching from 7-day click plus 1-day view down to 1-day click can cut reported conversions by around 40%, per TrackBee — the same real sales, credited over a shorter window. Use it to sanity-check, not as your headline number.
What number should I actually trust for decisions?
Trust your Shopify order count and total sales for how many sales happened and how much revenue came in — it's server-side and authoritative. Trust Meta's number for how many of those sales its ads plausibly influenced. And trust true per-order profit, after product cost, fees, and ad spend, for whether any of it made money. A conversion count alone can't tell you that.