Shopify B2B Deep Dive / Customer Account UI Extensions for B2B Portals

Customer Account UI Extensions for B2B Portals.

Every surface an app can extend inside Shopify's hosted customer accounts, what stays sealed, and how a working B2B portal gets built on top.

LAST VERIFIED 2026-07-12 AGAINST SHOPIFY DOCUMENTATION
TL;DR

Shopify customer account UI extensions let apps inject custom functionality at defined points in Shopify's hosted customer accounts: the order index, order status, and profile pages, order action menus, and entirely new full-page routes. They work only on the current version of customer accounts (legacy accounts support no extensions), render Shopify's own components inside a sandboxed Web Worker, and inherit the merchant's brand settings automatically. For B2B, four dedicated Profile targets plus the purchasingCompany API let an extension detect a company buyer and render company-specific tools such as team management, approvals, quotes, and invoice payment.

What are Shopify customer account extensions?

Customer account UI extensions are app-built components that render inside Shopify's hosted customer accounts. Shopify defines the injection points: the order index, order status, and profile pages, order action menus, and entirely new full-page routes. Extensions are written in Preact against Shopify's Polaris web components, configured in shopify.extension.toml, and executed in a sandboxed Web Worker. There is no direct DOM access and no arbitrary HTML or CSS; the extension composes the component set Shopify exposes, and the rendered UI inherits the merchant's brand settings automatically.

Two platform rules frame everything else. First, extensions run only on the current version of customer accounts: legacy customer accounts support no UI extensions. Second, Shopify B2B itself requires customer accounts, and legacy accounts cannot be used for B2B customers at all. Every store running native Shopify B2B is therefore already on the exact account surface extensions extend. That makes customer account UI extensions the sanctioned way to turn Shopify's stock account pages into a working B2B portal, without a replatform and without a custom storefront.

Naming note: in December 2024 Shopify renamed "new customer accounts" to "customer accounts" and "classic" to "legacy customer accounts," stating that legacy will eventually be retired. Apps can detect which version a shop runs through the Admin API's CustomerAccountsV2.customerAccountsVersion field.

Which surfaces can an extension target?

The targets reference (API version 2026-01) exposes extension points across seven surfaces:

SurfaceTargetsWhat renders there
Order indexorder-index.announcement.render, order-index.block.renderAnnouncements and blocks on the order list page
Order statusannouncement.render, block.render, plus render-after slots for cart line items, the cart line list, customer information, fulfillment details, payment details, return details, and unfulfilled itemsInline UI positioned around the native order detail sections
Order action menuorder.action.menu-item.render, order.action.renderA button on the order index and order status pages that opens the extension's modal
Full pagecustomer-account.page.render, customer-account.order.page.renderEntirely new standalone pages, and order-scoped pages with access to order data
Profile (default)profile.addresses.render-after, profile.announcement.render, profile.block.renderUI on every customer's profile page
Profile (B2B)render-after targets for company details, company location addresses, company location payment, and company location staffUI shown only to B2B customers, next to Shopify's native company management
Footerfooter.render-afterContent rendered after the account footer

Targets come in two behaviors. Static targets render in one fixed location and merchants cannot move them; block targets can be repositioned by the merchant in the checkout and accounts editor, but only among supported placements. For the order action menu, Shopify's own listed use cases are return request buttons, reorder functionality, exporting order data, and managing subscriptions.

What can full-page extensions do?

Full-page extensions create entirely new pages in customer accounts. They render in the main content area, below the header and above the footer. Shopify's named use cases are wishlists, loyalty programs, return requests, subscription management, and custom order views. When a merchant adds one in the checkout and accounts editor, they are prompted to add it to the customer account header menu, and the page gets a static URL that can be deep-linked. The Navigation API supports multi-route extensions through navigation.navigate() and the extension:// and shopify:customer-account/ protocols, and customers reach these pages without leaving their account or logging in again.

The order-scoped variant, customer-account.order.page.render, receives the order via shopify.order and its line items via shopify.lines; the data loads asynchronously and may be undefined on first render. One structural constraint applies to all of this: a full-page target cannot coexist with any other target in the same extension, so a portal that also injects inline blocks splits across multiple extensions.

For B2B, full pages are the surface that matters most. A quotes inbox, an approvals queue, a spend dashboard, a batch invoice payment screen: these are complete workflows, not inline widgets, and full-page extensions are the only mechanism that adds whole new account pages. A theme cannot do this; themes stop at the storefront, as covered in B2B themes and portals.

How does an extension know the buyer is a B2B company?

The Authenticated Account API gives read-only access to the signed-in customer's ID and their B2B purchasing company. When shopify.authenticatedAccount.purchasingCompany is non-null, it exposes company.id and location.id, and it is supported on 24 targets:

const purchasingCompany =
  shopify.authenticatedAccount.purchasingCompany.value;

if (purchasingCompany) {
  const {company, location} = purchasingCompany;
  // render company-specific UI for this location
}

On top of detection, the four Profile (B2B) targets render only for B2B customers, alongside Shopify's native company and location management UI. Shopify's suggested uses: account manager contact details, delivery zone restrictions and warehouse details per location, credit terms and approved payment methods, and staff role descriptions with onboarding links. This slots directly into the company structure described in companies, contacts, and permissions.

The login context is worth knowing when designing these flows. B2B sign-in is passwordless: the buyer enters the email associated with a company location plus a one-time PIN, and contacts assigned to multiple locations pick which location they are ordering for. Plus stores can replace the default login with their own OpenID Connect identity provider.

What data can an extension read and write?

