Why your GA4 ROAS is lying to you — and how to find the real number
Every few weeks a founder tells us some version of the same thing: "Google says we're at 3x, Meta says we're at 5x, and my accountant says we barely broke even. Who do I believe?"
The uncomfortable answer is: none of them, exactly. Not because anyone is cheating, but because the ad platforms and GA4 are measuring something different from the number you actually care about — money that landed in your account.
What GA4 and the ad platforms actually count
Ad platforms optimize toward the event you send them. For most stores that event is a pixel-fired "purchase" or "lead" — a click, a form submit, a checkout that fired in the browser. That's a fine proxy. It is not revenue.
Three things quietly break the link between that proxy and real money:
- Attribution windows overlap. Meta claims a conversion in its window, Google claims the same one in its window. Add them up and you've "sold" the same order twice.
- Browser tracking leaks. Ad blockers, iOS privacy, consent banners, and cookie loss mean a real chunk of purchases never fire a pixel at all — so the platform undercounts, then models the gap with its own guesses.
- The sale isn't the close. If you have returns, cancellations, partial refunds, or an offline/sales-assisted close, the pixel value and the booked value are simply different numbers.
Why the offline gap is the biggest one
For businesses with any human involvement in the sale — B2B, high-ticket, quote-based, showroom, or sales-assisted ecommerce — the real revenue lives in the CRM or ERP, not in the ad pixel. The platform sees a lead. It never sees whether that lead closed for $200 or $20,000, or churned in 30 days.
Optimize on the pixel and you train the algorithm to buy cheap leads. Optimize on closed revenue and you train it to buy customers. Those two strategies spend your budget in completely different places.
How to find the real number
Reconciling to true ROAS is less about a magic tool and more about connecting three systems that don't naturally talk to each other:
- Send closed revenue back as the conversion. Instead of firing a fixed pixel value at checkout, feed the actual booked/closed value from your CRM or ERP back to the platforms via server-side conversions (CAPI for Meta, offline conversions for Google). Now the algorithm optimizes on money, not clicks.
- Reconcile in one place. Land ad spend, platform-reported conversions, and real revenue in one warehouse (BigQuery works well), joined on order or lead ID with a sane date window. The moment they sit in one table, the double-counting and the leakage become visible instead of theoretical.
- Pick one source of truth for the denominator. Decide once whether ROAS is measured against pixel value or booked value — and report it the same way everywhere. Most of the "Meta says 5x, accountant says 1x" confusion is just two teams quietly using two different definitions.
What changes once you do
The first time a brand sees reported vs. real side by side, the reaction is almost always the same: a mix of relief and mild horror. Relief because the numbers finally reconcile; horror because they've been steering spend with the wrong dashboard for months.
But that's the win. Once bidding runs on closed revenue, the platforms stop chasing cheap conversions and start finding buyers — and the gap between what the dashboard says and what the bank says quietly closes.