Skip to main content
Add a small piece of UI to a built-in panel screen without copying it. The order detail page is a panel screen you don’t own. To add a button, a badge, or a note to it, you drop a widget at one of its zones. The SDK renders your component there, and the rest of the page keeps working exactly as shipped. This tutorial adds a Copy link button to the order summary section that copies a link to the order.
A widget is additive, not a replacement. It layers your component onto a built-in page at a documented zone. Reach for it first whenever you just want to add something to an existing screen.

Add the button

1

Create the widget file

Drop a file under src/widgets/. Export the component as the default and a config built with defineWidgetConfig. Target orders.detail.summary.after. Your component renders in the order summary section footer and receives the loaded order as data.
apps/vendor/src/widgets/order-copy-link.tsx
2

Read the zone id

A zone id is <domain>.<view>.<slot>.<placement>. The last segment is the placement.Multiple before or after widgets on the same zone stack in registration order.
3

Reload the panel

Start the project and open any order in the vendor portal. Widget files hot-reload. The Copy link button appears in the summary section footer, and the rest of the page is untouched.
Terminal

Order detail zones

These zones are mounted on the vendor order detail page. Each zone is passed the loaded order as data. The full, valid set is typed as WidgetZoneId and generated from the panel’s own zone hosts. Let your editor autocomplete zone: to see every option.
A zone that no page renders can’t be targeted and won’t type-check. Set zone: "not.a.zone" and tsc (bun run lint) fails with a “not assignable to WidgetZoneId” error.

Verify

Confirm the widget works end to end.
  1. Open an order. The Copy link button renders in the summary section footer.
  2. Click it. The link is copied and a toast appears.
  3. Change the zone to orders.detail.side.before and reload. The button moves to the top of the sidebar.
  4. Set zone: "not.a.zone". tsc (bun run lint) fails with a “not assignable to WidgetZoneId” error.
  5. Delete the file. The button disappears, and nothing else changed.

FAQ

The zone passes the loaded order as data (HttpTypes.AdminOrder): id, display id, totals, items, payment_collections, customer, and more. Build the link (or any UI) from it.
Yes. Put the same file in a block’s vendor_ui entry under src/widgets/. Installing the block adds the button with no wiring.
The zone renders any React component, such as a badge, an action menu, or a whole section. You have the full order in data.

Next steps

Add a widget

The general widget model and the full list of zones.

Extend forms and tables

Add validated fields and columns with defineCustomFieldsConfig.