Shopify POS UI Extensions: Custom Tools for Your Store Staff
How POS UI extensions add tiles, actions and blocks to Shopify POS, the targets available, what staff can do with them, plan notes, and custom vs public apps.
In this guide
Shopify POS covers selling, returns and customer lookup well. What it does not know is your own process: the loyalty card your staff scan, the stocktake routine for the back room, the warranty you register after a sale, the check a manager wants before a big discount. That is what POS UI extensions are for. They let an app put its own screens and buttons inside the POS app, where staff already work.
This guide covers how extensions appear in POS, the targets you can use today, what an extension can do on the device, the plan questions to check, and how to choose between an App Store app and a custom one.
Three shapes an extension can take
Shopify’s POS UI extensions reference describes three:
| Shape | Where it appears | Typical use |
|---|---|---|
| Tile | The smart grid on the POS home screen | Opens a full workflow: stocktake, loyalty lookup, gift card sale |
| Action | A menu item on a native screen that opens a modal | “Register warranty” on an order, “Check stock elsewhere” on a product |
| Block | Inline content inside a native screen | A loyalty balance on the customer screen, a note on the order screen |
Extensions are built with Preact and Shopify’s POS web components, configured in shopify.extension.toml, and run on the merchant’s device. The compiled bundle cannot exceed 64 KB.
Targets available today
The targets reference lists these for API version 2026-07:
| Screen | Targets |
|---|---|
| Home | pos.home.tile.render, pos.home.modal.render |
| Cart line item | pos.cart.line-item-details.action.menu-item.render, pos.cart.line-item-details.action.render |
| Product details | pos.product-details.block.render, ...action.menu-item.render, ...action.render |
| Customer details | pos.customer-details.block.render, ...action.menu-item.render, ...action.render |
| Order details | pos.order-details.block.render, ...action.menu-item.render, ...action.render |
| Draft order details | pos.draft-order-details.block.render, ...action.menu-item.render, ...action.render |
| Post-purchase | pos.purchase.post.block.render, ...action.menu-item.render, ...action.render |
| Register details | pos.register-details.block.render, ...action.menu-item.render, ...action.render |
| App background | pos.app.ready.data |
A few rules from the reference:
- One tile per extension. The home tile can update its enabled state and badge, and typically opens its companion modal with
shopify.action.presentModal(). - Menu item plus modal. The menu item target places one button in a screen’s action menu, and it typically opens its companion modal (the
action.rendertarget) withshopify.action.presentModal(). Each extension renders only one menu item button. - Cart line items take actions only. The help center notes cart line item details supports action extensions, not blocks.
- Background target.
pos.app.ready.datais not tied to a screen and shows as App background in the POS editor.
What an extension can do on the device
The reference lists the APIs an extension can use. The ones that matter most in practice:
| Capability | What it enables |
|---|---|
| Direct API access | GraphQL Admin API requests from the extension through shopify:admin/api/graphql.json, with access scopes declared in the TOML |
| App authentication | Requests to your app’s backend carry authorization headers, so your server knows which store is calling |
| Scanner and Camera | Scan barcodes and cards |
| Storage | Keep data on the device |
| Cash drawer and PinPad | Work with the till and with PIN entry |
| Navigation, Toast, Device, Connectivity | Move between screens, show messages, read device details and network status |
Two details shape the design:
- POS staff are not authenticated users. Shopify’s reference states this directly, and ID tokens are
nullwithout the right app permissions. If an action needs a manager, build that check into your flow rather than assuming the signed-in staff member is known to your server. - Offline works for some things. Setting
runs_offline = trueunder[extensions.supported_features]lets an extension keep running when POS loses connection (POS 11.0 or later, Shopify CLI 3.92.0 or later). Storage, Scanner, Cash drawer and several other APIs work offline; app authentication and direct API access do not. Use the Connectivity API to tell staff when an action has to wait.
Version gates also apply. App authentication and direct API access need POS 10.6.0 or later for extensions targeting 2025-07 or later. Keep devices updated, or staff will see an update prompt instead of your tool.
What staff can do with it: examples
Shopify’s help center gives stocktakes with the device scanner, scanning loyalty or employee cards for discounts, and receiving products in store as examples. Typical custom builds look like this:
| Need | Targets | Notes |
|---|---|---|
| Stocktake for a section of the shop | Home tile and modal | Scanner, storage while counting, inventory update at the end |
| Loyalty balance at the till | Customer details block and action | Reads your loyalty system through your app backend |
| Register a warranty or service plan | Post-purchase or order details action | Sends serial number and order to your system |
| Stock at other locations or the warehouse | Product details block | Admin API for Shopify locations, your backend for anything else |
| Manager check before a large discount | Cart line item action | Your own PIN or approval step |
| End-of-shift checklist | Register details block or action | Saves the result for the back office |
If the job is something staff do in the admin rather than at the till, it belongs in an admin tool instead; Shopify back-office tools for teams covers that side.
Plan and POS Pro considerations
Shopify’s POS UI extension documentation and the help center page on extensions do not list a plan requirement for using them. What does depend on your subscription is the POS feature set your extension sits beside. Per Shopify’s comparison of POS features:
- POS Pro adds retail staff permissions and management, unlimited POS-only staff, exchanges, save and retrieve cart, more fulfillment options, in-app retail analytics and custom printed receipts, among others.
- Shopify Plus includes POS Pro on the first 20 locations.
This matters for design. If your extension relies on a feature that only exists on POS Pro, such as staff roles to decide who sees a button, the location needs POS Pro. If you are unsure, check each location’s subscription under Settings > POS Pro Subscription before the project starts.
Turning an extension on
Installing the app is not enough; extensions are activated in the POS editor. From the help center:
Smart grid tile
- Go to Sales channels > Point of Sale.
- In Customize the in-store experience, click Edit for POS app.
- Select a smart grid template, open the page you want and click Add tile.
- Click Embedded Apps, select the app and save.
Action or block
- In the same section, click Edit Point of Sale.
- Click the Apps icon in the editor menu bar.
- Find the app, click the extension and turn on Activate on.
- Save. The extension is added to every supported surface at all locations.
If your network uses a firewall or content filter, allow cdn.shopify.com and extensions.shopifycdn.com, which extensions load from.
App Store app or custom extension
Start with the App Store: in Settings > Apps, filter by Works with Shopify POS. Loyalty, gift cards, reviews and stock counts are common categories, and a maintained app is cheaper than code you own.
A custom extension makes sense when:
- the data lives in your systems: a loyalty scheme you run, a repair or warranty database, a warehouse outside Shopify;
- the flow is specific to how your shops work, and no app matches it closely enough;
- you want staff to do one thing quickly, without giving them access to more of the admin than they need.
Custom POS extensions ship inside an app like any other extension, usually a custom app installed on your store. The trade-offs between custom and public distribution are the same as for any app; see Shopify custom app vs public app. Shopify’s docs also distinguish extension-only apps, where everything runs on the device, from apps with a server, which you need for third-party integrations or anything that must keep a secret.
How a POS extension project runs
- Watch staff do the task and write down each tap, scan and decision.
- Choose the surface: a tile for a standalone workflow, an action or block for something tied to a product, customer or order.
- Decide what runs where: on-device only, or with your app backend for outside systems and secrets.
- Plan for offline: what must work without a connection, and what can wait.
- Test on a development store with the Shopify POS app on a phone or tablet; no POS hardware is needed for development.
- Activate in the POS editor and roll out location by location.
- Maintain it across POS app and API version updates; see maintaining a custom Shopify app.
Have it built
If your staff work around POS with paper, spreadsheets or a second device, a POS extension can bring that step into the till. Our custom solutions page explains how the team behind Storefleet Store Ops takes on custom Shopify work and what to send us. For the bigger picture of when custom is worth it, see when to build a custom Shopify app. The same team also writes about checkout and account extensions in checkout UI extensions and customer account extensions, and about back-office numbers in custom reports with ShopifyQL.
FAQ
Do I need POS Pro to use POS UI extensions?
Shopify’s extension documentation does not list a plan requirement. POS Pro adds features like retail staff permissions, so an extension that depends on those needs a POS Pro location.
Can a POS extension work offline?
Partly. With runs_offline = true, an extension keeps running when the connection drops, and APIs like Storage, Scanner and Cash drawer still work. App authentication and direct Admin API calls do not work offline.
Can a POS extension update Shopify data?
Yes. Through direct API access it can send GraphQL Admin API requests, limited to the access scopes declared in the extension’s configuration.
Where do staff find the extension?
Tiles appear on the smart grid after you add them in the POS editor. Actions and blocks appear on the screens they target once you turn on Activate on for the extension.
Can one POS extension have several tiles?
No. Each POS UI extension can render only one tile. Use separate extensions for separate tiles.