Skip to content

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

  1. Platform GA4
  2. Usual cause Usually the purchase event, refunds or currency — rarely all three.
  3. Causes, ranked 5
  4. How to diagnose it 10
Go to the checks

First answer free, within one working day. Describe your case

Sounds familiar?

The symptom

Symptom report GA4

Someone pulls up Shopify’s Sales report and GA4’s ecommerce report for the same 30 days, and the numbers don’t line up. Sometimes it’s a rounding difference nobody would notice. Sometimes it’s tens of thousands of dollars, and now finance and marketing are in a meeting arguing about which system is lying.

Neither system is lying. They’re built to answer different questions, and treating them as two attempts at the same number is where the confusion starts.

Two bar columns for the same period with a small structural gap between them
Tick what you see

Tick the lines that match your store.

Describe my case

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

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.

  1. In Shopify Admin, go to Analytics → Reports → Sales over time, and pull total sales and order count for a closed 30-day window.
  2. 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.
  3. 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.
  4. Export order-level data from Shopify (Orders → Export), keeping order number, timestamp, total price, and financial status.
  5. Export event-level GA4 data via Explore → free-form exploration, using transaction_id and purchase_revenue as dimensions/metrics, or via BigQuery if it’s linked.
  6. 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.
  7. Check consent state on the purchase event in GA4 → Admin → DebugView during a live test, to confirm whether analytics_storage is granted before the event fires.
  8. Check Shopify orders filtered by refund status against whether GA4 revenue drops correspondingly for those orders.
  9. Compare GA4’s property currency (Admin → Property → Currency) against your store’s default currency and any Shopify Markets multi-currency setup.
  10. Review Admin → Data Settings → Data Filters for internal-traffic or IP exclusions that might be scoped too broadly.

Signal and fix

Decision table

CauseSignal you’ll seeFix
Missing purchase pathsShopify order count exceeds GA4 transaction count by more than a few percent; gap concentrated on specific checkout pathsTrace the exact path (Shop Pay, Apple Pay, POS, subscriptions) and confirm the Customer Events pixel actually fires there
ConsentGap correlates with a specific region or a cookie-banner update dateCheck Consent Mode default/update signals; confirm analytics_storage is granted before the purchase event fires
RefundsGA4 revenue stays flat when Shopify’s net revenue drops after refundsSend a refund event to GA4, or exclude refunded orders manually from your reconciliation baseline
Currency/tax configThe delta is a near-constant percentage rather than a shifting order countAlign GA4’s currency parameter and property currency with the store; agree on tax/shipping inclusion on both sides
FiltersKnown real segments (specific regions, referrers) are missing only from GA4Review 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.

Request a Health Check · USD 395

Follow the order. Then compare the evidence.

  1. Real orderOrder ID, amount, currency
  2. Browser / server eventsConsent, event ID, delivery
  3. GA4 / advertising platformsReceived events and reporting
  4. Reconcile the recordsMatch IDs, time windows and definitions
A completed order and a reported conversion are different records. Check the path and compare like-for-like before treating a difference as missing data.

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
Daniil Maximkin

Hi, I’m Daniil.

I work with you from defining the problem to implementation and handover. You talk to the person who does the work. I work in English and Russian.

Tried it and still stuck?

Describe your task

The first answer is free, within one working day. Or write directly: next@taskfordaniel.com