Tracking
Why your GA4 numbers don't match your bank account.
By Felix Grant4 min read
GA4 counts what a browser reports and what consent allows. Your bank counts money that actually arrived. Refunds, tax, shipping, currency, blocked tracking and payments that happen off the site all pull the two apart. A gap is normal. An unexplained gap is the problem, and it can be fixed.
Why
Why they will never be identical
GA4 and your accounts answer different questions. GA4 asks what happened on the website, as reported by a visitor's browser. Your accounts ask what money the business received, net of everything that went back out. Those are two different measures of the same customers, so they will always disagree by some amount.
The mistake we see most often is treating any gap as proof that tracking is broken. The opposite mistake is just as common: a team gets used to a 20% gap, stops asking why, and makes budget decisions on numbers nobody trusts. The useful question is not why they don't match, but whether you can explain every pound of the difference.
Causes
The usual causes
Consent comes first. In the UK, analytics cookies need consent. If a visitor declines, GA4 either records nothing or, with consent mode, sends a cookieless ping that Google models rather than counts. Ad blockers and privacy browsers remove more. Measure this on your own site rather than trusting an industry average.
Refunds come next. GA4 records the purchase when it happens. If the order is refunded next week, GA4 still shows the original revenue unless you send a refund event. A business with a 10% return rate will see a gap of roughly that size from this alone.
Then check what your purchase event actually sends as its value. Some setups include VAT and shipping, others exclude one or both, and discount codes are handled differently again. If Finance reports net and GA4 reports gross, the two will never line up however good the tracking is. Currency adds a little more, because GA4 converts at its own daily rate while your payment provider uses its own.
Duplicate and missing purchase events are common, and both can happen on the same site at once, which hides the problem in the totals. Payments that leave the site, such as PayPal, Klarna or a card security check, can stop a sale reaching GA4 if the customer does not return cleanly. Phone orders, invoices and trade accounts appear in your accounts but were never on the website. And time zones matter: compare the same dates, in the same time zone, by order date rather than settlement date.
Close enough
What close enough looks like
There is no universal acceptable gap. A subscription business taking card payments on site should get very close. A business with phone orders, trade accounts and three payment providers will always show a larger raw difference.
The better test is whether the gap is explained and stable. Build a simple reconciliation for one month. Start with GA4 revenue for the same dates and time zone. Take off tax and shipping if GA4 includes them, and refunds in the period. Add offline and manual orders, and orders with no purchase event, found by matching your order export to GA4 transaction IDs. Allow for currency. What is left is the unexplained difference.
If that line is small and similar month to month, your tracking is doing its job. If it is large or jumps around, something is broken, and the lines above tell you where to look.
A gap is normal. An unexplained gap is the problem.
Examples
What this looks like in practice
On one Shopify Plus store, we reconciled reported revenue to the Finance figures within £2. The work was not clever. We matched every order in the platform export to a GA4 transaction ID, then worked through each mismatch by cause, starting with tax and shipping settings, then refunds, then the orders that never sent a purchase event. Once each difference had a name, the remaining gap was small enough to ignore.
The result that mattered was not the £2. It was that marketing and Finance stopped quoting different figures in the same meeting.
For an online learning company, the same kind of match found 552 purchases that GA4 had never counted. Missing purchases change everything downstream. Ad platforms optimise on the conversions they can see, so channels that work look weak and budgets move the wrong way.
Checklist
A checklist you can run this week
Compare one full month of GA4 revenue with your platform's order export, using the same dates and time zone. Check whether the purchase value includes VAT and shipping, and match it to how Finance reports.
Count the orders in the export with no matching GA4 transaction ID and group them by payment method. Look for transaction IDs that appear more than once. Confirm refunds are sent to GA4, or exclude them from the Finance figure when comparing.
Test every payment route that leaves the site, end to end. Write down which order types never touch the website, so nobody expects them in GA4. Then repeat next month and check the unexplained line is stable.
Will server-side tracking fix the gap? It can reduce losses from ad blockers and some browser limits. It does not override consent, and it does not fix a purchase event that sends the wrong value. Fix the basics first. If your teams quote different revenue figures, our Discover audit at £1,950 reconciles one month line by line and tells you what to fix first.
Key takeaways
- GA4 measures browser activity; your bank measures money received
- Consent, refunds, tax settings and off-site payments cause most gaps
- Aim for a gap you can explain and that stays stable, not zero
- Match orders to GA4 transaction IDs and group the missing ones by cause
- Fix the purchase event before reaching for server-side tracking

Written by
Felix Grant
Founder of Kitebox, a business technology and AI consultancy that builds what it recommends. Based in Mallorca, working with UK businesses.
About Felix →