Free Shopify store auditSpeed, SEO and conversion leaks — no cost, no obligation.
Claim it
Thriftizer Solutions LLPShopify Select Partner
Book a Growth Audit
Analytics Aug 14, 2026 9 min read

GA4 vs Shopify Purchase Numbers: 7 Reasons They Don't Match

A 3-8% gap between GA4 purchases and Shopify orders is normal. Here are the seven causes, the tolerance range for each, and the order to check them in.

A 3-8% gap between GA4 purchases and Shopify orders is normal. Below 3% you are looking at rounding noise and should leave it alone. Above 10% you have a real tracking problem and it is almost always one of seven things. That is the short answer to the ga4 shopify data discrepancy question, and if you close the tab now you have got the most useful part.

The longer answer matters because the direction of the gap tells you which cause you are dealing with. GA4 under-counting points to consent, ad blockers or a script that fires too late. GA4 over-counting points to duplicate events, a refresh-friendly thank-you page, or test orders you forgot about. Most founders we talk to have never checked which way their gap runs. They just know the numbers are different and it makes them distrust both.

Set your tolerance before you start debugging

Pick a two-week window that does not include a sale, a festive spike or a theme deployment. Pull Shopify orders from Analytics > Reports > Sales over time. Pull GA4 purchases from Reports > Monetisation > Ecommerce purchases. Compare counts, not revenue, on the first pass, because revenue introduces currency and tax questions that muddy the diagnosis.

Say Shopify shows 1,140 orders and GA4 shows 1,061 purchases. That is a shortfall of 79, or 6.9% of Shopify's count. Inside tolerance. Annoying, but not worth a week of engineering time. If GA4 showed 890, the gap is 250 orders or 21.9%, and something is structurally broken.

One more habit worth building: check the gap monthly and write the number down. A stable 6% that suddenly becomes 14% after a theme update is a far more useful signal than an absolute number you look at once.

If you run a cookie consent tool with GA4 in blocking mode, every visitor who ignores or declines the banner disappears from your purchase count while their order still lands in Shopify. On EU and UK traffic this alone can account for 15-30% of missing purchases depending on how aggressive your banner is. Consent Mode v2 recovers some of it as modelled conversions, but modelling needs volume, and a store doing a few hundred EU orders a month will not get much of it back.

Indian traffic behaves differently. Most Indian stores run a notice-only banner rather than a blocking one, so the consent-driven loss is small, usually under 2%. If you sell to both India and the EU from one store, look at the gap by country before you conclude anything. We have seen a store with a 4% gap on Indian traffic and a 26% gap on German traffic report a blended 9% and go hunting for a tag problem that did not exist.

Tolerance: 0-3% for India-only traffic, up to 20% for EU-heavy traffic with a blocking banner. Investigate if your India-only gap crosses 5%.

2. Ad blockers and browser tracking prevention

Safari's Intelligent Tracking Prevention, Firefox's Enhanced Tracking Protection and browser extensions all drop the GA4 request before it leaves the device. Nothing appears in GA4. The order still exists in Shopify.

The loss scales with your audience. A store selling developer tools or privacy hardware loses a lot. A store selling ethnic wear to a mostly mobile Chrome-on-Android audience loses very little, because the Android Chrome share in India means most of your traffic runs a browser that does not block by default. Rough working figure from what we see: 2-5% on Indian D2C, 5-12% on US and UK traffic where iOS share is higher and extension use is more common.

Server-side GTM recovers part of this by moving the request to your own domain. It is not free, it needs a tagging server, and it is worth doing when you are spending enough on paid media that a 6% blind spot changes bidding decisions. Below roughly ₹5-8 lakh a month in ad spend, we usually tell people to accept the gap and move on.

Tolerance: 2-5% India, 5-12% Western markets. This one you mostly live with.

3. Shopify's checkout extensibility broke your old script

This is the biggest single cause of a sudden GA4 Shopify data discrepancy on stores that have been running for years. Additional scripts on the order status page are gone for Checkout Extensibility. If your GA4 purchase event was firing from a snippet pasted into that box, it stopped working when your store migrated, and nobody told you.

The symptom is unmistakable: purchases go to near zero or drop by 60-90% overnight while sessions and add-to-carts look completely normal. Check the date the drop started and match it against your checkout upgrade.

The fix is the customer events pixel in Shopify admin, under Settings > Customer events, or the native Google & YouTube channel app if your needs are simple. A web pixel runs sandboxed, which means the old habit of reading the global dataLayer or poking at window variables does not work. You get the event payload Shopify hands you and nothing else. If your tracking depended on custom variables you set on the thank-you page, you will need to rebuild that with pixel-scoped code, and it is a real piece of work rather than a copy-paste job. Our Shopify developers spend a fair chunk of every month on exactly this migration.

Tolerance: zero. A drop of this shape is a broken implementation, not variance.

4. Duplicate purchase events, which look like a completely different problem

Now the opposite failure. GA4 shows more purchases than Shopify. Almost always duplication, and there are three usual sources.

