TroubleshootingGA4
GA4 Revenue Doesn't Match Shopify: Full Diagnosis
Why GA4 revenue never matches Shopify exactly, the acceptable variance vs a real problem, and how to reconcile orders to find the gap.
- Published
- Reviewed
Diagnosis
- Platform GA4
- Usual cause Usually the purchase event, refunds or currency — rarely all three.
- Causes, ranked 5
- How to diagnose it 10
First answer free, within one working day. Describe your case
Sounds familiar?
The symptom
The short version
Direct answer
A small gap between GA4 revenue and Shopify’s Total Sales is structural: attribution-model differences, currency handling, and refund treatment produce some variance even in a correctly configured store.
As a working rule, a gap in the low single digits is usually explainable within an afternoon of checking. A gap that runs into double digits — or keeps growing — points to something specific: missing purchase events on part of the funnel, consent blocking a segment of traffic, or a currency/filter misconfiguration. Finding out which requires matching orders one by one, not comparing two dashboard totals.
Where to look
Causes, ranked
GA4 revenue ≠ Shopify5 causes
-
Missing purchase paths
The most common cause of a large gap. If the purchase event only fires reliably on the standard checkout path, orders completed through Shop Pay, Apple Pay, POS, subscription renewals, or B2B checkout can silently never reach GA4 while still landing in Shopify. -
Consent
If a visitor declines analytics consent, GA4 never receives that purchase event — but Shopify still recorded the order. A store with meaningful EU or opt-out traffic can lose a real share of its purchase data this way without anything being “broken” in the technical sense. -
Refunds
GA4 doesn’t automatically net out a refund unless a refund event is explicitly sent. If Shopify’s revenue figure is net of refunds and GA4’s isn’t, the gap grows with your refund rate. -
Currency and tax configuration
A mismatched currency parameter, or inconsistent inclusion of tax and shipping between the two systems, produces a gap that behaves like a near-constant percentage rather than a shifting count of missing orders. -
Filters
Overly broad internal-traffic exclusions, IP filters, or referral exclusion lists in GA4’s Data Settings can quietly drop real customer sessions, not just staff and testing traffic.
10 steps
How to diagnose it
If the store sells subscriptions, first check whether automatic renewals reach GA4 at all, each under its own transaction_id; the subscription renewal guide explains how I classify them.
- In Shopify Admin, go to Analytics → Reports → Sales over time, and pull total sales and order count for a closed 30-day window.
- In GA4, open Explore → Free form, add the Transactions and Purchase revenue metrics, and read them for the identical date range. The Monetization → Ecommerce purchases report is item-level and has no transaction count.
- Before comparing, check Admin → Property Settings → Time zone in GA4 against your Shopify store’s timezone — a mismatch shifts day boundaries and skews daily comparisons even when totals are fine.
- Export order-level data from Shopify (Orders → Export), keeping order number, timestamp, total price, and financial status.
- Export event-level GA4 data via Explore → free-form exploration, using
transaction_idandpurchase_revenueas dimensions/metrics, or via BigQuery if it’s linked. - Match the two exports by order number /
transaction_id. Flag orders present in Shopify but missing in GA4 — that’s your purchase-path or consent gap. - Check consent state on the purchase event in GA4 → Admin → DebugView during a live test, to confirm whether
analytics_storageis granted before the event fires. - Check Shopify orders filtered by refund status against whether GA4 revenue drops correspondingly for those orders.
- Compare GA4’s property currency (Admin → Property → Currency) against your store’s default currency and any Shopify Markets multi-currency setup.
- Review Admin → Data Settings → Data Filters for internal-traffic or IP exclusions that might be scoped too broadly.
Signal and fix
Decision table
| Cause | Signal you’ll see | Fix |
|---|---|---|
| Missing purchase paths | Shopify order count exceeds GA4 transaction count by more than a few percent; gap concentrated on specific checkout paths | Trace the exact path (Shop Pay, Apple Pay, POS, subscriptions) and confirm the Customer Events pixel actually fires there |
| Consent | Gap correlates with a specific region or a cookie-banner update date | Check Consent Mode default/update signals; confirm analytics_storage is granted before the purchase event fires |
| Refunds | GA4 revenue stays flat when Shopify’s net revenue drops after refunds | Send a refund event to GA4, or exclude refunded orders manually from your reconciliation baseline |
| Currency/tax config | The delta is a near-constant percentage rather than a shifting order count | Align GA4’s currency parameter and property currency with the store; agree on tax/shipping inclusion on both sides |
| Filters | Known real segments (specific regions, referrers) are missing only from GA4 | Review Data Filters and internal-traffic definitions for overly broad exclusions |
A note from Daniilbefore you decide
Should you fix it yourself or bring in help?
You can do the first pass yourself: pulling both exports, checking the timezone and currency settings, and reviewing the Data Filters list is an afternoon of work for anyone comfortable in Shopify and GA4 admin.
Where it gets harder is tracing a specific missing checkout path (which usually means digging into the Customer Events pixel or GTM setup) or diagnosing a consent implementation that’s silently blocking a whole segment.
If the gap is over roughly 5–10% and doesn’t shrink after checking the items above, or if it’s tied to a checkout path you can’t fully trace yourself, that’s the point to bring in a tracking audit rather than keep guessing from dashboards.
— Daniil
Next
If the self-check does not settle it.
The checks above find the cause in most stores. When two or more overlap, an order-level reconciliation is faster than another afternoon spent comparing dashboards.
Tracking Health Check
- Price
- USD 395
- Access
- Read-only
- Timeline
- verdict two working days after the kickoff
What the reconciliation shows for this symptom.
A Health Check reconciles this symptom order by order against your Shopify orders, so the cause is a fact from your own data, not a guess from a dashboard. Real numbers for this symptom are not published yet — ask for the sample report.
Follow the order. Then compare the evidence.
- Real orderOrder ID, amount, currency
- Browser / server eventsConsent, event ID, delivery
- GA4 / advertising platformsReceived events and reporting
- Reconcile the recordsMatch IDs, time windows and definitions
Questions
Questions this symptom raises
How much of a gap between GA4 and Shopify counts as normal?
There's no fixed number that applies to every store — it depends on your currency setup, refund volume, and how much traffic goes through paths GA4 struggles to measure. What matters diagnostically is whether the gap is small and stable (structural) or large and drifting (a sign of a specific broken piece). A gap under roughly 1–2% is rarely worth chasing on its own; a gap in the 10–30% range almost always has an identifiable cause.
Why doesn't GA4 revenue match Shopify's Total Sales even after everything checks out?
They're not measuring the same thing. Shopify's Total Sales is an accounting figure built from order records, including edits made after the fact. GA4 revenue is a purchase event fired at a moment in time, using whatever values were passed then. Even a perfectly instrumented store will show a small, permanent gap between the two.
Should I trust GA4 or Shopify for revenue reporting?
Shopify is the ledger — treat it as ground truth for actual revenue and finance. GA4 is the attribution layer — treat it for channel and campaign performance, not as a second finance system. Reconciling them tells you how much you can trust GA4's attribution, not which number is 'real.'
Do refunds explain most of the gap?
Refunds are a common contributor but rarely the whole story, because GA4 only reflects a refund if a refund event was actually sent — most default Shopify-to-GA4 setups don't send one. If your gap direction is 'GA4 revenue stays high after refunds happen,' refunds are worth checking first; if orders are missing entirely, look at purchase paths before refunds.
Read more, or check a neighbouring symptom.
All symptoms- Service Tracking Health Check — Read-Only Diagnosis for Shopify
- Article Why GA4 Revenue Doesn't Match Shopify Orders
- Knowledge Base What Is Order Reconciliation in Tracking Audits?
- Troubleshooting GA4 Not Tracking Purchases on Shopify: Diagnosis
- Troubleshooting GA4 Unassigned Traffic on Shopify: Diagnosis
- Troubleshooting GA4 Purchase Event Fires Twice on Shopify: Diagnosis
Tried it and still stuck?
Describe your taskThe first answer is free, within one working day. Or write directly: next@taskfordaniel.com