On August 26, 2026, Shopify switched off the last way non-Plus stores could run their own scripts on the Thank you and Order status pages. If your store still relied on code pasted into Additional scripts, or on an app that injected a script tag, that code stopped running. Stores that hadn't upgraded their Thank you and Order status pages by the deadline were upgraded automatically.
For most merchants the first sign is quiet: purchases keep coming in, but Google Ads, Meta, affiliate or analytics dashboards start reporting fewer conversions. This guide explains what changed, how to check your store in about five minutes, and how to rebuild tracking the way Shopify now supports.
What changed, and when
- Shopify Plus stores:
checkout.liquid, Additional scripts and script tags on the Thank you and Order status pages were sunset on August 28, 2025. - All other plans (Basic, Grow, Advanced): script tags on those pages were sunset on August 26, 2026, which was also the deadline to upgrade the Thank you and Order status pages. Stores that weren't upgraded by then were upgraded automatically.
- Apps: since February 1, 2025, apps haven't been able to create new script tags on the Thank you or Order status pages.
- The rest of the storefront is next: script tags stop running on every storefront page on March 1, 2027. If an app still loads code that way, see our theme app extensions guide. We list all these dates on our Shopify deprecation tracker.
Anything that depended on running your own JavaScript on the order confirmation page is affected. That usually means purchase pixels, affiliate or influencer tracking, post-purchase surveys, and custom messages or widgets.
Check your store in five minutes
- In your Shopify admin, go to Settings > Customer events and note which app pixels and custom pixels are connected.
- Open the pixel in Settings > Customer events and click Test to launch the Shopify Pixel Helper. It shows which events reach Shopify's pixel sandbox and flags errors.
- Place a test order. Use your payment provider's test mode, or a 100% discount code on a low-price product, and complete checkout with the Pixel Helper open.
- On the Thank you page, confirm that a
checkout_completedevent fires and that each ad or analytics tool you use receives it. - Compare conversions in Google Ads, Meta Events Manager and your affiliate platform for the two weeks before and after August 26 against your Shopify order count. A sudden drop that your sales don't show is the tell-tale sign.
Want a quick first pass? Our free Shopify tracking checker lists the Customer Events pixels, theme tags and script tags on any store in a few seconds.
What replaces what
- Tracking code in Additional scripts or theme files → an app pixel from the platform's official Shopify app, or a custom pixel under Settings > Customer events.
- Google Tag Manager pasted into Additional scripts → a custom pixel that loads your GTM container and pushes Shopify's standard events into the
dataLayer. - Apps that relied on script tags → the app's app block or app pixel. Check whether the app has released an updated version.
- Surveys, upsells or custom content on the Thank you page → app blocks built as checkout UI extensions, placed with the checkout and accounts editor.
- Custom checkout.liquid logic (Plus) → checkout UI extensions, and Shopify Functions for discount, delivery and payment rules.
Fix 1: use official channel apps where they exist
For Google Analytics 4, Google Ads, Meta, TikTok and similar platforms, start with the platform's own Shopify app, such as Google & YouTube or Facebook & Instagram. These install app pixels that the platform maintains, so you aren't hand-maintaining event code.
Before you switch, remove the old pixel code from theme files and Additional scripts. Shopify's own guidance is to remove or modify existing pixels first, so the same purchase isn't counted twice.
Fix 2: a custom pixel for everything else
Custom pixels live under Settings > Customer events > Add custom pixel. They run in a sandbox and subscribe to Shopify's standard events such as page_viewed, product_added_to_cart, checkout_started and checkout_completed.
checkout_completed fires once per checkout, usually on the Thank you page. If you use post-purchase upsells, it fires on the first upsell page instead. Here is the pattern for sending a purchase to a third-party endpoint:
analytics.subscribe("checkout_completed", (event) => {
const checkout = event.data?.checkout;
if (!checkout) return;
const payload = {
orderId: checkout.order?.id,
value: checkout.totalPrice?.amount,
currency: checkout.currencyCode,
items: (checkout.lineItems || []).map((item) => ({
id: item.variant?.id,
name: item.title,
quantity: item.quantity,
price: item.variant?.price?.amount,
})),
};
// Replace with your vendor's documented tracking call:
fetch("https://tracking.example.com/purchase", {
method: "POST",
body: JSON.stringify(payload),
keepalive: true,
});
});
Custom pixels can't contain HTML, so a vendor snippet that ships as <script src="..."> has to be rewritten as JavaScript that creates the script element. By default a new custom pixel requires the customer's Marketing and Analytics consent, so check the pixel's privacy settings match your consent setup.
Google Tag Manager inside a custom pixel
If you run GTM, Shopify documents loading the container from a custom pixel and pushing events into the dataLayer. The purchase part looks like this:
analytics.subscribe("checkout_completed", (event) => {
window.dataLayer.push({
event: "checkout_completed",
orderId: event.data?.checkout?.order?.id,
currency: event.data?.checkout?.currencyCode,
value: event.data?.checkout?.totalPrice?.amount,
});
});
In GTM, the trigger's Event name must match the event value (checkout_completed), and you read orderId, currency and value with dataLayer variables. Two things catch people out:
- Tags that GTM loads still run inside Shopify's sandbox, with the same limits as any other pixel.
- Google Tag Assistant's Troubleshoot tag feature doesn't detect tags inside a custom pixel. Test with the Shopify Pixel Helper and your ad platform's own test tools instead.
Fix 3: content on the Thank you page
Pixels can send data, but they can't add anything to the page. For post-purchase surveys, upsell offers, delivery notes or custom messages, use app blocks: checkout UI extensions that you place in the checkout and accounts editor.
UI extensions on the Thank you and Order status pages are available on every plan. Extensions on the Information, Shipping and Payment steps of checkout are still limited to Shopify Plus (what each plan can customize). If no App Store app does what you need, a developer can build a custom extension.
Common mistakes
- Double counting: leaving old code in
theme.liquidwhile also installing the app pixel. - Consent mismatch: a custom pixel that needs Marketing consent never fires for visitors who only accepted Analytics.
- Testing with the wrong tool: GTM's troubleshooting view doesn't see custom pixels. Use the Shopify Pixel Helper.
- Assuming the automatic upgrade kept your widgets: the upgrade replaced the page. Anything that was injected by script has to be rebuilt as an app block.
"Customer events" greyed out or a pixel won't save
If Settings > Customer events is missing or read-only, or a custom pixel saves but never fires, the cause is usually a permission, a pixel status or a consent setting, not your code. Check these first.
| Symptom | Likely cause | Fix |
|---|---|---|
| A staff member or agency collaborator can't open Customer events | Their role doesn't include the View customer events permission | The store owner adds it to the role under Store settings permissions |
| You can see pixels but can't add or edit a custom pixel | The role has view access but not Manage and add custom pixels | Add that permission as well |
| An app pixel's settings can't be changed | Managing app pixels needs Manage and install apps and channels, and the app developer sets each app pixel's permissions and privacy settings | Grant the permission, or change settings in the app itself |
| Shopify asks for a different name when you save | Another custom pixel already uses that name | Give the pixel a unique name |
| The pixel is saved but tracks nothing | Saving doesn't connect it, so it sits under Disconnected pixels | Click Connect and confirm. Status should show Connected |
| The Pixel Helper shows "Pixel is awaiting consent" | Your consent rules haven't been met in this browser session | Accept tracking in the cookie banner, or click Give consent to continue test |
| Consent is given, but the pixel still doesn't fire | A third-party cookie banner isn't syncing consent to Shopify through the Customer Privacy API | Ask the banner vendor to confirm the sync |
| Pixels and consent fail on the new Order status page | Your store uses a custom domain, but the customer account domain isn't a subdomain of it | Use a subdomain such as account.example.com |
| An app pixel went quiet | Its data access is Optimized, and Shopify can pause marketing pixels it sees as oversharing | Check the pixel's activity log. Switch to Always on if the app still needs the data |
| You can't edit the pixel, or the Pixel Helper won't start | The Pixel Helper tests one pixel at a time, blocks edits while it runs, and doesn't work on headless stores or stores in private mode | Save, close the Pixel Helper tab, then reopen it with the pixel's Test button |
Sandbox limits that break old tracking code
Code copied from theme.liquid or Additional scripts often fails silently inside a pixel:
- No access to the page. Custom pixels run in an iframe (Shopify's "lax" sandbox) that can't reach the top frame. Selectors on the store's HTML, form scraping for emails or phone numbers, and outbound-link, scroll or heatmap tracking don't work.
- The URL is the sandbox's. Read the page URL from the event:
event.context.document.location.href. - No visible UI. Pixels can't render buttons, forms, banners or modals. Use app blocks instead.
- App pixels are stricter. They run in a web worker (the "strict" sandbox) with no
window.document. Only a few globals such asfetch,consoleand timers are guaranteed, and requests must support CORS. - DOM events have gaps.
clicked,form_submittedand theinput_*events work on the storefront, checkout and Thank you page, but not on the Order status page or customer account pages. On customer account pages, pixels track onlypage_viewed, and only after you connect a custom subdomain. Those pages exist only on the new customer accounts, not on legacy accounts. - For anything else, publish a custom event. Call
Shopify.analytics.publish('my_store:event_name', data)from your theme, oranalytics.publishfrom a checkout UI extension, and subscribe to that name in your pixel. You can't publish standard events, and prefixing your own names avoids collisions.
Need it fixed?
We rebuild Thank you page tracking and content for Shopify stores as a fixed-price job. That covers app pixels, custom pixels, GTM, and app blocks for surveys and upsells, and we test it with a real order. Send us your store URL and a list of the tools you track with, and we'll reply with a fixed quote.
Sources
- Shopify: checkout.liquid and Thank you page sunset dates
- Shopify Help Center: Upgrading the Thank you and Order status pages
- Shopify Help Center: Create custom pixel code
- Shopify Help Center: Create a Google Tag Manager custom pixel
- Shopify: checkout_completed event reference
- Shopify: Script tags blocked on Thank you and Order status pages
- Shopify Help Center: Store permissions
- Shopify Help Center: Manage your custom pixels
- Shopify Help Center: Testing custom pixels
- Shopify Help Center: App pixels
- Shopify: About web pixels (sandbox environments)
- Shopify: DOM Pixel Events API
- Shopify changelog: Shopify Pixel Helper (June 21, 2024)


