Inventory & Fulfilment
Buy Online, Pick Up In Store (BOPIS) & Multi-Location Stock
Track stock separately for each store and warehouse, let shoppers choose in-store pickup at checkout with no shipping charged, and fulfil pickup orders from the location that holds the stock.
Overview
BestWebby tracks stock per location — each store, warehouse, or pickup point holds its own count, and those counts roll up to your overall on-hand. On top of that, you can offer buy online, pick up in store (BOPIS): at checkout, a shopper chooses to collect their order at one of your stores instead of having it shipped. A pickup order is never charged shipping, doesn't need a delivery address, and draws its stock from the store the shopper picked — so the count at that location stays honest.
Locations are part of every plan. The Inventory page, where you keep stock per location, is on the Growth plan and above.
This page covers how to set up locations, turn on pickup, what the shopper sees at checkout, and how you fulfil a pickup order.
By the end you'll have:
- One or more locations, each with its own stock counts
- Pickup enabled on the locations that offer it
- In-store pickup showing as an option at checkout
- A clear path to mark pickup orders ready and hand them off with a collection code
- Reminders for customers who have not come yet, and a list of orders nobody collected
How multi-location stock works
Every location holds its own on-hand count for each product (and each variant). Your overall on-hand for a product is the sum of its location counts — so when a sale draws stock from one store, the overall number drops by the same amount. This keeps one number true across every channel: your storefront, your product feeds, and your in-store register all read the same on-hand.
If you run a single location (or haven't set up locations yet), nothing changes — stock is tracked as a single global count exactly as before. The per-location behaviour engages only once you have at least one active location holding stock.
Step 1: Add your locations
Go to Settings → Locations and click Add location. For each place you hold or sell stock, enter:
- Name (for example, "Downtown Store" or "Main Warehouse")
- Address: optional for a warehouse, but a pickup location needs its country, its province or state and its postal code (where the country uses them). A pickup order is taxed at this address, so a store without them is not offered for pickup (see How a pickup order is taxed).
- Pickup — turn this on if shoppers can collect orders here
Your first location becomes the default automatically. The default is the location BestWebby prefers first when it needs to choose where to draw stock for a shipping order. You can change which location is the default at any time.
Mark a location inactive when it's temporarily closed or being wound down — inactive locations are never offered for pickup and are skipped when allocating stock.
Step 2: Distribute your stock across locations
Assign on-hand counts to each location so BestWebby knows where your inventory physically sits. Manage per-location counts from your inventory screens under Catalog → Inventory → Stock by location.
Gotcha — undistributed stock: the per-location pickup and allocation path only engages for a product once its location counts fully account for its overall on-hand. If a product still has stock that hasn't been assigned to any location, BestWebby falls back to the plain overall-count decrement for that product — safe, but it means pickup allocation from a specific store won't kick in until that product's counts are distributed. Distributing your counts is what unlocks the per-location behaviour.
Move stock between locations with a transfer
When stock travels from one location to another (a delivery from the warehouse to a store, a box of returns going back), use a transfer so the goods are counted honestly while they are on the road. Go to Catalog → Inventory → Transfers and click New transfer.
- Create a draft. Pick the location the stock leaves from and the one it goes to, then add each product with its quantity (a product with variants asks which variant). Add a note if the people packing need one. A draft moves nothing, so you can prepare it ahead of time; every transfer gets its own number (T0001, T0002 and so on).
- Print the packing slip. Packing slip on the transfer opens a printable sheet listing what is being sent, both addresses, a column for the receiving team to count in what arrived, and lines to sign. It never shows prices.
- Ship it. Click Ship when the goods leave. Every line comes out of the origin's count at once. If the origin doesn't have enough of a product, nothing ships and you are told which product and how many are there. You can add the carrier and tracking number at any time while the transfer is open.
- Receive what arrived. At the destination, open the transfer and click Receive. Enter what actually arrived on each line. A short delivery is fine: whatever you don't receive stays in transit, and you can receive the rest later. The transfer closes as Received once every unit is accounted for.
While stock is in transit it counts at neither location: it is not in the origin's on-hand any more, not yet in the destination's, and it can't be sold online, picked up or rung up at either end. Your overall on-hand drops by the units on the road and comes back as they are received. Stock by location shows them as incoming at the destination, separately from on-hand.
Units that never arrive. If part of a shipment is lost or damaged, click Write off missing units, enter how many of each product and the reason. Written-off units are closed out on the transfer with your reason and recorded in the audit log; they don't come back into stock.
Cancelling. Cancelling a draft changes nothing. Cancelling a transfer that is in transit puts every unit still on the road back at the origin; anything already received stays where it is.
Lot-tracked products carry their lots with them: the earliest-expiring lots leave first and arrive at the destination under the same lot codes, so a recall still finds them. Products tracked by serial number can't go on a transfer yet.
For a quick move that happens instantly, such as carrying one product to the shop floor, you can still use Transfer stock on a product's Stock by location view.
Step 3: Turn on pickup
Pickup is a per-location switch. Only locations that are active and have pickup turned on are offered to shoppers at checkout. Turn pickup on for your customer-facing stores, and leave it off for back-office warehouses that don't accept walk-in collection.
If no location has pickup enabled, the in-store pickup option is hidden from checkout entirely — shoppers simply see the normal shipping flow.
What the shopper sees at checkout
When at least one pickup-enabled location exists, checkout offers a choice between shipping and pick up in store:
- Ship (the default) is the normal carrier flow: the shopper enters a delivery address, BestWebby quotes shipping rates, and they choose a method.
- Pick up in store lets the shopper choose one of your pickup locations. No delivery address is required, and no shipping is charged — the shipping line is skipped entirely.
The pickup location list shows each store's name and address. Shoppers only ever see your own store's locations; there is no way for one store's locations to appear on another's checkout.
How a pickup order is taxed
A pickup order is taxed at the store the shopper collects from, not at the shopper's own address. A sale is made where the goods are handed over: in Canada, goods delivered or made available in a province are supplied in that province (Excise Tax Act, Schedule IX, Part II, section 2; CRA GST/HST Technical Information Bulletin B-103), and most US states source an over-the-counter sale to the seller's location. So a shopper from Québec who collects in your Toronto store pays Ontario HST, and a shopper who gives no address at all is still charged the tax of the store.
This works the same way whichever tax engine you use:
- Your own tax rules (Finance → Tax rules): the rule for the store's country and province or state applies.
- Stripe Tax: the store's address is sent to Stripe as the place of delivery, and the sale is recorded in your Stripe Tax at that address.
The tax the shopper sees at checkout is the tax on the order and the amount charged to their card. There is no shipping line, so nothing is taxed for shipping. Your tax report files the order under the store's province or state, and an exchange on the order is taxed there too.
For this BestWebby needs to know where the store is. Under Settings → Locations, a pickup location's address must have a country and, where the country uses them, a province or state and a postal code. Type the province or state as its code or its name ("ON" or "Ontario"). Until it does:
- the store is left out of the pickup choices at checkout (when it is your only pickup store, the pickup option is hidden);
- a shopper whose page still shows it is turned away before anything is charged, and asked to choose another store or delivery;
- the location shows a warning on Settings → Locations that names what is missing.
Local delivery is not pickup: a local delivery order is taxed at the delivery address, like any shipped order.
How a pickup order draws stock
When a shopper completes a pickup order, BestWebby draws each item's stock only from the location they chose to collect from. The order is tagged as a pickup order and assigned to that location.
If the chosen location doesn't hold enough of an item to cover the order, BestWebby falls back to the overall on-hand count rather than blocking the sale — so an order never fails purely because per-location counts are still being distributed.
Stock draw-downs are atomic and oversell-safe: if two orders race for the last unit at a location, one wins and the other is turned away — a location can never be pushed below zero. If a payment never completes (the shopper abandons at the card step, or the payment fails), the reserved stock is returned to the same location it was drawn from, so your counts self-correct.
Step 4: Fulfil a pickup order
A pickup order's page shows a Pickup panel in place of the shipping address. Pull and pack the order, then click Mark ready. That gives the order a six-character collection code and emails the customer that their order is ready to collect, with the code, from your store's own email address and in the language they shopped in. The code is also on the order page in the customer's account on your store. With no email address on record the order still moves to ready and you handle the hand-off in person. An order on hold has to be released before it is handed over.
In the same panel you can assign an order to a specific location to fulfil it from there. When you do, BestWebby re-attributes the order's stock to the store that's actually fulfilling it, so the count that drops is the one at the store handing over the goods. If that store doesn't hold enough on-hand for an item, the assignment is refused rather than pushing its count negative.
Hand over with the collection code
When the customer arrives, ask for their collection code. Either:
- open the order, click Mark collected and type or scan the code into Collection code, then click Hand over; or
- go to Orders → Pickups, type or scan the code into Hand over by code and click Find order. You see whose order it is and what is in it; click Hand over.
A barcode scanner works as a keyboard: scan into the box and it submits. Capitals, spaces and the dash don't matter. The codes never use 0, O, 1 or I, so there is nothing to misread.
A wrong code is refused and the order stays as it is. After five wrong codes for one order, or twenty from one member of staff, within 15 minutes, codes are refused until the 15 minutes have passed. The dashboard never shows the code itself: you check the one the customer shows you.
If the customer has no code (they lost the email, or the order was collected before it was marked ready), click Customer has no code, write how you checked who is collecting it (for example, photo ID against the order name) and click Hand over without code. Your reason is kept in the audit log with your name.
Handing over completes the order and fulfils every line, the same as before: stock was already taken when the order was placed, so nothing changes on hand. The order's Pickup panel shows when the code was sent, which reminders went out and when it was collected, and whether the code was checked.
Every fulfilment action — assigning a location, marking ready, handing over, a refused code — is recorded in your audit log with the who, what, and when.
Reminders and orders nobody collects
If an order is still waiting, the customer is emailed a reminder 2 days after it was marked ready and a last reminder after 6 days, each with the collection code. Each reminder goes once per order. An order on hold gets none.
After 14 days the order moves from Ready to Not collected on Orders → Pickups. Nothing happens to it by itself: BestWebby never cancels or refunds an order nobody collected. For each one you choose:
- Keep waiting gives it another hold period (14 days unless you change it) before it is listed again.
- Cancel and refund… opens the order with the Cancel order dialog, where you can cancel it, put the items back in stock and refund what was paid, exactly as for any other order.
To change the timings, click Reminder settings on Orders → Pickups: turn reminders off, or set the days for the reminder, the last reminder and the hold (each later than the one before, at most 90 days). Changing them needs the same permission as managing locations.
Orders marked ready before collection codes existed have no code: they are not listed on Orders → Pickups and get no reminders. Hand them over from the order page with Customer has no code.
Tips
- Enable pickup only where you mean it. Leave it off for warehouses and any location that can't accept walk-in collection.
- Give every pickup point its full address. Without a country, province or state and postal code a store is not offered for pickup, because its orders cannot be taxed. Shoppers also see the address when choosing where to collect.
- Distribute your counts first. Per-location pickup allocation depends on a product's location counts covering its overall on-hand. Until then it safely falls back to the overall count.
- Watch the default location. For shipping orders across multiple locations, the default is drawn from first — set it to the store you'd rather ship from.
- Keep a scanner at the counter. The code in the email and on the customer's account page can be typed or scanned straight into Hand over by code.
Gotchas
- No pickup-enabled location = no pickup option. If shoppers aren't seeing "pick up in store," check that at least one location is both active and has pickup turned on.
- Inactive locations disappear from checkout. Marking a location inactive immediately removes it as a pickup choice.
- Pickup skips shipping and the address requirement. A pickup order needs contact details and a chosen location — not a full delivery address. That's by design. The tax comes from the store's address, not the shopper's.
- A pickup store disappeared from checkout? Check its address on Settings → Locations: the warning there says which part is missing.
- Mark collected asks for the code. A wrong code is refused. If the customer cannot show one, hand over with a reason instead of guessing.
- A no-show is never refunded automatically. The order waits on Not collected until you keep waiting or cancel it.
- A stale pickup selection is caught server-side. If a location is switched off or set to not support pickup between when the shopper loaded checkout and when they pay, the order is rejected with a clear "please choose another" message.
What's next
- Set per-location counts under Catalog → Inventory → Stock by location
- Move stock between locations under Catalog → Inventory → Transfers
- Review a pickup order's location and status on its order detail page
- Hand over, follow up and decide on no-shows from Orders → Pickups
- See the Getting Started guide if you're still setting up your catalog and payments