Skip to main content

Upgrading to 2025-10

This guide describes how to upgrade your checkout UI extension to API version 2025-10 and adopt Polaris web components.


Set the API version to 2025-10 in shopify.extension.toml to use Polaris web components.

Shopify.extension.toml

api_version = "2025-10"

[[extensions]]
name = "your-extension"
handle = "your-extension"
type = "ui_extension"

# Contents of your existing file...

Anchor to adjust-dependenciesAdjust package dependencies

As of 2025-10, Shopify recommends Preact for UI extensions. Update the dependencies in your package.json file and re-install.

New dependencies with Preact

package.json

{
"dependencies": {
"preact": "^10.10.x",
"@preact/signals": "^2.3.x",
"@shopify/ui-extensions": "2025.10.x"
}
}

Get full IntelliSense and auto-complete support by adding a config file for your extension at extensions/{extension-name}/tsconfig.json. You do not need to change your app's root tsconfig.json file.

New tsconfig.json

tsconfig.json

{
"compilerOptions": {
"jsx": "react-jsx",
"jsxImportSource": "preact",
"target": "ES2020",
"checkJs": true,
"allowJs": true,
"moduleResolution": "node",
"esModuleInterop": true
},
"include": ["./src", "./shopify.d.ts"]
}

Anchor to upgrading-shopify-cliUpgrade the Shopifiy CLI

The new CLI adds supoort for building 2025-10 extensions.

The shopify app dev command runs your app and also generates a shopify.d.ts file in your extension directory, adding support for the new global shopify object.

Support new global shopify object

CLI

# Upgrade to latest version of the CLI
npm install -g @shopify/cli

# Run the app to generate the type definition file
shopify app dev

Anchor to eslint-configurationOptional ESLint configuration

If your app is using ESLint, update your configuration to include the new global shopify object.

.eslintrc.cjs

module.exports = {
globals: {
shopify: 'readonly',
},
};

Instead of accessing APIs from a callback parameter, access them from the global shopify object. Here's an example of migrating the applyAttributeChange API call.

New API calls in Preact

Preact

import '@shopify/ui-extensions/preact';
import {render} from 'preact';

export default function extension() {
render(<Extension />, document.body);
}

function Extension() {
return (
<s-checkbox
onChange={onCheckboxChange}
label="Include a complimentary gift"
/>
);
}

async function onCheckboxChange(event) {
const isChecked = event.target.checked;

const result =
await shopify.applyAttributeChange({
type: 'updateAttribute',
key: 'includeGift',
value: isChecked ? 'yes' : 'no',
});

console.log(
'applyAttributeChange result',
result,
);
}

If you had previously been using React hooks, import those same hooks from a new Preact-specific package. Here's an example of migrating the useAttributeValues hook.

New hooks in Preact

Preact

import '@shopify/ui-extensions/preact';
import {render} from 'preact';

import {useAttributeValues} from '@shopify/ui-extensions/checkout/preact';

export default function extension() {
render(<Extension />, document.body);
}

function Extension() {
const [includeGift] = useAttributeValues([
'includeGift',
]);
return (
<s-checkbox
checked={includeGift === 'yes'}
onChange={onCheckboxChange}
label="Include a complimentary gift"
/>
);
}

async function onCheckboxChange(event) {
const isChecked = event.target.checked;

const result =
await shopify.applyAttributeChange({
type: 'updateAttribute',
key: 'includeGift',
value: isChecked ? 'yes' : 'no',
});

console.log(
'applyAttributeChange result',
result,
);
}

Anchor to migrate-to-polaris-web-componentsMigrate to Polaris web components

Polaris web components are exposed as custom HTML elements. Update your React or JavaScript components to custom elements.

New components in Preact

Preact

/* eslint-disable react/self-closing-comp */
import '@shopify/ui-extensions/preact';
import {render} from 'preact';

export default function extension() {
render(<Extension />, document.body);
}

function Extension() {
return (
<s-stack direction="inline" gap="base">
<s-text-field label="Gift message"></s-text-field>
<s-button variant="primary">Save</s-button>
</s-stack>
);
}

Anchor to mapping-legacy-components-to-polaris-web-componentsMapping legacy components to Polaris web components

Legacy ComponentPolaris Web ComponentMigration Notes
AbbreviationAvailable
BadgeBadgeAvailable
BannerBannerAvailable
BlockLayoutRemoved. Use Grid
BlockSpacerRemoved. Use Stack with gap property
BlockStackRemoved. Use Stack with direction=block
ButtonButtonAvailable
ChatChatComing soon
CheckboxCheckboxAvailable
ChoiceChoiceAvailable
ChoiceListChoiceListAvailable
ClipboardItemClipboardItemAvailable
ConsentCheckboxConsentCheckboxAvailable
ConsentPhoneFieldConsentPhoneFieldAvailable
DateFieldDateFieldAvailable
DatePickerDatePickerAvailable
DisclosureDetails and SummaryAvailable
DividerDividerAvailable
DropZoneDropZoneAvailable
EmailFieldAvailable
FormFormAvailable
GridGridAvailable
GridItemGridItemAvailable
HeadingHeadingAvailable
HeadingGroupSectionAvailable
IconIconAvailable
ImageImageAvailable
InlineLayoutRemoved. Use Grid
InlineSpacerRemoved. Use Stack
InlineStackStackRemoved. Use Stack with direction=inline
LinkLinkAvailable
ListUnorderedList or OrderedListAvailable
ListItemListItemAvailable
MapMapAvailable
MapMarkerMapMarkerAvailable
MapPopoverPopoverAvailable
ModalModalAvailable
MoneyFieldAvailable
PaymentIconPaymentIconAvailable
PhoneFieldPhoneFieldAvailable
PopoverPopoverAvailable
PressableClickableAvailable
ProductThumbnailProductThumbnailAvailable
ProgressProgressAvailable
QRCodeQRCodeAvailable
ScrollViewScrollBoxAvailable
SelectSelectAvailable
SheetSheetAvailable
SkeletonImageRemoved
SkeletonTextSkeletonParagraphAvailable
SkeletonTextBlockSkeletonParagraphAvailable
SpinnerSpinnerAvailable
StepperNumberFieldAvailable
SwitchSwitchAvailable
TagChip and ClickableChipAvailable
TextTextAvailable
TextField with multilineTextAreaAvailable
TextBlockParagraphAvailable
TextFieldTextFieldAvailable
TimeAvailable
ToggleButtonPressButtonAvailable
ToggleButtonGroupChoiceList or PressButtonAvailable
TooltipTooltipAvailable
ViewBoxAvailable