TRACKING SPECIALIST — BARIS ASA · LONDON
Synctag
Start the check → TRACKING SPECIALIST — BARIS ASA · LONDON

READING ROOM › SYMPTOM FILES › SYM-001

SYMPTOM FILE SYM-001 FILED 13 JUN 2026

GA4 revenue runs ahead of Shopify, every week.

ALSO FILED AS
  • “ga4 revenue higher than shopify”
  • “ga4 purchases counted twice”
  • “meta reports more sales than the store”

Diagnosis

Your purchase event is firing more than once per order. A theme or app update injects the tag a second time, the same conversion lives in both GTM and a platform’s native integration, or the thank-you page re-fires when someone reloads it. The store took one order. The analytics took two. When it is the tag double-firing on the page, every platform that tag feeds inflates together, which is exactly why it looks plausible until finance reconciles against the bank.

TIMEEVENTTRANSACTION_IDVALUE
12:40:31begin_checkout
12:41:07purchaseT-88412£96.00
12:41:09purchaseT-88412£96.00
EVENT LOG — checkout, one order · GA4 DebugView, anonymised

One order, two purchase hits, two seconds apart, sharing one transaction_id. That shared id is the tell. It is how you catch the duplicate, not how GA4 drops it.

Where it shows

Open Tag Assistant or GA4 DebugView on a test order and watch for two purchase events with the same transaction_id. Or skip the tooling: if GA4 revenue runs a steady few percent ahead of the Shopify or Stripe figure, week after week, by roughly the same margin, you are almost certainly counting some orders twice. A gap that holds its shape is a duplication gap, not a sampling one.

℞ The fix

  1. Find every place the purchase fires. GTM tags, hardcoded gtag, the platform’s native pixel, app-injected snippets. Most double counts are two of these going off on the same page.
  2. Fire it from exactly one place. Pick one source of truth for the purchase. If a native integration already sends it, do not also send it from GTM. This is the only thing that actually stops GA4 doubling.
  3. Send the order id, but know what it does. A consistent transaction_id is how you catch the duplicate and how the ad platforms drop it: Meta dedupes on a matching event_id, Google Ads on the order id. GA4 itself will not. Fire purchase twice with the same id and GA4 still counts both. The id is your detection net and the platform safety net, not a substitute for firing once.

Fixed at the source, the gap closes from that day forward; the revenue already doubled in GA4 stays doubled in the history. If GA4 and the platforms still disagree with each other after that, duplication was only half the story, and the rest is filed under F-102 .

← back to the reading room