GA4 says £42,000. WooCommerce says £38,000. Facebook says it drove £31,000 by itself. One of these is right. The other two are wrong in specific, explainable ways — and the right number is almost always the one nobody highlights on a dashboard: the confirmed WooCommerce order.
Across the average WooCommerce store, those numbers can diverge by 30% or more (industry tracking audits, 2024). That’s not a rounding error. That’s the difference between “great month” and “cut the ad budget.” If you’ve ever opened three tabs and felt your stomach drop at three different totals, this is why.
Why You Have Three Different Revenue Numbers
Three systems, three jobs, three counting methods. Each one is internally consistent. None of them were designed to agree with the others.
GA4 under-reports
GA4 runs in the browser. That means it’s fighting ad blockers (31.5% of global users, Statista 2024), Safari’s 7-day cookie cap (WebKit, current), and iOS Mail privacy. If a customer clicks an email on iPhone, turns off JavaScript, or installs uBlock, GA4 never sees them. The sale still happens — WooCommerce still processes the order — but GA4’s revenue total goes down.
On a typical WordPress site (and WordPress is 43.5% of the web, W3Techs 2024), the gap between GA4 and actual orders sits between 20% and 30%. That’s not a bug. That’s what client-side tracking looks like in 2026.
Facebook over-reports
Facebook’s Ads Manager isn’t measuring reality. It’s measuring attribution — which is a different thing. Its default 7-day-click / 1-day-view window credits any conversion that happens after an ad impression, even if the customer would have bought anyway.
If a returning customer sees your Facebook ad Tuesday and buys organically via a Google search on Thursday, Facebook claims that sale. So does Google Ads. Add up every platform’s self-reported revenue and you’ll often exceed your actual total by 40-60%. That’s not fraud — it’s just how attribution windows overlap.
WooCommerce records the truth (mostly)
WooCommerce doesn’t estimate. It records confirmed orders with paid gateway callbacks. If the money hit your merchant account, WooCommerce has it. If it didn’t, WooCommerce doesn’t. That makes the WooCommerce order log the only tier-1 source of truth in the whole stack.
“Mostly” because WooCommerce still has edge cases: refunds posted in a later period, failed payments captured on retry, subscription renewals landing in a different month. But these are small adjustments — single-digit percentages, not 30%.
Which Number Is Right? The One Tied to a Real Transaction
A confirmed WooCommerce order with a successful payment gateway response is the unit of truth. Everything else is an estimate of how that order happened.
GA4 tries to estimate which session produced the order. Facebook tries to estimate which ad influenced it. Google Ads tries to estimate which keyword drove it. All three are running probabilistic models on incomplete data. The order either exists or it doesn’t.
So the first question to ask is never “which platform is right?” The real question is “what was the actual revenue?” — and that answer lives in WooCommerce. The platforms aren’t competing to tell you what happened. They’re competing to claim credit for it.
You may be interested in: Bad Data Is Costing Your WooCommerce Store More Than You Think
The Single Source of Truth Problem
Knowing WooCommerce has the true revenue number doesn’t solve the harder problem: where did it come from? WooCommerce doesn’t know which ad drove a sale. GA4 does — partially. Facebook does — in its own biased way. Google Ads does — in its own biased way.
This is the real problem. Your source of truth for revenue (WooCommerce) is different from your source of truth for attribution (scattered across GA4, Facebook, Google Ads). Until those two live in the same table, every marketing decision is a guess.
What a single source of truth actually requires
- One system that holds every event: page views, add-to-carts, checkouts, and orders — all in the same place, at the same grain, with the same IDs.
- Server-side capture: events sent from your server, not the browser, so ad blockers and ITP can’t selectively delete them.
- First-party identity: a customer ID that ties a first-touch UTM to a final paid order, even across devices.
- Raw, not sampled: every event preserved at row level, not aggregated into a dashboard bucket you can’t drill into.
There’s really only one system that does all four without costing enterprise money: BigQuery, populated by server-side first-party events.
Why BigQuery Ends the Argument
BigQuery is Google’s managed columnar data warehouse. The interesting part for WooCommerce stores is what it doesn’t do: it doesn’t have a commercial interest in inflating your numbers. It’s a neutral table. You put events in. You ask questions. You get answers.
Once your BigQuery holds every WooCommerce order (from the server, so it’s complete), every session with UTM parameters (from the server, so it’s not missing 30%), and every user identifier that links sessions to orders, the analytics argument collapses.
You stop asking “what does GA4 say?” and start asking “what actually happened?” Total revenue becomes a one-line query. Revenue by UTM source becomes a one-line query. Revenue by campaign minus Facebook’s self-claims becomes a one-line query.
The platforms keep reporting their own versions — that’s fine, let them. But those numbers become diagnostics, not decisions. Your decisions come from the table that matches your bank account.
You may be interested in: The Intelligence Layer: BigQuery + Claude as a WooCommerce Co-Pilot for Business Decisions
How to Actually Get This Running
The gap between “BigQuery solves this” and “your BigQuery is actually populated” is where most stores stall. You need three things working together: event capture on WordPress, a server that cleans and routes the data, and a streaming insert into BigQuery. GTM Server can do it. Enterprise CDPs can do it. Both are overkill for most SMB stores.
Transmute Engine™ is a first-party Node.js server that runs on your own subdomain (e.g., data.yourstore.com). The inPIPE WordPress plugin captures WooCommerce events and sends them via API to your Transmute Engine server, which streams raw event rows into BigQuery — alongside simultaneous routing to GA4, Facebook CAPI, and Google Ads. The BigQuery table is complete because the events never touched a blockable browser pipeline.
Key Takeaways
- Three different revenue numbers is the default, not a bug. GA4, Facebook, and WooCommerce were never designed to agree.
- Only WooCommerce orders with confirmed payments are tier-1 truth. GA4 and ad platforms are estimates layered on top.
- GA4 typically under-reports by 20-30% because of ad blockers (31.5% of users, Statista 2024) and Safari’s 7-day cookie limit.
- Ad platforms collectively over-report by 40-60% because attribution windows claim sales they didn’t drive.
- BigQuery populated by server-side first-party events is the only neutral layer that can answer “what actually happened?” without platform bias.
Frequently Asked Questions
Treat WooCommerce as the source of truth for revenue. Export confirmed orders by date, then match order IDs to GA4. Expect GA4 to be 20-30% lower on a typical WordPress site due to ad blockers and Safari’s ITP. The permanent fix is streaming server-side events into BigQuery so both numbers sit in the same table and every discrepancy is traceable to a specific missing session.
Facebook uses a 7-day-click, 1-day-view attribution window by default. It claims any conversion that happens after a user saw or clicked an ad, even if the purchase would have happened anyway. A returning customer who sees your ad Monday and buys via Google search Wednesday counts as a Facebook conversion. Total self-reported ad revenue across platforms often exceeds actual revenue by 40-60%.
A single source of truth is one data layer that holds every event — page views, carts, checkouts, orders — at row level, with consistent IDs, captured server-side so it can’t be blocked. For a WooCommerce store, this is BigQuery populated by first-party server-side tracking. Platform reports (GA4, Facebook, Google Ads) become diagnostics, not decision sources.
BigQuery has no commercial interest in inflating or deflating numbers. When you stream every WooCommerce event into BigQuery from a server-side pipeline, you end up with one table containing the complete, unbiased record. Revenue by UTM, revenue by campaign, customer LTV by channel — all become single queries against the same grain of truth. Platform reports still exist, but they stop being the answer.
No. Keep both. GA4 is useful for real-time dashboards and audience building. Facebook’s Ads Manager is essential for ad delivery. What changes is their role: they go from authoritative revenue reports to diagnostic tools. Your actual revenue number, and the decisions you make with it, come from WooCommerce and BigQuery — the two systems with no incentive to mislead you.
The Bottom Line
Stop trying to make three platforms agree. They won’t, and they shouldn’t have to. Build one layer they all pour into, and ask your questions there.
Ready to end the argument between your dashboards? Start at seresa.io.
