LUCENTCOMMERCEGET A FREE STORE AUDITFREE AUDIT

CHECKOUT · SHOPIFY PLUS · FUNCTIONS · 30 JUNE 2026 · 8 MIN READ

The checkout you cannot change, and the one you can

Checkout is now three narrow, well-documented surfaces instead of a template you could edit. Knowing which of the three a request falls into answers most of the scoping.

A release note pinned beside the storefront it changed

Checkout is no longer a template you edit — it is three separate, deliberately narrow surfaces. Branding changes how it looks through a design system applied to a checkout profile. UI extensions add content at defined targets, running in a sandbox with no access to the checkout page's HTML or assets. Functions change behaviour server-side: discounts, delivery options, payment methods, cart and checkout validation, bundles, fulfilment constraints and pickup. What is not on that list is not available at any price: the layout, the order of the steps, the fields Shopify asks for, and per-step styling. The plan line is sharper than most teams expect — Shopify documents that "only stores on a Shopify Plus plan can use custom apps that contain Shopify Function APIs", and that "checkout UI extensions for the information, shipping, and payment steps are available only to stores on a Shopify Plus plan".

IN SHORT

  • There are exactly three checkout surfaces — branding, UI extensions and Functions — and a request that does not map onto one of them is not a scoping problem, it is a no.
  • Shopify documents custom apps containing Function APIs as Shopify Plus only; public apps from the App Store that contain functions are not restricted that way.
  • Checkout UI extensions on the information, shipping and payment steps are documented as Plus-only. Thank you and Order status page targets are not behind that line.
  • checkout.liquid and additional scripts were sunset for the Thank you and Order status pages on 28 August 2025; script tags on those pages are sunset for non-Plus stores on 26 August 2026.
  • Functions run inside a published budget — 11 million instructions, 128 kB input and 20 kB output for carts up to 200 lines — so the logic has to be a decision, not a lookup.
  • Extensions run sandboxed with no access to checkout HTML, assets or sensitive payment data, and any outbound call needs the `network_access` capability declared.

The date in front of non-Plus stores

Start with the deadline, because it is the one thing in this article that has a date attached and some stores have not acted on it.

Shopify's documentation is unambiguous: "checkout.liquid and additional scripts were sunset for the Thank you and Order status pages on August 28, 2025. Script tags were sunset on those pages on August 28, 2025 for Plus stores, and are sunset for non-Plus stores on August 26, 2026." The same page notes that checkout.liquid "is now unsupported for the Information, Shipping, and Payment checkout steps".

If you are not on Plus and something still injects a script into your Thank you or Order status page, it stops working in under two months. In practice that is usually a conversion tag, a post-purchase survey, a referral widget or a reviews prompt — installed years ago by someone who has left, and invisible until the revenue attributed to it goes to zero. The replacement is a checkout UI extension or a web pixel, and both are development work with a lead time. Audit what is on those two pages this month, not in August.

Surface one: branding, which is a design system, not CSS

Branding attaches to a checkout profile and is applied either through the checkout and accounts editor or through the Admin GraphQL API. The input has two layers: a designSystem covering colour schemes, typography, font sizing and corner radius, and customizations reaching into specific areas — the header and logo, the main column, the order summary, form controls, the primary button, the footer, the buyer journey, the favicon.

You are configuring values, not writing rules. There is no selector, no cascade, and nowhere to put a media query. That is the constraint teams find hardest, and it is the right one: it is what lets Shopify keep shipping checkout improvements without breaking every store that styled it.

Two documented limits catch people at handover. You cannot style one step differently from another — Shopify states you "can't currently customize styling for individual pages" — and what you set carries across checkout, UI extensions and customer account pages together. And SVG is not a supported image type for styling checkout, so the logo needs a raster export.

Surface two: UI extensions, which add but never rearrange

An extension renders at a defined target — a named place in checkout — using Shopify's own components. It can add a delivery-date picker, a required consent checkbox, a gift message field, a loyalty balance, a note about a restricted item.

What makes extensions predictable is the sandbox, and it is worth understanding before you promise anything. Extensions run isolated from the checkout page and from each other, with no access to checkout HTML or assets and no access to sensitive payment data, restricted to the exposed APIs and a subset of standard web APIs. Outbound network calls are opt-in: an extension has to declare the network_access capability in its configuration, and Shopify's own documentation flags this even for the modest case of sending errors to a third-party service.

The practical consequence is that an extension cannot fight the page it sits in. It cannot move the email field, collapse the order summary, restyle the shipping step or read the card form. Every one of those has been asked for in a kickoff we have sat in, and the answer is the same each time.

The plan line runs through here too. Shopify documents that "checkout UI extensions for the information, shipping, and payment steps are available only to stores on a Shopify Plus plan." Thank you and Order status page targets are not behind that restriction, which is the practical route for a non-Plus store replacing a sunset script tag.

Surface three: Functions, where the real work is

Functions are the interesting surface, because they change what checkout *does* rather than what it shows. The documented set covers discounts, payment customisation, delivery options, server-side cart and checkout validation, location rules, bundles, fulfilment constraints, local pickup options and charges, and pickup points.

They run on Shopify's infrastructure, which is the whole point: validation implemented in a Function cannot be bypassed by a customer editing the cart, and a delivery rule cannot be skipped by a client that does not run your JavaScript. Anything that must be true about an order belongs here rather than in the theme.

