Why your GA4 and Shopify numbers don't match (and how to fix it)
If your Google Analytics 4 revenue never quite matches what Shopify says you actually made, you're not going mad, and you're not alone. A gap is normal. A big gap is a problem. Here's what causes it, how to work out which one is hitting you, and how to fix it properly.
The short answer
GA4 and Shopify are counting two different things. Shopify records orders it actually processed. GA4 records purchase events that fired in the browser and made it back to Google. Those two numbers are measured in different timezones, with different rules, and with different amounts of data loss along the way. A difference of a few percent is expected. Once you're regularly seeing 10, 20, 30 percent or more, something is broken and it's quietly distorting every decision you make from that data.
The 7 real reasons they don't match
1. Different timezones and reporting windows
Shopify reports in your store's timezone. GA4 reports in the timezone set on the property, and it credits revenue to the session's attribution date, not the order date. If those don't line up, a sale near midnight lands on different days in each tool. Always the first thing to rule out.
2. GA4 is undercounting (ad blockers and iOS)
The GA4 tag runs in the browser. Ad blockers, iOS tracking protection and privacy extensions stop it firing for a big share of visitors, often a quarter or more. Those real orders show in Shopify but never reach GA4. This is usually the single biggest source of a persistent gap.
3. GA4 is overcounting (the purchase event fires twice)
The opposite problem, and a nasty one. If your theme or apps fire the purchase event more than once, GA4 counts the same order twice. Your revenue and ROAS look better than reality, right up until the numbers stop matching the bank. Very common on themes that have been edited or have several tracking apps installed.
4. Missing or duplicate transaction IDs
GA4 uses the transaction_id to dedupe orders. If it's missing, blank, or not unique, GA4 can't tell repeat events apart and your counts drift. This also breaks deduplication between your browser pixel and any server-side events.
5. Consent mode is blocking your tags
If you have a cookie banner but consent mode isn't set up properly, tags can be blocked outright instead of throttled. In the EU and UK that can silently remove a big chunk of your measured revenue the moment someone ignores the banner.
6. Refunds, tax and shipping counted differently
Shopify's headline revenue and GA4's purchase value often include different combinations of tax, shipping and discounts, and refunds are handled differently again. Some of your gap is just definitions, not lost data. Worth separating out before you go hunting for a technical fault.
7. Failed, draft and test orders
Shopify counts orders that GA4 never sees a purchase event for, draft orders, POS sales, manual orders, and orders created by apps. None of those fire a website purchase event, so they'll never appear in GA4.
Not sure which of these is hitting you?
Pop in your domain and we'll show you where your tracking is leaking, in about 10 seconds. Free, no signup.
Check my tracking freeHow to diagnose which one you've got
Work top down:
- Line up the dates. Match GA4's timezone and date range to Shopify's before comparing anything.
- Check the direction. If GA4 is lower than Shopify, you're losing data (ad blockers, iOS, consent, blocked tags). If GA4 is higher, you're double-counting (duplicate events).
- Inspect one order end to end. Place a test order and watch the purchase event fire. Firing zero times, or more than once, tells you a lot immediately.
- Check transaction_id. Confirm every purchase event carries a unique one.
- Test with the banner. Decline cookies and see how much tracking survives.
How to actually fix it
The permanent fixes are the same ones that make all your ad platforms more accurate too:
- Server-side tracking (a clean GA4 + server setup) so ad blockers and iOS stop eating your data.
- A single, correct purchase event with proper deduplication so nothing fires twice.
- Consent Mode v2 set up so you stay compliant without throwing away measurable revenue.
- A clean data layer so every event carries the right value and a unique transaction_id.
Done properly, GA4 and Shopify land within a few percent of each other, and stay there. More importantly, the same clean data flows to Google, Meta and TikTok, so your ad platforms finally optimise on real numbers instead of a distorted picture.
Want it checked and fixed by hand?
We run an advanced audit of your live tags and conversions, tell you exactly what's wrong in plain English, and give you a fixed quote for the fix. Guaranteed, and the audit comes off any build.
See how it works & pricingDatahound are analytics and ad-tracking specialists. We fix broken GA4, Google Tag Manager and server-side tracking for ecommerce and lead-generation businesses so every sale, form and call gets counted. Back to datahound.agency