Setting up BOPIS on Shopify takes 4 steps: enable in-store pickup at each location in Shopify Admin, tag your pickup-only products, configure per-location capacity, then test the cart-to-checkout flow. Most stores can complete this in 30 minutes, but the harder part — handling mixed carts and capacity edge cases — is where Shopify’s defaults fall short.
This guide walks through the full setup, then covers the five most common mistakes that turn BOPIS from a revenue lever into a support nightmare.
What is BOPIS?
BOPIS stands for Buy-Online-Pickup-In-Store. A customer places an order on your Shopify storefront, selects a physical location for pickup at checkout, and collects the order in person instead of having it shipped. It’s also called click-and-collect in the UK and Australia.
BOPIS sits between pure e-commerce and pure retail. It gives customers same-day fulfillment without shipping fees, and gives merchants higher-margin orders (no carrier costs) plus foot traffic that often converts into add-on purchases.
According to Statista’s 2024 retail study, over 50% of US online shoppers used BOPIS at least once in the prior 12 months, and BOPIS orders convert 25-40% higher than ship-to-home for retailers with physical locations.
Why does Shopify need extra setup for BOPIS?
Shopify supports local pickup as a fulfillment option out of the box — you can enable it per location and pickup will appear at checkout. But the default behavior has four gaps that bite most merchants within the first month of going live:
- Shipping methods still appear on pickup-only carts. A customer adds a “store-only” item, and Shopify still shows them USPS rates, leading to confused orders that need manual fixing.
- Mixed carts can’t split cleanly. When a customer adds one pickup-only item and one shippable item, Shopify forces a single fulfillment choice. Most merchants either lose the order or fulfill it incorrectly.
- No per-location capacity. Shopify won’t stop accepting pickup orders for a store that’s already booked solid for the day.
- Inventory drift between sync windows. If POS sells the last unit while the e-commerce order is in the cart, Shopify happily takes the BOPIS order — leading to an unfulfillable promise.
Each gap is solvable, but solving them requires either a custom Shopify Function or a purpose-built app. The setup below covers the native flow first, then flags where you’ll need to extend.
Prerequisites
Before you start:
- A Shopify store on any plan (Basic and up — Plus is not required for BOPIS)
- At least one active location with a physical address customers can visit
- An Online Store 2.0 theme (Dawn, or any theme published after 2021)
- Inventory tracked at each location (not just at “online”)
- Staff trained on the pickup workflow (this is the operational part most merchants skip)
If you’re missing any of these, fix them first — BOPIS on top of broken inventory data will make the data problem worse, not better.
Step 1: Enable in-store pickup at each location
In Shopify Admin:
- Go to Settings → Locations
- Click the location you want to offer pickup from
- Scroll to Pickup and toggle This location offers pickup
- Set the expected pickup time (“usually ready in 2 hours” / “next day” — be honest, undersetting expectations costs more than oversetting)
- Add pickup instructions that will appear in the order confirmation (parking, hours, which door, how to identify yourself)
- Save
Repeat for every location that should accept pickup. Locations without pickup enabled won’t appear at checkout.
Common mistake: enabling pickup at a fulfillment-only warehouse where customers can’t physically visit. If staff aren’t trained to greet pickup customers, don’t enable pickup there — even if the inventory lives there.
Step 2: Tag your pickup-only products (and decide your taxonomy)
Not every product should be available for pickup. Heavy items, fragile items, perishables outside refrigeration, and special-order items often need to be either pickup-only or ship-only.
The cleanest way to model this in Shopify is with tags or a metafield:
- Tag-based: add
pickup-only,ship-only, ordualtags to each product - Metafield-based: define a
fulfillment_modemetafield with the same values
Pick one and stick with it. Mixing tag-based and metafield-based logic is the #1 cause of BOPIS bugs we see in production.
Why this matters: by default, Shopify will show shipping methods for any product with stock at any location. Without product-level pickup rules, a customer adds a pickup-only item and Shopify still asks for a shipping address. The order goes through, the customer gets confused, your support team eats it.
Step 3: Set per-location capacity
Shopify natively does not support per-location pickup capacity. If your store can prep 30 pickup orders per day before staff are overwhelmed, Shopify won’t stop the 31st order from being placed.
To enforce capacity, you need either:
- A scheduling app (Zapiet, Bopple, BopiSafe — see comparison in our BopiSafe vs Zapiet writeup)
- A custom Shopify Function on Cart Transform that hides at-capacity locations
The goal is the same: when a location hits its daily/hourly cap, it should stop appearing as a pickup option at checkout. Customers either pick a different location or switch to shipping. Both outcomes preserve revenue; an unfulfillable pickup order does not.
If you’re at low pickup volume (under 10 orders/day) you can defer this step and operate on trust. Above that threshold, capacity enforcement pays for itself within the first week.
Step 4: Handle mixed carts (the hardest part)
A mixed cart is a single cart containing both pickup-only and shippable items. Shopify treats this as one cart with one fulfillment choice — there’s no native way to ship one item and pick up another in a single order.
You have three real options:
- Block mixed carts at the cart page. Show a message: “This cart contains items that can’t be combined. Please check out separately.” This is the cheapest to implement and the worst for conversion — abandonment rate spikes 15-25%.
- Split the cart into two coordinated draft orders. When the customer checks out, programmatically create one order for pickup and one for shipping, both linked to the same customer and payment. This is what BopiSafe does. Conversion stays intact, customer gets one checkout, you get two clean fulfillment paths.
- Force the whole cart to one fulfillment mode based on majority. Risky — you’ll fulfill some items wrong.
Option 2 requires a Shopify Cart Transform Function plus checkout-side coordination. It’s not trivial to build from scratch, which is why most merchants either accept the abandonment of option 1 or buy an app that handles option 2.
Step 5: Test the full flow before going live
Before you announce BOPIS to customers, run these test scenarios from a private browser session:
| Scenario | Expected outcome |
|---|---|
| Cart with 1 pickup-only item | Shipping methods hidden; pickup options shown |
| Cart with 1 shippable item | Shipping shown; pickup hidden (unless dual) |
| Cart with both | Either split cleanly or surface a clear message |
| Pickup at a location with 0 stock | Location should not appear as a pickup option |
| Pickup at an at-capacity location | Location should not appear |
| Order placed, then inventory hits 0 between cart and submit | Order should be blocked or downgraded |
If any of these fail, fix before announcing. BOPIS that breaks at edge cases erodes trust faster than no BOPIS at all.
The 5 mistakes that kill BOPIS rollouts
After watching dozens of merchants launch BOPIS, the same five mistakes recur:
- Enabling pickup at locations that aren’t staffed for it. Customers show up, no one greets them, refund follows. Train first, then enable.
- Not setting expected pickup time honestly. “Ready in 2 hours” when reality is 6 hours generates more support tickets than no estimate at all.
- Forgetting to handle inventory drift. POS sells the last unit while a BOPIS order is in flight. Without enforcement, you’ve just promised a customer something you can’t deliver.
- Mixing tag-based and metafield-based pickup rules. Pick one. Document it. Never mix.
- Treating BOPIS as a shipping replacement, not a fulfillment mode. Mixed carts, location capacity, and pickup-only checkout are all distinct problems. Solving one without the others creates new failure modes.
Where Shopify defaults stop and BopiSafe begins
If you’re a single-location store with simple inventory and low pickup volume, Shopify’s native pickup is enough. Set it up, test it, run it.
If any of these apply, you’ll outgrow native quickly:
- 2+ locations
- More than 20 pickup orders per day
- A non-trivial portion of orders are mixed carts
- Inventory updates from a separate POS or ERP
- You can’t afford an unfulfillable pickup order
BopiSafe was built specifically for the gaps above: pickup-only checkout enforcement, mixed-cart splitting via coordinated draft orders, per-location capacity guardrails, and inventory-drift blocking. It runs on Shopify Cart Transform + Checkout Functions, so it adds zero perceivable latency and doesn’t require theme rewrites.
For a deeper comparison with the most-installed alternative, see our BopiSafe vs Zapiet writeup (coming soon).
Next steps
- Walk through Steps 1-5 above on your store
- Run the test matrix in Step 5 — find the gaps before customers do
- If you hit the failure modes in §“5 mistakes”, read our piece on BOPIS fraud prevention (coming soon) and shopify pickup location capacity management (coming soon)
- Or install BopiSafe to skip the gap-filling and get all five steps enforced by default
Have a question this guide didn’t answer? Email support@bopisafe.com — we read everything and update this guide based on what merchants actually run into.