GA4 Purchase Event Firing Twice? Here Is How to Find It
A double firing purchase event inflates revenue, breaks your ROAS, and poisons every audience you build. Here is how to confirm it, trace the cause, and fix it for good.

If GA4 revenue is roughly double what Shopify says, you almost certainly have a purchase event firing twice. It is one of the most common tracking faults out there and one of the easiest to prove.
Confirm it first, guess later
Do not start changing tags based on a hunch. Prove it in five minutes.
Open GA4 and go to Realtime.
Place one real test order on your site. A cheap product or a discount code that takes it near zero.
Watch the event stream. Count how many purchase events appear.
One order should produce exactly one purchase event. If you see two, you have confirmed the problem and can stop guessing.
For a longer view, compare GA4 revenue against Shopify revenue for the same month. If GA4 is close to exactly double, that is not a rounding issue.
The five causes, in order of likelihood
1. GA4 installed twice
The measurement ID is hardcoded in your theme and also configured in Google Tag Manager. Both load. Everything fires twice, not just purchases.
Quick check: view your page source and search for your measurement ID, the one starting with G. If it appears in the theme code and also in a GTM tag, that is it.
Sessions and pageviews being roughly double as well is a strong hint that the whole install is duplicated rather than just the purchase tag.
2. Thank you page reloads
The event fires on page load, and the customer refreshes, bookmarks, or returns to check their order. Each visit fires again.
The fix is to send a transaction ID with every purchase event. GA4 uses it to recognise and discard repeats. If your purchase events have no transaction ID, add it before anything else.
3. Two triggers, one tag
Someone built a trigger for the thank you page URL. Later someone added a data layer based trigger for the purchase event. Both are attached to the same tag and both conditions are true.
Open the tag in GTM and look at how many triggers are listed.
4. Shopify sending it and GTM sending it
Shopify’s own Google integration reports the purchase, and your GTM setup reports it as well. Very common after a store migrates to checkout extensibility and custom pixels, where the old and new methods end up running side by side.
5. Server side and browser side both firing
You added server side tracking and left the browser tag running. Both report the same purchase. Without a shared event ID for deduplication, GA4 counts both.
How to trace it properly
Open GTM preview mode, then complete a test purchase. The debug panel shows you every tag that fired and what triggered it. If two tags fired, you can see exactly which ones.
If GTM preview shows only one tag firing but GA4 still records two events, the second one is not coming from GTM. That points to hardcoded tracking in the theme or a Shopify app doing its own reporting.
The browser network tab is the final word. Filter requests for collect and count how many go out on the thank you page. That shows you what actually left the browser, regardless of what any interface claims.
After you fix it
Your revenue numbers will drop by roughly half. This is correct and it is the whole point, but warn people first.
Also remember that historic data stays wrong. GA4 will not retroactively clean it. Make a note of the date you fixed it so nobody compares this month against a period that was inflated and concludes the business is collapsing.
Then check your audiences and any remarketing lists built on purchase events. They were built on doubled data and will need rebuilding.
Need this fixed properly?
If your GA4 revenue has never matched your store and you are tired of explaining the gap, this is usually a quick fix. I set up and repair tracking for ecommerce stores and lead generation businesses, so the numbers in your ad accounts match the money in your bank account.
Have a look at what I do, or book a call and we can go through your setup together.






















