Multi-location warehouses (BF+)
If you ship orders from more than one warehouse — your own warehouse plus a 3PL, two retail locations plus a fulfillment center, an Amazon FBA setup, anything multi-location — you have a problem most inventory apps quietly ignore:
Shopify can split a single order across multiple fulfillment orders — and those fulfillment orders can be assigned to different locations (even the same line item's quantity can be divided between warehouses). If your inventory app only tracks "total stock across all locations," it can't tell which warehouse's pool to decrement for each fulfillment order. The result: BulkFlow could subtract 250 widgets from your Texas pool while Shopify actually assigned that fulfillment order to Florida. Now Texas's pool says "low stock!" when Texas is fine, and Florida silently runs out.
Multi-Location (BF+) fixes this by keeping a separate bulk pool per Shopify location and following Shopify's actual order-routing decisions automatically.
How it works
When an order is paid:
orders/paidwebhook fires → BulkFlow receives line items- BulkFlow also queries Shopify's
fulfillmentOrdersAPI to find out which location(s) Shopify assigned the order's lines to — one order can produce several fulfillment orders at different locations - Deductions happen against THOSE locations' bulk pools
- If Shopify later changes the routing (e.g., warehouse A is out, reroute to warehouse B), BulkFlow's
fulfillments/createwebhook catches that and corrects the pool
What's supported and what isn't: Supported — per-location deduction follows Shopify's actual fulfillment-order assignments, including a single line item whose quantity Shopify splits across two of your warehouses (each fulfillment order adjusts its own location's pool), reroutes before fulfillment, and location corrections when the actual fulfillment happens somewhere other than originally routed. Known limit — quantities Shopify routes to a location BulkFlow doesn't manage (a fulfillment service or another app's location): BulkFlow never debits a warehouse pool it doesn't manage. The order's total still comes out of your overall stock, and the unmatched location shows up as a reported line on the order record — review those rather than assuming a warehouse shipped it.
You don't have to do anything operationally — once it's set up, it follows Shopify automatically.
Setting it up (3 minutes)
After upgrading to BF+, you'll see a banner on your Dashboard prompting setup. It takes you to the Locations page (left sidebar), where you choose which Shopify locations BulkFlow manages.
To spread existing stock across warehouses, use Allocate Across Locations on each item's detail page, or the bulk allocate action on the Items list (strategies: split evenly, split by percentages, or move everything to a single location). New imports read each product's native per-location Shopify stock automatically.
Managing which locations BulkFlow tracks
Not every Shopify location is a real warehouse. Some are:
- "Online" (a virtual location for digital products)
- 3PL pickup-only locations
- Closed/seasonal locations
On the Locations page (left sidebar), toggle each location:
- ✅ Managed — BulkFlow tracks a bulk pool here
- ❌ Ignored — BulkFlow skips this location; orders shipping from here don't affect any pool
The "primary" location is your default warehouse — used when Shopify can't tell us which location an order belongs to.
What changes in the UI
Once multi-location is set up:
- Item Detail page shows a "Per-location breakdown" panel — units by warehouse — plus the Allocate Across Locations card
- Reconcile runs per-location — drift reports broken out by warehouse
- Physical Count workflow asks "which warehouse are you counting?" first
- Movements rows include the location_id so audit trails are warehouse-aware
- Transfers sidebar entry unlocks — record moves between warehouses. BulkFlow adjusts both locations' pools AND pushes the updated availability to Shopify at transfer start and on receipt.
What happens if I downgrade from BF+?
Downgrading consolidates your per-location pools into your primary location — this is a real reallocation, not a view change. The per-location split itself is gone after consolidation: Shopify's counts get updated to match the consolidated state, so the old split cannot be regenerated from Shopify later. If you re-upgrade, you'll re-allocate stock across locations manually (the downgrade dialog warns you about exactly which pools hold stock outside your primary location before you confirm).
Common questions
Q: Do I have to enable multi-location even though I have 5 Shopify locations?
A: No. If you only ship from one in practice, leave the others "Ignored" and BulkFlow stays in single-pool mode.
Q: What if a new Shopify location appears later?
A: The locations/create webhook fires → BulkFlow re-prompts setup so the new warehouse gets tracked.
Q: Can I run a physical count for just one warehouse?
A: Yes — Physical Count's first step asks you to pick which location.
Q: What about transfers between warehouses?
A: BulkFlow's Transfers page records the move, adjusts both locations' bulk pools, and pushes the updated per-location availability to Shopify (at transfer start and again on receipt). You don't need Shopify's own Transfers system for BulkFlow-managed pools.
Q: I have one Shopify location that's actually 3 physical buildings. What now?
A: BulkFlow tracks Shopify locations, not physical buildings. If you want separate pools per building, you'll need 3 Shopify locations.