How do duplicate transactions happen in GA4?
Duplicate transactions occur when the GA4 purchase event fires more than once for the same order. The three root causes: (1) Thank-you page refresh — a user refreshes the order confirmation page, firing the purchase event again; (2) Multiple triggers — both the URL-based page view trigger AND a custom event trigger fire the purchase event on the same page load; (3) Email confirmation link — the order confirmation email links back to the thank-you page URL, and a returning user click fires the purchase event again. Impact: GA4 reports 2–5x actual revenue.
Google Ads Smart Bidding learns from inflated conversion counts and develops distorted bidding strategies. This is one of the most commercially damaging data quality problems in GA4.
Detecting duplicates: the BigQuery query
Interpreting results:
occurrence_count > 2: severe duplication — page loads are being tracked multiple times, not just onceduplicate_revenue: the total amount of false revenue over the query periodover_reporting_pct: how much this specific transaction inflated revenue
Calculating the scale of the problem
If duplicate_pct > 5%, you have a significant duplicate transaction problem.
Fix 1 — sessionStorage deduplication (client-side)
Limitation: sessionStorage is cleared when the browser tab closes. If a user opens a new tab to the thank-you URL (via email link), sessionStorage is empty and the purchase fires again.
Fix 2 — Server-side flag on the order record (most reliable)
Set a flag on the order record in your database after the first GA4 push:
Want to see which hidden implementation gaps are affecting your GA4 data quality?
WooCommerce (PHP):
Shopify: Use analytics.subscribe('checkout_completed', ...) Custom Pixel event — fires exactly once per order, not on subsequent page views.
Fix 3 — Removing duplicate triggers in GTM
Check for double-trigger setups in GTM:
In GTM, look for any GA4 Event tag with event name = purchase that has:
- Trigger: All Pages (or a broad page view trigger) AND
- Trigger: Custom event
purchasefrom the dataLayer
If both triggers are active on the order confirmation page, they fire simultaneously → duplicate purchase. Remove the page view trigger; keep only the Custom Event trigger.
Cleaning historical duplicate data
GA4 doesn't offer a way to selectively remove specific event instances from reports. For historical analysis after fixing the duplication bug:
In BigQuery (deduplicated purchase report):
Use this query in Looker Studio for historical revenue analysis that correctly deduplicates.
FAQ: GA4 Duplicate Transactions: How to Detect and Fix Them
What should a team validate first when ga4 duplicate transactions: how to detect and fix them appears?
How do I know whether the fix actually worked?
When should this become a full GA4 audit instead of a quick fix?
Related guides for GA4 Duplicate Transactions: How to Detect and Fix Them
BigQuery Cost Optimisation for GA4 Exports: 9 SQL Patterns (2026)
The biggest cost wins come from nine SQL patterns: (1) partition pruning via _TABLE_SUFFIX BETWEEN (10–50x cost difference vs derived filters), (2) clustering on source/medium/event_name (30–60% reduction on top of partitioning), (3) explicit column selection (never SELECT *)…
How to Stitch GA4 BigQuery Sessions Manually (2026)
GA4 doesn't store sessions as records in BigQuery exports — only individual events with session identifiers. To reconstruct sessions: join on user_pseudo_id + (SELECT value.int_value FROM UNNEST(event_params) WHERE key='ga_session_id') as the unique session key…
Run a GA4 audit before ga4 duplicate transactions: how to detect and fix them spreads into reporting decisions
Use GA4 Audits to surface implementation gaps, broken signals, and the next fixes to prioritize before the issue becomes harder to trust or explain.