Why Google Analytics for Shopify Is Almost Always Wrong
Last month I audited a DTC skincare brand spending EUR 11,000 per month on Google and Meta. Their Shopify admin showed 312 purchases in July. GA4 showed 471. That is 51 percent more conversions than actually happened -- every ROAS number, every budget allocation, every campaign decision built on inflated data.
The problem took me about four minutes to find. They had Shopify's native Google & YouTube channel app installed, which sends purchase events to GA4 automatically. They also had a GTM custom pixel firing the same purchase event to the same GA4 property. Every order hit GA4 twice. Double the conversions, double the revenue, half the credibility.
This is not rare. In roughly six out of ten Shopify stores I audit, the google analytics for shopify setup is either double-counting purchases or under-counting them. The mechanics differ, but the root cause is the same: nobody mapped out which system sends what, and nobody checked the numbers against Shopify's own order list.
This post is specifically about GA4 itself on Shopify -- the native integration, the double-counting trap, and how to set it up so the numbers match your actual orders. If you need to set up Google Tag Manager on Shopify with full data-layer mapping and server-side forwarding, I wrote a separate guide for that: Google Tag Manager Shopify: Tracking That Fires.
How Shopify Sends Data to GA4 (Two Paths, One Problem)
There are exactly two ways to get purchase data from Shopify into Google Analytics 4. Understanding the difference is the entire game.
Path 1: The native Google & YouTube channel app
Shopify's own Google & YouTube channel connects your store to Google Merchant Center, syncs your product feed, and sends GA4 ecommerce events automatically. When you link a GA4 property, Shopify handles page_view, view_item, add_to_cart, begin_checkout, and purchase on your behalf using its Customer Events infrastructure. For stores that only need standard GA4 ecommerce tracking, this path works without writing any code.
Path 2: A GTM custom pixel (or hardcoded gtag.js)
The second path is loading GTM or gtag.js via a Shopify custom pixel, subscribing to events like checkout_completed, and pushing them into the dataLayer. This gives you full control -- custom parameters, server-side forwarding, multi-platform tag management.
The double-counting trap
The problem arrives when you use both paths at the same time for the same GA4 property. The native app sends a purchase event. Your GTM tag sends a purchase event. GA4 receives two hits for the same order. If the transaction_id values happen to differ between the two sources -- which they often do, because the native app and your GTM payload may reference different Shopify identifiers -- GA4 cannot deduplicate them.
The result: every purchase is counted twice. Revenue doubles. Your CPA looks impossibly good. Smart Bidding optimizes against phantom conversions. And nobody notices for months, because the numbers are "up and to the right."
This is the single most common google analytics for shopify store failure I see in audits. Fixing it requires choosing one path and disabling the other.
Which Path Should You Choose?
The answer depends on your setup and what else you track.
| Scenario | Recommended path | Why |
|---|---|---|
| Shopify store, GA4 only, no GTM, no server-side needs | Native Google & YouTube app | Zero-code, maintained by Shopify, fires on checkout without sandbox issues |
| Multi-platform tracking (GA4 + Google Ads + Meta + others) | GTM custom pixel | One container manages all tags; server-side forwarding possible |
| Need custom event parameters or enhanced ecommerce beyond Shopify defaults | GTM custom pixel | Full control over the data layer and event schema |
| Running server-side tracking via a sGTM container | GTM custom pixel | Server-side forwarding requires a GTM web container as the client |
If you choose GTM, disable the GA4 connection inside the Google & YouTube app. Go to the app settings, disconnect your GA4 property, and confirm that purchase events no longer fire from the app by checking GA4 DebugView while placing a test order. If you choose the native app, remove any custom pixel or hardcoded gtag.js that sends events to the same Measurement ID.
One path. One source of truth. That is the rule.
How to Set Up Google Analytics for Shopify (Native App Path)
If you are going with the native integration -- the simplest path for stores that only need GA4 -- here is how to set it up correctly.
Step 1: Install the Google & YouTube channel
In your Shopify admin, go to Sales channels > Google & YouTube. If it is not installed, add it from the Shopify App Store. Connect your Google account and link your GA4 property. The app will ask for your Measurement ID (the G-XXXXXXX string from your GA4 data stream).
Step 2: Verify events in GA4 DebugView
After linking, open GA4 DebugView (Admin > DebugView). Complete a test purchase using Shopify's Bogus Gateway. Confirm the purchase event arrives with transaction_id, value (as a number), currency, and an items array. If value is missing or zero, reconnect the GA4 property and verify the Measurement ID.
Step 3: Mark purchase as a key event
In GA4, go to Admin > Events. Find purchase and toggle "Mark as key event." Set the counting method to "Once per event" -- a customer who places two separate orders in one session should generate two conversions.
Step 4: Remove any other GA4 tags
This is where most people go wrong. Check Settings > Customer events for custom pixels containing your Measurement ID. Check theme code for hardcoded gtag.js snippets. Check third-party Shopify apps that may inject GA4 tracking. If you find any, remove them or disconnect them from the property the native app uses.
How to Set Up Google Analytics 4 for Shopify via GTM
If you need GTM -- because you run multiple ad platforms, need custom parameters, or want server-side tracking -- the setup is more involved but gives you full control.
I covered the complete GTM implementation in Google Tag Manager Shopify: Tracking That Fires, including the custom pixel code, data-layer mapping, server-side container setup, and validation. Rather than duplicate that here, I will focus on the GA4-specific gotchas.
Disconnect the native app first
Go to the Google & YouTube channel app and disconnect your GA4 property. Do not uninstall the app entirely -- that may break your Google Merchant Center product feed. Remove the GA4 link specifically. Confirm by checking DebugView: no GA4 events should fire until your GTM pixel is active.
Use the correct transaction_id
Shopify's checkout_completed event provides the order object. The transaction_id you push must be a value GA4 can use for deduplication. Use checkout.order.id or checkout.order.name -- pick one and stick with it. If you later layer on a Google Ads conversion tag or import GA4 conversions into Google Ads, the same transaction_id must flow through all systems, or you risk the kind of discrepancies I describe in GA4 vs Google Ads Conversions: Why They Don't Match.
Test with real (test) orders
Place at least three test orders using Shopify's Bogus Gateway. For each one, verify in GA4 DebugView that exactly one purchase event arrives with the correct transaction_id, value, and currency. Then cross-check GA4 Realtime against Shopify's order list. The numbers must match one-to-one. If GA4 shows more purchase events than Shopify shows orders, you still have a duplicate source firing somewhere.
Diagnosing Shopify GA4 Double Counting
If your GA4 purchase count already exceeds your Shopify order count, here is how to find the duplicate.
Step 1: Compare numbers. Pull last month's purchase count from GA4 (Reports > Monetization > Ecommerce purchases) and compare to Shopify's total orders. A gap over 5 percent means something is misconfigured.
Step 2: Check Tag Assistant. Open Tag Assistant, complete a purchase flow, and count how many times the purchase event fires. You should see exactly one hit reaching your Measurement ID.
Step 3: Audit every source. Check the Google & YouTube channel app, custom pixels under Settings > Customer events, theme code for hardcoded gtag() calls, and third-party apps. Once you find the duplicate, remove it. Keep one path.
If you need to quantify the damage from months of double-counted data, run through my Google Analytics Audit Checklist for GA4.
Three Other GA4-on-Shopify Failures Worth Knowing
Double-counting is the most visible problem, but it is not the only one.
Missing currency parameter
Shopify stores selling in multiple currencies sometimes push the purchase event without a currency value. GA4 defaults to USD when currency is absent. If you sell in EUR or GBP, your revenue reports silently convert at the wrong rate -- or worse, show raw numbers labeled as USD. Always confirm currency is present in the event payload.
Consent mode gaps in GDPR markets
If you sell to Europe, your GA4 tags must respect consent. The native Google & YouTube app integrates with Shopify's Customer Privacy API, which handles consent gating in regions that require it. But if you are using a GTM custom pixel, you also need Google Consent Mode v2 configured with correct defaults so that GA4 fires in restricted mode when consent is denied. Without it, every visitor who declines cookies produces zero data -- and in GDPR markets, that can be 30 to 60 percent of your traffic, depending on banner design and jurisdiction, per etracker's consent benchmarks.
Safari ITP eating attribution
Safari caps JavaScript-set cookies at seven days, per WebKit's ITP policy. A customer who clicks a Google Ad and returns twelve days later looks like direct traffic -- the GA4 cookie is gone. The fix is server-side tracking, which sets cookies from your server on a first-party subdomain. Server-set cookies can persist for up to 400 days on Safari, well beyond the ITP cap.
When to Get Help
If your GA4 purchase count is more than 10 percent off from your Shopify orders -- in either direction -- your data is not trustworthy. Every budget decision, every ROAS calculation, every Smart Bidding signal built on top of it is wrong by at least that margin.
The fix is usually straightforward. In most cases I resolve shopify ga4 setup issues in a single engagement: audit the current state, remove duplicates, configure the correct path, validate end-to-end. But the longer bad data runs, the harder it is to untangle what happened and recalibrate your campaigns. If your numbers do not match, get a tracking audit before the next budget review.
FAQ
Why does GA4 show more purchases than Shopify?
The most common cause is double-counting. If you have both the Shopify Google and YouTube channel app and a GTM custom pixel or hardcoded gtag.js sending purchase events to the same GA4 property, every order is counted twice. The fix is to keep only one source active and remove or disconnect the other.
Can I use both the Shopify native GA4 integration and Google Tag Manager?
You can use both for different purposes, but they must not send the same events to the same GA4 property. If your GTM container fires GA4 purchase events, disconnect GA4 from the Google and YouTube channel app. If you keep the native app for GA4, do not fire GA4 tags from GTM. One source per property per event is the rule.
How do I set up Google Analytics for Shopify without coding?
Install the Google and YouTube channel app from the Shopify App Store, connect your Google account, and link your GA4 property using your Measurement ID. The app handles ecommerce events automatically, including page views, product views, add-to-cart, checkout, and purchase. No custom code is required for standard ecommerce tracking.
Does GA4 automatically deduplicate purchase events on Shopify?
GA4 can deduplicate purchase events only if they share the same transaction_id value. If two sources send purchase events with different transaction IDs for the same order, GA4 treats them as separate transactions. This is why double-counting happens when the native app and a GTM tag use different Shopify order identifiers.
Should I use the native Shopify GA4 integration or GTM?
Use the native integration if you only need standard GA4 ecommerce tracking and do not run multiple ad platforms through GTM. Use GTM if you need custom event parameters, server-side forwarding, or centralized tag management for Google Ads, Meta, and other platforms. Either path works, but never run both to the same GA4 property simultaneously.
Not sure your Shopify GA4 setup is trustworthy? Book a tracking audit -- I will tell you exactly what is broken and how to fix it.