One open question for contract pricing: Shopify documentation does not state whether Storefront API responses inside a customer account extension are automatically contextualized with the buyer's company location. The headless B2B docs require explicit buyer contextualization, so verify price behavior in a development store before relying on shopify.query() for contract prices.

What is sealed in customer accounts?

The extension model is deliberately closed. The hard limits, each from Shopify's documentation:

CapabilityStatusDetail
Extensions on legacy customer accountsNOT NATIVEOnly the current version of customer accounts supports UI extensions
Arbitrary HTML, CSS, or JavaScript on the pageNOT NATIVEExtensions are limited to specific UI components exposed by the platform for security reasons
Restyling native chrome (header, footer, login, order tables)NOT NATIVEThe UI inherits merchant brand settings; styling stops at what the checkout and accounts editor allows
Placing UI at arbitrary pointsNOT NATIVEStatic targets are fixed; block targets move only within supported placements
Injecting UI at any defined targetNATIVEAll targets in the table above, across seven surfaces
New full account pages with their own routesNATIVEVia customer-account.page.render, one full-page target per extension
Order actions without full authenticationNOT NATIVECustomers must be fully authenticated to complete order actions; pre-auth order status pages prompt login, then resume
Customer data access without reviewNOT NATIVEApps touching customer data need protected customer data access approved before going live

Platform-level B2B constraints also cap what any portal can do: Shopify B2B does not support purchase options such as subscriptions, pre-orders, and try before you buy, and the shipping and billing addresses cannot be edited during B2B checkout. Plan gates apply too: B2B runs on all plans, but Basic, Grow, and Advanced are capped at 3 active B2B market catalogs, while unlimited catalogs, direct company catalogs, deposits, and partial payments are Plus-only. The full ledger lives in Shopify B2B limitations. Note also that customer accounts are receiving layout updates behind the "Customer account improvements" feature preview, which changes where extension targets render.

What B2B use cases do customer account extensions serve?

Native B2B accounts already cover a baseline: buyers can view order history and company location information, manage saved payment methods, pay invoices, track orders, place reorders by duplicating a past order, and submit and track return requests. As of API 2025-10, company locations can also own store credit accounts that buyers view and spend in customer accounts. Everything a wholesale buyer needs beyond that baseline is extension territory:

Buyer workflowSurface that fitsB2B Supercharge coverage
Team management: invite users, assign roles, set who can order, approve, or see pricesProfile (B2B) targets or a full pageAccount Tools
Order approvals with thresholds and historyFull pageAccount Tools, see order approvals
Order search by status, PO, SKU, or location, plus reporting and exportsOrder index blocks and a full pageAccount Tools, see order search
Quotes the buyer reviews, accepts, and converts to ordersFull pageBuying Tools, see quoting
Fast reorder, quick order pad, CSV upload, saved cartsFull page and order action menuBuying Tools, see bulk ordering
Selecting every open invoice and paying them togetherFull pagePayments, see invoice payments

This is how B2B Supercharge is delivered: it installs as a Shopify app, your team works in the admin they already know, and your buyers stay in the customer account they already log into. The base platform is free and each module switches on independently.

Should you build extensions or install them?

Scaffolding is one command: shopify app generate extension --template customer_account_ui. A single inline block, an announcement, or an order action is a reasonable custom build for a team that already ships Shopify apps. A full B2B portal is a different scope: teams and roles, approval routing, quoting, batch invoice payment, and ERP sync are products with state, permissions, and back-office integration behind them, not components. The practical decision is usually one custom extension for the one thing unique to your business, and an installed suite for the portal itself. Browse the native gaps and their fixes to see where the line falls for your operation, or start from the Shopify B2B Deep Dive if you are still mapping what native B2B includes.

Last verified 2026-07-12 against Shopify documentation (Customer Account UI Extensions API, 2026-01 stable).

Frequently asked questions

What are Shopify customer account extensions?

They are app-built UI components that render at defined points inside Shopify's hosted customer accounts: the order index, order status, and profile pages, order action menus, a footer slot, and entirely new full pages. They use Shopify's component set inside a sandboxed worker and inherit the merchant's brand settings.

Do customer account UI extensions work with legacy customer accounts?

No. They are only supported on the current version of customer accounts. Legacy accounts support no UI extensions and cannot be used for B2B customers at all.

Are there B2B-specific extension targets?

Yes. Four Profile (B2B) targets render after company details, company location addresses, company location payment, and company location staff. They appear only for B2B customers, alongside Shopify's native company UI.

Can an extension add a whole new page to the customer account?

Yes. Full-page extensions render in the main content area with a static, deep-linkable URL, support multi-route navigation, and can be added to the account header menu by the merchant. An order-scoped variant gets direct access to order data.

Can extensions use custom CSS or their own design system?

No. Extensions are limited to the UI components Shopify exposes, for security reasons, and the rendered UI inherits the merchant's brand settings from the checkout and accounts editor.

Can an extension read the buyer's orders and company data?

Yes, through the Customer Account API: extensions fetch shopify://customer-account/api/{version}/graphql.json with automatic authentication, given scopes like customer_read_orders and approved protected customer data access. The Authenticated Account API also exposes the buyer's purchasing company and location IDs.

Is Shopify B2B Plus-only?

No. Companies, locations, net terms, vaulted cards, quick order lists, easy reorders, and PO numbers run on all plans. Plus adds unlimited catalogs, direct company catalogs, deposits, and partial payments. See what Shopify B2B includes.

Sources · verified 2026-07-12

See a portal built on this surface.

B2B Supercharge puts teams, approvals, quotes, and batch invoice payment inside the Shopify customer account your buyers already use. Book a demo.

Book a demo