Clarvivo

Free tool by Clarvivo · no login

Is your Shopify-to-GA4 revenue gap normal, or broken?

Upload both exports for the same period. We treat Shopify as the financial source of truth and tell you whether GA4's difference is ordinary measurement loss, a duplicate-purchase problem, or tracking that has genuinely failed.

Your Shopify orders and your GA4 revenue

Export both over the same date range. We treat Shopify as the financial source of truth and GA4 as a measurement of it.

This tool answers: Is my Shopify-to-GA4 revenue gap normal, or is my purchase tracking broken?

Enable JavaScript to run the check — the diagnosis itself is free and needs no account.

Why this happens

GA4 and Shopify will never match, and every store owner eventually discovers this the hard way — usually mid-way through a meeting about ad spend.

The reason is structural. Shopify records money it actually took. GA4 records purchases a browser managed to report, which means it loses whatever ad blockers, consent refusals, JavaScript failures and closed tabs take away. A gap is not a bug; it is the cost of client-side measurement.

Which makes the useful question completely different from the one people ask. Not "why don't these match" but "is this the gap I had last month". A stable 11% gap is a healthy store. That same 11% gap appearing where 4% used to be is a deploy that broke checkout tracking, and nothing in either dashboard will tell you.

And one shape is always wrong: GA4 reporting more revenue than Shopify took. Measurement cannot exceed reality, so that is duplicate purchase events — which inflates every ROAS figure you calculate from it.

Next checks

These answer the questions this one tends to raise.

How this check works

So you can trust the result — and your developer can verify it.

  1. We count orders, not spreadsheet rows

    Shopify's orders export is one row per line item, and the order total appears only on the first row of each order. Counting rows inflates your order count by however many multi-item orders you had, which produces a wrong average order value and a wrong conclusion. We key on the order number instead.

  2. Unpaid orders are excluded

    Pending, voided and unpaid orders are not revenue. Including them makes GA4 look like it is under-reporting when it is simply not counting money you never took. We report how many we excluded and why.

  3. We check the comparison is valid before making it

    Mismatched date ranges and mixed currencies produce a gap that looks exactly like broken tracking. Those are checked first, because sending someone to debug tags over a date-picker mistake wastes days.

  4. Revenue and order count are compared separately

    If the order-count gap and the revenue gap disagree, GA4 is not missing purchases — it is recording them with the wrong value, usually because the purchase event excludes shipping or tax. Same headline symptom, completely different fix.

Common causes and fixes

GA4 higher than Shopify — duplicate purchase events
Almost always a purchase event firing twice: a theme snippet plus a GTM tag, a Shopify app pixel plus a manual gtag, or a thank-you page a customer can refresh. Give every purchase a unique transaction_id — GA4 deduplicates on it.
A single untracked checkout path
Express checkout, Shop Pay and subscription flows frequently skip the order-status page where tracking lives. The tell is a gap that is too large to be attrition but far short of total failure.
Consent Mode denying analytics storage
If a large share of visitors decline, GA4 records a fraction of purchases by design. This looks like broken tracking and is not — but it does mean GA4 revenue is not a basis for budget decisions without modelling.
Purchase value excluding shipping and tax
Shopify's Total includes both. If your purchase event sends the subtotal, revenue is understated by a consistent percentage while the order count matches perfectly. That divergence is the signature.
Refunds recorded on one side only
Shopify nets refunds out; GA4 usually does not, because a refund event is rarely implemented. Your GA4 revenue is effectively gross, so margin decisions taken from it will be optimistic.
A checkout extensibility migration
Shopify's move away from checkout.liquid dropped tracking scripts on a lot of stores. If your gap widened sharply on a specific date, check what changed in checkout that week.

Frequently asked questions

How much difference between Shopify and GA4 is normal?
Most stores see GA4 reporting 5-15% less than Shopify. That range is the ordinary cost of client-side measurement — ad blockers, consent refusals, and customers closing the tab before the purchase event fires. What matters far more than the number is whether it is stable: a gap that suddenly changes is the real alarm.
Why does GA4 show MORE revenue than Shopify?
Because a purchase event is firing more than once. Analytics cannot observe more money than the store actually took, so this is duplication rather than a gap — commonly a theme snippet and a GTM tag both sending purchase, or a thank-you page being refreshed. Every ROAS figure calculated from that number is inflated until it is fixed.
Which exports should I use?
From Shopify: Orders → Export → CSV for orders. From GA4: any report carrying Total revenue — Monetization → Ecommerce purchases works well. Use the same date range for both, or the comparison measures your date picker rather than your tracking.
Should I try to make them match exactly?
No, and a near-exact match is itself worth investigating. Client-side tracking always loses a few percent. Identical totals usually mean GA4 is being fed server-side from the same source as the store, so the comparison is not testing what you think it is.
Do you store my orders data?
No. Both files are parsed to produce the diagnostic and are not retained. We keep only the findings, which are totals and percentages — no order-level or customer rows.
My gap changed suddenly. What should I check first?
What deployed on that date. Sudden movement is almost never gradual attrition — it is a theme update, a checkout migration, a consent-banner change or a tag manager publish. Compare the gap week by week to find the exact break point.

You are already reconciling revenue by hand. Clarvivo is the persistent version.

This comparison is one export, one period, one moment. Clarvivo joins payment data to acquisition data continuously, so the channel that produced a sale is attached to the payment itself instead of being inferred from two dashboards that disagree.

Connect payment truth to channel attribution

What this tool reads, and what it keeps