Version 2025-07 is the last API version to support React-based UI components. Later versions use Polaris web components, native UI elements with built-in accessibility, better performance, and consistent styling with Shopify's design system. Check out the upgrade guide to upgrade your extension and avoid being blocked from updating your extension after October 1st 2026.
Order status
The Order status page displays details for a single order, including line items, fulfillment progress, customer information, and payment status. Extensions on this page help customers get richer context for a specific order without leaving the page.
Anchor to Use casesUse cases
- Order tracking widgets: Display real-time shipment tracking with carrier updates and estimated delivery dates directly on the Order status page.
- Loyalty and rewards context: Show loyalty points earned from the order or progress toward a reward tier.
- Custom line item details: Add product care instructions, warranty information, or personalization details beneath individual line items.
- Post-purchase upsells: Surface relevant product recommendations or subscription offers based on the items in the order.

Anchor to Order status static targetsOrder status static targets
Use static targets to extend specific sections of the Order status page with contextual information.
Static targets render after specific page elements, including line items, the line item list, and the customer information section. The examples demonstrate using the Order API and the Order Status Localization API or fetching data from your app's backend.
Anchor to Cart line item (render after) ,[object Object]Cart line item (render after) target
customer-account.order-status.cart-line-item.render-after
Renders after each individual line item on the Order status page. Use this target to add product-specific information like care instructions, warranty details, or personalization summaries beneath each item.
Extensions at this target can access order data through the Order API and locale context through the Order Status Localization API. This target renders once per line item.
Supported components
- Avatar
- Badge
- Banner
- Block
Layout - Block
Spacer - Block
Stack - Button
- Card
- Checkbox
- Choice
- Choice
List - Clipboard
Item - Customer
Account Action - Date
Field - Date
Picker - Disclosure
- Divider
- Drop
Zone - Form
- Grid
- Grid
Item - Heading
- Heading
Group - Icon
- Image
- Image
Group - Inline
Layout - Inline
Spacer - Inline
Stack - Link
- List
- List
Item - Map
- Map
Marker - Map
Popover - Menu
- Modal
- Page
- Payment
Icon - Phone
Field - Popover
- Pressable
- Product
Thumbnail - Progress
- QRCode
- Resource
Item - Scroll
View - Select
- Sheet
- Skeleton
Image - Skeleton
Text - Skeleton
Text Block - Spinner
- Stepper
- Switch
- Tag
- Text
- Text
Block - Text
Field - Toggle
Button - Toggle
Button Group - Tooltip
- View
Available APIs
- Addresses API
- Analytics API
- Attributes API
- Authenticated Account API
- Authentication State API
- Buyer Identity API
- Cart Lines API
- Checkout Settings API
- Cost API
- Customer Account API
- Customer Privacy API
- Discounts API
- Extension API
- Gift Cards API
- Localization API
- Metafields API
- Navigation API
- Note API
- Order API
- Order Status Localization API
- Require Login API
- Session Token API
- Settings API
- Shop API
- Storage API
- Storefront API
- UI API
- Version API
Supported components
- Avatar
- Badge
- Banner
- Block
Layout - Block
Spacer - Block
Stack - Button
- Card
- Checkbox
- Choice
- Choice
List - Clipboard
Item - Customer
Account Action - Date
Field - Date
Picker - Disclosure
- Divider
- Drop
Zone - Form
- Grid
- Grid
Item - Heading
- Heading
Group - Icon
- Image
- Image
Group - Inline
Layout - Inline
Spacer - Inline
Stack - Link
- List
- List
Item - Map
- Map
Marker - Map
Popover - Menu
- Modal
- Page
- Payment
Icon - Phone
Field - Popover
- Pressable
- Product
Thumbnail - Progress
- QRCode
- Resource
Item - Scroll
View - Select
- Sheet
- Skeleton
Image - Skeleton
Text - Skeleton
Text Block - Spinner
- Stepper
- Switch
- Tag
- Text
- Text
Block - Text
Field - Toggle
Button - Toggle
Button Group - Tooltip
- View
Available APIs
- Addresses API
- Analytics API
- Attributes API
- Authenticated Account API
- Authentication State API
- Buyer Identity API
- Cart Lines API
- Checkout Settings API
- Cost API
- Customer Account API
- Customer Privacy API
- Discounts API
- Extension API
- Gift Cards API
- Localization API
- Metafields API
- Navigation API
- Note API
- Order API
- Order Status Localization API
- Require Login API
- Session Token API
- Settings API
- Shop API
- Storage API
- Storefront API
- UI API
- Version API
Examples
Description
Show warranty details beneath each line item on the Order status page. This example reads the line item's product title from `useTarget` and fetches warranty data from your app's backend.
React
import {useState, useEffect} from 'react'; import { reactExtension, InlineStack, Badge, Text, useTarget, useSessionToken, } from '@shopify/ui-extensions-react/customer-account'; export default reactExtension( 'customer-account.order-status.cart-line-item.render-after', () => <Extension />, ); function Extension() { const {merchandise: {title}} = useTarget(); const {getSessionToken} = useSessionToken(); const [warranty, setWarranty] = useState(null); useEffect(() => { async function fetchWarranty() { const token = await getSessionToken(); const res = await fetch( `https://your-app.com/api/warranty?product=${encodeURIComponent(title)}`, {headers: {Authorization: `Bearer ${token}`}}, ); const data = await res.json(); setWarranty(data); } fetchWarranty(); }, []); if (!warranty) return null; return ( <InlineStack spacing="small"> <Badge>{warranty.status}</Badge> <Text appearance="subdued"> Warranty expires {warranty.expiresAt} </Text> </InlineStack> ); }TS
import { extension, InlineStack, Badge, Text, } from '@shopify/ui-extensions/customer-account'; export default extension( 'customer-account.order-status.cart-line-item.render-after', async (root, api) => { const {merchandise: {title}} = api.target.current; const token = await api.sessionToken.get(); const res = await fetch( `https://your-app.com/api/warranty?product=${encodeURIComponent(title)}`, {headers: {Authorization: `Bearer ${token}`}}, ); const warranty = await res.json(); root.appendChild( root.createComponent(InlineStack, {spacing: 'small'}, [ root.createComponent(Badge, undefined, warranty.status), root.createComponent( Text, {appearance: 'subdued'}, `Warranty expires ${warranty.expiresAt}`, ), ]), ); }, );Description
Display care instructions beneath a line item based on the product title. This example reads the line item from `useTarget` and uses `useTranslate` to render localized care text.
React
import { reactExtension, BlockStack, Text, useTarget, useTranslate, } from '@shopify/ui-extensions-react/customer-account'; export default reactExtension( 'customer-account.order-status.cart-line-item.render-after', () => <Extension />, ); function Extension() { const {merchandise: {title}} = useTarget(); const translate = useTranslate(); return ( <BlockStack spacing="small"> <Text emphasis="bold">{title}</Text> <Text appearance="subdued"> {translate('care.instructions')} </Text> </BlockStack> ); }TS
import { extension, BlockStack, Text, } from '@shopify/ui-extensions/customer-account'; export default extension( 'customer-account.order-status.cart-line-item.render-after', (root, api) => { const {merchandise: {title}} = api.target.current; const translate = api.i18n.translate; root.appendChild( root.createComponent(BlockStack, {spacing: 'small'}, [ root.createComponent(Text, {emphasis: 'bold'}, title), root.createComponent( Text, {appearance: 'subdued'}, translate('care.instructions'), ), ]), ); }, );
Anchor to Cart line list (render after) ,[object Object]Cart line list (render after) target
customer-account.order-status.cart-line-list.render-after
Renders after the entire line item list on the Order status page. Use this target to display order-level summaries, cross-sell recommendations, or aggregate information that applies to all items.
Extensions at this target can access order data through the Order API and locale context through the Order Status Localization API.
Supported components
- Avatar
- Badge
- Banner
- Block
Layout - Block
Spacer - Block
Stack - Button
- Card
- Checkbox
- Choice
- Choice
List - Clipboard
Item - Customer
Account Action - Date
Field - Date
Picker - Disclosure
- Divider
- Drop
Zone - Form
- Grid
- Grid
Item - Heading
- Heading
Group - Icon
- Image
- Image
Group - Inline
Layout - Inline
Spacer - Inline
Stack - Link
- List
- List
Item - Map
- Map
Marker - Map
Popover - Menu
- Modal
- Page
- Payment
Icon - Phone
Field - Popover
- Pressable
- Product
Thumbnail - Progress
- QRCode
- Resource
Item - Scroll
View - Select
- Sheet
- Skeleton
Image - Skeleton
Text - Skeleton
Text Block - Spinner
- Stepper
- Switch
- Tag
- Text
- Text
Block - Text
Field - Toggle
Button - Toggle
Button Group - Tooltip
- View
Available APIs
- Addresses API
- Analytics API
- Attributes API
- Authenticated Account API
- Authentication State API
- Buyer Identity API
- Cart Lines API
- Checkout Settings API
- Cost API
- Customer Account API
- Customer Privacy API
- Discounts API
- Extension API
- Gift Cards API
- Localization API
- Metafields API
- Navigation API
- Note API
- Order API
- Order Status Localization API
- Require Login API
- Session Token API
- Settings API
- Shop API
- Storage API
- Storefront API
- UI API
- Version API
Supported components
- Avatar
- Badge
- Banner
- Block
Layout - Block
Spacer - Block
Stack - Button
- Card
- Checkbox
- Choice
- Choice
List - Clipboard
Item - Customer
Account Action - Date
Field - Date
Picker - Disclosure
- Divider
- Drop
Zone - Form
- Grid
- Grid
Item - Heading
- Heading
Group - Icon
- Image
- Image
Group - Inline
Layout - Inline
Spacer - Inline
Stack - Link
- List
- List
Item - Map
- Map
Marker - Map
Popover - Menu
- Modal
- Page
- Payment
Icon - Phone
Field - Popover
- Pressable
- Product
Thumbnail - Progress
- QRCode
- Resource
Item - Scroll
View - Select
- Sheet
- Skeleton
Image - Skeleton
Text - Skeleton
Text Block - Spinner
- Stepper
- Switch
- Tag
- Text
- Text
Block - Text
Field - Toggle
Button - Toggle
Button Group - Tooltip
- View
Available APIs
- Addresses API
- Analytics API
- Attributes API
- Authenticated Account API
- Authentication State API
- Buyer Identity API
- Cart Lines API
- Checkout Settings API
- Cost API
- Customer Account API
- Customer Privacy API
- Discounts API
- Extension API
- Gift Cards API
- Localization API
- Metafields API
- Navigation API
- Note API
- Order API
- Order Status Localization API
- Require Login API
- Session Token API
- Settings API
- Shop API
- Storage API
- Storefront API
- UI API
- Version API
Examples
Description
Display product recommendations below the order's line items. This example fetches related products from your app's backend and renders them as a list with links.
React
import {useState, useEffect} from 'react'; import { reactExtension, BlockStack, InlineStack, Text, Link, Heading, useSessionToken, } from '@shopify/ui-extensions-react/customer-account'; export default reactExtension( 'customer-account.order-status.cart-line-list.render-after', () => <Extension />, ); function Extension() { const {getSessionToken} = useSessionToken(); const [recommendations, setRecommendations] = useState(null); useEffect(() => { async function fetchRecommendations() { const token = await getSessionToken(); const res = await fetch('https://your-app.com/api/recommendations', { headers: {Authorization: `Bearer ${token}`}, }); const data = await res.json(); setRecommendations(data.products); } fetchRecommendations(); }, []); if (!recommendations || recommendations.length === 0) return null; return ( <BlockStack spacing="base"> <Heading>You might also like</Heading> {recommendations.map((product) => ( <InlineStack key={product.id} spacing="base"> <Text emphasis="bold">{product.title}</Text> <Link to={product.url}>View product</Link> </InlineStack> ))} </BlockStack> ); }TS
import { extension, BlockStack, InlineStack, Text, Link, Heading, } from '@shopify/ui-extensions/customer-account'; export default extension( 'customer-account.order-status.cart-line-list.render-after', async (root, api) => { const token = await api.sessionToken.get(); const res = await fetch('https://your-app.com/api/recommendations', { headers: {Authorization: `Bearer ${token}`}, }); const data = await res.json(); const products = data.products; if (!products || products.length === 0) return; const items = products.map((product) => root.createComponent(InlineStack, {spacing: 'base'}, [ root.createComponent(Text, {emphasis: 'bold'}, product.title), root.createComponent(Link, {to: product.url}, 'View product'), ]), ); root.appendChild( root.createComponent(BlockStack, {spacing: 'base'}, [ root.createComponent(Heading, undefined, 'You might also like'), ...items, ]), ); }, );Description
Display the total loyalty points earned from the order below the line item list. This example fetches points data from your app's backend using the session token.
React
import {useState, useEffect} from 'react'; import { reactExtension, InlineStack, Badge, Link, useSessionToken, } from '@shopify/ui-extensions-react/customer-account'; export default reactExtension( 'customer-account.order-status.cart-line-list.render-after', () => <Extension />, ); function Extension() { const {getSessionToken} = useSessionToken(); const [points, setPoints] = useState(null); useEffect(() => { async function fetchPoints() { const token = await getSessionToken(); const res = await fetch('https://your-app.com/api/order-points', { headers: {Authorization: `Bearer ${token}`}, }); const data = await res.json(); setPoints(data.pointsEarned); } fetchPoints(); }, []); if (!points) return null; return ( <InlineStack spacing="base"> <Badge tone="success">{points} points earned</Badge> <Link to="shopify:customer-account/profile"> View your rewards </Link> </InlineStack> ); }TS
import { extension, InlineStack, Badge, Link, } from '@shopify/ui-extensions/customer-account'; export default extension( 'customer-account.order-status.cart-line-list.render-after', async (root, api) => { const token = await api.sessionToken.get(); const res = await fetch('https://your-app.com/api/order-points', { headers: {Authorization: `Bearer ${token}`}, }); const data = await res.json(); const points = data.pointsEarned; if (!points) return; root.appendChild( root.createComponent(InlineStack, {spacing: 'base'}, [ root.createComponent(Badge, {tone: 'success'}, `${points} points earned`), root.createComponent( Link, {to: 'shopify:customer-account/profile'}, 'View your rewards', ), ]), ); }, );
Anchor to Customer information (render after) ,[object Object]Customer information (render after) target
customer-account.order-status.customer-information.render-after
Renders after the customer information section on the Order status page. Use this target to display additional customer context like account tier, contact preferences, or organization details.
Extensions at this target can access order data through the Order API and locale context through the Order Status Localization API.
Supported components
- Avatar
- Badge
- Banner
- Block
Layout - Block
Spacer - Block
Stack - Button
- Card
- Checkbox
- Choice
- Choice
List - Clipboard
Item - Customer
Account Action - Date
Field - Date
Picker - Disclosure
- Divider
- Drop
Zone - Form
- Grid
- Grid
Item - Heading
- Heading
Group - Icon
- Image
- Image
Group - Inline
Layout - Inline
Spacer - Inline
Stack - Link
- List
- List
Item - Map
- Map
Marker - Map
Popover - Menu
- Modal
- Page
- Payment
Icon - Phone
Field - Popover
- Pressable
- Product
Thumbnail - Progress
- QRCode
- Resource
Item - Scroll
View - Select
- Sheet
- Skeleton
Image - Skeleton
Text - Skeleton
Text Block - Spinner
- Stepper
- Switch
- Tag
- Text
- Text
Block - Text
Field - Toggle
Button - Toggle
Button Group - Tooltip
- View
Available APIs
- Addresses API
- Analytics API
- Attributes API
- Authenticated Account API
- Authentication State API
- Buyer Identity API
- Cart Lines API
- Checkout Settings API
- Cost API
- Customer Account API
- Customer Privacy API
- Discounts API
- Extension API
- Gift Cards API
- Localization API
- Metafields API
- Navigation API
- Note API
- Order API
- Order Status Localization API
- Require Login API
- Session Token API
- Settings API
- Shop API
- Storage API
- Storefront API
- UI API
- Version API
Supported components
- Avatar
- Badge
- Banner
- Block
Layout - Block
Spacer - Block
Stack - Button
- Card
- Checkbox
- Choice
- Choice
List - Clipboard
Item - Customer
Account Action - Date
Field - Date
Picker - Disclosure
- Divider
- Drop
Zone - Form
- Grid
- Grid
Item - Heading
- Heading
Group - Icon
- Image
- Image
Group - Inline
Layout - Inline
Spacer - Inline
Stack - Link
- List
- List
Item - Map
- Map
Marker - Map
Popover - Menu
- Modal
- Page
- Payment
Icon - Phone
Field - Popover
- Pressable
- Product
Thumbnail - Progress
- QRCode
- Resource
Item - Scroll
View - Select
- Sheet
- Skeleton
Image - Skeleton
Text - Skeleton
Text Block - Spinner
- Stepper
- Switch
- Tag
- Text
- Text
Block - Text
Field - Toggle
Button - Toggle
Button Group - Tooltip
- View
Available APIs
- Addresses API
- Analytics API
- Attributes API
- Authenticated Account API
- Authentication State API
- Buyer Identity API
- Cart Lines API
- Checkout Settings API
- Cost API
- Customer Account API
- Customer Privacy API
- Discounts API
- Extension API
- Gift Cards API
- Localization API
- Metafields API
- Navigation API
- Note API
- Order API
- Order Status Localization API
- Require Login API
- Session Token API
- Settings API
- Shop API
- Storage API
- Storefront API
- UI API
- Version API
Examples
Description
Show the customer's loyalty tier after the customer information section. This example fetches the tier from your app's backend and renders it as a badge.
React
import {useState, useEffect} from 'react'; import { reactExtension, InlineStack, Text, Badge, useSessionToken, } from '@shopify/ui-extensions-react/customer-account'; export default reactExtension( 'customer-account.order-status.customer-information.render-after', () => <Extension />, ); function Extension() { const {getSessionToken} = useSessionToken(); const [tier, setTier] = useState(null); useEffect(() => { async function fetchTier() { const token = await getSessionToken(); const res = await fetch('https://your-app.com/api/loyalty-tier', { headers: {Authorization: `Bearer ${token}`}, }); const data = await res.json(); setTier(data.tier); } fetchTier(); }, []); if (!tier) return null; return ( <InlineStack spacing="small"> <Text appearance="subdued">Loyalty tier:</Text> <Badge>{tier}</Badge> </InlineStack> ); }TS
import { extension, InlineStack, Text, Badge, } from '@shopify/ui-extensions/customer-account'; export default extension( 'customer-account.order-status.customer-information.render-after', async (root, api) => { const token = await api.sessionToken.get(); const res = await fetch('https://your-app.com/api/loyalty-tier', { headers: {Authorization: `Bearer ${token}`}, }); const data = await res.json(); const tier = data.tier; if (!tier) return; root.appendChild( root.createComponent(InlineStack, {spacing: 'small'}, [ root.createComponent(Text, {appearance: 'subdued'}, 'Loyalty tier:'), root.createComponent(Badge, undefined, tier), ]), ); }, );Description
Display the order confirmation number after the customer information section. This example reads from `useOrder` to show the confirmation number when available.
React
import { reactExtension, BlockStack, InlineStack, Text, useOrder, } from '@shopify/ui-extensions-react/customer-account'; export default reactExtension( 'customer-account.order-status.customer-information.render-after', () => <Extension />, ); function Extension() { const order = useOrder(); if (!order?.confirmationNumber) return null; return ( <BlockStack spacing="small"> <InlineStack spacing="small"> <Text appearance="subdued">Confirmation number:</Text> <Text emphasis="bold">{order.confirmationNumber}</Text> </InlineStack> </BlockStack> ); }TS
import { extension, BlockStack, InlineStack, Text, } from '@shopify/ui-extensions/customer-account'; export default extension( 'customer-account.order-status.customer-information.render-after', (root, api) => { const order = api.order.current; if (!order?.confirmationNumber) return; root.appendChild( root.createComponent(BlockStack, {spacing: 'small'}, [ root.createComponent(InlineStack, {spacing: 'small'}, [ root.createComponent( Text, {appearance: 'subdued'}, 'Confirmation number:', ), root.createComponent( Text, {emphasis: 'bold'}, order.confirmationNumber, ), ]), ]), ); }, );
Anchor to Order status announcement and block targetsOrder status announcement and block targets
Use static and block targets to extend the Order status page with announcements and custom block content.
Announcement targets render as dismissable banners at the top of the page, while block targets display as inline cards that merchants can position using the checkout and accounts editor. The examples demonstrate using the Order Status Localization API or fetching data from your app's backend.
Anchor to Order status announcement ,[object Object]Order status announcement target
customer-account.order-status.announcement.render
Renders a dismissable announcement at the top of the Order status page. Use this target to surface time-sensitive information like delivery updates, delays, or order-specific promotions.
Extensions at this target can access order data through the Order API and locale context through the Order Status Localization API. The root element should be a Banner component.
Supported components
- Avatar
- Badge
- Banner
- Block
Layout - Block
Spacer - Block
Stack - Button
- Card
- Checkbox
- Choice
- Choice
List - Clipboard
Item - Customer
Account Action - Date
Field - Date
Picker - Disclosure
- Divider
- Drop
Zone - Form
- Grid
- Grid
Item - Heading
- Heading
Group - Icon
- Image
- Image
Group - Inline
Layout - Inline
Spacer - Inline
Stack - Link
- List
- List
Item - Map
- Map
Marker - Map
Popover - Menu
- Modal
- Page
- Payment
Icon - Phone
Field - Popover
- Pressable
- Product
Thumbnail - Progress
- QRCode
- Resource
Item - Scroll
View - Select
- Sheet
- Skeleton
Image - Skeleton
Text - Skeleton
Text Block - Spinner
- Stepper
- Switch
- Tag
- Text
- Text
Block - Text
Field - Toggle
Button - Toggle
Button Group - Tooltip
- View
Available APIs
- Addresses API
- Analytics API
- Attributes API
- Authenticated Account API
- Authentication State API
- Buyer Identity API
- Cart Lines API
- Checkout Settings API
- Cost API
- Customer Account API
- Customer Privacy API
- Discounts API
- Extension API
- Gift Cards API
- Localization API
- Metafields API
- Navigation API
- Note API
- Order API
- Order Status Localization API
- Require Login API
- Session Token API
- Settings API
- Shop API
- Storage API
- Storefront API
- UI API
- Version API
Supported components
- Avatar
- Badge
- Banner
- Block
Layout - Block
Spacer - Block
Stack - Button
- Card
- Checkbox
- Choice
- Choice
List - Clipboard
Item - Customer
Account Action - Date
Field - Date
Picker - Disclosure
- Divider
- Drop
Zone - Form
- Grid
- Grid
Item - Heading
- Heading
Group - Icon
- Image
- Image
Group - Inline
Layout - Inline
Spacer - Inline
Stack - Link
- List
- List
Item - Map
- Map
Marker - Map
Popover - Menu
- Modal
- Page
- Payment
Icon - Phone
Field - Popover
- Pressable
- Product
Thumbnail - Progress
- QRCode
- Resource
Item - Scroll
View - Select
- Sheet
- Skeleton
Image - Skeleton
Text - Skeleton
Text Block - Spinner
- Stepper
- Switch
- Tag
- Text
- Text
Block - Text
Field - Toggle
Button - Toggle
Button Group - Tooltip
- View
Available APIs
- Addresses API
- Analytics API
- Attributes API
- Authenticated Account API
- Authentication State API
- Buyer Identity API
- Cart Lines API
- Checkout Settings API
- Cost API
- Customer Account API
- Customer Privacy API
- Discounts API
- Extension API
- Gift Cards API
- Localization API
- Metafields API
- Navigation API
- Note API
- Order API
- Order Status Localization API
- Require Login API
- Session Token API
- Settings API
- Shop API
- Storage API
- Storefront API
- UI API
- Version API
Examples
Description
Display a dismissable announcement about a shipping delay for the current order. This example reads from `useOrder` to include the order name in the message.
React
import { reactExtension, Banner, Text, useOrder, } from '@shopify/ui-extensions-react/customer-account'; export default reactExtension( 'customer-account.order-status.announcement.render', () => <Extension />, ); function Extension() { const order = useOrder(); return ( <Banner> <Text> {order ? `There's a shipping delay on ${order.name}. We'll update you when it ships.` : "There's a shipping delay on your order. We'll update you when it ships."} </Text> </Banner> ); }TS
import { extension, Banner, Text, } from '@shopify/ui-extensions/customer-account'; export default extension( 'customer-account.order-status.announcement.render', (root, api) => { const order = api.order.current; const message = order ? `There's a shipping delay on ${order.name}. We'll update you when it ships.` : "There's a shipping delay on your order. We'll update you when it ships."; root.appendChild( root.createComponent(Banner, undefined, [ root.createComponent(Text, undefined, message), ]), ); }, );Description
Display a localized confirmation announcement on the Order status page. This example uses `useTranslate` to render the message in the customer's language.
React
import { reactExtension, Banner, InlineStack, Text, Link, useTranslate, } from '@shopify/ui-extensions-react/customer-account'; export default reactExtension( 'customer-account.order-status.announcement.render', () => <Extension />, ); function Extension() { const translate = useTranslate(); return ( <Banner> <InlineStack spacing="base"> <Text>{translate('orderStatus.confirmation')}</Text> <Link to="shopify:customer-account/orders"> {translate('orderStatus.viewAllOrders')} </Link> </InlineStack> </Banner> ); }TS
import { extension, Banner, InlineStack, Text, Link, } from '@shopify/ui-extensions/customer-account'; export default extension( 'customer-account.order-status.announcement.render', (root, api) => { const translate = api.i18n.translate; root.appendChild( root.createComponent(Banner, undefined, [ root.createComponent(InlineStack, {spacing: 'base'}, [ root.createComponent( Text, undefined, translate('orderStatus.confirmation'), ), root.createComponent( Link, {to: 'shopify:customer-account/orders'}, translate('orderStatus.viewAllOrders'), ), ]), ]), ); }, );Description
Display a shipping policy announcement based on the buyer's country. This example reads `useLocalizationCountry` from the [Order Status Localization API](/docs/api/customer-account-ui-extensions/2025-07/target-apis/order-apis/order-status-localization-api) and shows relevant shipping information for the buyer's region.
React
import { reactExtension, Banner, InlineStack, Text, Link, useTranslate, useLocalizationCountry, } from '@shopify/ui-extensions-react/customer-account'; export default reactExtension( 'customer-account.order-status.announcement.render', () => <Extension />, ); function Extension() { const country = useLocalizationCountry(); const translate = useTranslate(); if (!country) return null; const isDomestic = country.isoCode === 'US'; return ( <Banner> <InlineStack spacing="base"> <Text> {isDomestic ? translate('shipping.domestic') : translate('shipping.international', {country: country.isoCode})} </Text> <Link to="shopify:customer-account/orders"> {translate('shipping.viewOrders')} </Link> </InlineStack> </Banner> ); }TS
import { extension, Banner, InlineStack, Text, Link, } from '@shopify/ui-extensions/customer-account'; export default extension( 'customer-account.order-status.announcement.render', (root, api) => { const country = api.localization.country.current; const translate = api.i18n.translate; if (!country) return; const isDomestic = country.isoCode === 'US'; const message = isDomestic ? translate('shipping.domestic') : translate('shipping.international', {country: country.isoCode}); root.appendChild( root.createComponent(Banner, undefined, [ root.createComponent(InlineStack, {spacing: 'base'}, [ root.createComponent(Text, undefined, message), root.createComponent( Link, {to: 'shopify:customer-account/orders'}, translate('shipping.viewOrders'), ), ]), ]), ); }, );
Anchor to Order status block ,[object Object]Order status block target
customer-account.order-status.block.render
Renders inline content on the Order status page. Use this target to display persistent information like tracking widgets, estimated delivery dates, or order-specific recommendations.
Extensions at this target appear as blocks that merchants can position using the checkout and accounts editor. To preview your extension in each supported location, use the placement reference for that location as a URL parameter.
Supported components
- Avatar
- Badge
- Banner
- Block
Layout - Block
Spacer - Block
Stack - Button
- Card
- Checkbox
- Choice
- Choice
List - Clipboard
Item - Customer
Account Action - Date
Field - Date
Picker - Disclosure
- Divider
- Drop
Zone - Form
- Grid
- Grid
Item - Heading
- Heading
Group - Icon
- Image
- Image
Group - Inline
Layout - Inline
Spacer - Inline
Stack - Link
- List
- List
Item - Map
- Map
Marker - Map
Popover - Menu
- Modal
- Page
- Payment
Icon - Phone
Field - Popover
- Pressable
- Product
Thumbnail - Progress
- QRCode
- Resource
Item - Scroll
View - Select
- Sheet
- Skeleton
Image - Skeleton
Text - Skeleton
Text Block - Spinner
- Stepper
- Switch
- Tag
- Text
- Text
Block - Text
Field - Toggle
Button - Toggle
Button Group - Tooltip
- View
Available APIs
- Addresses API
- Analytics API
- Attributes API
- Authenticated Account API
- Authentication State API
- Buyer Identity API
- Cart Lines API
- Checkout Settings API
- Cost API
- Customer Account API
- Customer Privacy API
- Discounts API
- Extension API
- Gift Cards API
- Localization API
- Metafields API
- Navigation API
- Note API
- Order API
- Order Status Localization API
- Require Login API
- Session Token API
- Settings API
- Shop API
- Storage API
- Storefront API
- UI API
- Version API
Supported components
- Avatar
- Badge
- Banner
- Block
Layout - Block
Spacer - Block
Stack - Button
- Card
- Checkbox
- Choice
- Choice
List - Clipboard
Item - Customer
Account Action - Date
Field - Date
Picker - Disclosure
- Divider
- Drop
Zone - Form
- Grid
- Grid
Item - Heading
- Heading
Group - Icon
- Image
- Image
Group - Inline
Layout - Inline
Spacer - Inline
Stack - Link
- List
- List
Item - Map
- Map
Marker - Map
Popover - Menu
- Modal
- Page
- Payment
Icon - Phone
Field - Popover
- Pressable
- Product
Thumbnail - Progress
- QRCode
- Resource
Item - Scroll
View - Select
- Sheet
- Skeleton
Image - Skeleton
Text - Skeleton
Text Block - Spinner
- Stepper
- Switch
- Tag
- Text
- Text
Block - Text
Field - Toggle
Button - Toggle
Button Group - Tooltip
- View
Available APIs
- Addresses API
- Analytics API
- Attributes API
- Authenticated Account API
- Authentication State API
- Buyer Identity API
- Cart Lines API
- Checkout Settings API
- Cost API
- Customer Account API
- Customer Privacy API
- Discounts API
- Extension API
- Gift Cards API
- Localization API
- Metafields API
- Navigation API
- Note API
- Order API
- Order Status Localization API
- Require Login API
- Session Token API
- Settings API
- Shop API
- Storage API
- Storefront API
- UI API
- Version API
Examples
Description
Show real-time tracking information for the order as an inline block. This example fetches tracking data from your app's backend and displays the current status with a link to the carrier's tracking page.
React
import {useState, useEffect} from 'react'; import { reactExtension, BlockStack, InlineStack, Text, Badge, Link, Heading, Spinner, useSessionToken, } from '@shopify/ui-extensions-react/customer-account'; export default reactExtension( 'customer-account.order-status.block.render', () => <Extension />, ); function Extension() { const {getSessionToken} = useSessionToken(); const [tracking, setTracking] = useState(null); useEffect(() => { async function fetchTracking() { const token = await getSessionToken(); const res = await fetch('https://your-app.com/api/tracking', { headers: {Authorization: `Bearer ${token}`}, }); const data = await res.json(); setTracking(data); } fetchTracking(); }, []); if (!tracking) { return ( <BlockStack spacing="base"> <Heading>Shipment tracking</Heading> <Spinner size="base" /> </BlockStack> ); } return ( <BlockStack spacing="base"> <Heading>Shipment tracking</Heading> <InlineStack spacing="small"> <Text emphasis="bold">{tracking.carrier}</Text> <Badge>{tracking.status}</Badge> </InlineStack> <Text appearance="subdued"> Estimated delivery: {tracking.estimatedDelivery} </Text> <Link to={tracking.trackingUrl}> Track on {tracking.carrier} </Link> </BlockStack> ); }TS
import { extension, BlockStack, InlineStack, Text, Badge, Link, Heading, Spinner, } from '@shopify/ui-extensions/customer-account'; export default extension( 'customer-account.order-status.block.render', async (root, api) => { const loadingContainer = root.createComponent( BlockStack, {spacing: 'base'}, [ root.createComponent(Heading, undefined, 'Shipment tracking'), root.createComponent(Spinner, {size: 'base'}), ], ); root.appendChild(loadingContainer); const token = await api.sessionToken.get(); const res = await fetch('https://your-app.com/api/tracking', { headers: {Authorization: `Bearer ${token}`}, }); const tracking = await res.json(); root.removeChild(loadingContainer); root.appendChild( root.createComponent(BlockStack, {spacing: 'base'}, [ root.createComponent(Heading, undefined, 'Shipment tracking'), root.createComponent(InlineStack, {spacing: 'small'}, [ root.createComponent(Text, {emphasis: 'bold'}, tracking.carrier), root.createComponent(Badge, undefined, tracking.status), ]), root.createComponent( Text, {appearance: 'subdued'}, `Estimated delivery: ${tracking.estimatedDelivery}`, ), root.createComponent( Link, {to: tracking.trackingUrl}, `Track on ${tracking.carrier}`, ), ]), ); }, );Description
Display an estimated delivery date block on the Order status page. This example fetches delivery estimates from your app's backend and shows the date range.
React
import {useState, useEffect} from 'react'; import { reactExtension, BlockStack, Text, Heading, useSessionToken, } from '@shopify/ui-extensions-react/customer-account'; export default reactExtension( 'customer-account.order-status.block.render', () => <Extension />, ); function Extension() { const {getSessionToken} = useSessionToken(); const [estimate, setEstimate] = useState(null); useEffect(() => { async function fetchEstimate() { const token = await getSessionToken(); const res = await fetch('https://your-app.com/api/delivery-estimate', { headers: {Authorization: `Bearer ${token}`}, }); const data = await res.json(); setEstimate(data); } fetchEstimate(); }, []); if (!estimate) return null; return ( <BlockStack spacing="small"> <Heading>Estimated delivery</Heading> <Text emphasis="bold"> {estimate.earliestDate} – {estimate.latestDate} </Text> <Text appearance="subdued"> {estimate.message} </Text> </BlockStack> ); }TS
import { extension, BlockStack, Text, Heading, } from '@shopify/ui-extensions/customer-account'; export default extension( 'customer-account.order-status.block.render', async (root, api) => { const token = await api.sessionToken.get(); const res = await fetch('https://your-app.com/api/delivery-estimate', { headers: {Authorization: `Bearer ${token}`}, }); const estimate = await res.json(); if (!estimate) return; root.appendChild( root.createComponent(BlockStack, {spacing: 'small'}, [ root.createComponent(Heading, undefined, 'Estimated delivery'), root.createComponent( Text, {emphasis: 'bold'}, `${estimate.earliestDate} – ${estimate.latestDate}`, ), root.createComponent( Text, {appearance: 'subdued'}, estimate.message, ), ]), ); }, );
Anchor to Best practicesBest practices
- Guard against missing order data: Always check that
useOrderreturns a value before rendering order-specific content. The order data loads asynchronously and might beundefinedon the initial render. - Return null for empty states: If your extension has no data to display, such as missing warranty or tracking information, return
nullto avoid rendering an empty container on the page. - Keep announcements order-specific: Unlike order index announcements, order status announcements should relate to the specific order being viewed. Include the order name or relevant order details in the message.
Anchor to LimitationsLimitations
- Cart line item target renders per item: The
customer-account.order-status.cart-line-item.render-aftertarget renders once per line item, not once per order. Ensure your extension handles this correctly and doesn't make redundant API calls for each item.