Every business running ads eventually notices that no two systems agree. The instinct is that something is broken. Usually nothing is — they are measuring different things by design.
Why the numbers never match
Attribution windows
Meta might count a conversion up to seven days after a click and one day after a view. Google counts differently. Your analytics counts last non-direct click. The same sale is counted by different systems under different rules.
View-through conversions
Meta may credit a sale to an ad that was seen but never clicked. Your analytics will never attribute that to the ad. Neither is wrong; they answer different questions.
Cross-device
Someone sees the ad on a phone and buys on a laptop. Platforms with logged-in users can connect those. Cookie-based analytics generally cannot.
Blocking
Ad blockers, browser tracking prevention and consent banners stop client-side events firing. Analytics undercounts; the platform's own signal often survives better.
Which number to believe
Establish one source of truth and judge everything against it: your actual revenue — orders in your store, invoices in your accounts, money in your bank.
Then use platform numbers for relative decisions. Meta over-reporting by 40% consistently is still perfectly usable for comparing ad A against ad B, because the bias applies to both.
Building tracking worth having
1. Define the conversions first
Write down what counts before implementing anything. "Purchase" is obvious; "lead" needs a definition. A form submission and a qualified enquiry are different events, and conflating them makes the whole dataset useless.
2. Fire events server-side where you can
Client-side pixels are blocked, throttled and lost. Server-side events — Meta's Conversions API, Google's equivalent — report from your server after the event genuinely happened. More reliable and harder to inflate.
3. Deduplicate
If you run both client and server events, send a shared event ID so the platform counts one conversion rather than two. Skipping this is a common cause of impossible-looking ROAS.
4. Pass values, not just counts
A conversion without a value cannot tell you whether a campaign is profitable. Send the order total, and the currency.
5. Test before you trust
Place a real order. Confirm it appears in the platform, in your analytics and in your order system. Do it again after every site change — migrations break tracking silently and you find out a month later.
Consent changes the picture
Where consent is required, visitors who decline should not be tracked. That is correct behaviour, and it means your data covers a subset of visitors.
Consent mode lets platforms model the gap rather than ignore it. Configure it properly rather than treating the missing data as breakage.
What goes wrong
- Pixel on the thank-you page only, which a single-page checkout may never load.
- Test orders counted in live data.
- Refunds never subtracted, so ROAS overstates permanently.
- Two tracking systems installed after an agency change, double-counting everything.
- Nobody re-tested after a redesign.
If your ads look like they stopped working, check this before you rebuild the campaigns: why your Facebook ads stopped delivering.