AuditTags
GA4ShopifyRevenueTroubleshootingData Quality

GA4 Revenue Higher Than Shopify — Why and How to Fix It

Your GA4 reports show more revenue than Shopify actually processed. Here are the 5 causes and how to fix each one on your Shopify store.

A
AuditTags Engineering
GA4 Troubleshooting Specialists
9 min read
GA4 Revenue Higher Than Shopify — Why and How to Fix It

You open GA4 and see $47,000 in revenue this month. You open Shopify and see $31,000. That's a 50% discrepancy on the single most important number in your business.

This isn't a rounding error. It's a structural problem that makes every downstream decision unreliable. Your ROAS calculations are wrong. Your ad spend looks more efficient than it is. Your revenue forecasts are based on fantasy. And the gap gets worse every month because the root cause compounds.

The frustrating part: GA4 doesn't tell you something is wrong. The numbers look normal. Revenue goes up when you run promotions and down in slow periods. The pattern looks real. It's only when someone compares GA4 to Shopify's actual order data that the inflation becomes obvious—and by then you've been making decisions on bad data for weeks or months.

TL;DR

  • GA4 revenue higher than Shopify is almost always caused by events firing more than once
  • The #1 cause: both Shopify's native GA4 and your GTM fire separate purchase events
  • Other causes: thank-you page refreshes, currency mismatches, test orders, discount handling
  • Every day you wait means another day of corrupted revenue data that can't be fixed retroactively
  • Check Network tab for multiple "collect" requests on your order confirmation page

Why This Matters

Revenue is the anchor metric for your entire analytics stack. When it's inflated, everything downstream breaks.

Google Ads ROAS looks artificially good. You keep spending on campaigns that aren't actually profitable because GA4 tells you they're returning 3x when the real number is 2x. Facebook Ads attribution is inflated for the same reason. Your blended CAC looks lower than reality. Board reports, investor updates, financial projections—all built on the wrong number.

The worst outcome isn't the wrong number. It's the confidence you have in it. GA4 revenue looks consistent. It trends correctly. It responds to promotions. Everything about it feels right—except the magnitude. And by the time someone catches it, you've already made months of allocation decisions you can't undo.

What's Actually Happening

GA4 counts revenue based on purchase events it receives. Send one purchase event, get one transaction recorded. Send two purchase events with the same order data, get two transactions recorded. GA4 does not deduplicate purchase events by default.

On Shopify, multiple systems can fire purchase events independently. The native GA4 integration fires through Customer Events. Your GTM container fires through its own tags. Apps can inject their own purchase tracking. Each source sends a complete purchase event to GA4 without knowing the others exist.

The result is deterministic: if two systems each fire a purchase event for the same $150 order, GA4 records $300 in revenue. Every order, every day, doubled.

Cause 1: GTM and Shopify Native Both Fire Purchase Events

What's Going Wrong

Shopify's native GA4 connection fires a purchase event through Customer Events on every order confirmation. Separately, your GTM container also fires a GA4 purchase event tag on the thank-you page. Two independent systems, same measurement ID, same order—double revenue.

Where You'll See It

Open GA4 DebugView and complete a test purchase. Watch for two purchase events arriving in rapid succession with identical transaction values. In Shopify Admin, check Settings → Customer Events for a "Google" or "GA4" connection showing "Connected." Then check your GTM container for a purchase event tag.

How AuditTags Detects It

AuditTags counts purchase events per confirmation page load during the scan. Multiple purchase events with the same transaction data trigger automatic duplicate detection, identifying both the Shopify native source and GTM source independently.

Fix Steps

  • Check Shopify Admin → Settings → Customer Events for native GA4 connection
  • Open GTM and check for GA4 purchase event tags
  • If BOTH exist, you have the problem—choose one and remove the other
  • If using GTM for everything: disconnect native GA4 in Shopify
  • If using native: remove purchase event tags from GTM container

Cause 2: Thank-You Page Refresh Without Deduplication

What's Going Wrong

Customer completes a purchase and lands on the thank-you page. Purchase event fires. Customer refreshes the page—maybe the page loaded slowly, maybe they want to screenshot the confirmation. Purchase event fires again. Same order, counted twice. Some customers refresh 3-4 times.

Where You'll See It

Transaction count in GA4 exceeds actual Shopify order count. The inflation isn't exactly 2x—it's irregular because only some customers refresh. Revenue is 10-30% higher than Shopify. DebugView shows purchase events without transaction_id, or with the same transaction_id firing multiple times.

