Version 2025-07 is the last API version to support React-based UI components. Later versions use web components, native UI elements with built-in accessibility, better performance, and consistent styling with Shopify's design system. Check out the migration guide to upgrade your extension.
Navigation API
The Navigation API lets you navigate between extension routes, other extensions, or host pages within customer accounts. Use this API to build multi-route extensions, link to specific customer account pages, or direct customers to other installed extensions.
The API supports several custom protocols:
shopify:customer-account/: Navigates to built-in customer account host pages such as orders or profile.extension://: Navigates within the current extension's routes.extension://<handle>: Navigates to a different installed extension by its handle.
Anchor to Use casesUse cases
- Build multi-page extensions: Use
extension://routes to create extensions with multiple views, such as a subscription management page with a settings sub-page. - Link to customer account pages: Navigate customers to built-in pages like order details or profile settings using the
shopify:customer-account/protocol. - Connect related extensions: Deep-link from one extension to another using
extension://<handle>when workflows span multiple extensions.
Supported targets
- Customer
Account::Kitchen Sink - customer-account.
footer. render-after - customer-account.
order-index. announcement. render - customer-account.
order-index. block. render - customer-account.
order-status. announcement. render - customer-account.
order-status. block. render - customer-account.
order-status. cart-line-item. render-after - customer-account.
order-status. cart-line-list. render-after - customer-account.
order-status. customer-information. render-after - customer-account.
order-status. fulfillment-details. render-after - customer-account.
order-status. payment-details. render-after - customer-account.
order-status. return-details. render-after - customer-account.
order-status. unfulfilled-items. render-after - customer-account.
order. action. menu-item. render - customer-account.
order. action. render - customer-account.
order. page. render - customer-account.
page. render - customer-account.
profile. addresses. render-after - customer-account.
profile. announcement. render - customer-account.
profile. block. render - customer-account.
profile. company-details. render-after - customer-account.
profile. company-location-addresses. render-after - customer-account.
profile. company-location-payment. render-after - customer-account.
profile. company-location-staff. render-after - customer-account.
profile. payment. render-after
Supported targets
- Customer
Account::Kitchen Sink - customer-account.
footer. render-after - customer-account.
order-index. announcement. render - customer-account.
order-index. block. render - customer-account.
order-status. announcement. render - customer-account.
order-status. block. render - customer-account.
order-status. cart-line-item. render-after - customer-account.
order-status. cart-line-list. render-after - customer-account.
order-status. customer-information. render-after - customer-account.
order-status. fulfillment-details. render-after - customer-account.
order-status. payment-details. render-after - customer-account.
order-status. return-details. render-after - customer-account.
order-status. unfulfilled-items. render-after - customer-account.
order. action. menu-item. render - customer-account.
order. action. render - customer-account.
order. page. render - customer-account.
page. render - customer-account.
profile. addresses. render-after - customer-account.
profile. announcement. render - customer-account.
profile. block. render - customer-account.
profile. company-details. render-after - customer-account.
profile. company-location-addresses. render-after - customer-account.
profile. company-location-payment. render-after - customer-account.
profile. company-location-staff. render-after - customer-account.
profile. payment. render-after
Anchor to PropertiesProperties
The navigation object available to all customer account extension targets. Access the following properties to navigate between pages and handle navigation events.
- NavigateFunctionNavigateFunctionrequiredrequired
Navigates to a specific URL within the customer account, updating the history entries list.
NavigateFunction
A function that performs navigation to a specific URL within the customer account.
Additional navigation properties available only to full-page extensions (customer-account.page.render). Includes access to the current navigation entry and history state.
- (type: "currententrychange", cb: (event: NavigationCurrentEntryChangeEvent) => void) => void(type: "currententrychange", cb: (event: NavigationCurrentEntryChangeEvent) => void) => voidrequiredrequired
Registers a callback that fires whenever the current navigation entry changes.
- NavigationHistoryEntryNavigationHistoryEntryrequiredrequired
Returns a
representing the location the user is currently navigated to.- NavigateFunctionNavigateFunctionrequiredrequired
Navigates to a specific URL within the customer account, updating the history entries list.
- (type: "currententrychange", cb: (event: NavigationCurrentEntryChangeEvent) => void) => void(type: "currententrychange", cb: (event: NavigationCurrentEntryChangeEvent) => void) => voidrequiredrequired
Removes a previously registered
currententrychangeevent listener.- (options: { state: Record<string, any>; }) => void(options: { state: Record<string, any>; }) => voidrequiredrequired
Updates the state of the current entry without triggering a navigation or reload.
NavigationCurrentEntryChangeEvent
The event object for the `currententrychange` event, which fires when `Navigation.currentEntry` has changed. Based on the [Navigation API `NavigationCurrentEntryChangeEvent`](https://developer.mozilla.org/en-US/docs/Web/API/NavigationCurrentEntryChangeEvent) interface.
- from
The `NavigationHistoryEntry` that was navigated from.
NavigationHistoryEntry - navigationType
The type of navigation that resulted in the change.
NavigationType
NavigationHistoryEntry
Represents a single navigation history entry. Based on the [Navigation API `NavigationHistoryEntry`](https://developer.mozilla.org/en-US/docs/Web/API/NavigationHistoryEntry) interface.
- getState
Returns a clone of the developer-supplied state associated with this history entry.
() => Record<string, any> - key
A unique, user-agent-generated value that represents the history entry's slot in the entries list, rather than the entry itself.
string - url
The URL of this history entry.
string
NavigationType
An enumerated value representing the type of navigation: - `'push'`: A new entry is added to the history stack. - `'replace'`: The current entry in the history stack is replaced. - `'traverse'`: The user navigated to an existing entry in the history stack (back or forward).
'push' | 'replace' | 'traverse'Returns the current navigation history entry, representing the page the buyer is viewing. Only available in full-page extensions.
Anchor to Best practicesBest practices
- Use custom protocols instead of absolute URLs: Always use
extension://,shopify:customer-account/, orextension://<handle>protocols rather than hardcoded URLs. Custom protocols ensure your extension works across different store domains and environments. - Provide a way back: When navigating to sub-routes within your extension, always include a navigation action that lets customers return to the previous view.
- Listen for navigation events when rendering depends on the route: Use
shopify.navigation.currentEntryor listen forcurrententrychangeevents to update your UI when the route changes, rather than relying on stale state.
Anchor to LimitationsLimitations
- The Navigation API can only navigate within the customer accounts surface. It can't redirect to external URLs or the storefront.
- The
extension://<handle>protocol requires the target extension to be installed and active on the store. If the target extension isn't available, the navigation call has no effect. - Navigation between extensions doesn't support passing custom data or query parameters beyond what the target extension's URL structure supports.