Shopify will ask your shopper which store to collect from. It asks at checkout, and it asks without showing them any stock. That is the whole problem in one sentence: the decision is real, but it’s made at the wrong moment with the wrong information.
This is what moving that choice earlier involves, and what the picker has to get right.
What native does
Turn on local pickup at more than one location and Shopify’s checkout shows a list of your pickup locations with addresses and ready-time estimates. There’s also a “Check availability at other stores” link on the product page — a yes/no per location, one click deep.
Neither one connects the two facts the shopper is actually weighing: which shop is convenient and which shop has it. They pick the convenient one and find out about the other half at the counter.
Why the choice belongs before checkout
Stock is a product-level fact. By the time someone is in checkout they’ve already committed to a cart, entered an address, and are looking at a payment button. Asking “which store?” there means:
- they choose on convenience alone, because no stock is shown;
- if the answer is wrong, the failure lands on your staff, not on the site;
- and you learn nothing, because a wasted trip never appears in your reports.
Moving the same question onto the product page or into the cart, with the count next to each store, is the identical decision made with the information it needs. It also lets the shopper reconsider before they’re invested — switching stores at that point costs them nothing.
What the picker has to show
The number, per store. Not a badge. “4 at Downtown, 1 at Riverside, none at Northgate” is what ranks your shops; “available / available / available” ranks nothing. Which number to use — and why the obvious ones mislead — is its own subject.
Out-of-stock stores, still visible. Grey them and make them unselectable, don’t remove them. A shopper who can see their nearest shop is out will pick the next one. A shopper whose nearest shop silently vanished wonders whether the site is broken.
A sane order. Distance if you can get it, otherwise a priority you control. Alphabetical is the default nobody wants — it puts “Aberdeen” above the shop across the street.
A list, not a wall of cards. Store counts aren’t capped at three. Twenty stacked cards is a wall; a divider list with the name on the left and the count on the right stays scannable at any length. Use real radio inputs while you’re at it — keyboard navigation, screen-reader grouping and forced-contrast support all come free, and nothing you hand-roll will match them.
Locking the store into checkout
A picker that doesn’t carry its result into checkout is decoration. If checkout still offers every pickup location, the shopper can change their mind at the last step — and now the stock you showed and any capacity you counted were about a different shop.
The clean way to do this on Shopify is a delivery customization that hides the pickup options other than the one already chosen. Two properties matter:
- It only ever hides. It cannot throw an error, so there is no path where a shopper is stopped at checkout by your store logic.
- If it can’t match the choice for any reason, it should fail open — show everything, like native. A picker bug should degrade to plain Shopify, never to a checkout nobody can complete.
One order, one store
Shopify binds a single pickup location to an order. That’s a platform fact, not an app limitation, and working around it means splitting the cart into separate orders — which is a different product with different costs.
The practical consequence for a picker: in the cart, where there are several products, the honest thing to report per store is coverage, not a count. “All 3 items in stock” or “2 of 3 items in stock” answers the question the shopper is actually asking, which is whether one trip will do it.
Don’t build it into the theme
The picker should render through a theme app extension and keep its own markup. Two rules that save you pain later:
- No theme code edits. Anything that requires pasting a snippet into
product-form.liquidbreaks on your next theme update, and leaves residue when you uninstall. - Don’t inject into the theme’s cart drawer. Every theme names and structures its drawer differently, non-OS-2.0 themes may not have one, and themes re-render the drawer on every cart change — taking your injected markup with it. A panel that owns its own DOM is unaffected by all of that.
How BopiSafe does it
BopiSafe puts the picker on the product page, in the cart and beside your theme’s cart drawer, in a panel of its own — no theme code, one app embed switch. Each store shows its available quantity read live from your Shopify inventory; out-of-stock stores stay listed and unselectable; in the cart the rows report coverage across the whole basket.
The chosen store is locked into Shopify’s own checkout, and the buy-now button is caught too, so a direct express checkout still carries the store and the pickup time. Unlimited locations on the free plan, up to 100 pickup orders a month — pricing.
Written by the BopiSafe team — we build store-pickup tooling for Shopify merchants. Have a question this guide didn’t answer? Email miles.bopisafe@outlook.com.