Checkout Extensibility Migration Plan: Replace Legacy Checkout Customizations Safely
Migrate from checkout.liquid and scripts to Checkout UI Extensions, Functions, and Customer Events without revenue or tracking regressions.
Stores still carrying legacy checkout customizations are exposed to conversion, compliance, and measurement regression risk. You need a deterministic replacement map, not a one-shot rewrite.
Dates that matter for migration planning
- August 13, 2024:
checkout.liquidstopped working on in-checkout pages. - August 28, 2025:
checkout.liquid, additional scripts, and script tags on Thank you/Order status reached end-of-support. - January 6, 2026: Shopify started automatic upgrades for stores still using deprecated checkout pages.
- June 30, 2026: Shopify Scripts stop working. Shopify Functions remains.
Migration matrix by capability
- UI customization in checkout -> Checkout UI Extensions.
- Business rules/validation -> Shopify Functions.
- Tracking events -> Customer Events + Web Pixels API.
- Post-purchase UI/logic -> Extension targets and app blocks.
Inventory current customizations first
UI path: Settings > Checkout > View personalized report.
Capture each existing customization with:
- source location,
- business owner,
- expected behavior,
- replacement surface,
- rollback plan.
Checkout UI Extensions implementation
Add controlled attribute capture in checkout
import {
reactExtension,
Checkbox,
useApplyAttributeChange
} from "@shopify/ui-extensions-react/checkout";
export default reactExtension("purchase.checkout.contact.render-after", () => (
<GiftWrapExtension />
));
function GiftWrapExtension() {
const applyAttributeChange = useApplyAttributeChange();
async function onToggle(value) {
await applyAttributeChange({
type: "updateAttribute",
key: "gift_wrap_requested",
value: value ? "yes" : "no"
});
}
return <Checkbox onChange={onToggle}>Add gift wrap</Checkbox>;
}
Replace Script-based validation with Functions
Validate shipping address constraints
src/cart_validations_generate_run.graphql
query Input {
cart {
deliveryGroups {
deliveryAddress {
address1
address2
}
}
}
}
src/index.js
const PO_BOX = /p\.?\s*o\.?\s*box/i;
export function cartValidationsGenerateRun(input) {
const blocked = (input.cart?.deliveryGroups || []).some((group) => {
const a1 = group.deliveryAddress?.address1 || "";
const a2 = group.deliveryAddress?.address2 || "";
return PO_BOX.test(`${a1} ${a2}`);
});
if (!blocked) return { operations: [] };
return {
operations: [
{
validationAdd: {
errors: [
{
message: "PO boxes are not supported for this shipping method.",
target: "$.cart.deliveryGroups"
}
]
}
}
]
};
}
Rebuild analytics in Customer Events
UI path: Settings > Customer events.
analytics.subscribe("checkout_started", (event) => {
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
event: "checkout_started",
checkout_token: event.data?.checkout?.token,
currency: event.data?.checkout?.currencyCode
});
});
analytics.subscribe("checkout_completed", (event) => {
window.dataLayer.push({
event: "purchase",
order_id: event.data?.checkout?.order?.id,
value: event.data?.checkout?.totalPrice?.amount,
currency: event.data?.checkout?.currencyCode
});
});
Release with configuration gates
UI path: Settings > Checkout > Configurations.
Use phased traffic rollout
- Create staging configuration.
- Assign low-risk market or segment.
- Validate event parity and conversion parity.
- Increase rollout in controlled increments.
Technical Checklist
- Every legacy checkout customization has a mapped extensibility replacement.
- No live dependency remains on
checkout.liquidor additional scripts. - Validation logic is migrated into Shopify Functions with test coverage.
- Pixel/event mapping is rebuilt using Customer Events subscriptions.
- Checkout configuration rollout is phased with rollback criteria.
- Revenue and AOV parity checks pass before full rollout.
SEO Checklist
- Thank you and Order status tracking migration preserves attribution continuity.
- Purchase event schema for analytics remains stable after migration.
- No checkout migration changes leak
noindexto storefront pages. - Consent and pixel loading behavior remains compliant per region.
- Post-purchase content and links stay crawl-safe where indexable.