Back to blog
March 24, 20266 min read

Building Custom Shopify POS Extensions for Multi-Location Retail

Off-the-shelf POS features weren't built for the complexity of multi-location retail. Here's how I use Shopify POS UI extensions to solve real problems across three store locations.

Shopify POSExtensionsMulti-LocationRetail

I operate three retail locations — one in Brooklyn, one in the Bay Area, and one in South Florida. Each store has its own inventory mix, its own customer base, and its own operational quirks. Shopify POS handles the fundamentals well: processing transactions, basic inventory tracking, customer lookup. But when you're running multiple locations with specialized products and services, the standard POS feature set starts showing its limits fast.

That's where Shopify POS UI extensions come in. These are custom interface elements that run directly inside the Shopify POS app on your staff's devices. They can display information, capture input, and connect to external systems — all without leaving the POS screen. I've built several that solve real problems for my team, and I want to walk through the use cases, the development process, and what I've learned deploying them across locations.

Why off-the-shelf POS features fall short

Standard Shopify POS gives every location the same interface. That's fine for a single-store operation, but multi-location retail has unique challenges:

Inventory visibility across locations. A customer in Brooklyn asks if you have a certain product in stock. Your Brooklyn store is out, but your Bay Area store has three. The default POS shows local inventory, but checking other locations requires navigating away from the current transaction. Staff either don't bother or it takes too long during a busy checkout.

Location-specific product knowledge. Each store carries different brands and models based on local demand. Staff need quick access to product details, fitting notes, and compatibility information — not just what's in Shopify's product description, but the institutional knowledge that experienced salespeople carry in their heads.

Service scheduling. We offer bike fitting, assembly, and repair services. Customers want to book while they're in the store, but the POS doesn't know anything about service availability. Staff end up checking a separate calendar app, which is slow and error-prone.

POS UI extensions let you solve all of these within the POS interface itself.

What POS UI extensions can do

Shopify's POS UI extension framework gives you defined extension points — specific places in the POS workflow where you can inject custom UI. The main ones I use are:

pos.home.tile — a tile on the POS home screen. Good for quick-access tools that staff use throughout the day.

pos.product-details.action — an action button on the product detail screen. Perfect for showing additional information or triggering workflows related to a specific product.

pos.customer-details.action — same idea but on the customer detail screen. I use this for viewing a customer's service history or loyalty status.

pos.purchase.post — runs after a purchase is completed. Useful for triggering follow-up actions like booking a service appointment or sending a custom receipt.

Extensions are built with Shopify's UI extension framework using React and a set of POS-specific components. They run in a sandboxed environment on the POS device and communicate with your backend via authenticated API calls.

Real use cases I've built

Cross-location inventory checker. This is the extension my staff uses most. It's a product detail action that, when tapped, queries all three locations' inventory for that product and its variants. The display shows each location's stock level with color coding — green for in-stock, yellow for low, red for out. If a customer wants an item that's at another location, staff can initiate a transfer request right from the extension.

The backend is a simple Vercel serverless function that queries Shopify's inventoryLevels via GraphQL, filtered by the product's variant IDs and all active location IDs. Response time is under 500ms, which is fast enough that staff actually use it during conversations with customers.

Staff picks and product notes. Each store has products that the local team is particularly enthusiastic about or knowledgeable about. I built a home tile extension called "Staff Picks" that displays a curated list of recommended products with short notes written by the staff themselves — why they like it, who it's best for, common questions. The data lives in a Supabase table that store managers can update through a simple web form.

This is especially valuable for newer staff. Instead of taking months to build product knowledge, they have instant access to the team's collective expertise right in the POS.

Service scheduling. This is the most complex extension I've built. It's a post-purchase action that detects when a customer buys a product that typically requires professional assembly or fitting (bikes, for instance). It presents available service appointment slots for that location, lets the staff book on the spot, and sends the customer a confirmation. The availability data comes from our scheduling system, and the booking creates entries in both that system and the customer's Shopify profile via metafields.

Before this extension, about 30% of customers who needed assembly would book an appointment at the register. After deploying it, that number jumped to over 70%. The staff don't have to remember to offer it or switch to a different app — it's just part of the checkout flow.

The development process

Building POS extensions follows Shopify's standard app development workflow, with a few POS-specific considerations:

Scaffold with the Shopify CLI. Running shopify app init and selecting the POS extension template gives you a working starting point. The extension runs locally during development and hot-reloads on the POS device — you connect the POS app to your development store and see changes in near-real-time.

Keep the UI simple. POS extensions run on tablets and phones, often in a retail environment where staff are multitasking. Every tap counts. I design extensions to require the minimum number of interactions: one tap to open, immediate display of the most important information, optional drill-down for details. If an extension takes more than 5 seconds to use, staff will skip it when the store is busy.

Handle offline gracefully. Retail WiFi is not always reliable. Extensions should show cached data when the network is unavailable and queue actions for retry. For inventory checks, I cache the last-known stock levels locally and display them with a "last updated" timestamp when the API call fails.

Use session tokens for auth. POS extensions have access to Shopify session tokens, which you can verify on your backend to authenticate API calls without managing separate credentials. This is both simpler and more secure than alternative auth approaches.

Testing across locations

Deploying to one store is straightforward. Deploying to three stores with different inventory, staff, and customer bases requires more planning.

I test every extension at one location for at least two weeks before rolling it out to the others. The first location is always the one where I have the most hands-on access. During the pilot, I watch for performance issues (slow API calls during peak hours), UX problems (staff confusion about what a button does), and edge cases (what happens when a product has 47 variants across 3 locations).

After the pilot, I deploy to the remaining locations with a brief training session — usually a 10-minute walkthrough for the store manager, who trains their team. I also add lightweight analytics to each extension (usage counts, error rates) that report to a monitoring dashboard. If usage drops at a location, something is wrong — either the extension is broken or the staff needs retraining.

Syncing POS data with online

One of the most valuable outcomes of custom POS extensions is the data they generate. Service bookings made in-store sync to the customer's online profile. Staff notes on products appear on the website. Cross-location transfer requests feed into our inventory management system.

The architecture is straightforward: POS extensions send events to a Vercel serverless backend, which writes to both Shopify (via GraphQL mutations on metafields, customer records, or order notes) and our operational database (Supabase). A nightly reconciliation job catches anything that fell through the cracks.

The end result is that the customer experience is consistent whether they're shopping in-store or online. If a customer gets a bike fitted in our Brooklyn store, their fit measurements are available when they browse accessories on our website. If they buy tires online, the in-store staff can see the purchase history and offer relevant services.

Is it worth the investment?

Custom POS extensions aren't trivial to build. Each of the use cases I described took 1–3 weeks of development time, including testing and deployment. But the operational improvements are tangible: faster checkout, better service booking rates, fewer lost sales due to inventory miscommunication, and staff who feel empowered rather than limited by their tools.

If you're running a multi-location Shopify retail operation and you're working around POS limitations with sticky notes, separate apps, or "just remember to check" workflows, custom extensions are worth exploring. The framework is mature, the development experience is good, and the impact on daily operations is real.

Need help with your Shopify store?

I build custom Shopify solutions, AI automations, and integrations that save real time and drive revenue. Let's talk about your project.

Get in touch