Why is GA4 showing duplicated revenue?
The Short Answer
Duplicated revenue happens when a user reloads the order confirmation page (which fires the purchase event again), or when you have both GA4 direct tracking and GTM deployed simultaneously.
The Context
If your GA4 dashboard proudly displays $10,000 in revenue for yesterday, but your Stripe or Shopify admin panels show exactly $5,000, you are experiencing the dreaded "Double Counting" error.
This is a critical data failure. Duplicated conversions completely break your Return on Ad Spend (ROAS) metrics in Google Ads, forcing algorithms to bid aggressively on keywords that aren't actually profitable.
The 3 Most Common Root Causes
Google Analytics 4 is inherently "dumb" when it comes to deduplication unless you strictly enforce it. Here is why your data is doubling:
1. The "Thank You" Page Reload The most common cause of duplicate revenue is customers bookmarking the order confirmation page, or navigating back to it later via their browser history to check their shipping status. If your `purchase` tracking snippet is fired simply by the page loading, every single reload triggers a brand new purchase event in GA4.
2. Dual-Tagging (Hardcoded + GTM) During migrations (like moving from UA to GA4, or changing agencies), it's incredibly common for someone to deploy an e-commerce tag via Google Tag Manager without realizing the development team also hardcoded a native `gtag.js` purchase event directly into the site's source code. Both fire simultaneously on checkout.
3. Missing Transaction IDs By default, GA4 will attempt to deduplicate identical purchases, but only if you provide it the exact same `transaction_id` within a 72-hour window. If your dataLayer is broken and passing `null` or a randomly generated string instead of the actual Shopify/WooCommerce Order ID, GA4 treats every firing as a unique sale.
How to fix it:
- 1
Enforce Transaction IDs: Open Google Tag Manager, preview your checkout flow, and inspect the dataLayer on the confirmation page. Ensure the
ecommerce.transaction_idis populated with a real, unique order number (e.g., #1042). - 2
Use Event Setup Tags instead of Page Views: Rather than firing the purchase tag on 'Page View - URL contains /thank-you', tell your developers to push a custom event to the dataLayer only once at the exact moment the server validates the payment. Fire your GTM tag on that custom event.
- 3
Check for Dual-Tagging: Run the Google Tag Assistant Chrome extension on your checkout page. If you see two GA4 tags pushing the distinct purchase event, you must pause the redundant one in GTM or ask development to remove the hardcoded snippet.
- 4
Implement Server-Side Tracking: Moving your purchase tracking to webhooks completely eliminates page-reload duplication. The webhook fires once when Stripe confirms the charge, entirely bypassing the user's browser.
Want to check this automatically?
Instead of clicking through settings yourself, let our engine audit your GA4 Property for this exact issue (and 30 others) in 60 seconds.
Scan your setup with our Google Analytics 4 Audit Tool