WebmasterID logoWebmasterID
Data quality

Duplicate transactions in ecommerce data

Duplicate transactions occur when one purchase is counted more than once — usually because the order-confirmation page is reloaded, bookmarked, or shared, or because a retry resends the same event. GA4 deduplicates ecommerce purchases on `transaction_id`, so an absent or unstable ID is the root cause. This page covers detection and the deduplication key.

Verified against primary sources

What this means

GA4 recommends sending a unique `transaction_id` with every `purchase` event. When the same `transaction_id` arrives again within the deduplication window, GA4 treats it as the same transaction. If the confirmation page fires `purchase` on every load and the user refreshes, the event repeats.

Without a `transaction_id`, GA4 cannot deduplicate at all, so every reload is a new sale in the data.

Common causes

Reloaded or bookmarked thank-you pages, browser back-then-forward to the confirmation screen, server retries that resend the event, and tags that fire `purchase` on a page that is not strictly post-payment. Each repeats the same order.

How it appears in analytics and logs

Revenue or purchase counts higher than the backend order system usually mean the same transaction_id (or none) is being sent multiple times from a reloadable confirmation page.

Diagnostic use case

Find inflated revenue caused by repeated purchase events and confirm a stable transaction_id is set so GA4 can deduplicate.

What WebmasterID can help detect

WebmasterID's event validation can flag repeated conversion events that share an identifier, surfacing duplicate-purchase patterns before they distort revenue.

Common mistakes

Privacy and accuracy notes

transaction_id is an order reference, not personal data, and should not embed customer email or names. Keep purchase events free of PII.

Related pages

Sources and verification notes

Last reviewed 2026-06-24. Facts are checked against primary/official sources where available; uncertain specifics are marked “Data not yet verified” rather than guessed.