Skip to main content
Besides opening full screen from the app launcher, your app can appear right where the merchant works: on an order, a catalog item (product, food, service or digital product) or a customer.
  • An action is an item in the page’s Apps menu. Choosing it opens your app in a modal, already told which resource the merchant was looking at. Use it for one-off tasks such as “Print packing slip” or “Send to courier”.
  • A block is a small card inside the page. Use it for at-a-glance information such as a fraud score, a tracking status or a loyalty balance.
Both are iframes of pages in your own app, talking to the dashboard over the App Bridge.

Targets

The product.* targets cover every catalog type. The context tells you which one the store uses: resource.type is product (ecommerce), food (restaurant), service (business) or digital-product (digital). Fetch the item from the matching API (/products, /foods, /services or /digital-products). Declaring a target grants nothing. An extension only appears on stores whose installation of your app holds the scope in the last column, and it is hidden again the moment the app is uninstalled.

Declaring extensions

In the dashboard go to Apps, Developer, open your app and find Dashboard extensions. Add one row per extension: An app can declare up to 12 extensions. The API refuses an invalid row with a message that says which row and why. Through the API, send the list as dashboardExtensions with PUT /api/v1/apps/developer/:id:
This is a different field from extensions, which holds your storefront extensions (embeds and blocks on the shop). Send null or [] to remove every dashboard extension.

Paths always stay on your origin

You declare a path, never a URL. The dashboard resolves it against the install / launch URL of the store’s installation, so a development install loads your development app URL and a production install loads your production one. The dashboard checks the resolved URL has the same origin as that app URL before it loads anything.

What the frame receives

The frame URL carries the same parameters as the full-screen app, plus three more: When the frame loads, the dashboard also sends a salesive:extension-context message:
The resource id is a pointer, not a permission. Always load the resource through the API with the access token you hold for that store, and check the shop matches the store you expect. Never trust the id alone to decide what a merchant may see.

Using the bridge

React example

Limits and behaviour

  • Extension frames use a stricter sandbox than the full-screen app: scripts, forms, your own cookies and storage, popups and downloads are allowed; navigating the dashboard window is not.
  • Only the extension messages above are answered inside an extension frame. Other bridge calls such as pickFiles() or requestPermission() work only in the full-screen app.
  • Blocks load lazily, when the merchant scrolls near them. Pages without any extension from an installed app load no extension code at all.
  • The menu and blocks list extensions in the order the apps were installed (newest first), then in the order you declared them.