Every Shopify merchant who opens GA4 eventually asks the same question: why does GA4 say I made less (or more) than Shopify does? The honest answer is that they will never match exactly, and they're not meant to. Shopify records every order. GA4 records what a tag in a browser managed to send, and only for visitors who allowed it.
The useful question is whether your gap is normal or a sign that something is broken. This guide walks through both, then gives you a simple reconciliation routine.
Start with the right mental model
Treat Shopify as the source of truth for how many orders and how much revenue. Treat GA4 as the source for where those shoppers came from and how they behaved, measured on a consented sample. You want GA4 to be a consistent, explainable sample of reality. It doesn't need to be a perfect copy.
Normal reasons GA4 shows fewer purchases
1. Cookie consent
If your banner works properly, visitors who reject analytics aren't measured normally by GA4. With Consent Mode in basic mode they're not measured at all. In advanced mode Google may model some of them, but only if your property meets Google's traffic thresholds, which many small stores don't. How many people reject depends heavily on your banner design and audience, so measure your own baseline rather than relying on someone else's figure.
2. Ad blockers and browser tracking protection
Some browsers and extensions block Google Analytics requests outright. You can't fix this in the browser, and you shouldn't try to sneak around a user's choice.
3. Orders that never touch the online store
Shopify POS sales, draft orders created by staff, phone orders, some subscription renewals and marketplace orders all show up in Shopify but never trigger a website purchase event. Filter your Shopify figures to the Online Store sales channel before comparing.
4. Time zones and processing delays
If your GA4 property's time zone differs from your Shopify store's, orders near midnight land on different days. Daily figures then wobble even when weekly totals agree. GA4 can also take a day or two to fully process data, so don't reconcile yesterday.
5. Revenue definitions
Your GA4 purchase value may or may not include VAT, shipping or discounts, depending on how it's sent. Shopify's reports split these out. If you compare the wrong figures, revenue looks off even when order counts match. Refunds are another trap: Shopify's net sales subtract them, but GA4's purchase revenue doesn't unless refund events are sent.
Not sure what your store fires before consent?
Send us your URL and we'll run a free homepage pre-consent scan: which trackers and cookies load before a shopper chooses. No obligation.
Get my free scan Use the free checklistSigns your tracking is actually broken
GA4 shows more purchases than Shopify
This is almost never normal. The usual causes are:
- Double tagging: GA4 installed through the Google & YouTube app and through GTM or hard-coded theme code.
- Thank-you page reloads: the purchase event fires again when the shopper refreshes or revisits the order-status page.
A sudden drop on a specific date
If capture was steady and then fell sharply, look at what changed that day: a theme update, a new app, a consent app change, or a checkout change. Shopify's move from legacy checkout scripts to Checkout Extensibility caught many stores out. Purchase tracking that lived in the old "Additional scripts" box has to be rebuilt as an app pixel or a custom pixel in Settings › Customer events.
A very large, steady gap
A gap far bigger than consent and ad blockers could explain usually means a tag is blocked permanently. Common examples are a Consent Mode default stuck at "denied" because the banner never sends its update, or a custom pixel that requires a consent category the banner never grants. As a rough rule of thumb, if GA4 is missing more than about 40% of online orders, check the tagging before blaming consent. Treat that as a prompt to investigate, not a benchmark.
Revenue gap much bigger than the order gap
If GA4 has nearly all the orders but much less revenue, suspect the value itself: tax or shipping excluded, the wrong currency, or a value sent in pence instead of pounds. Compare average order value in both systems. They should be close.
A 30-minute reconciliation routine
- Pick a date range of the last 30 complete days, ending at least two days ago.
- From Shopify: Analytics › Reports, filtered to the Online Store channel. Note orders, gross sales, discounts, tax and shipping per day.
- From GA4: Explore › Free form with dimension Date and metrics Transactions (or Ecommerce purchases) and Purchase revenue.
- Calculate capture = GA4 purchases ÷ Shopify orders for each day and for the period.
- Look at the shape, not just the total. Is it steady? Did it change on a particular date? Is it ever above 100%?
- Match at order level. In GA4, build an exploration with the Transaction ID dimension and export it. Compare with your Shopify order export. Orders missing from GA4 often share a pattern, such as one payment method or one device type. Transaction IDs that appear twice point to duplicates.
- Fix one cause at a time, then re-check two to four weeks later.
Make sure the IDs are in the same format before matching. Shopify's order name (#1001), order number (1001) and long internal order ID are different values, and integrations don't all send the same one.
Quick diagnosis table
| What you see | Most likely cause |
|---|---|
| GA4 purchases above Shopify orders | Duplicate GA4 install or thank-you page reload |
| Steady, moderate gap since the banner went live | Consent working as intended |
| Sudden drop on one date | Theme, app, checkout or consent change |
| Missing orders cluster on one payment method | Gateway redirect skipping the thank-you page |
| Daily numbers wobble, weekly totals fine | Time zone mismatch |
| Order counts close, revenue far apart | Tax, shipping, currency or value formatting |
Make it a habit
Reconcile monthly, and after any change to apps, theme, checkout or consent. A one-page record of "capture was X% last month, Y% this month" is the quickest early warning that tracking has broken. It's much cheaper than discovering it after a quarter of ad spend has been optimised on bad data.
Also check the consent side, because a broken banner and a broken GA4 often go together. Our 10-minute consent audit and Consent Mode v2 explainer cover that half.
Want it checked properly?
The TrackCheck Health Check is a fixed-price review for UK Shopify and WooCommerce stores: a full consent test (before choice, after "Reject all", after "Accept all", including Consent Mode v2 signals), a GA4-vs-orders reconciliation, a prioritised fix list and a recorded walkthrough, delivered in 5 working days.
See Health Check pricing Start with a free scanThis article is technical guidance, not legal advice. Platform menus change; check the vendor's current documentation if a setting has moved.