---
title: Checkout UI extensions
description: |-
Checkout UI extensions let app developers build custom functionality that merchants can install
at defined points in the checkout flow, including product information, shipping, payment,
order summary, and Shop Pay.
> Shopify Plus:
>Checkout UI extensions for the information, shipping and payment step are available only to stores on a [Shopify Plus](https://www.shopify.com/plus) plan.
api_version: 2025-01
api_name: checkout-ui-extensions
source_url:
html: https://shopify.dev/docs/api/checkout-ui-extensions/2025-01
md: https://shopify.dev/docs/api/checkout-ui-extensions/2025-01.md
---
# Checkout UI extensions
Checkout UI extensions let app developers build custom functionality that merchants can install at defined points in the checkout flow, including product information, shipping, payment, order summary, and Shop Pay.
Shopify Plus
Checkout UI extensions for the information, shipping and payment step are available only to stores on a [Shopify Plus](https://www.shopify.com/plus) plan.
## Scaffolding an extension
Use Shopify CLI to [generate a new extension](https://shopify.dev/apps/tools/cli/commands#generate-extension) in the directory of your app.
[](https://www.youtube.com/watch?v=jr_AIUDUSMw)
[WatchGetting started video](https://www.youtube.com/watch?v=jr_AIUDUSMw)
### Examples
* #### Scaffolding
##### npm
```bash
npm init @shopify/app@latest
cd your-app
npm run shopify app generate extension
```
##### yarn
```bash
yarn create @shopify/app
cd your-app
yarn shopify app generate extension
```
##### pnpm
```bash
pnpm create @shopify/app
cd your-app
pnpm shopify app generate extension
```
## Extension Targets
Extension targets provide locations where merchants can insert custom content. Static extension targets are tied to core checkout features like contact information, shipping methods, and order summary line items. Block extension targets can be displayed at any point in the checkout process and will always render regardless of which checkout features are available. An example is a field to capture order notes from the customer.
Extension UIs are rendered using [remote UI](https://github.com/Shopify/remote-dom/tree/remote-ui), a fast and secure environment for custom [(non-DOM)](#security) UIs.
[](https://shopify.dev/docs/api/checkout-ui-extensions/extension-targets-overview)
[OverviewExtension targets](https://shopify.dev/docs/api/checkout-ui-extensions/extension-targets-overview)
### Examples
* #### Extension targets
##### React
```tsx
import {
reactExtension,
Banner,
} from '@shopify/ui-extensions-react/checkout';
export default reactExtension(
'purchase.checkout.block.render',
() => ,
);
function Extension() {
return Your extension;
}
```
##### JS
```js
import {
extension,
Banner,
} from '@shopify/ui-extensions/checkout';
export default extension(
'purchase.checkout.block.render',
(root, api) => {
const banner = root.createComponent(
Banner,
{},
'Your extension',
);
root.appendChild(banner);
},
);
```

## Configuration file
When you create a checkout UI extension, the `shopify.extension.toml` file is automatically generated in your checkout UI extension directory. It contains the extension's configuration, which includes the extension name, extension targets, metafields, capabilities, and settings definition.
[](https://shopify.dev/docs/api/checkout-ui-extensions/configuration)
[Learn moreConfiguration guide](https://shopify.dev/docs/api/checkout-ui-extensions/configuration)
### Examples
* #### shopify.extension.toml
##### toml
```toml
api_version = "2023-07"
[[extensions]]
type = "ui_extension"
name = "My checkout extension"
handle = "checkout-ui"
[[extensions.targeting]]
target = "purchase.checkout.block.render"
module = "./Checkout.jsx"
```
## Extension APIs
APIs enable checkout UI extensions to get information about the checkout or related objects and to perform actions. For example, you can use the APIs to retrieve what's in customer carts so that you can offer related products.
Extensions use JavaScript to read and write data and call external services, and natively render UIs built using Shopify's checkout components.
[](https://shopify.dev/docs/api/checkout-ui-extensions/apis)
[API referenceCheckout extensions API](https://shopify.dev/docs/api/checkout-ui-extensions/apis)
### Examples
* #### Extension APIs
##### React
```tsx
import {
reactExtension,
useShippingAddress,
Banner,
} from '@shopify/ui-extensions-react/checkout';
export default reactExtension(
'purchase.checkout.delivery-address.render-before',
() => ,
);
function Extension() {
const {countryCode} = useShippingAddress();
if (countryCode !== 'CA') {
return (
Sorry, we can only ship to Canada at this
time
);
}
}
```
##### JS
```js
import {
extension,
Banner,
} from '@shopify/ui-extensions/checkout';
export default extension(
'purchase.checkout.delivery-address.render-before',
(root, api) => {
renderApp(root, api);
api.shippingAddress.subscribe(() =>
renderApp(root, api),
);
},
);
function renderApp(root, api) {
const {countryCode} =
api.shippingAddress.current;
// In case of a re-render, remove previous children.
for (const child of root.children) {
root.removeChild(child);
}
if (countryCode !== 'CA') {
const banner = root.createComponent(
Banner,
{},
'Sorry, we can only ship to Canada at this time',
);
root.appendChild(banner);
}
}
```
## UI components
Checkout UI extensions declare their interface using supported UI components. Shopify renders the UI natively, so it's performant, accessible, and works in all of checkout's supported browsers.
Checkout components are designed to be flexible, enabling you to layer and mix them to create highly-customized app extensions that feel seamless within the checkout experience. All components inherit a merchant's brand settings and the CSS cannot be altered or overridden.
[](https://shopify.dev/docs/api/checkout-ui-extensions/components)
[API referenceComponent library](https://shopify.dev/docs/api/checkout-ui-extensions/components)
[](https://www.figma.com/community/file/1304881365343613949/checkout-and-account-components)
[UI ReferenceFigma UI kit](https://www.figma.com/community/file/1304881365343613949/checkout-and-account-components)
### Examples
* #### UI components
##### React
```tsx
import {
reactExtension,
BlockStack,
InlineStack,
Button,
Image,
Text,
} from '@shopify/ui-extensions-react/checkout';
export default reactExtension(
'purchase.checkout.block.render',
() => ,
);
function Extension() {
return (
HeadingDescription
);
}
```
##### JS
```js
import {
extension,
BlockStack,
Button,
Image,
InlineStack,
Text,
} from '@shopify/ui-extensions/checkout';
export default extension(
'purchase.checkout.block.render',
(root, api) => {
const inlineStack = root.createComponent(
InlineStack,
{},
[
root.createComponent(Image, {
source: '/url/for/image',
}),
root.createComponent(BlockStack, {}, [
root.createComponent(
Text,
{size: 'large'},
'Heading',
),
root.createComponent(
Text,
{size: 'small'},
'Description',
),
]),
root.createComponent(
Button,
{
onPress: () => {
console.log('button was pressed');
},
},
'Button',
),
],
);
root.appendChild(inlineStack);
},
);
```

## Security
Checkout UI extensions are a safe and secure way to customize the appearance and functionality of the checkout page without compromising the security of checkout or customer data.
* They run in an isolated sandbox, separate from the checkout page and other UI extensions.
* They don't have access to sensitive payment information or the checkout page itself (HTML or other assets).
* They are limited to specific UI components and APIs that are exposed by the platform.
* They have limited access to [global web APIs](https://github.com/Shopify/ui-extensions/blob/unstable/documentation/runtime-environment.md).
* Apps that wish to access [protected customer data](https://shopify.dev/docs/apps/store/data-protection/protected-customer-data), must submit an application and are subject to strict security guidelines and review proccesses by Shopify.
Constraints
You can't override the CSS for UI components. The checkout UI will always render the merchant's own branding as shown in the image in the UI components section above.
Checkout UI extensions don't have access to the DOM and can't return DOM nodes. They can't return `
` elements, for example. Building an arbitrary tree of HTML and loading additional scripts using script tags are also not supported.
[](https://shopify.engineering/remote-rendering-ui-extensibility)
[Learn moreRendering extensions](https://shopify.engineering/remote-rendering-ui-extensibility)
[](https://shopify.dev/docs/apps/checkout/styling)
[Learn moreCheckout styling](https://shopify.dev/docs/apps/checkout/styling)
## Troubleshooting
Find an end-to-end guide to testing your extensions in [Testing checkout UI extensions](https://shopify.dev/apps/checkout/test-ui-extensions#test-the-extension-in-the-checkout-editor).
If you're encountering errors when you run `dev` for an app that contains checkout UI extensions, follow this [troubleshooting guide](https://shopify.dev/apps/checkout/delivery-instructions/getting-started#troubleshooting).
[](https://shopify.dev/apps/checkout/delivery-instructions/getting-started#troubleshooting)
[Learn moreTroubleshooting guide](https://shopify.dev/apps/checkout/delivery-instructions/getting-started#troubleshooting)
## Resources
[](https://github.com/Shopify/remote-dom/tree/remote-ui)
[remote-ui](https://github.com/Shopify/remote-dom/tree/remote-ui)
[Learn more about the underlying technology that powers checkout UI extensions.](https://github.com/Shopify/remote-dom/tree/remote-ui)
[](https://shopify.dev/apps/checkout/checkout-ux-guidelines)
[UX guidelines](https://shopify.dev/apps/checkout/checkout-ux-guidelines)
[Use our UX guidelines when you're designing your checkout experiences to ensure that they're trustworthy, efficient, and considerate.](https://shopify.dev/apps/checkout/checkout-ux-guidelines)
[](https://shopify.dev/apps/checkout/localize-ui-extensions)
[Localization](https://shopify.dev/apps/checkout/localize-ui-extensions)
[You can use JavaScript APIs to access translations and localize UI extensions for international merchants and customers.](https://shopify.dev/apps/checkout/localize-ui-extensions)
[](https://shopify.dev/apps/checkout)
[Tutorials](https://shopify.dev/apps/checkout)
[Check out our tutorials on how to build payment or delivery customizations, product offers, custom banners and more.](https://shopify.dev/apps/checkout)