The problem nobody looks for
When a CMO opens GA4 on Monday morning, they look at the weekend's revenue. If the number roughly matches what they expect, they move on to ROAS by channel. If ROAS is good, they raise the budget. If ROAS is bad, they cut.
The problem: the revenue shown in GA4 is wrong on most e-commerce sites, and the gap is 10 to 30%, far beyond a 1 or 2% rounding difference. The budget decisions made on that basis are wrong too.
The 5 most common errors
These are the errors we find again and again on WooCommerce and PrestaShop implementations. They are silent: GA4 doesn't flag them, the dataLayer doesn't crash, no JavaScript error shows up.
| Error | Frequency | Impact on GA4 revenue | Native GA4 detection |
|---|---|---|---|
| Tax-inclusive amount sent instead of net | Very common | +20% (French VAT) | None |
currency parameter missing | Common | Revenue shown = €0 | None |
purchase fired twice | Common | +100% on duplicated transactions | None |
Shipping fees included in value | Frequent | +5 to 15% | None |
transaction_id missing or fixed | Frequent | No way to deduplicate | None |
Error 1: tax-inclusive instead of net
This is the most widespread error. WooCommerce plugins send the tax-inclusive amount in the value field of the purchase event by default. The CMO compares that amount with the net revenue in the back office and sees a 20% gap (20% VAT). Often they put the gap down to "differences between tools" and don't dig further.
Concrete impact: on €100,000 of monthly net revenue, GA4 shows €120,000. The calculated ROAS is 20% too optimistic. Budgets get raised on campaigns that don't perform as well as everyone thinks.
Error 2: the missing currency parameter
Google Analytics 4 requires a currency parameter on every purchase event. Without it, GA4 accepts the event but assigns no revenue. The event shows up as a conversion, but with a value of zero.
The trap: the "Conversions" report shows the right number of transactions. The "Revenue" report shows zero. If nobody compares the two, the problem goes unnoticed for weeks.
On PrestaShop, the official GA4 module sometimes omits currency when the default currency isn't set in the module settings. On WooCommerce, some custom themes overwrite the dataLayer before the GA4 plugin runs.
Error 3: double firing
The classic scenario: the user lands on the confirmation page. The purchase event fires. The user refreshes the page (or clicks "back" and then returns). The event fires a second time.
Without a unique transaction_id and without deduplication logic in GTM, every reload creates a new transaction in GA4. On a site with 5,000 transactions/month, if 8% of users reload the confirmation page, that's 400 ghost transactions and revenue inflated by 8%.
Error 4: shipping fees in the value
Many e-commerce plugins include shipping fees in the value field. That's technically correct according to Google's documentation, but it creates a systematic gap with the product revenue in the back office.
With average shipping fees of €6.90 and an average order value of €85, GA4 revenue is inflated by 8.1%. On €500,000 of annual revenue, that's a €40,500 gap.
The knock-on effect on Smart Bidding
Wrong revenue in GA4 doesn't stay in GA4. It feeds straight into bidding strategies:
- The target ROAS is calculated on inflated revenue
- Google Ads thinks the campaigns are performing better than they really are
- Bids go up, CPC rises
- Real ROAS drops, but reported ROAS stays stable
- Budget is maintained or increased on campaigns that are losing money
For a paid budget of €50,000/month with revenue inflated by 20%, the estimated overspend is €8,000 to €12,000/month: budget allocated to campaigns whose real ROAS doesn't justify the investment.
How to detect these errors
GA4 won't warn you. Here are the signals to watch:
Signal 1: a persistent gap with the back office. If GA4 consistently shows 15-25% more than your ERP, it's probably tax-inclusive vs net amounts or shipping fees included.
Signal 2: conversions without revenue. In the GA4 exploration report, compare the number of purchase events with total revenue. If revenue is zero or abnormally low, the currency or value parameter is probably missing.
Signal 3: duplicated transaction_ids. Export your purchase events through BigQuery and count duplicate transaction_id values. Above 2%, you have a deduplication problem.
Korvus automates this detection. The checkout_zero alert fires when purchase events come in with a value of 0 or null. Korvus also compares amounts against historical baselines to catch anomalies in both directions: a sudden spike (likely duplicate) or a collapse (missing parameter).
The fix plan
Immediate (day 1): Check the currency parameter in your dataLayer. Open the console, place a test order, inspect the purchase event. If currency is missing, fix that first.
Short term (week 1): Compare GA4 revenue with your ERP over the last 30 days. A gap above 5% justifies a dataLayer audit. Check tax-inclusive vs net amounts and whether shipping fees are included.
Medium term (month 1): Implement deduplication logic on the confirmation page (cookie or sessionStorage holding the transaction_id). Turn on the BigQuery export to audit duplicates regularly.
Key takeaways
- GA4 revenue is inflated by 10 to 30% on most WooCommerce and PrestaShop sites
- The 3 main errors: tax-inclusive instead of net, missing
currency, double firing - GA4 flags none of these errors, so you have to go looking for them
- The knock-on effect on Smart Bidding can cost €8,000 to €12,000/month in misallocated budget
- Real-time monitoring of conversion amounts is the only way to catch regressions from the very first abnormal event