Shopify shows 412 orders this month. GA4 shows 239 purchases. Or GA4 was fine until a few weeks ago, then the purchase line dropped and never came back. Either way, every report built on GA4 is now wrong, and so is every Google Ads campaign optimizing on GA4 conversions.
This guide is the diagnosis we run when a Shopify store's GA4 purchases go missing. It's ordered so the most likely causes come first. For the broader question of why GA4 revenue and Shopify revenue differ even when tracking works, see why GA4 and Shopify revenue don't match.
Start with the symptom
The shape of the gap usually tells you the cause before you open any settings.
| What you see | Most likely cause |
|---|---|
| Purchases dropped to near zero on a specific date | Thank you page change, theme or app update, removed script |
| GA4 steadily records 50 to 80% of orders | Consent, ad blockers, upsell pages or off-site payments |
| GA4 records more purchases than Shopify | Two setups sending purchases, or refires on reload |
| Purchases are there but show as direct or unassigned | Purchase sent with the wrong client or session ID |
| Purchases are there but revenue looks wrong | Wrong value field, currency, or tax and shipping handling |
The August 2026 change
If your purchases fell off a cliff in late August 2026, this is almost certainly why. Shopify has been moving checkout to a locked-down, app-based system called checkout extensibility. The last piece was the Thank you and Order status pages.
- Shopify Plus stores lost the old Thank you page scripts on August 28, 2025.
- All other stores were automatically upgraded on August 26, 2026. From that day, anything pasted into the Additional Scripts box under Settings, Checkout stopped running.
Orders kept processing and the page still looked normal, so nothing warned anyone. But any GA4 purchase tag, gtag snippet or data layer push that lived in Additional Scripts went silent. The same happened to Google Ads conversion tags, affiliate pixels and survey tools that lived there.
Purchase tracking now runs through Settings, Customer events. You use either an app pixel (the Google and YouTube app, or a tracking app) or a custom pixel that you write yourself. Both listen for Shopify's checkout_completed event and send the purchase to GA4.
Diagnose it in 5 steps
1. Find the date it broke
Put Shopify online store orders per day next to GA4 purchases per day for the last 90 days. In GA4, a free form exploration with Date as the dimension and Ecommerce purchases as the metric does the job. Divide GA4 by Shopify for each day. If the ratio drops on a specific date, write that date down and check what changed: a theme publish, an app install, a checkout upgrade or the August 2026 deadline.
2. List everything that sends purchases
Most broken setups have too many purchase sources, not too few. Check all of these:
- Settings, Customer events. Every app pixel and custom pixel. Note which ones are connected.
- The Google and YouTube app. Is GA4 connected, and to the right property?
- Theme code. Search theme.liquid for gtag, G- IDs and GTM- IDs.
- Your GTM container. Any GA4 purchase tag, and what triggers it.
- Settings, Checkout, Additional Scripts. Anything still there no longer runs on the Thank you page.
- Tracking apps (Elevar, Analyzify, Littledata and similar) that send purchases server-side.
You want exactly one source of GA4 purchase events. If you find two, that's your duplicate problem. If you find none that still works, that's your missing purchase problem.
3. Place a real test order and watch it arrive
Use a 100% discount code with free shipping, or buy a cheap product and refund it. Before you check out, open GA4, Admin, DebugView, or keep Realtime open. Then check two things:
- Does a purchase arrive? In your browser's developer tools, open the Network tab, filter for
collect, and look for a request withen=purchaseafter the Thank you page loads. This works even where GTM preview doesn't. - Does it arrive once? Two purchase requests for one order means duplicates. Reload the Thank you page and check that nothing fires again.
Repeat the test with a different payment method (PayPal, Shop Pay, buy now pay later) and on your phone through the Instagram in-app browser. Those are the paths that break most often.
4. Check consent
Shopify pixels respect the Customer Privacy API. If your store shows a cookie banner, custom pixels with analytics or marketing permissions won't run until the visitor accepts. That's correct behaviour, but it means GA4 will legitimately miss a share of orders, and that share is much higher for EU and UK traffic. Check each custom pixel's permission setting and make sure it matches what your banner actually asks for.
5. Match the missing orders
Export 30 days of Shopify orders and GA4 transaction IDs, and match them in a spreadsheet. Group the missing orders by payment method, device and day. The pattern points at the cause. The step-by-step matching method is in our GA4 vs Shopify guide.
Our free tracking check runs this diagnosis on your store across GA4, Google Ads and Meta, and sends you a written note: what's firing, what's missing, what's duplicated and what to fix first. Read-only, within 3 business days.
Get a free tracking checkCauses and fixes
Purchase code still in Additional Scripts
Fix: Move purchase tracking to Customer events. The quickest route is the Google and YouTube app, which sends GA4 ecommerce events and Google Ads conversions. If you need control over parameters, or a GTM setup with other tags, use a custom pixel subscribed to checkout_completed. Then delete the old scripts so nobody assumes they still work.
Two setups sending purchases
Fix: Pick one. A common pattern is the Google and YouTube app sending purchases while a GTM custom pixel also sends them. Either disconnect GA4 in the app or remove the purchase tag in GTM. Then check GA4 for repeated transaction IDs over the next week.
Post-purchase upsell pages
If you use a post-purchase upsell app, checkout_completed fires on the first upsell page instead of the Thank you page. If your pixel or tag listens for a Thank you page view, it misses every order where the customer leaves on the upsell page. Fix: trigger the purchase on checkout_completed, not on a page view, and make sure upsell revenue is sent as a separate event or added correctly.
Off-site payment methods
Some gateways send the customer to another site to pay. If they close the tab before returning, Shopify has the order but the browser never fires the purchase. Fix: you can't recover these from the browser. Send purchases server-side as well (see below), or accept the gap and track it.
Purchases show up as direct or unassigned
The custom pixel sandbox doesn't share the storefront's GA4 setup automatically. If the pixel creates its own client ID, GA4 sees the purchase as a new user with no source. Fix: read the _ga cookie and the session cookie inside the pixel and send the purchase with the same client and session IDs the storefront used. Good tracking apps handle this. A hand-written pixel often doesn't.
Wrong revenue values
Fix: decide what purchase revenue means (with or without tax and shipping), send it in the store currency, and include a transaction_id that matches the Shopify order number. Without a transaction ID you can't match orders or deduplicate.
Ad blockers and closed tabs
No browser setup can see these. The fix is sending purchases from Shopify's servers, using the order webhook, to GA4's Measurement Protocol, Meta's Conversions API and Google Ads. Whether that's worth doing depends on how much you're losing. Our guide to server-side tracking on Shopify walks through the decision.
Make sure it stays fixed
Tracking breaks again. A theme update, a new checkout app, a consent banner change, a Shopify platform update. The stores with reliable data aren't the ones that never break. They're the ones that notice within a day.
- Track capture rate daily. GA4 purchases divided by Shopify online orders. A small dashboard or a scheduled sheet is enough.
- Alert on drops. If capture rate falls below 80% for a day, someone should get a message.
- Test after every change. New app, theme publish or checkout setting: place a test order and watch it arrive.
When GA4 is fixed, Google Ads usually improves too, because it optimizes on the conversions it receives. If Meta is the platform that looks off, that's a different set of causes, covered in why Meta revenue doesn't match Shopify.
Common questions
Why did GA4 stop tracking Shopify purchases?
The most common reason in 2026 is that Shopify stopped running Additional Scripts on the Thank you and Order status pages. Plus stores lost them on August 28, 2025 and all other stores on August 26, 2026. Any GA4 purchase code pasted there stopped firing. Purchase tracking now has to run through Customer events, either an app pixel such as the Google and YouTube app or a custom pixel.
Can I use Google Tag Manager with Shopify Customer events?
Yes. You can load a GTM container inside a custom pixel and push Shopify's standard events into the data layer. The catch is that custom pixels run in a sandbox, so GTM preview mode does not connect the usual way. Test with GA4 DebugView or your browser's network tab instead.
Why do my GA4 purchases show as direct or unassigned?
Usually the purchase event is sent with a different client ID or session ID from the one the storefront used, so GA4 cannot join the purchase to the visit that came from your ad. Read the _ga cookie inside the pixel and send purchases with the same IDs, and check that only one setup is sending purchases.
How many Shopify purchases should GA4 capture?
On a healthy setup, GA4 usually records 90% or more of Shopify online store orders. Between 80 and 90% is worth investigating. Under 80% means part of the setup is broken, and over 100% means duplicate purchase events.
Does server-side tracking fix missing GA4 purchases?
It can recover purchases lost to ad blockers and closed tabs, because the order is sent from Shopify rather than from the browser. It does not fix a broken setup, wrong IDs or duplicates. Fix the browser setup first, then decide whether server-side is worth it for your store.
