Upgrading to 2025-10
This guide describes how to upgrade your admin UI extension to API version 2025-10 and adopt web components from Polaris, Shopify's unified system for building app interfaces.
Version 2025-07 is the last API version to support React-based UI components. Web components replace them with native UI elements that offer built-in accessibility, better performance, and consistent styling — so your extension looks and behaves like the rest of the Shopify admin.
Anchor to Update API versionUpdate API version
Set the API version to 2025-10 in shopify.extension.toml to use web components.
shopify.extension.toml
Anchor to Adjust package 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
Previous dependencies with React
package.json
Previous dependencies with JavaScript
package.json
Anchor to TypeScript configurationType Script configuration
Get full IntelliSense and auto-complete support by adding a config file for your extension at extensions/{extension-name}/tsconfig.json. You don't need to change your app's root tsconfig.json file.
New tsconfig.json
Old tsconfig.json
Anchor to Upgrade the Shopify CLIUpgrade the Shopify CLI
The new CLI adds support 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
Anchor to Optional ESLint configurationOptional ESLint configuration
If your app uses ESLint, update your configuration to include the new global shopify object.
.eslintrc.cjs
Anchor to Migrate API callsMigrate API calls
Instead of accessing APIs from a callback parameter or React hook, access them from the global shopify object. Here's an example of migrating API calls for an admin block.
New API calls in Preact
Previous API calls in React
Previous API calls in JavaScript
Anchor to Migrate hooksMigrate hooks
If you were previously using React hooks, import those same hooks from a Preact-specific package. Here's an example of migrating hooks for an admin action.
New hooks in Preact
Previous hooks in React
Anchor to Migrate to web componentsMigrate to web components
Web components are exposed as custom HTML elements. Update your React components to custom elements.
New components in Preact
Previous components in React
Previous components in JavaScript
Anchor to Web components mappingWeb components mapping
The following table maps each legacy React component to its web component equivalent.
| Legacy component | Web component | Migration notes |
|---|---|---|
AdminAction | Admin action | Use heading instead of title. Primary and secondary actions are rendered as child elements. |
AdminBlock | Admin block | Use heading instead of title. |
AdminPrintAction | Admin print action | None |
Badge | Badge | None |
Banner | Banner | None |
BlockStack | Stack | Use the stack component with default block direction. |
InlineStack | Stack | Use the stack component with direction="inline". |
Box | Box | None |
Button | Button | None |
Checkbox | Checkbox | None |
ChoiceList | Choice list | None |
ColorPicker | Color picker | None |
CustomerSegmentTemplate | Customer Segment Template Extension API | Replaced by a target API. Return template data from the admin.customers.segmentation-templates.data target instead of rendering a component. |
DateField | Date field | None |
DatePicker | Date picker | None |
Divider | Divider | None |
EmailField | Email field | None |
Form | Form | None |
FunctionSettings | Function settings | None |
Heading | Heading | None |
HeadingGroup | Removed. Use heading levels directly. | |
Icon | Icon | None |
Image | Image | None |
Link | Link | None |
MoneyField | Money field | None |
NumberField | Number field | None |
Paragraph | Paragraph | None |
PasswordField | Password field | None |
Pressable | Clickable | None |
ProgressIndicator | Spinner | None |
Section | Section | None |
Select | Select | None |
Text | Text | None |
TextArea | Text area | None |
TextField | Text field | None |
UrlField | URL field | None |