You have GA4 installed twice, once through the Google & YouTube channel and once through a hardcoded gtag in theme.liquid or a GTM container. Both fire on purchase. Every order counts twice.

Or the event fires on page load of the order status page without a transaction ID deduplication, and customers refresh, revisit from their order confirmation email, or come back to check their tracking. Each visit is a new purchase. GA4 does deduplicate on transaction_id inside a fairly narrow window, so this shows up more as a partial inflation than a clean doubling.

Or an app added its own analytics integration and you forgot. Reviews apps, upsell apps and subscription apps all do this.

The test takes five minutes. In GA4, open the purchase event, add transaction ID as a dimension and sort by event count. If any order ID shows two or more events, you have duplication. Genuine orders appear once.

Tolerance: zero duplicates. Any transaction ID with a count above one is a bug.

5. Timezone and attribution windows

Shopify reports in the store's timezone. GA4 reports in the property's timezone. If your store is set to IST and someone set the GA4 property to America/Los_Angeles during setup, every daily comparison is off by 13.5 hours and your day boundaries do not line up. Monthly totals mostly wash out. Daily comparisons look chaotic.

Separately, GA4's default reports credit a conversion to the session in which it happened, but the advertising reports use a data-driven attribution model with a 90-day window. So a purchase event count and a "conversions" figure in an acquisition report will not match each other either, let alone match Shopify. When someone tells us their GA4 numbers are wrong, a third of the time they are comparing two different GA4 metrics without realising.

Tolerance: daily variance of 5-15% from timezone alone if the settings differ. Fix the timezone, then re-measure. Compare monthly, not daily.

6. Draft orders, POS, cancellations and test transactions

Shopify counts things GA4 will never see. Draft orders converted manually in admin. POS orders from your Bengaluru store or an exhibition stall. Orders created through the Admin API by a wholesale or ERP integration. Anything that does not pass through the online checkout produces no browser event.

If you run POS at all, split it out before you compare. A brand doing 200 online and 60 POS orders a month will see a 23% gap that is entirely correct.

Cancellations and refunds cut the other way. Shopify's sales reports net out refunds by default depending on the report you pick. GA4 keeps the original purchase unless you send a refund event, which most stores do not. And on COD-heavy Indian stores this gets large fast: a 25-30% RTO rate means Shopify's net revenue and GA4's purchase revenue will diverge badly by the end of the month even when the tracking is perfect.

That last point deserves emphasis. If you sell COD in India, GA4 revenue is a measure of orders placed, not money received. Do not use it for financial reporting. Use it to compare channels against each other.

Tolerance: depends entirely on your channel mix and RTO rate. Calculate the expected gap first, then treat the residual as the number to investigate.

7. Slow pages and abandoned thank-you pages

The purchase event needs the page to load and the script to execute. On a heavy theme with eleven apps injecting scripts, a customer on a 3G connection in a tier-2 city may close the tab before the GA4 request fires. This is the quiet one. It never produces a dramatic drop, just a persistent 3-6% that no amount of tag auditing explains.

You can spot it by comparing the gap on mobile versus desktop. If mobile runs 5 points worse than desktop, page weight is part of the story. Fixing it means the same work as fixing conversion rate generally: cut the render-blocking JavaScript, drop the apps you stopped using, get your LCP under 2 seconds. We wrote more about the mechanics in Shopify speed optimisation, and SwiftStore handles the scanning and monitoring side if you would rather not do it by hand.

Tolerance: 2-4%. A mobile-desktop delta above 5 points is worth chasing.

The order to work through it

  1. Check direction. GA4 lower, or GA4 higher? Higher means go straight to duplication.
  2. Match timezones between Shopify and the GA4 property. Then wait a week and re-measure.
  3. Subtract POS, draft and API orders from Shopify's count. This is your comparable base.
  4. Add transaction ID as a dimension in GA4 and look for repeats.
  5. Segment the gap by country and by device. Country isolates consent. Device isolates page weight.
  6. If the gap appeared suddenly, find the date and check what shipped that week.

Six steps, maybe three hours if your GA4 access is in order. Most stores find their answer at step 4 or 5.

What number to actually trust

Shopify's order count is the truth for revenue, tax and inventory. It sits at the source. GA4 is the truth for relative channel performance, because whatever loss rate it has applies roughly evenly across channels, so the ratio between Google and Meta and organic stays meaningful even when the absolute number is 7% light.

Stop trying to reconcile them to zero. We have never seen a store where that was possible, and the effort is better spent on the funnel steps where GA4 is genuinely reliable: which collection pages leak, where mobile users drop off, which search queries return nothing.

If your gap is above 15% and the six steps above have not found it, send us the two numbers and the date range. A free audit covers the tracking setup along with everything else, and a broken purchase event is usually visible in the first twenty minutes.

Previous postNext post

Ready to scale your D2C brand profitably?

Let's build a growth engine that drives more traffic, more conversions and more profit.

Book a Growth Audit
📅 Free Audit💬 WhatsApp