Grocery is the number-one click-and-collect category for one reason: fresh food can’t go in a parcel. Produce, dairy, frozen, and prepared items are pickup-only or local-delivery-only by nature — they spoil in transit and shoppers want them today. That makes a multi-store grocery operation the sharpest fit for real BOPIS on Shopify, and the mixed cart its hardest case.
Up to 78.7% of click-and-collect sales are grocery items, according to Capital One Shopping research. The reason isn’t novelty — it’s physics. A bag of spinach and a tub of ice cream are pickup-or-local-delivery items, full stop. This guide covers how multi-store grocers run BOPIS correctly on Shopify, why live per-store stock is non-negotiable for fresh goods, and what happens when a customer mixes a perishable item with a pantry staple that ships from a warehouse.
Why is grocery the hardest BOPIS category to ship — and the best one to pick up?
Most retail categories can ship; pickup is a convenience. Grocery is the opposite. A meaningful slice of any grocery catalog physically can’t survive a parcel: fresh produce, refrigerated and frozen items, deli and bakery goods, cut flowers, prepared meals. These aren’t pickup-preferred — they’re pickup-only or local-delivery-only by their nature.
That flips the usual BOPIS framing. For a grocer, pickup and local delivery aren’t a feature bolted onto a shipping business — for the perishable half of the catalog, they’re the only fulfillment that works. Shelf-stable items (canned goods, pantry staples, household supplies) can ship. The cold-chain and fresh items can’t.
So a grocery store sells two kinds of products at once, and they need two different fulfillment paths. The trouble starts the moment a customer puts both in one cart.
Pickup also matches how people actually grocery shop — a planned weekly trip, not a spontaneous parcel order. US click-and-collect retail sales reached $154.3 billion in 2025, per Capital One Shopping, and grocery anchors that volume. Pickup’s share of online grocery specifically held around 37% in early 2025, with delivery taking the rest, according to Brick Meets Click data reported by Grocery Dive. Either way, the in-store-collection half of grocery is a multi-billion-dollar habit, not a niche.
Why does per-store stock matter more for grocery than any other category?
Grocery inventory moves faster than almost any other retail category, and it differs sharply by store. One location has organic strawberries on the shelf this morning; another sold the last clamshell an hour ago. A combined inventory pool — the Shopify default, which treats all your stock as one number — hides that difference completely.
The failure mode is concrete. A customer in one neighborhood reserves fresh salmon for pickup based on a stock count that’s really the total across five stores. Their local store doesn’t have it. They drive over, the fish isn’t there, and now you owe a refund and an apology for a wasted trip. For perishables, the stakes are higher than dry goods — there’s no “we’ll order it in for next week.”
Real multi-location BOPIS treats each store’s stock as its own truth. The product page shows live availability per store, and the in-cart store picker lets the shopper choose where to collect — sorted by priority then distance. A store that’s out of stock or at pickup capacity stays visible but greyed out, so the shopper sees it exists and picks an available one instead.
This is the heart of grocery BOPIS, not a nice-to-have. The store picker also locks the chosen store into checkout, so the order can’t drift to a location that doesn’t stock the item. Our guide to showing per-store stock at pickup covers how this works across a chain.
How does a mixed grocery cart break native checkout?
Here’s the everyday grocery cart that has no clean resolution at native checkout: a customer adds fresh chicken, a bag of apples, and a pint of ice cream (all pickup-only — they can’t ship) plus a case of canned tomatoes and a box of pasta (shelf-stable, shipped from your distribution centre — no store shelf to collect them from). One cart, two fulfillment realities.
By design, a Shopify order carries one fulfillment method. Every line in a single order ships, or every line is picked up — there’s no native way for one order to do both. So this cart has no single method that fits all of it. The customer hits checkout and either sees an error, or is forced into one method that creates an order you can’t fulfill — fresh chicken with a shipping label, or canned goods flagged for in-store collection.
This isn’t a rare edge case for grocery. It’s the modal basket. Shoppers don’t separate their fresh and pantry items into two trips, and they shouldn’t have to. The mixed cart is the normal grocery cart — which is exactly why grocers feel this gap harder than any other category.
The clean fix is to split the cart by fulfillment type and send each group through its own checkout. BopiSafe groups the fresh pickup-only items into one real native order tied to the chosen store, and the warehouse-shipped pantry items into a second real native order — two orders, never one merged order, because combining incompatible fulfillment into a single Shopify order is a platform limit nobody clears. Our mixed-cart split guide walks through the full flow.
Setting fresh items to pickup-only — and why it must hold at checkout
The mechanism behind all of this is a single merchant decision: which products can’t ship. You set each perishable SKU — or a whole “Fresh” or “Frozen” collection — to pickup-only or local-delivery-only. That’s the menu you’re defining. The shopper then orders from it.
The catch is enforcement. Marking an item pickup-only does nothing if shipping reappears at checkout. A theme tweak that hides shipping on the cart page looks correct in a browser — then a customer taps Shop Pay or Apple Pay, which skip the cart page entirely, and shipping options come back. The order goes through, the warehouse prints a shipping label for a carton of eggs, and you find out from the customer.
Proper BOPIS enforces the rule at checkout itself, inside Shop Pay and Apple Pay too — not just on the cart page. The fresh item never gets a shipping option, and there’s nothing to bypass by switching payment methods. This is the part DIY theme work can’t reliably do; most grocers use an app for it. Our pickup-only products guide breaks down the labeling decision and the enforcement gap in detail.
The principle is worth stating plainly: the merchant sets the menu, the buyer orders from it. You decide that fresh and frozen are collected in store, and the platform holds that line — a warehouse can’t ship what’s been marked must-collect.
How grocery pickup time slots actually work
Grocery pickup is time-sensitive in a way most categories aren’t. A customer picking up refrigerated items wants a specific window, and the store needs to stage cold items at the right moment — you can’t pull ice cream two hours early.
After choosing a store, the shopper books a pickup or local-delivery time from a month calendar for that store. Per-slot caps grey out windows that are full, so a single Saturday-morning slot doesn’t get swamped with more orders than staff can stage. Capacity caps (a daily limit per store) are a Pro-plan control; choosing a time is available on every plan.
Keep the framing honest here: this is a light confirmation layer — pick a store, pick a window. It is not a delivery-routing engine, a courier-dispatch tool, or a staff-rostering suite. Those run on Shopify-native tools or dedicated apps. BopiSafe’s job is the buyer-facing loop and checkout enforcement, not back-office logistics. For the setup details, see our pickup time window guide.
What does a complete grocery BOPIS setup look like?
Pulling it together, a multi-store grocer’s BOPIS stack has these parts working as one loop:
| Layer | What it does for a grocer | Why it matters |
|---|---|---|
| Live per-store stock | Shows what each store actually has, in real time | Perishables turn over fast; combined pools cause wasted trips |
| In-cart store picker | Shopper chooses where to collect; out-of-stock stores greyed | One trip, the right store, locked into checkout |
| Pickup-only enforcement | Fresh and frozen can’t get a shipping label | Holds inside Shop Pay and Apple Pay, not just the cart page |
| Time-slot booking | Shopper books a collection window per store | Cold items staged at the right moment; slots don’t overload |
| Mixed-cart split | Fresh + pantry cart becomes two real native orders | The modal grocery basket still checks out |
Notice the order. The store picker and per-store stock are the heart of grocery BOPIS — that’s the everyday win, the shopper seeing which store has their items and locking that store into a clean native order. The split is what keeps the fresh-plus-pantry basket alive: it fires on a cart no single method covers — a pickup-only perishable beside a pantry line that ships from your warehouse.
Across our own pickup integration work since 2023, the pattern that separates a smooth grocery BOPIS launch from a support backlog is almost always per-store stock accuracy — get that right and the rest of the loop holds.
Where the native flow ends
If you run a single store, do a handful of pickup orders a week, and almost never see a mixed fresh-plus-pantry cart, you can probably get by on Shopify’s native local pickup plus a cart-page warning. The Shopify Help Center on local pickup covers that baseline.
You’ll outgrow it the moment any of these become true:
- 2+ stores with stock that differs by location (the normal grocery case)
- Fresh-plus-pantry mixed carts more than a few times a week
- Express checkout (Shop Pay, Apple Pay) is a real share of your orders
- A wasted trip for a perishable item is something you can’t afford
Worth noting: BOPIS shoppers are valuable once they arrive. 85% of US BOPIS shoppers have made an additional purchase when collecting an order, per Capital One Shopping — for grocery, the in-store top-up on pickup is a well-documented habit. A clean pickup experience isn’t just damage control; it’s a second sale.
BopiSafe is complete multi-location BOPIS for Shopify, and grocery is one of its sharpest cases. You set each product’s fulfillment — lock perishables to pickup-only or local-delivery-only in one click, per product or per collection. Shoppers see real-time per-store stock, choose where to collect in an in-cart store picker, and book a pickup time. That choice is enforced at checkout, not just shown — so fresh items never get a shipping label inside Shop Pay or Apple Pay. And a cart mixing a perishable item with a warehouse-shipped one splits into two real native orders, one per fulfillment type. Because these are real native orders, Shopify’s own “Ready for pickup” emails and POS handling just work — one less system to run.
Written by the BopiSafe team — we build BOPIS infrastructure for Shopify merchants.
Next steps
- Decide which of your SKUs are genuinely pickup-only or local-delivery-only, then read our pickup-only products guide
- If you run more than one store, read the multi-location BOPIS guide — per-store stock is where grocery lives or dies
- Understand the split before you commit to an approach: mixed-cart split guide
- See how live per-store stock shows up for shoppers: per-store stock at pickup
- Or install BopiSafe to get every layer enforced by default