Troubleshooting
Duplicate GA4 Purchases: Causes & Fixes
Revenue in GA4 looks too high, purchase counts are inflated, and the numbers don't match your store's orders. Duplicate purchase events are one of the most common, and most damaging, tracking bugs, because they quietly corrupt the metric you care about most. Here's why they happen and how to stop them.
The five usual causes
- Thank-you page reloads. Fire on page load and every refresh or back-button revisit re-counts the sale.
- Two integrations. A native/app purchase tag and your own GA4 tag both send it.
- Browser + server, unaligned. A browser tag and a server event without a shared id count twice.
- Trigger fires twice. Overlapping triggers, or one that matches more than you intended.
- SPA re-render. A single-page-app confirmation that re-mounts and re-pushes the event.
Fix 1: send a unique transaction_id
This is the single most important defense. GA4 deduplicates purchases that share a transaction_id, so a refreshed thank-you page won't create a second sale, as long as the id is present and stable.
dataLayer.push({
event: "purchase",
ecommerce: {
transaction_id: "T-10492", // unique + stable → GA4 dedups repeats
currency: "USD",
value: 129.0,
items: [/* … */]
}
});Watch for
transaction_id that's blank, or regenerated on each page load, defeats dedup entirely. It must be the real order id, the same on every fire for that order.Fix 2: fire once per order
- Set the purchase tag's firing option to Once per page where an order can only happen once per page load. (Once per event won't help: a re-pushed purchase is a new event, so the tag fires again.)
- Prefer a dataLayer success event over a raw thank-you page-load trigger.
- In a SPA, guard the push so a re-render can't re-emit the event.
Fix 3: one source of truth
Pick a single integration to send the purchase, your GTM tag or a platform/app integration, never both. On Shopify especially, an app pixel plus a custom pixel is a classic double-count. Then reconcile GA4's purchase count against your store's order count.
Practice this on a real container
Deduplication is a learnable, hands-on skill: fire-once options, trigger limits and a shared id. Practice them on a live container so one sale is counted exactly once.
Practice tag dedup →Fix 4: align browser and server
If you send the purchase both client-side and server-side (e.g. Meta Pixel + Conversions API), give both the same event_id so the vendor recognizes them as one conversion. Mismatched ids are a silent doubling.
How to confirm it's fixed
- In Tag Assistant, complete a test order and confirm the purchase fires once.
- Refresh the thank-you page, GA4 should not add another purchase.
- Compare GA4 purchases to your store's orders for the same window; they should be close.
Now go practice it
Reading sticks when you do it. These hands-on lessons load your own GTM container and let you debug in Tag Assistant.
Frequently asked questions
Why is GA4 showing duplicate purchases?
Common causes are firing the purchase on a thank-you page that gets reloaded or revisited, two integrations both sending the purchase (such as a platform tag plus your own GA4 tag), browser and server events without a shared id, overlapping triggers, or a single-page app re-rendering the confirmation and re-pushing the event.
How does transaction_id prevent duplicate purchases?
GA4 deduplicates purchase events that share the same transaction_id, so a refreshed or revisited thank-you page won't create a second sale. The id must be the real, stable order id, present on every fire for that order. A blank or regenerated transaction_id defeats deduplication.
How do I stop a purchase tag from firing twice?
Send a stable transaction_id so GA4 can dedupe, set the tag's firing option to once per page where that fits, fire on a dataLayer success event rather than a raw thank-you page load, guard against SPA re-renders, and keep a single source of truth so two integrations don't both send the purchase.
How do I know duplicate purchases are fixed?
Place a test order in Tag Assistant and confirm the purchase fires once, refresh the thank-you page and confirm GA4 doesn't add another purchase, and compare GA4's purchase count to your store's order count for the same window, they should be close.
Related posts
Troubleshooting
Why Isn't My GTM Tag Firing? A 6-Step Debugging Checklist
Tags that won't fire almost always come down to six causes. Here's the exact order to check them in Tag Assistant, from 'did you publish?' to 'did the hit actually leave the browser?'.
Read →Troubleshooting
GTM Preview Not Working? 6 Fixes That Actually Connect
Preview won't connect or Tag Assistant keeps spinning? It's almost always an environment issue, not a broken container. The fixes in the order worth trying them.
Read →Troubleshooting
Shopify Checkout Tracking Not Working? Missing & Doubled Purchases, Fixed
Missing purchases, doubled purchases, wrong revenue, Shopify checkout tracking fails in predictable ways, almost all of them environmental. Here's how to find which one you hit.
Read →About the author

Analytics & Tag Management Consultant
Nathan Gage got his start in marketing through Google Tag Manager. Seeing how tracking customer behavior could turn raw clicks into insight you can actually act on is what pulled him into the field. Since then he has worked both full time and as a consultant with 15 marketing agencies, supporting brands that spend anywhere from a thousand dollars a month to over a million. Along the way he built a multi-touch attribution app, and he created The Happy Tagger so anyone can practice GTM, GA4 and server-side tracking on a real container instead of a production site.