The deadlines have passed. checkout.liquid is unsupported for the Information, Shipping and Payment steps, and on 28 August 2025 it was sunset for the Thank you and Order status pages too. Checkout script tags stopped working on Plus stores the same day, and stopped for everyone else on 26 August 2026. Shopify Scripts was deprecated on 30 June 2026, and published scripts were deactivated that day.
The question is no longer when to migrate. It is which of the things your checkout used to do earn a place on the most constrained surface in the store.
checkout.liquid was not replaced by another file
There is no new file to paste the old HTML, CSS and JavaScript back into. What replaced it is a division of labor across layers, each with its own rules, its own ceilings and its own plan gating.
- Shopify Functions. Logic that reacts to the real state of the cart, the address or the payment method. Runs on the server.
- Checkout UI extensions. What the buyer sees or fills in, in the browser and inside a fenced space.
- Web pixels. Anything that only measures.
- Checkout and Accounts Configuration API. Anything purely visual: type, color, shape.
Before a line of code moves, every legacy customization should land in one of those four boxes, or in a fifth: this does not need to be in checkout.
Validation moved to the server
This is a conceptual change, not a change of syntax. Stopping a buyer from advancing with an invalid cart used to mean intercepting them in the interface, and that pattern is being retired: the useBuyerJourneyIntercept hook and the block_progress capability were deprecated in version 2026-07. Existing extensions keep working on that version and earlier ones, but Shopify says the API will be removed later.
The replacement is the Cart and Checkout Validation Function API, which runs server-side and applies the rule across every surface — including express wallets such as Shop Pay, PayPal, Google Pay and Apple Pay, and agentic checkout, which is exactly where interface-level validation never reached. A store can activate up to 25 validation functions, and their errors are exposed on the Storefront API's Cart object, so the same rule shows up in a theme's cart.
The rest of the family follows the same logic. Hiding or reordering payment methods is a Payment Customization; doing the same to shipping is a Delivery Customization; and turning away discount codes now belongs in the Discount Function API, with one condition worth knowing before you promise it: that operation only works when an automatic discount backs the function.
What the buyer sees runs inside hard limits
UI extensions run in a Web Worker with no access to DOM APIs, and the bundle carries a strict 64 KB compressed limit. On Shopify CLI 3.92.0 or higher, each extension emits an esbuild metafile into its dist/ folder at build time, which is how you find out what is eating that budget; older CLI versions do not write it. The editor adds its own ceiling: a maximum of three apps per highlighted area.
Styling is not open either. Since version 2026-04 the branding layer is the Checkout and Accounts Configuration API, three pieces in place of designSystem and customizations: designTokens (a palette of up to 20 colors, typography, corner radius), components, and surfaces, which allows per-surface overrides. The Checkout Branding API and the Checkout Profile API were deprecated in the same version, but they were not switched off: checkoutBrandingUpsert still runs in 2026-07 and the styling docs still describe it, so a live branding integration has room to move. What did not change: it is Plus-only, there is no free-form CSS and no per-page styling, and SVG is not a supported image type. A design that leaned on fine-grained CSS is not migrated. It is redrawn inside the token system.
Before writing code, it is worth checking what the Checkout Blocks app already covers, with a plan caveat that changes the arithmetic: on Basic and higher only the dynamic content and static content blocks are available, and only on Thank you and Order status. Every other feature of that app is Shopify Plus only.
Address autocomplete belongs in this layer because it needs the field live. It has two targets: purchase.address-autocomplete.suggest returns suggestions as the buyer types, and the optional purchase.address-autocomplete.format-suggestion resolves the chosen one when your provider returns partial results. It needs an external address service, it is Shopify Plus only, and it sits on the critical path of every keystroke.
Thank you and Order status are not the same surface
They get named in the same breath, and underneath they are different. Thank you page extensions use the purchase.thank-you target and run at a moment when the order has not been created yet, though its id is available. Order status uses a customer account UI extension target, customer-account.order-status, where the order always exists. No UI extension mutates an order; post-purchase extensions are the tool for that, and they are still in beta. They run unrestricted in a development store, but using them on a live store means requesting access from Shopify first.
Where the plan boundary falls
You do not need Plus to customize. From Basic you can use web pixel extensions, UI extensions on Thank you, Order status and every customer accounts page, public apps built with Shopify Functions, and post-purchase extensions, subject to that beta access request. Plus-only territory is UI extensions on Information, Shipping and Payment — including checkouts from draft orders — custom apps containing Functions, and branding. Per-market customization starts on the Advanced plan.
Migrating early did not settle it
If your checkout was migrated in 2024, there is fresh debt already. Version 2025-07 is the last version that supports React-based UI components; from 2025-10 onward extensions use Polaris web components. Nothing was pulled out from under a pinned extension — it keeps running on its version. What Shopify documents is a block by API version, applied to the whole app: after 1 October 2026, an app containing checkout or customer account UI extensions on 2025-07 or earlier can no longer be updated, React or not. Version 2026-04 also deprecated the metafields property; reads move to shopify.appMetafields.
The other debt sits outside checkout. Online Store script tags are being retired separately: scriptTagCreate and scriptTagUpdate return a user error from 1 October 2026, and Shopify stops injecting existing tags into storefronts on 1 March 2027. They do not break until then, so they do not announce themselves — you have to go looking.
When to leave something out of checkout
Anything you put there you will migrate again, because the API moves by version and the layers shift, as they shifted between 2025 and 2026. And anything you add competes on the payment screen, under the design guidelines for checkout apps: lowest total by default, additional charges disclosed and itemized, optional ones off until the buyer turns them on, and network responses under a second. An attribution survey, an informational block or a recommendation lives better on the product page, in the cart or in customer accounts, where the cost of change is lower.
If a customization can live outside checkout without losing its purpose, move it out. What stays is what needs the real state of the order at that exact moment.
Where to start
- Open the customizations report in the admin, which groups the Scripts that were active into payment gateway, shipping and product discount sections, with compatible apps suggested.
- List every active extension with its API version. Any app with extensions on 2025-07 or earlier stops being updatable after 1 October 2026.
- Audit Online Store script tags separately from checkout ones: different debts, different dates.
- Sort each customization into one of the five boxes: Function, UI extension, pixel, branding, or out of checkout.
- Test in a draft configuration: a store has one active configuration and holds up to 20 drafts on Basic, Grow and Advanced, and up to 99 on Plus. A draft takes no traffic on its own; showing one to a portion of visitors is a rollout.
Common questions
Can you customize the Shopify checkout without being on Plus?
Partly, yes. From the Basic plan you can use web pixel extensions, UI extensions on the Thank you and Order status pages and on every customer accounts page, public apps built with Shopify Functions, and post-purchase extensions, which are still in beta: unrestricted in a development store, but running them on a live store requires requesting access from Shopify. Customizing the Information, Shipping and Payment steps, using custom apps that contain Functions, and applying checkout branding are Shopify Plus only. Per-market customization is available from the Advanced plan.
Can I stop a buyer from progressing through checkout if a rule is not met?
Yes, but no longer from the interface. The useBuyerJourneyIntercept hook and the block_progress capability were deprecated in version 2026-07 of checkout UI extensions; existing extensions keep working, but Shopify has said the API will be removed later. Validation now belongs in a Cart and Checkout Validation Function, which runs server-side and applies the rule across every surface, including express wallets such as Shop Pay, PayPal, Google Pay and Apple Pay, and agentic checkout. A store can activate up to 25 validation functions.
Can I add my own CSS or JavaScript to the Shopify checkout?
Your own JavaScript, yes, but only inside a checkout UI extension and under its rules: it runs in a Web Worker with no access to DOM APIs, and the bundle carries a strict 64 KB compressed limit. What you cannot do is inject scripts or write free-form CSS. Appearance is controlled through the Checkout and Accounts Configuration API, which as of version 2026-04 replaces the Checkout Branding API and the Checkout Profile API; both are deprecated, though checkoutBrandingUpsert still works. It is Shopify Plus only, works through designTokens, components and surfaces, does not allow styling individual pages separately, and does not accept SVG images.
What happens to my Online Store script tags?
They are being retired too, on dates separate from the checkout ones. From 1 October 2026 the scriptTagCreate and scriptTagUpdate mutations return a user error, though existing tags keep running, and on 1 March 2027 Shopify stops injecting them into storefronts. The general replacement is an app embed block inside a theme app extension; if a script only collects analytics or conversion data, the replacement is a web pixel. This debt is worth auditing separately from the checkout migration.
