Home Bilby — store monitor Free store scan Free tools AI apps Navaal SEO app Blog Services Studio Contact Sign in

// Troubleshooting · Tracking

Why is your GA4 purchase event missing on Shopify?

By Published Updated 8 min read

Last updated 28 September 2026.

Because purchase is the one event that fires on the thank-you page, after payment — a page your theme doesn't control — so it breaks in ways the rest of your tag doesn't: a GA4 tag pasted into theme.liquid never runs there, a legacy script tag that used to run there has been sunset, and the Google & YouTube app or a custom pixel only sends purchase when it's connected to the right measurement ID. The proof is a count: yesterday's orders in Shopify against yesterday's purchase events in GA4 — a small gap is consent and blockers, a large or total gap is a missing event. Then place a test order with DebugView open and watch for purchase with a transaction_id.

// The gap check — orders vs GA4 purchases, same period

Same day or same week for both: Shopify admin → Orders (filter by date) and GA4 → Reports → Monetization → Ecommerce purchases (event count for purchase). Yesterday is the safest single day — today's GA4 numbers are still arriving.
Orders GA4 didn't see—orders minus purchase events
Gap—share of orders with no purchase event
Enter both counts and the verdict tells you whether purchase is firing, partly firing, missing, or doubled.

our rule of thumb, printed so you can disagree with it: a gap up to 10% is consent choices and blockers · 10–40% means purchase fires on some paths and not others · above 40% means the event is missing · more purchases than orders means a double install. Runs in your browser; nothing is sent.

Every other GA4 event on a store is easy to check: open the page, do the thing, watch it appear. Purchase is the exception. It lives on the one page you can't reach without paying, it's the event ad bidding and revenue reports depend on, and when it goes missing the store looks fine everywhere else. That's why it deserves its own checklist.

The Bilby scan screen mid-visit on the demo store
The scan screen mid-visit on our labelled demo store, Fernwick & Co.: a screenshot per step as it lands, then the seven things it checks read the recording. Run it on your store: free, about a minute, no signup, we never touch your store. Run the free scan →

Why purchase is the fragile one

Shopify's storefront pages belong to your theme; the checkout and the thank-you page belong to Shopify. A GA4 tag installed in the theme runs on product and cart pages and fires view_item, add_to_cart and even begin_checkout — and then never sees the thank-you page. For purchase to fire, something has to run there: the Google & YouTube app, a custom pixel built on Shopify's customer events (Shopify Help Center: Pixels), or — until Shopify sunset them — a legacy script tag on the order-status page. If your purchase tracking was built on that last one, it stopped, and nothing on your storefront looks any different.

A GA4 tag pasted into a Shopify theme can fire view_item, add_to_cart and begin_checkout and still never send a purchase — because the thank-you page belongs to Shopify, not the theme, and only the Google & YouTube app or a custom pixel runs there.

The 2026 checklist

  1. Count first. Yesterday's orders in Shopify against yesterday's purchase events in GA4 (Reports → Monetization → Ecommerce purchases). Put both into the gap check beside the answer. A small gap is normal; a large or total one is the problem, and the size tells you which kind.
  2. Know your install. Which of these sends purchase for you: the Google & YouTube app, a custom pixel, or a tag in the theme? If the answer is "the theme", that's the fault — the theme never sees the thank-you page.
  3. Match the measurement ID. The G- ID in the app or pixel must be the one on the GA4 property you're reading. Two properties, two IDs, and purchase lands in the one you're not looking at.
  4. Remove theme-pasted purchase code. Old order-status-page scripts and theme.liquid snippets that reference purchase are dead weight at best and duplicates at worst. Our app-code scanner lists every script the storefront still loads.
  5. Place a test order with DebugView open. Enable debug mode for your browser (Tag Assistant does it), open DebugView, and complete an order with a 100%-off code or Shopify's test gateway. Watch for purchase on the thank-you page.
  6. Check the event's fields. GA4's recommended purchase event carries transaction_id, value, currency and items. A purchase with no transaction_id can't be de-duplicated; one with no value reports zero revenue.
  7. Visit the consent path. Complete the test order twice — once accepting cookies, once rejecting. Rejecting should reduce what GA4 receives; it should not remove purchase for the customers who accepted. If accepting still yields nothing, the consent tool is blocking the pixel outright.
  8. Hunt duplicates. More purchases than orders means two installs. Keep one — the app or the custom pixel — and remove the other.

How to read the gap

A gap of a few percent is the world being the world: visitors who declined tracking, browsers that block it, the odd order placed in a way the pixel never saw. A gap in the tens of percent is a pixel that fires on some paths and not others — the classic case is an express checkout (Shop Pay, PayPal, Apple Pay) or a draft order that skips the page the pixel expects. A gap near everything is a missing event, and a negative gap — more purchases than orders — is a double install. The thresholds in the gap check are our rule of thumb; they're printed so you can disagree with them.

The two-minute proof that GA4 purchase tracking works is a count, not a tag inspector: yesterday's Shopify orders against yesterday's GA4 purchase events, on the same day, with the gap read in tens of percent.

Everything up to purchase, checked every night. Bilby's Money check reads the network log of a real visit and records which GA4 events fired on each step — page_view, view_item, add_to_cart, begin_checkout — and tells you the night one that fired yesterday goes silent, or the night a new script appears beside it. It says plainly that purchase needs an order, and links this page. Run one free visit now; the Tracking Health Check is the ten-second version.

Frequently asked questions

Why is GA4 not recording purchases from my Shopify store?
Purchase fires on the thank-you page, which your theme doesn't control. A GA4 tag in the theme never runs there; only the Google & YouTube app or a custom pixel does, and only when it's connected to the right measurement ID. Count orders against purchase events for the same day to prove it, then place a test order with DebugView open.
How do I test the GA4 purchase event on Shopify?
Enable debug mode with Tag Assistant, open DebugView in GA4, and complete an order using a 100%-off discount code or Shopify's test payment gateway. Watch for purchase on the thank-you page with a transaction_id, value, currency and items.
GA4 shows more purchases than Shopify orders. Why?
Two installs — usually the Google & YouTube app plus a custom pixel or a theme snippet both sending purchase. Keep one and remove the other; a purchase with a transaction_id can be de-duplicated, one without can't.
Can a monitor verify my GA4 purchase event?
Not without placing an order. Bilby verifies page_view, view_item, add_to_cart and begin_checkout per step from the network log every night, and links the two-minute owner check on this page for purchase.

Keep reading: Meta pixel not firing? · Shopify's script sunset — is your tracking silently broken? · Free Tracking Health Check · The Money check

// Per step, every night

Is your tracking
firing tonight?

Bilby reads the network log of a real visit and records which GA4 events fired on every step — then tells you the night one goes silent. One free scan, no signup.

Thin or missing product content is the other half of this problem, and it is the half search engines and AI assistants see. Navaal: AI SEO, AEO & GEO audits a Shopify catalogue for it free, and writes what is missing for review.