Shopify Checkout Extensibility vs Theme Liquid: Where Each Belongs
Checkout UI extensions and theme Liquid solve different problems. We map the boundary from Plus checkout rebuilds and theme-only stores so your team does not ship the wrong layer.
Share with Shopify developers — useful guides spread faster in theme dev communities.
Marketing asked for custom checkout Liquid on a Basic plan store last spring. Shopify had moved that boundary years ago. Drawing the checkout line — what theme Liquid can still do versus what Plus checkout extensions require — prevents proposals that sound possible in a sales deck but fail in admin.
The most expensive misunderstanding on Shopify Plus projects is scope placed in the wrong layer: a developer spends a week editing cart-drawer.liquid when the client needed a checkout UI extension; or an app team builds checkout extensions for a problem that belongs in theme product sections. Checkout extensibility and theme Liquid are adjacent in the shopper journey but separated by platform architecture. Theme Liquid renders the storefront — product pages, cart drawer, header, collection grids. Checkout extensibility renders checkout after the handoff — payment, shipping selection, thank-you page extensions on supported surfaces. Three client calls in one month — each quoting "checkout customization" without naming the system — produced the boundary map below. Pair with cart drawer implementation for storefront-side cart work.
What theme Liquid still owns in 2026
Theme Liquid owns everything before checkout submission on standard Online Store flows: discovery, product evaluation, cart accumulation, and accelerated checkout buttons on product and cart surfaces. That includes sections/, snippets/, JSON templates, cart drawer AJAX, cart drawer implementation, and app blocks in main-product. Merchants customize these in the theme editor. Developers deploy via Git, CLI, or ZIP. When Nishad audits a theme, he maps shopper touchpoints: which are Liquid-addressable before checkout click. If the answer is "product upsell before payment," that is theme work — not checkout extensibility.
Cart drawer: last theme-controlled moment
The cart drawer is the highest-leverage theme Liquid surface for pre-checkout conversion. Free shipping progress bars, upsell tiles, discount messaging, and trust icons belong here — implemented with sections, snippets, and /cart.js refresh patterns. Once the shopper clicks Checkout, theme JavaScript typically hands off to Shopify-hosted checkout. Patching checkout DOM from theme assets is fragile and breaks Terms of Service. We redirect client requests for "checkout field edits" to the correct layer after confirming Plus status and checkout profile version.
{%- comment -%} Theme layer — cart drawer footer trust (valid) {%- endcomment -%}
{{ section.settings.trust_message }}
{% for block in section.blocks %}
- {{ block.settings.label }}
{% endfor %}
{%- comment -%} This is NOT checkout — it is pre-checkout theme UI {%- endcomment -%}
What checkout extensibility is
Checkout extensibility is Shopify's model for customizing checkout on Plus using UI extensions (React-based components deployed to checkout surfaces), Shopify Functions (discount, delivery, payment customization logic), and branding in the checkout editor. It replaces deprecated checkout.liquid editing for new Plus merchants. Extensions mount at defined targets — purchase.checkout.block.render, thank-you page, order status — not arbitrary HTML injection. Your app or custom extension ships through Shopify's deployment pipeline, not theme sections/. Dhruv's first Plus project lesson: the checkout editor preview and live checkout profile must match; draft profiles save teams from Friday disasters.
Side-by-side boundary table
- Product page upsell — Theme Liquid section or app block on product.json
- Cart cross-sell — Theme Liquid cart drawer section + Cart API
- Shipping method UI in checkout — Checkout UI extension or carrier app
- Payment step trust badge — Checkout UI extension target
- Post-purchase survey — Thank-you / order status extension
- Dynamic discount rules — Shopify Functions, not Liquid
- Collection merchandising — Theme Liquid exclusively
- Checkout font/color branding — Checkout branding editor (Plus), not theme CSS
Plus versus non-Plus client conversations
Non-Plus merchants hit a hard ceiling on checkout UI. Sales teams promise "custom checkout" without qualifying plan level. K2 Devworks clarifies in kickoff: theme scope covers cart and storefront; checkout customization requires Plus and a separate extension scope with different tooling, timeline, and maintainers. Some clients downgrade expectations to cart drawer polish and Shop Pay optimization — legitimate wins without Plus. Others upgrade to Plus — budget for extension developers, not theme freelancers only. Document plan assumptions in writing; Dhruv and Nishad have rescued projects where ineligible checkout promises were sold to Basic plan merchants.
When apps blur the boundary
Subscription apps, upsell apps, and one-click post-purchase offers span layers. Recharge or Skio may inject theme widgets and checkout-adjacent flows. Post-purchase upsell apps use extensions after payment — not theme Liquid. Before integrating, read whether the app uses theme app extensions, checkout UI extensions, or ScriptTag legacy patterns. Duplicate upsells happen when theme cart drawer and checkout extension both fire — shoppers see two offers and abandon. Map app surfaces in a spreadsheet: theme, checkout, admin. App blocks vs sections helps for theme-side; checkout apps need extension docs.
Shopify Functions versus Liquid logic
Merchants ask for "if cart contains collection X, show message Y" in checkout. Liquid can do that in cart drawer before checkout. Inside checkout payment step, you need Functions or UI extensions reading cart attributes — not product.liquid. Complex B2B pricing belongs in Functions or dedicated apps, not hacked Liquid comparing cart item properties on the thank-you page (which you do not control with Liquid anymore). When scope creeps, we draw a literal diagram in Figma: left column Theme Liquid, right column Checkout extensibility, arrows at checkout click.
Accelerated checkout buttons: theme concern
Shop Pay, Apple Pay, Google Pay buttons on product and cart pages are theme-rendered via Liquid and Shopify payment settings — not checkout extensions. Broken wallet buttons are theme integration bugs: wrong form structure, missing variant id input, CSS pointer-events:none on parent. We fix these in sections/main-product.liquid and cart form snippets. Do not conflate with Plus checkout branding. Dawn customization lessons covers wallet button placement on Dawn forks.
{%- comment -%} Product form — theme layer wallet buttons {%- endcomment -%}
{% form 'product', product %}
{% render 'buy-buttons', block: block, product: product %}
{{ form | payment_button }}
{% endform %}
Project staffing and skills
Theme Liquid developers are not automatically checkout extension developers. Extensions use React, Shopify CLI app scaffolding, and deployment profiles. Agencies should staff separately or partner. Quoting one "Shopify dev" for theme rebuild plus checkout extensions underestimates learning curve. Our theme team hands off extension requirements as user stories with surface targets; extension specialists implement. Mixed teams need shared glossary — cart drawer, checkout profile, UI extension target — so standups do not talk past each other.
Migration from legacy checkout.liquid
Legacy Plus stores may still reference checkout.liquid customization from pre-extensibility era. Shopify has been pushing migration to extensible checkout. Rescue projects audit: what customizations exist, which have extension equivalents, which are abandoned. Tracking pixels and analytics moved to web pixels and server-side patterns — not inline Liquid in checkout. Migration is a product project, not a weekend theme PR. Budget QA across payment methods, international markets, and B2B checkout if applicable.
Testing strategy across both layers
Theme QA uses duplicate themes and device lab — established in section workflow. Checkout extension QA uses profile previews, test orders, and market-specific checkout flows. A change in cart drawer Liquid does not require extension redeploy; a UI extension change does not fix cart drawer bugs. Regression suites should tag which layer failed. We maintain separate checklists in Notion: Theme Pre-Checkout and Checkout Extensions — merged only at UAT sign-off when marketing reviews full funnel.
Performance and UX continuity
Shoppers feel discontinuity when cart drawer branding diverges wildly from checkout branding. Align typography, colors, and trust language across layers within platform limits — checkout branding editor on Plus, theme CSS variables in drawer. Theme performance tips apply to cart drawer JS; checkout performance is Shopify-hosted with extension bundle budgets. Heavy extension JavaScript slows payment step; theme-side cart bloat slows add-to-cart. Optimize each layer independently.
Common scoping mistakes
- Promising custom checkout fields on non-Plus plans.
- Building theme cart drawer features that duplicate checkout extension upsells.
- Editing checkout.liquid on migrated Plus stores against Shopify guidance.
- Using ScriptTags for checkout DOM manipulation — brittle and deprecated direction.
- Assuming app marketing "checkout customization" means theme-accessible code.
Decision workflow for your next client ask
When a client says "customize checkout," run this sequence: confirm Plus and extensible checkout status; identify shopper step — cart, payment, post-purchase; if before checkout click, theme Liquid; if after, extensions; if discount logic, Functions; if purely merchandising, theme sections. Document in proposal which deliverables live in Git theme repo versus app/extension repo. Clear boundaries prevent rework and protect merchants from solutions that break on Shopify platform updates. Theme excellence and checkout excellence are both achievable — just not in the same file.
B2B and wholesale checkout boundaries
B2B clients blur lines further: net payment terms, PO numbers, and volume pricing may appear in cart drawer via Liquid reading customer.tags, while actual payment term enforcement happens in checkout via Functions or B2B apps. Theme developers implement visibility — show PO field snippet when customer is company account — but validation logic belongs in checkout extensions or Shopify B2B features. We have seen themes hack PO collection in cart note fields while checkout ignored them — fulfillment chaos. Map B2B requirements in discovery: theme UI versus checkout validation versus ERP integration.
Web pixels, analytics, and the post-Liquid handoff
Analytics migrated off inline Liquid in checkout to web pixels and server-side events. Theme Liquid still fires add-to-cart and view-item events on product pages — coordinate with marketing so duplicate events do not inflate ROAS reporting when checkout extensions also track purchase. Theme developers document which sections emit data attributes for GTM — data-product-id on cards, data-section-name on bands — so analytics teams wire triggers without editing Liquid weekly. Checkout pixel configuration is admin-side; do not promise theme PR fixes for missing purchase events.
Checkout branding alignment workshop
Before Plus checkout extension work, run a branding alignment session: cart drawer colors, typography, button radius, and trust copy should philosophically match checkout branding editor settings even when hex codes differ slightly. Merchants notice jarring jumps from minimalist drawer to default checkout. Theme team exports CSS variables list; extension team maps closest checkout branding tokens. Perfect match is impossible — Shopify hosts checkout — but intentional continuity reduces abandonment attributed to "site felt different."
Proposal language that prevents scope creep
SOW language we use: Theme Liquid scope covers storefront templates, sections, snippets, cart drawer, and accelerated checkout buttons through checkout handoff. Checkout UI extension scope covers Plus checkout surfaces deployed via Shopify CLI app project, separate timeline and maintainer. Functions scope covers discount and delivery logic with server-side tests. When clients request "custom checkout field," we specify which layer in writing — cart note (theme), checkout attribute (extension), or order metafield (app/admin). Vague checkout customization line items created the rescue calls that motivated this article.
International markets and checkout profiles
Plus stores with multiple markets may run different checkout profiles per region — theme Liquid still renders one storefront with market-aware pricing, but checkout extensions can vary by market. Theme developers must not hardcode currency symbols in cart drawer when markets handle presentation. Test cart drawer and checkout handoff per market on staging before launch. A UK market checkout extension does not fix a US cart drawer displaying wrong currency — layer confusion again.
Training internal teams on the boundary
Sales and PM teams sell features without knowing Liquid boundaries. We run annual internal lunch-and-learn: live demo adding trust icons in cart drawer (theme), then show checkout extension admin (not theme editor). Developers attend sales kickoffs for Plus deals to answer one question — theme or extension? — before estimates go out. Reduces the "can you quick tweak checkout in Liquid?" Slack messages that waste senior developer time explaining platform architecture for the fifth time.
Headless and Hydrogen adjacency
Headless Hydrogen storefronts may not use theme Liquid at all — checkout still routes through Shopify checkout with extensibility on Plus. Agencies serving hybrid clients must not apply this article's theme guidance to React components while ignoring checkout boundary on the same project. Document which repo owns cart UI versus checkout extensions. Theme Liquid expertise does not automatically transfer to Hydrogen cart routes without relearning the handoff point — still Shopify checkout, still not theme sections on payment step.
Escalation path when scope is wrong
When mid-sprint discovery reveals checkout extension need on a theme-only SOW, stop theme work on that feature, notify PM, issue change order. Patching cart drawer to mimic checkout field validation wastes budget and fails compliance. Our escalation template: problem statement, correct layer, estimated extension effort, theme cleanup to remove wrong-layer attempt. Clients respect honesty; they do not respect launch-week reversions.
Documentation deliverables per layer
Theme handoff doc covers sections, snippets, JSON templates, cart drawer behavior. Checkout extension handoff covers extension targets, deployment command, checkout profile names, and rollback. Never merge both into one vague README. Future developers — internal or client — find the right repo in five minutes instead of searching theme sections/ for checkout React code that was never there. Dawn customization lessons exemplifies theme-side documentation depth; checkout docs mirror that specificity for Plus work.
If your team only ships theme Liquid today, still read checkout extensibility release notes quarterly. Shopify moves features across layers — cart attributes, branding APIs, Functions types — and proposals go stale when developers assume 2023 boundaries still apply. Bookmark Shopify developer changelog; spend thirty minutes monthly. That habit prevents quoting theme work for problems Shopify already solved in checkout extensions.
Share this boundary map in client kickoff decks for Plus rebuilds. One slide: cart drawer equals theme, checkout payment equals extensions, Functions equal logic. Stakeholders remember slides longer than appendix SOW language. Fewer wrong-layer requests reach development backlog — the metric we care about on every Plus engagement we scope.
Cart drawer is your last conversation in Liquid. Checkout is a different product surface — treat it that way in estimates and architecture.
Frequently asked questions
Can I customize checkout with theme Liquid on Shopify Plus?
No. Checkout rendering is outside theme Liquid on modern Plus stores. Checkout customization uses Checkout UI extensions, Shopify Functions, and the checkout editor — not sections/product.liquid or layout/checkout.liquid on older deprecated flows.
Where does cart drawer customization fit?
Cart drawer is theme Liquid — sections, snippets, Cart AJAX API. It affects pre-checkout UX. Once the shopper clicks checkout, theme Liquid stops; checkout extensibility takes over on eligible Plus setups.
Do non-Plus stores have any checkout customization?
Limited — branding settings, checkout language, and some apps. You cannot deploy custom checkout UI extensions without Plus. Theme work focuses on cart, product pages, and accelerating checkout buttons.
Should trust badges live in cart drawer or checkout extension?
Pre-checkout trust signals belong in cart drawer or product page theme sections. Checkout extensions handle payment-step reassurance — guarantees, support phone, policy links — where shoppers hesitate during payment entry.
How do we test checkout extensions without breaking live checkout?
Use draft checkout profiles, preview URLs from Shopify CLI, and test on duplicate stores when possible. Never experiment on production checkout during peak sales without a rollback plan.
Topic cluster
Theme Development
Dawn, performance, images, and production theme workflows.
Convert HTML to Shopify Liquid
Paste HTML & generate Liquid with schema, blocks, and scoped CSS. No signup required.
Share
Share this guide
Found this guide useful? Share it with other Shopify developers on LinkedIn, X, or Reddit.
Authors
About the authors
Practical Shopify section workflows from the developers who build and maintain this tool.

Dhruv Goyani
3 years web design + 3 years Shopify development experience
Dhruv combines web design and Shopify theme development — converting Figma and static HTML into merchant-editable OS 2.0 sections for client stores. He focuses on schema structure, section presets, and clean handoffs between design and Liquid.
Follow Dhruv on LinkedIn
Nishad Kikani
2 years web design + 6 years Shopify development experience
Nishad has six years of Shopify theme engineering — Dawn migrations, JSON templates, performance tuning, and complex block-based sections. He leads client delivery, code review, and the production standards behind every export from HTML to Liquid Converter.
Follow Nishad on LinkedInRelated articles from our team
Editorial review
Reviewed by the HTML to Liquid Converter team


Content is reviewed by the HTML to Liquid Converter Shopify development team before publication. Technical accuracy is validated against current Shopify Online Store 2.0 conventions and active client theme work.
Last updated:
Questions or corrections? Contact us.