Upgrading from checkout.liquid to Checkout Extensibility (2026)
Step-by-step migration from checkout.liquid, script tags and additional scripts to Shopify Checkout Extensibility, keeping upsells and tracking working.
If your Shopify checkout still has anything tied to checkout.liquid, script tags on the thank you page, or the old “additional scripts” box, that code is no longer running. Shopify completed the retirement of legacy checkout customization in 2025, and Checkout Extensibility is now the only supported way to change what happens between the cart and the order confirmation.
This guide covers what was turned off and when, what each piece maps to in the new model, and a practical migration order that protects revenue-generating features first: post purchase upsells, tracking, and checkout messaging.
TL;DR: checkout.liquid, checkout script tags, additional scripts and Shopify Scripts are all retired. Replace UI with checkout UI extensions and post-purchase extensions (added in the checkout editor), replace tracking with web pixels, and replace discount and shipping logic with Shopify Functions. Most stores can finish in an afternoon by swapping apps rather than rewriting code.
Do you need to migrate?
Answer three questions:
- Did your store use checkout.liquid? Only Shopify Plus stores ever had access. If you are on Basic, Shopify or Advanced, you never had it, but the next two questions still apply.
- Did you paste tracking or app code into Settings > Checkout > “Additional scripts”? That box is gone and the code no longer runs. Migrate your tracking.
- Do you use an upsell, survey, tracking or review app that worked by injecting a script into the thank you page or redirecting after payment? Check whether the app has shipped a Checkout Extensibility version. If not, replace it.
If none of the three apply and your checkout is stock, you are already on the new system; skip to the post-purchase section below.
What was retired, and when
| Legacy mechanism | Retired | Replacement |
|---|---|---|
| checkout.liquid on information, shipping and payment pages (Plus) | August 13, 2024 | Checkout UI extensions in the checkout editor (Plus) |
| checkout.liquid on thank you and order status pages | August 28, 2025 | Checkout UI extensions on thank you / order status page (all plans) |
| Script tags on the order status page | August 28, 2025 | Checkout UI extensions; web pixels for tracking |
| “Additional scripts” (order status page) | August 28, 2025 | Web pixels (Settings > Customer events) |
| Shopify Scripts (Ruby line-item, shipping, payment scripts, Plus) | August 28, 2025 | Shopify Functions |
Source: Shopify’s Checkout Extensibility upgrade documentation.
Why Shopify closed the old path
Three reasons, each of which affected merchants directly.
Risk. checkout.liquid and script tags ran arbitrary third-party code on the same page as payment fields. Scripts conflicted with each other, one bad update could break checkout entirely, and Shopify could not audit what any given store was loading.
Performance. Every script was extra work on the browser’s main thread at the moment of highest purchase intent. This is the direct cause of poor Interaction to Next Paint scores on checkout; see how native extensions keep INP under 200 ms.
Upgrade safety. Shopify could not ship checkout improvements without risking broken custom templates. Extensions never touch checkout markup, so Shopify can update the checkout underneath them.
What Checkout Extensibility consists of
Instead of asking “what code do you want to run”, the new model asks “what outcome do you want” and provides a sandboxed building block for each.
Checkout UI extensions. Small app bundles that run in an isolated web worker and render through Shopify’s component library at fixed targets: banners, custom fields, trust messaging, product offers on the order status page. On the information, shipping and payment steps they require Plus; on the thank you and order status pages they are available to all plans. Merchants add and position them as app blocks in the checkout editor. See checkout UI extensions vs legacy apps for the architecture comparison.
Post-purchase extensions. A dedicated page between payment and the thank you page where an app can show a one-click offer. Accepting adds the product to the existing order and charges the stored payment method. Available on all plans.
Web pixels. The replacement for pasted tracking scripts. Shopify emits standard customer events (page viewed, product added to cart, checkout completed) inside a sandbox; Shopify-built pixels for Google, Meta and others, plus app pixels and custom pixels, subscribe to them. Managed in Settings > Customer events.
Shopify Functions. Server-side logic for discounts, delivery options and payment method ordering. Discount Functions are available on all plans; delivery and payment customizations require Plus.
Checkout editor. Settings > Checkout > Customize is where you position app blocks, edit text, and set logo, colors and fonts (Plus adds the Checkout Branding API).
Migration, step by step
Step 1: Inventory what you had
Write down every customization by function, not by code. Typical categories:
- Conversion tracking and attribution (Google, Meta, TikTok, affiliate pixels)
- Post-purchase or thank you page upsells
- Checkout messaging: delivery estimates, guarantees, gift notes
- Post-purchase surveys (“how did you hear about us”)
- Discount or shipping logic (Shopify Scripts)
For each, note whether it still produces measurable value; migration is the moment to drop what does not.
Step 2: Move tracking to web pixels first
Tracking has no visible failure mode, so do it before anything else.
- Go to Settings > Customer events.
- For Google, Meta and other major platforms, install the official Shopify sales channel or app; it registers a managed pixel automatically.
- For anything else, add a custom pixel and subscribe to
checkout_completedand the other events you need. - Place a test order and confirm the events fire in each platform’s debugger.
Pasted Google Tag Manager containers do not run in checkout; if you need GTM, load it through a custom pixel.
Step 3: Open the checkout editor
Settings > Checkout > Customize opens your checkout profile. Here you can:
- Add app blocks from installed apps to the thank you page and order status page (any plan) or to the checkout steps (Plus)
- Edit built-in text and styling
- Preview the checkout, thank you and order status pages before publishing
If an app you rely on does not appear in the “Apps” section of the editor, it has not been rebuilt on Checkout Extensibility.
Step 4: Replace legacy apps with native ones
You do not rewrite scripts; you swap the apps that shipped them. For each category in your inventory, install an app that provides the equivalent as an extension, recreate the configuration, verify with a test order, then uninstall the legacy app. Uninstalling last avoids a gap where nothing runs.
Step 5: Rebuild discount and shipping logic as Functions
If you used Shopify Scripts for tiered discounts, free gifts or shipping rate changes, these need a Functions-based app (or a custom Function built by a developer). Discount Functions work on all plans; delivery and payment customizations are Plus. Most common cases (volume discounts, free shipping thresholds, hiding a payment method) have off-the-shelf apps.
Add a native post-purchase upsell
Post-purchase is the highest-leverage surface in the new model, because it is the one place Shopify lets an app add revenue after the sale is secured without touching checkout performance. The customer has paid, the payment method is authorized, and a decline costs nothing.
With Cart X, the setup is:
- Install Cart X from the Shopify App Store.
- In Cart X, create a post-purchase funnel: choose the trigger products or collections, the offer product, and the discount. Add up to three upsells and three downsells; a downsell shows only if the previous offer is declined.
- In Settings > Checkout > Customize, open the post-purchase page and select Cart X as the post-purchase app.
- Place a test order and confirm the offer renders, “Decline offer” returns to the thank you page, and an accepted offer appears as an additional line on the same order.
Shopify’s rules for this surface are strict: state that the stored payment method will be charged, strike through the compare-at price when discounting, always show a decline button, and never use false urgency. Cart X’s offer templates enforce these. For strategy, see pre-purchase vs post-purchase upsell.
Frequently asked questions
Will my tracking break if I have not migrated?
It already has. Nothing in checkout.liquid or additional scripts executes. Recreate the tracking as web pixels in Settings > Customer events.
Do I need a developer?
Usually not. Apps handle the extension code; you configure them in the checkout editor. A developer is only needed for genuinely custom logic that no app covers, which is then built as a custom checkout UI extension or Function.
Is Checkout Extensibility only for Shopify Plus?
No. Thank you page, order status page and post-purchase extensions, web pixels and Discount Functions are on every plan. Plus adds extensions on the checkout steps, the Branding API, and delivery and payment customizations.
Can I keep my existing upsell app?
Only if it has shipped a Checkout Extensibility version. Check the checkout editor: if the app does not appear as an app block or post-purchase app, it is not using the supported surfaces.
Try it on your store
Cart X was built on Checkout Extensibility from the start: native post-purchase upsells with downsells, thank you page and order status page offers, and an in-cart popup, with no code. Install it from the Shopify App Store; the free plan includes every feature up to 100 orders a month, and paid plans have no revenue cap or commission.