How AuditTags Detects It

AuditTags validates purchase event parameters and flags when transaction_id is missing or when the implementation doesn't include client-side deduplication logic.

Fix Steps

  • Ensure purchase event includes transaction_id (Shopify order name or number)
  • Implement first-party cookie check: only fire purchase if order ID hasn't been seen
  • Use GTM's built-in "fire once per page" option if available
  • Store fired transaction IDs in sessionStorage to prevent re-fires on refresh

Cause 3: Currency Mismatch Between GA4 and Shopify

What's Going Wrong

Your Shopify store sells in CAD. GA4 is configured with USD as the currency. Purchase events send the numeric value (e.g., 150) but GA4 interprets it as USD. Or worse, some events send CAD while others send USD, creating inconsistent revenue data.

Where You'll See It

Revenue discrepancy doesn't follow a clean multiplier like 2x. It's off by an irregular percentage that roughly matches exchange rate fluctuations. GA4 revenue changes relative to Shopify even on days with identical order volumes. Currency field in GA4 ecommerce reports shows mixed or unexpected values.

How AuditTags Detects It

AuditTags inspects purchase event parameters including the currency field. It flags when currency is missing, when it doesn't match the store's configured currency, or when mixed currencies appear across events.

Fix Steps

  • Check GA4 property settings for reporting currency
  • Verify your GTM purchase tag sends the correct currency code (e.g., "CAD")
  • Ensure Shopify native integration passes the store currency
  • If multi-currency: verify each event sends the transaction currency, not the display currency

Cause 4: Test and Internal Orders in GA4

What's Going Wrong

Development team runs test orders. QA runs validation purchases. You place test orders to check shipping. Each fires a real purchase event to your production GA4 property. These orders get refunded in Shopify but the purchase events persist in GA4 forever.

Where You'll See It

Revenue spikes on days with heavy testing or QA cycles. Small orders at round numbers ($1.00, $0.01) appear in GA4 but not in Shopify revenue reports. Discrepancy is inconsistent and doesn't follow a pattern.

How AuditTags Detects It

AuditTags focuses on structural tracking issues rather than data hygiene, but identifying whether test traffic reaches production GA4 is part of the broader audit scope.

Fix Steps

  • Use a separate GA4 property for staging and development
  • Filter internal IP addresses in GA4 data streams
  • Use GTM environment variables to prevent production tags from firing in staging
  • Never test purchases on production with real GA4 connected

Cause 5: Discount and Tax Handling Differences

What's Going Wrong

A customer buys a $100 item with a 20% discount code. Shopify reports the order as $80 (net revenue). But your GTM purchase tag sends the item price as $100 (list price) because it reads from the product object, not the order totals. GA4 records $100 in revenue for an $80 order.

Where You'll See It

Discrepancy grows during sales periods. BFCM revenue in GA4 is dramatically higher than Shopify. The gap correlates with discount code usage. Individual high-discount orders show the largest discrepancies.

How AuditTags Detects It

AuditTags validates ecommerce event parameters including value, items array pricing, and coupon fields. It flags when purchase value parameters don't include discount adjustments.

Fix Steps

  • Verify your purchase event sends the order total, not the sum of item list prices
  • Use Shopify's checkout order data (which includes discounts) as the revenue source
  • Include the coupon parameter when discounts are applied
  • Test with a discount code and compare the purchase event value to Shopify's order value

What To Do Next

Start with the biggest cause first. Open Shopify Admin → Settings → Customer Events and check if native GA4 is connected. Then open your GTM container and look for purchase event tags. If both exist, you've found your primary inflation source—it accounts for exact 2x revenue in most cases.

Then verify deduplication: complete a test purchase, note the order total, and check GA4 real-time for how many purchase events arrive. One event per order is correct. Two or more means you have a problem.

For currency, discounts, and test orders—these cause smaller but persistent discrepancies that add up. Fix them after resolving the duplication issue.

Final Note

GA4 revenue discrepancy isn't cosmetic. It corrupts every metric that depends on accurate revenue: ROAS, CAC, LTV, conversion value. Every day of inflated data is a day of misinformed decisions about ad spend, inventory, and growth.

The fix is usually straightforward once you identify which combination of causes applies to your store. Most stores have cause 1 (dual purchase events) as the primary driver, with one or two secondary causes adding smaller distortions on top.