Guides · 6 min read
Why is my Meta pixel missing sales?
You open Shopify and see 40 orders from yesterday. Ads Manager says your ads brought in 26 purchases. Some buyers came from elsewhere, sure — but often a big part of the gap is sales the Meta pixel simply never saw.
How the pixel normally reports a purchase
The Meta pixel is a piece of JavaScript that runs in your buyer's browser. When the thank-you page loads, it sends a Purchase event to Meta with the order value. Meta then tries to match that event to a person who saw or clicked one of your ads.
That means two things have to go right: the script has to run in the buyer's browser, and Meta has to recognise who the buyer is. Both go wrong more often than you'd think.
Five reasons the purchase never arrives
- Ad blockers and privacy browsers block the pixel script or its network requests completely.
- iOS and Safari limit cookies and tracking, so the link between the ad click and the purchase is lost, especially when buyers come back days later.
- Cookie banners: when a buyer doesn't accept marketing cookies, the pixel may not fire at all.
- In-app browsers (Instagram, Facebook, TikTok) are short-lived. Buyers switch to Safari or Chrome to pay and the click is gone.
- The thank-you page never loads: the buyer closes the tab after paying, the page is slow, or the payment happens on another page or device.
Why it costs you more than a wrong number
Missing purchases don't just make your ROAS look worse. Meta's algorithm learns from the purchases it receives. If it only sees part of your sales, it optimises towards the wrong people and stops spending on ads that actually work.
That's how a profitable ad gets switched off because it 'breaks even' in Ads Manager.
The fix: send purchases from a server as well
Meta's Conversions API (CAPI) lets you send the same Purchase event from a server, straight from your store's order data. No browser, no ad blocker, no thank-you page needed.
To work well, the server event needs the right details: the original ad click (fbclid / fbc), the browser id (fbp), hashed email and phone, and the same event id as the browser pixel — so Meta counts the sale once, not twice.
Doing this yourself means building and maintaining that matching, for every ad platform you use. Tools like Settl do it for you: the ad click is saved when the visitor lands and kept for 90 days, and every paid order is sent to Meta, TikTok, Google (GA4 and Google Ads), Snapchat, Pinterest, X, Microsoft Ads and Reddit from our server. An hourly health check e-mails you if a platform starts failing, a token expires or orders stop arriving.
How to check how much you're missing
Pick a few days. Count the paid orders in your store that came from Meta ads (or all orders, as a rough upper limit) and compare with the purchases in Ads Manager for the same days and attribution window. The difference is your tracking gap.
You can also put your numbers in our ROAS calculator to see what that gap does to the ROAS you're judging your ads on.
Common questions
How big a gap between Shopify and Ads Manager is normal?
There's no fixed number: it depends on how many of your buyers come from Meta, your attribution setting, and how many of your visitors block tracking or decline cookies. Compare a full week of Meta-driven orders with Ads Manager purchases for the same days; that difference is the gap worth working on.
Does Shopify's own Facebook & Instagram app send purchases from the server?
On the Enhanced and Maximum data sharing levels it adds the Conversions API, according to Shopify's Help Center (checked October 2026). On Standard it only uses the browser pixel, which an ad blocker can stop.
My pixel isn't sending any purchases at all. Is this the same problem?
No, that's a setup problem, not a tracking gap. Start with a test order in Meta Events Manager and check for a disconnected custom pixel, the wrong pixel id or duplicate pixels. Our Facebook pixel not tracking purchases checklist goes through it step by step.
See what your real ROAS is with your own numbers.
Open the ROAS calculator