Editorial Sankey diagram on cream notebook paper with one ribbon highlighted in orange and labelled ‘mistributed flow’.
The Ecom Bunny

Why your Shopify revenue doesn’t match GA4 — and the three configs causing 90% of it

If your Shopify report and GA4 report disagree by more than 3%, it almost never means one of them is broken. It means three configurations are stacked in a way nobody documented.

6 min read

If your Shopify revenue and GA4 revenue disagree by more than 3%, something is misconfigured. If they disagree by more than 10%, three things are misconfigured, and they’re probably partially cancelling each other out. Here’s the list I check first, in the order I check it.

1. Currency conversion happening twice

The classic. Shopify reports presentment currency (what the customer saw) while GA4’s ecommerce events are usually sent in the shop’s currency. If your tagging vendor also runs a conversion, you’re double-converting on every international order. Symptom: the gap scales with non-USD revenue share.

What to check in your dataLayer push

window.dataLayer.push({
  event: 'purchase',
  ecommerce: {
    currency: '{{ checkout.currency }}',      // not shop.currency
    value: {{ checkout.total_price | divided_by: 100 }},
    transaction_id: '{{ checkout.order_number }}',
  }
});

2. Refunds counted on the wrong date

Shopify subtracts refunds from the order’s original date. GA4 records a refund event on the day it was processed. Run reporting on a month boundary and you’ll see a gap that flips sign every period. Symptom: the gap inverts month over month.

Most data discrepancies aren’t one tool lying. They’re two tools telling slightly different truths.

The Ecom Bunny

3. The thank-you page fires twice

Almost every Shopify Plus store I audit has at least one app that injects a tracking script into additional_scripts for Order Status, and at least one global pixel that fires on the same page. Some browsers debounce; most don’t. Symptom: a flat ~6–9% over-reporting in GA4 versus Shopify, completely unrelated to seasonality.

How to talk about this internally

Don’t frame it as “GA4 is wrong.” Frame it as “our reports are measuring three different things, and here’s what each one is actually counting.” The fix is almost never to pick a winner. The fix is to write down what each number means and stop comparing them directly until they’re reconciled.