Troubleshooting
Shopify Checkout Tracking Not Working? Missing & Doubled Purchases, Fixed
Your storefront tracking works, but purchases are missing, doubled, or wrong, and GTM Preview shows nothing useful. Shopify checkout tracking fails in a handful of predictable ways, and almost all of them are environment problems, not bugs in your tags. Here's how to find which one you've hit.
First: stop trusting GTM Preview here
The single biggest source of confusion. GTM Preview / Tag Assistant cannot connect to the Shopify checkout, it can't see into the pixel sandbox where your GTM and dataLayer run. A purchase tag that looks "not fired" in Preview may be firing perfectly. Verify a different way:
- Use the Shopify Pixel Helper to confirm events reach the sandbox.
- Open DevTools Console, switch the frame to the pixel sandbox, and inspect
window.dataLayer. - Place a real test order (100%-off code) and watch the
checkout_completedpush, and the GA4 DebugView.
Purchases are missing
Likely causes
- Store still on legacy checkout.liquid, pixel goes silent
- Container loaded but no tag + trigger exists
- Custom Event trigger name ≠ the pushed event key
- Upsell flow moved checkout_completed to the offer page
How to confirm
- Check Settings for Checkout Extensibility
- Confirm a GA4 purchase tag + trigger are published
- Match the trigger name exactly to event: 'checkout_completed'
- Place a test order with an upsell and watch where it fires
Empty values?
Purchases are doubled
Double-counting comes from two integrations both sending the purchase. The usual pairs:
- An app pixel and your custom pixel both send
purchase. - Shopify's native GA4 integration plus your own GA4 tag.
- A post-purchase upsell page that re-emits the event.
The fix
transaction_id so GA4 deduplicates any genuine repeats. Then reconcile GA4's purchase count against Shopify's order count.Revenue is wrong
- Totals look low or zero. You mapped
subtotalPriceinstead oftotalPrice, or the field path changed, logevent.data.checkoutand re-check. - Items are empty.
lineItemsisn't a straight rename; you must reshape each into GA4'sitemsshape (item_id,item_name,price,quantity). - Currency mismatches. Pass
currencyCodeon every event so GA4 doesn't assume your property default.
Practice this on a real container
Build the GA4 purchase tag against a simulated Shopify checkout_completed push, same fields and trigger name as production, so you can see exactly what a correct setup looks like before debugging a live store.
Practice the Shopify purchase →The 5-minute triage
- On Checkout Extensibility? Legacy checkout = silent pixel.
- Tag + trigger published? An empty container transfers nothing.
- Trigger name exact? Must equal the pushed
eventvalue. - One source of truth? Two integrations = doubled purchases.
- Tested for real? Pixel Helper + console frame + a test order, never Preview.
Now go practice it
Reading sticks when you do it. These hands-on lessons load your own GTM container and let you debug in Tag Assistant.
Frequently asked questions
Why is my Shopify purchase not showing in GA4?
Common causes: the store is still on legacy checkout.liquid so the pixel goes silent at checkout; the container loaded but no tag and trigger exist; the Custom Event trigger name doesn't exactly match the pushed event key; or a post-purchase upsell moved where checkout_completed fires. Test with a real order, not GTM Preview.
Why does GTM Preview show nothing on Shopify checkout?
GTM Preview / Tag Assistant cannot connect into the Shopify checkout pixel sandbox, so tags that are firing correctly can appear as not fired. Verify with the Shopify Pixel Helper, by switching the DevTools console to the pixel sandbox frame, and via GA4 DebugView after a test order.
Why are my Shopify purchases counted twice?
Two integrations are both sending the purchase event, for example an app pixel plus your custom pixel, or Shopify's native GA4 plus your own GA4 tag. Keep one source of truth, send a unique transaction_id so GA4 deduplicates, and reconcile against Shopify's order count.
Why is my Shopify revenue wrong in GA4?
Usually a mapping issue: sending subtotalPrice instead of totalPrice, an empty items array because lineItems wasn't reshaped into GA4's item fields, or a missing currency. Log event.data.checkout and re-map the fields.
Related posts
Troubleshooting
Why Isn't My GTM Tag Firing? A 6-Step Debugging Checklist
Tags that won't fire almost always come down to six causes. Here's the exact order to check them in Tag Assistant, from 'did you publish?' to 'did the hit actually leave the browser?'.
Read →Troubleshooting
GTM Preview Not Working? 6 Fixes That Actually Connect
Preview won't connect or Tag Assistant keeps spinning? It's almost always an environment issue, not a broken container. The fixes in the order worth trying them.
Read →Troubleshooting
Why GA4 and Google Ads Conversions Don't Match (and When to Worry)
142 conversions in Ads, 119 in GA4, same week, before assuming it's broken, know the two tools are supposed to differ. Why they drift, and how to spot a real bug.
Read →About the author

Analytics & Tag Management Consultant
Nathan Gage got his start in marketing through Google Tag Manager. Seeing how tracking customer behavior could turn raw clicks into insight you can actually act on is what pulled him into the field. Since then he has worked both full time and as a consultant with 15 marketing agencies, supporting brands that spend anywhere from a thousand dollars a month to over a million. Along the way he built a multi-touch attribution app, and he created The Happy Tagger so anyone can practice GTM, GA4 and server-side tracking on a real container instead of a production site.