TRACKFIX · Shopify tracking repair
Guide · Checkout Extensibility
Shopify DTC · post-migration rebuild

Shopify Checkout Extensibility Broke Your Tracking? Here’s the Rebuild Checklist

You upgraded Checkout Extensibility — or got forced off Additional Scripts — and purchases went quiet. If Shopify checkout extensibility tracking broken is what you searched, here’s what died, what replaced it, how to rebuild checkout_completed, and when a $497 prepaid variance audit is worth it.

What died (Additional Scripts / checkout.liquid / thank-you scripts)

Checkout Extensibility changed the contract. The old “drop a snippet on thank-you and pray” model is gone.

Additional Scripts deprecated tracking is not a rumor — on the modern checkout path, that box is retired or effectively useless for purchase. Anything that depended on pasting GA4, Meta, TikTok, or GTM loaders into Additional Scripts stopped when you migrated.

checkout.liquid tracking removed (or never available under Checkout Extensibility) means theme-level checkout injections that used to fire pixels no longer run in the same place. Classic thank-you hardcodes, app embeds that only fire on storefront, and GTM tags scoped to thank-you URLs that no longer match fail silently.

The post-migration signature: mid-funnel looks fine (add_to_cart, begin_checkout) while purchase vanishes.

Leftover theme snippets that never ran on checkout still do not. Inventory every purchase source before you add another pixel — stacking a new app on a dead Additional Scripts path usually creates the next problem: duplicates.

What replaced it (Customer Events / custom pixels / Web Pixels API / checkout_completed)

Shopify’s replacement stack is not “paste harder.” It is:

  1. Customer Events — where you add app pixels and custom pixels
  2. Custom pixels — JavaScript in Shopify’s sandbox, subscribed to checkout lifecycle events
  3. Web Pixels API — analytics.subscribe(...) event model
  4. checkout_completed — the event that maps to purchase / conversion for most DTC stacks

If you never subscribed a custom pixel (or a vetted app pixel) to checkout_completed, GA4 and ads look like purchase died — because for the browser path, it did.

Customer Events GA4 setups typically either:

Neither is set-and-forget. Both need verification on a real order after migration. Mid-funnel subscriptions (checkout_started, payment_info_submitted, and storefront events where applicable) help funnel fidelity — but the cliff everyone feels is checkout_completed not firing into analytics and ads.

Subscribe checklist (events + payload)

Events to subscribe (minimum)

Payload on checkout_completed → purchase

FieldWhy it matters
valueRevenue / ROAS inputs; empty value = useless purchase
currencyMulti-currency stores skew without it
itemsItem reports, shopping reports, some ads optimizations
transaction idDedupe + join to Shopify order id/name

Decide once: order id vs order name as transaction_id. Native Google & YouTube often leans order name; custom GTM often uses order id. Mismatched keys make GA4 vs Shopify reconciliations look worse than reality.

One authoritative purchase path per destination — or intentional dedupe if native + GTM both fire. Respect Consent Mode. Do not leave dead Additional Scripts “just in case.”

Sandbox vs GTM Preview lies → DebugView

Custom pixels run in Shopify’s sandbox. They do not share the storefront dataLayer the way classic theme tags did.

That produces a reliable false negative: you open GTM Preview on the shop, walk checkout, and Preview looks empty or incomplete. You conclude GTM is dead. Purchase may still be firing from a sandboxed custom pixel — or may not be — and Preview alone cannot tell you. Fix the verification method, not your mood.

  1. Place a real test order
  2. Confirm in GA4 DebugView that purchase arrives with transaction id, value, currency
  3. Confirm ads pixel / Events Manager test events if Meta (or equivalent) is in scope
  4. Only then trust “it works” — homepage Preview proves nothing about checkout

If DebugView is silent after checkout_completed should have run, your subscribe or mapping is wrong — not “GA4 is broken.”

Signal table (symptom → cause)

SymptomWhat you seeLikely cause
Cliff after upgradePurchases near zeroAdditional Scripts / thank-you paste gone; no Customer Events on checkout_completed
Thank-you pixel not firingPixel helper empty on confirmationScripts never moved to custom / app pixel
checkout_completed not firingFunnel OK, purchase missingNot subscribed — or payload / destination send failed
GTM Preview “dead”Preview empty on checkoutSandbox — use DebugView
~2× purchasesInflated GA4 / adsNative Google & YouTube and GTM both sending purchase
Spotty by gatewayShop Pay / some methods missingRedirect timing; browser hit never completes
Orders never in GA4Subs / upsells / POSOff-browser orders; client thank-you never ran
DebugView OK, reports shortOne test passesHistorical gap, consent, dupes — reconcile a real window

15-minute post-migration checklist

  1. Confirm Checkout Extensibility / modern thank-you & order status pages are live (not half-migrated).
  2. Open Settings → Customer Events. List every app + custom pixel; note checkout_completed subscribers.
  3. Kill or quarantine leftover Additional Scripts / theme purchase hardcodes.
  4. Verify subscribe + payload: value, currency, items, transaction id.
  5. Run one test purchase with GA4 DebugView (and ads test tools) — not GTM Preview alone.
  6. Pull 7–14 days Shopify paid web orders vs GA4 purchases (same UTC window). Gap %.
  7. Spot-check 5 order ids against transaction_id in GA4.

Decision: rebuilt, DebugView clean, explainable gap → monitor. Still silent, unexplained cliff, or untangleable duplicates → stop DIY theater.

Still unexplained after migration?

AUDIT-497 quantifies the post-migration gap (GA4 ↔ Shopify ↔ ads spot-check) in 72 hours from confirmed access. $497 prepaid; credits into a Tracking Sprint.

Soft CTA · diagnose only on the audit · live fixes = Sprint

AUDIT-497: quantify the post-migration gap in 72h

When the rebuild checklist does not explain the silence — or finance will not wait while you guess — buy the diagnostic. AUDIT-497 is read / diagnose only:

Live rebuild of custom pixels, dedupe, and validation against real orders are the Sprint, not the audit. We do not guarantee ROAS, manage ad spend, or sell “free audit → retainer” theater. If you only need variance math after migration, the audit is the wedge; if you need the pixel rebuilt and proven on real orders, that is Sprint scope.

Related reading while you decide: Why GA4 purchases don’t match Shopify — same variance logic once checkout_completed is alive again.

FAQ

Did Checkout Extensibility always break tracking?

No. It breaks tracking that still depended on Additional Scripts, classic thank-you paste, or checkout.liquid-era injection. Sudden cliffs mean the purchase path was never rebuilt.

Is Additional Scripts still usable?

Treat it as deprecated for modern Checkout Extensibility. Rebuild on Customer Events, custom pixels, or vetted app pixels.

Why is GTM Preview empty on checkout?

Custom pixels are sandboxed. Preview on the storefront is a weak signal for checkout. Use GA4 DebugView and the ads debugger on a real test order.

Will you fix the pixel for $497?

No. $497 is diagnosis. Fixes are fixed-scope Sprints; the audit fee credits into the first Sprint within 30 days.

Do you guarantee ROAS?

No. We work on signal fidelity. Media performance stays yours.

Should I install another tracking app first?

Usually no. Inventory native Google & YouTube, existing custom pixels, and GTM first. A third purchase path without dedupe often creates inflated counts next.

Quantify the post-migration gap

If Checkout Extensibility retired your thank-you scripts and DIY cannot prove checkout_completed → purchase, buy the diagnostic.

$497USD · prepaid

What’s included on fixmypixels.com · GA4 vs Shopify guide · 72h from confirmed access · credits into Sprint