Why your pixel under-reports at checkout, and what fixes it
7 min readUpdated September 2026
Short answer. A browser pixel only fires when a browser lets it. Blockers, Safari’s tracking prevention and iOS app-tracking prompts remove a slice of your purchases before they are ever counted. Sending the same events from the server, with a shared event id, closes most of that gap.
Where the events go missing
Three separate things eat conversions, and they stack. Content blockers stop the pixel loading at all. Tracking prevention shortens or removes the cookie the pixel needs to tie the purchase back to the click. App-tracking prompts remove the identifier the ad platform used to match the user.
The effect is not an even shave off the top. It falls hardest on the audiences that are most privacy-conscious, which are often the ones an ad platform is optimising towards.
What a conversions API actually does
It moves the report from the buyer’s browser to your server. The purchase is sent directly to the ad platform from a system nobody can block, with whatever matching signals you legitimately hold — hashed email, the click id you captured when they arrived, the order value.
It does not resurrect consent you never had, and it does not invent matches. It reports what did happen, over a channel that does not depend on the buyer’s browser cooperating.
- Meta: Conversions API
- TikTok: Events API
- Google: Measurement Protocol for GA4
- Snapchat and Pinterest: their own conversion endpoints
The mistake everyone makes: counting twice
If the browser pixel and the server both report the same purchase and nothing ties them together, the platform counts two. Your reported ROAS goes up, your bidding gets worse, and it takes weeks to notice.
The fix is an event id: the same identifier on both copies of the event, so the platform keeps one. Every major platform supports it, and every setup that skips it is quietly lying to itself.
In Onyx each purchase carries one event id across every destination, so the browser copy and the server copy collapse into a single conversion.
What to check before you blame the software
Capture the click id when the visitor lands, not at the checkout — by then the parameter is usually gone from the URL.
Send the same value and currency from both sides; a mismatch is treated as a different event.
Use the platform’s own test tool and watch a real purchase arrive once, not twice.
Questions people actually ask
- Does server-side tracking get around consent?
- No. It changes the transport, not the lawful basis. You still need the consent your market requires, and you should send only what you are allowed to send.
- How much do I get back?
- It depends on your traffic mix, and anyone who quotes you a universal number is guessing. The honest answer is that the gap is largest on mobile and iOS traffic, and you should measure your own before and after.
- Do I still need the browser pixel?
- Yes. It carries signals the server does not have, and the platforms deduplicate the pair. Run both with a shared event id.
Want the checkout this guide describes?
Your page, your domain, your payment account, a flat fee per store. You can build the whole thing and see it live before you pay anything.