Why the numbers disagree
Meta's pixel is a piece of JavaScript that runs in your customer's browser. When it fires, it tells Meta a sale happened. When it does not fire, Meta simply never learns about that sale - the order still exists in your store, it just never reaches the ad platform.
Plenty of things stop it firing. iOS privacy prompts, ad blockers, a cookie banner the shopper ignored, a checkout that redirects through a payment provider. None of these are bugs you introduced. They are the normal condition of the web in 2026.
The three that cause most of the gap
- iOS and ad blockers - the pixel never runs for a meaningful slice of buyers, and you cannot opt them back in.
- Pixel installed, purchase event missing - page views track fine, money does not. This is more common than people expect, and it looks identical to "ads are not working".
- Consent banner blocks it - correct behaviour under GDPR, invisible to Meta.
Here is what actually goes wrong as a result. Meta optimises towards the conversions it can see. If it only sees half your sales, it is learning from half your customers - and it will confidently spend your budget chasing the wrong half. The reporting gap is annoying. The optimisation damage is what costs you money.
The reporting gap is the symptom. The real cost is that Meta spends your budget learning from half your customers.
Check which one is broken before you change anything
Two different problems look the same from the dashboard, and the fix is different for each.
| What you see | Likely cause | What to do |
|---|---|---|
| Meta shows some sales, but fewer than your store | Browser tracking blocked for part of your traffic | Server-side tracking - see below |
| Meta shows zero sales, store has plenty | Purchase event never installed, or firing on the wrong page | Check the event in Meta Events Manager first |
| Meta shows more sales than your store | Attribution window - Meta is claiming sales that came from elsewhere | Compare blended, not per-platform. Here is how each tool counts. |
Server-side tracking cannot send an event that was never set up. If the purchase event is missing, adding the Conversions API on top changes nothing and you will spend a week wondering why.
Open Events Manager, find your pixel, and look at the Purchase event. If it has not received anything in seven days while your store has been taking orders, you have an installation problem, not a blocking problem. Fix that first - server-side tracking cannot send an event that was never set up.
Not sure which one you have?
Connect your store and your ad account, and Magneety compares real orders against what Meta reports - so you can see the size of the gap before you spend an afternoon debugging the wrong thing.
14-day trial · no card · cancel anytimeThe fix: report sales from your store, not the browser
Meta's Conversions API takes the browser out of the loop. Your shop tells Meta about the order directly, server to server. Nothing to block, no consent banner in the way, no iOS prompt.
Meta then matches these against whatever the pixel did manage to send and counts each sale once, so you are not double-counting. You keep the pixel. You are adding a second, more reliable path, not replacing the first.
Doing it by hand is developer work: access tokens, event IDs for deduplication, hashing customer data correctly, then testing that any of it arrived. It is the kind of task that eats a weekend and then quietly breaks three months later.
- Connect your shop and your ad accountShopify or WooCommerce on one side, Meta on the other. Both are OAuth - no tokens to paste anywhere.
- Pick your pixel from a listNo IDs to copy across, which is where most manual setups go wrong.
- Press Test and watch the event landYou see the order arrive in Meta before you trust it with real budget.
- Turn it onIt is off until you switch it on, per store. From then every order flows through, with only hashed customer data ever leaving your shop.
Send profit, not revenue - this is the part most people skip
By default you tell Meta a sale was worth whatever the customer paid. So Meta goes and finds you more big-basket customers. Sounds good, until you notice the biggest baskets are your lowest-margin products and you are busier than ever while making less.
Set your margin and send what you actually keep. Meta then optimises for profitable customers instead of expensive ones. It is the single highest-leverage change most small stores can make, and it takes about a minute.
Where to go next
Common questions
Will server-side tracking double-count my sales?
No. Meta deduplicates using an event ID sent by both the pixel and the server. A sale seen by both paths is counted once. Magneety sets those IDs for you, which is the part people most often get wrong when wiring it up manually.
Is this GDPR compliant?
Sending order data server-side does not remove your consent obligations - you still need a lawful basis and a working cookie banner. What changes is reliability, not the legal position. Customer data is hashed before it leaves your store, so Meta never receives a raw email address or phone number.
How much of a gap is normal?
Most small stores see Meta under-report somewhere between 20 and 40 percent of real purchases before server-side tracking is in place. If your gap is far larger than that, the more likely explanation is a missing or misconfigured purchase event rather than blocking.
Do I still need the pixel?
Yes. Keep it. The pixel still captures browsing behaviour that the server cannot see, and Meta uses both together. Server-side tracking is an addition, not a replacement.
How long until my ads improve?
The reporting gap closes immediately. The optimisation improvement takes longer, because Meta needs to relearn from the fuller data - usually one to two weeks of normal spend before the difference is visible in performance rather than just in reporting.
Stop guessing which number is right
Magneety connects your store and your ad accounts, fixes the tracking, and shows you one honest view of what your marketing actually made.
Fix my tracking - free for 14 days 14-day trial · from €50/month after · see plans