They also run inside a published budget, and it is tighter than a general-purpose runtime. For carts up to 200 line items the documented limits are 11 million instructions, 128 kB of function input and 20 kB of function output, scaling proportionally as the cart grows beyond that. Around them sit fixed limits: a 256 kB compiled binary, 10,000 kB of linear memory, 512 kB of stack, and log output truncated at 1 kB. The input query itself is capped at 3,000 bytes excluding comments, with a query cost budget of 30 points, list arguments of up to 100 elements and metafield values up to 10,000 bytes.

Read as a design constraint rather than a specification, that budget says one thing: a Function is a decision, not a lookup. It gets the data it declared in its input query and it answers. It cannot call your ERP to ask whether this customer is on stop, and it cannot walk a thousand-row price list held in a metafield. Whatever the rule needs has to be on the cart, the customer or a metafield before checkout starts — which usually means a sync job somebody has to own, and that job is the part of the estimate people leave out.

  • Put anything that must be enforced in a Function. Theme-side validation is a hint to honest customers.
  • Shape the data for the decision in advance — a metafield holding the answer, not the inputs to the answer.
  • Test with a large cart. The dynamic limits are quoted against 200 line items, and a B2B order can exceed that comfortably.

The plan question, answered properly

This comes up in every scoping call and gets answered wrongly in both directions, so here is the documented position.

Shopify states that "only stores on a Shopify Plus plan can use custom apps that contain Shopify Function APIs", and separately that "some Shopify Functions capabilities are available only to stores on a Shopify Plus plan". Public apps distributed through the App Store containing functions are not restricted to Plus.

That distinction matters more than the headline. A store that is not on Plus cannot write its own checkout logic, but it can install someone else's. So the honest question for a non-Plus merchant is not "do we upgrade" but "does an App Store app already do this" — and for the common cases, one usually does. Upgrading to Plus to write one discount Function is the most expensive way to get a discount.

When Plus does pay for itself it is rarely a single rule but a set that only make sense together — B2B pricing with net terms and validation, multi-market delivery logic, a bundle model — plus the other things the plan carries. When we scope [a Shopify build](/services/build) that includes checkout, the plan question is settled by the whole list, never by one feature.

The requests we turn down, and why that is good news

A one-page checkout. A custom field order. Our own payment step. A different layout on mobile. A progress bar of our own design. These arrive on almost every checkout brief and none of them is buildable, on any plan, at any budget.

We would not build them if they were. The last decade of ecommerce is full of bespoke checkouts that were a competitive advantage for a year and a liability for the five after it — unmaintained, untested against new wallets, quietly converting worse than the default that kept improving without anybody paying for it. A checkout you cannot change is a checkout that gets better while you work on something else.

The reframe that gets a brief unstuck is to stop asking how checkout should look and start asking what has to be true about an order. Trade customers must not see consumer shipping rates. Hazardous goods must not go by air. A gift order needs a message and a delivery date. Orders over a threshold need approval. Every one of those is a Function or an extension, all of them are enforceable, and none of them needs a line of the checkout page to move.

If after that the brief still contains something on the impossible list, the work is not in checkout. It is in the cart page — which is yours, which is where the decision actually gets made, and which is where we would spend the budget.

Questions this raises

What are the limits of Shopify checkout customisation?

Three surfaces and nothing else. Branding sets a design system on a checkout profile. UI extensions add content at defined targets from inside a sandbox with no access to the page's HTML or assets. Functions change behaviour server-side — discounts, delivery, payments, validation, bundles, fulfilment constraints, pickup. Layout, step order, the fields Shopify asks for and per-step styling are not customisable.

Do you need Shopify Plus to customise checkout?

For the parts that matter, yes. Shopify documents that only stores on a Plus plan can use custom apps containing Function APIs, and that checkout UI extensions on the information, shipping and payment steps are Plus-only. Public App Store apps containing functions are not restricted to Plus, so a non-Plus store's first question should be whether an existing app already does the job.

Can you build a one-page checkout on Shopify?

No. The structure of checkout — what is asked, in what order, in which column — belongs to Shopify, and there is no surface that changes it. That is the trade that lets Shopify keep improving checkout for everyone. If the goal behind the request is fewer steps to purchase, the levers are express checkout and wallets, not the page layout.

What happened to checkout.liquid and additional scripts?

They were sunset for the Thank you and Order status pages on 28 August 2025, and checkout.liquid is unsupported for the information, shipping and payment steps. Script tags on those two pages were sunset for Plus stores on the same date and are sunset for non-Plus stores on 26 August 2026. Anything still injecting a script there needs replacing with an extension or a web pixel before that date.

Can a checkout Function call an external API?

No. A Function receives the data declared in its input query and returns a decision, inside a documented budget — 11 million instructions, 128 kB input and 20 kB output for carts up to 200 lines. Anything the rule depends on has to be present on the cart, the customer or a metafield before checkout begins, which means a sync job somebody owns. That job is the part of the estimate most often missed.

Can checkout UI extensions restyle checkout?

No, and deliberately so. Extensions render Shopify's components inside an isolated sandbox with no access to checkout HTML, assets or sensitive payment data, and they need the `network_access` capability declared before making any outbound call. Styling is the Checkout Branding API's job — and because branding applies across checkout, extensions and account pages together, an extension inherits the design system rather than needing its own.

NEXT STEP

Free store audit

A senior Shopify engineer reviews your storefront, theme performance and checkout, then sends a prioritised list of fixes.