Troubleshooting

Duplicate GA4 Purchases: Causes & Fixes

Duplicate GA4 Purchases: Causes & Fixessame id → one salepurchasetransaction_id: T-1042purchasetransaction_id: T-10421sale

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

A 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

About the author

Nathan Gage
Nathan Gage

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.