The revenue reports disagreed by 21%.
An online retailer was using GA4 revenue to judge campaigns despite a gap of approximately 21% against the order system. Duplicate purchase activity, inconsistent refund handling and different revenue definitions made the discrepancy too large to treat as ordinary tracking loss.
Fix how purchases were recorded
Transaction IDs connected purchase events to order records. The data-layer review checked values, currencies and the point at which a successful purchase should fire. GTM logic was inspected for repeated events, including behavior around reloads and the return from payment.
The full checkout journey was tested so a repair at one step would not leave another duplication path intact. Duplicate prevention needed to protect a valid purchase event while stopping repeated credit for the same order.
Agree what revenue means in each report
The team documented tax, refunds, reporting dates and other revenue components. Purchase validation checked the complete journey, including repeated events and missing orders.
Recurring checks compared analytics with the order records and explained the remaining difference. That made a discrepancy something the team could investigate rather than a reason to distrust every campaign report.
Start with what the business actually sold.
Order records provided the reference for revenue. Purchase events were checked for repeated delivery, missing transactions and differences in tax, refunds and reporting dates.
| Difference | Investigation | Appropriate treatment |
|---|---|---|
| Repeated transaction | Match purchase events by transaction identifier | Repair duplicate firing while preserving the valid event |
| Different order value | Check data-layer values, currency and revenue components | Correct the payload or align the definition |
| Refund or period mismatch | Compare financial treatment and relevant dates | Document a consistent record checks rule |
| Legitimate coverage loss | Review consent and browser-related limits | Keep the gap visible rather than forcing equality |
Some reporting differences had a valid explanation. The objective was an understood gap, not a dashboard forced to agree.
Four weeks of checking the records
Within four weeks, the revenue reporting gap narrowed from 21% to 3%, duplicate purchase events fell below 1%, and the teams adopted one documented revenue definition.
After four weeks, the remaining 3% gap was small enough to investigate against documented definitions and known limitations. A duplicate rate below 1% addresses a specific tracking defect; neither number turns GA4 into the financial source of truth.
What the remaining gap means
A zero gap would have been a misleading success criterion. Client-side measurement cannot capture every transaction under every consent and browser condition, whereas duplicate firing and incorrect values are preventable implementation problems.
Transaction-level matching made it possible to inspect the remaining difference without assuming all missing revenue had the same cause.
Campaign decisions became easier to defend once the team could explain the gap transaction by transaction. Matching every dashboard number was less useful than agreeing which revenue definition each decision required.