Shopify Multiple Warehouses Made Simple: Setup, Routing, and Best Practices
Scaling with Shopify multiple warehouses unlocks faster delivery, lower shipping costs, and resilience. This guide shows how to set up locations, route orders, manage inventory, and automate workflows across multi-origin shipping and 3PLs.
What “multiple warehouses” means in Shopify
Locations vs warehouses vs fulfillment apps
Locations: Physical places that stock or fulfill inventory (warehouses, 3PLs, stores, pop-ups).
Warehouses: A type of location you own or operate.
Fulfillment apps: 3PLs or services installed as apps. They can appear as locations and receive fulfillment orders via the Fulfillment Orders API.
Shopify tracks inventory per location and assigns fulfillment orders to one or more locations based on your routing rules and priorities.
When multi-location makes sense
You ship nationally or internationally and want regional delivery speed.
You use a 3PL in addition to your own DC.
You run DTC plus wholesale with dedicated stock pools.
You operate retail stores and want BOPIS and local delivery.
You need redundancy for peak or disruptions.
Limits, prerequisites, and permissions
Your plan determines location limits and advanced routing options. Check your plan limits before adding locations.
Staff need permissions for Locations, Products, and Orders to manage multi-warehouse settings.
Some features (e.g., advanced routing, APIs, Flow automation steps) may vary by plan or require apps.
Setup blueprint: configuring locations the right way
Create locations and naming conventions
Use a clear, scalable taxonomy for names, codes, and types.
Naming template: Country-Region-City-Function-Partner
Examples:
US-WEST-LA-DC-INHOUSE
US-EAST-NJ-DC-3PL-ShipCo
CA-ON-TOR-STORE-QUEENST
EU-DE-BER-DC-3PL-FastFulfill
Metadata to maintain (in a sheet or metafields):
Short code (e.g., USW1)
Address and geocode
Cutoff times and carrier pickups
Capabilities: ship, pickup, local delivery
Market eligibility and hazmat constraints
Add locations in Settings > Locations. Disable “Fulfill online orders from this location” for stocking-only nodes if needed.
Assign products/variants to locations
In Products, set inventory tracking and enable the locations that stock each variant.
For 3PL-managed SKUs, leave the 3PL location as the source of truth; avoid manual edits that fight the integration.
For channel-specific stock (e.g., wholesale), create dedicated locations or use “available to sell” rules via your WMS.
Fulfillment priority and shipping profiles
Set location priority in Settings > Locations. Shopify assigns fulfillment orders starting with the highest-priority location that has stock.
Build shipping profiles to group products with similar packaging, origins, and rates.
Example profiles: Standard DTC, Heavy/Bulky, Hazmat, Oversize.
Define zones and rates per profile. Multi-origin shipping sums rates when orders split.
Test orders and staging/sandbox tips
Use a hidden product with controlled stock across two locations to simulate splits.
Create test shipping zones with simple flat rates to validate multi-origin totals.
Place test orders with addresses near each location and verify assigned fulfillment orders.
Before going live, duplicate the store or use a development store to rehearse routing and profile logic.
More time, More Sales
Sign Up
Order routing strategies that minimize cost and delay
Nearest-warehouse and zone-based routing
A practical decision tree for proximity-based routing:
If the destination country is not supported by a location, exclude that location.
If multiple eligible locations have all items:
Choose the location in the same region/zone as the destination.
If none, choose the geographically nearest with a pickup before cutoff.
If no single location has all items:
Try the lowest-cost two-location combination that meets promised SLA.
If costs exceed threshold, hold-to-consolidate (see Flow recipe below).
Proximity matching can be approximated with region tags (e.g., LOC_REGION: US-WEST) and rules in Flow or via an OMS/WMS. Built-in priority acts as a fallback.
Cost- and SLA-based routing
Use a tiered approach:
Tier 1: Single-location fulfillment that meets SLA and lowest rate.
Tier 2: If not possible, pick the location with the lowest label cost for the longest-lineitem (biggest cube/weight).
Tier 3: If still not possible, allow split with the minimum number of shipments and cap extra cost.
Inputs to consider:
Carrier zone and negotiated rates per origin.
Cutoff time and pickup schedule per location.
Packaging and dimensional weight.
Rules to avoid split shipments
Prefer locations that can fulfill all line items.
Allow split only when:
An item is backordered at the primary location beyond the SLA, or
Consolidation delay exceeds your promised delivery window.
Flow recipe (conceptual):
Trigger: Order created.
Conditions:
If all items available at a single preferred location, tag ORDER_ROUTED: {location}.
If split required and extra shipping > configured threshold, tag HOLD_CONSOLIDATE and notify ops.
If VIP or expedited, bypass consolidation and route to fastest origin.
Actions:
Add order tags (HOLD_CONSOLIDATE, ROUTE_{LOC}).
Send email/Slack to warehouse team.
Optional: Call middleware to reassign fulfillment orders based on tags.
Inventory management across locations
Safety stock and buffers per location
Two pragmatic methods:
Days-of-cover approach:
Safety stock = Average daily sales × Safety days.
Pick Safety days by variability and lead time (e.g., 5–10 days).
Variability-adjusted approach:
Safety stock = P95 daily sales × Lead time days − Avg daily sales × Lead time days.
Implementation tips:
Store safety days in a product metafield (e.g., mf.safety_days_by_loc = {USW1: 7, USE1: 5}).
In WMS or Flow, prevent allocation that dips into safety stock for non-expedited orders.
Review monthly by SKU/loc, increase buffer for high variance or long lead times.
Transfers and replenishment cadence
Use Transfers to move stock between locations. Schedule weekly or biweekly runs based on sales velocity.
Replenishment rules:
Reorder point per location = (Lead time days + Safety days) × Avg daily sales.
Reorder quantity = Max stock − Current available.
Create a “Staging” location for inbound stock not yet receivable to keep availability realistic.
Backorders and preorders across locations
If allowing backorders (continue selling when out of stock), set expectations by location:
Tag items with ETA per origin and show delivery windows by market.
For preorders, create a separate preorder location to isolate inventory and prevent oversell at active DCs.
Bundles/kitting and component availability
Define bundles as SKUs that consume component inventory at the ship-from location.
Allocation rules:
A bundle is available only if all components exist at the same location in required quantities.
For 3PLs:
Clarify kitting method (pre-kitted vs on-demand).
Sync component availability to Shopify or bundle availability via an app/OMS.
Shipping with multiple origins
How rates are calculated with multi-origin
Shopify creates separate shipments per origin when items come from different locations.
Each shipment calculates rates based on that origin’s profile, zone, and package.
Checkout displays combined rates (sum of shipments) if the order splits.
Tip: Keep profiles simple and aligned across origins to avoid surprising totals.
Consolidation vs split shipments
Consolidate when cost savings outweigh delay and you can meet delivery promises.
Split when:
The order includes oversize + standard items that ship cheaper separately.
The customer chose expedited service and a single origin cannot meet SLA.
Use HOLD_CONSOLIDATE tags and manual or automated reassignment before label creation.
Regional free-shipping thresholds and profiles
Set region-specific thresholds (e.g., $75 US, $100 CA) and align with origin costs.
Avoid cross-region subsidization by assigning origins to the right zones and disabling ineligible locations for distant markets.
Cross-border and regional warehouses
Shopify Markets, duties, and taxes
Use Markets to manage currencies, domains, duties, and tax settings per region.
Assign eligible catalogs and shipping to each Market; route orders to in-region locations to avoid cross-border duties when possible.
Region-specific catalogs and blocking locations
Hide products that cannot legally ship into certain Markets.
Block locations from fulfilling out-of-region orders by:
Removing them from the shipping profile for that Market, or
Using Flow/middleware to reassign fulfillment orders away from blocked origins.
Delivery promises and currency considerations
Show delivery estimates by Market using your in-region warehouse cutoffs.
Price and thresholds in local currency; ensure rate logic uses the same currency per Market.
Automation and integrations
Shopify Flow examples for routing and holds
Auto-route single-origin orders:
If location A can fulfill all items, set tag ROUTE_USW1 and notify A.
VIP and expedited handling:
If tag VIP or shipping method contains “Express,” bypass consolidation and prioritize fastest origin.
Backorder holds:
If any line item is backordered beyond N days, tag HOLD_BACKORDER and send email to CS.
Using tags/metafields for advanced logic
Location attributes metafield (per location):
region: US-WEST
capability: hazmat, oversize, standard
cutoff_time_local: 16:00
Product routing metafields:
hazmat: true/false
oversize: true/false
preferred_location: USW1
Order-level tags:
MARKET_US, SLA_2DAY, HOLD_CONSOLIDATE, ROUTE_{LOC}
WMS/3PL integration patterns and key APIs
Core sync loop:
Inventory in: WMS pushes per location to Shopify.
REST example: POST /inventory_levels/set with location_id, inventory_item_id, available.
GraphQL example: inventoryAdjustQuantities for batch updates.
Orders out: Pull fulfillment orders assigned to the 3PL location.
REST example: GET /fulfillment_orders?assigned_status=open&location_ids[]=LOC_ID.
Claim and fulfill:
Move fulfillment to your location if needed (GraphQL: fulfillmentOrderMove).
Mark as fulfilled and provide tracking (REST: POST /fulfillments with line_items_by_fulfillment_order).
Webhooks to subscribe:
inventory_levels/update, orders/create, fulfillment_orders/assigned, fulfillment_orders/cancellation_request_submitted.
Minimal payload examples (conceptual):
Set inventory: {location_id: 123, inventory_item_id: 456, available: 120}
Create fulfillment: {fulfillment: {line_items_by_fulfillment_order: [{fulfillment_order_id: 789, fulfillment_order_line_items: [{id: 1011, quantity: 2}]}], tracking_info: {number: "1Z...", company: "UPS"}}}
Best practices:
Treat Shopify as the sellable inventory source of truth; WMS as physical truth.
Avoid double-writes; one system owns availability calculations.
Batch updates to reduce API calls; use retries and idempotency keys.
Retail stores, BOPIS, and local delivery
Enable pickup-only locations
For stores, enable “Pickup at this location.” Disable “Fulfill online orders” if you don’t want ship-from-store.
Set pickup instructions and SLAs per store.
Inventory visibility by channel
Use channel allocation to hide low-stock SKUs from online but show in-store.
For BOPIS, ensure real-time stock sync per store and define cutoff times to prevent missed same-day pickups.
Omnichannel returns and restocking
Define return routing:
DTC returns to nearest DC or original ship-from.
In-store returns accepted and restocked to store location with optional transfer.
Flow rule:
If returned in-store but originally fulfilled by DC, create Transfer from store to DC once volume > threshold.
Reporting and KPIs by location
Inventory aging and turnover
KPIs:
Inventory turnover (by location, SKU): COGS / Average Inventory.
Aging buckets: 0–30, 31–60, 61–90, 90+ days on hand.
Actions:
Discount or transfer slow movers; reduce reorders for long-aging stock.
Fulfillment SLA and on-time delivery
Define SLA:
Time to fulfill (order to handoff).
Time to deliver (order to first delivery attempt).
Track by location and carrier. Investigate misses by cutoff breaches or carrier delays.
Split-ship rate and cost per order
Split-ship rate = Orders with >1 shipment / Total shipped orders.
Cost per order (CPO) by location includes pick/pack, label, packaging, and accessorials.
Goals:
Keep split-ship rate below your profitability threshold.
Reduce CPO by routing to optimal origin and packaging effectively.
Migration and troubleshooting
Move from single to multi-warehouse safely
Migration checklist:
Audit SKUs: ensure inventory_item_id consistency across apps and WMS.
Define location taxonomy, codes, and shipping profiles.
Create locations; disable online fulfillment for those not ready.
Map products to locations and seed starting inventory.
Set priorities and routing rules; pilot with a subset of orders.
Train ops on reassignment and exception handling.
Monitor KPIs and error logs for 2–4 weeks before full rollout.
Common errors and diagnostics
Orders assigned to the wrong location:
Check location priority, profile eligibility, and stock at order time.
Overselling:
Ensure one system owns availability writes; add safety stock buffers.
Unexpected split shipments:
Review profile assignments and market-based location eligibility.
3PL sync delays:
Verify webhook subscriptions, rate limits, and retry logic.
Ongoing maintenance checklist
Weekly: Review backorders, split-ship rate, and SLA misses.
Biweekly: Replenishment transfers and safety stock adjustments.
Monthly: Carrier rate audits and profile threshold tuning.
Quarterly: Market eligibility review, store hours/cutoffs, and 3PL scorecards.
Here at Verve AI with have a massive range of tools and tips to help your E-Commerce store, check our blog for full details.
FAQs
Can Shopify support multiple warehouses or fulfillment locations?
Yes. Shopify uses “locations” to represent warehouses, 3PLs, and stores. Inventory and fulfillment are tracked per location, and orders can be routed based on priority and rules.
How do I route orders to the nearest warehouse without splitting shipments?
Use a decision rule that prefers single-origin fulfillment and in-region locations. Set location priorities, then use tags/metafields and Flow (or an OMS) to route to the nearest eligible location that can fulfill all items. Allow splits only when needed to meet SLA.
How do shipping rates work with multiple origins in Shopify?
If an order ships from more than one origin, Shopify calculates rates for each shipment based on the origin’s profile and zone, then sums them at checkout. Keep profiles aligned to avoid unexpected totals.
What’s the best way to prevent overselling across locations?
Let one system (WMS or 3PL) own available inventory updates to Shopify.
Use safety stock buffers per location.
Avoid simultaneous edits from multiple apps.
For bundles, ensure component-level availability is enforced per location.
How many locations can I create and are there limitations per plan?
Shopify supports multiple locations, with limits based on your plan. Check your plan’s current limits and any advanced routing feature availability before scaling.
Can I assign specific variants to specific warehouses only?
Yes. Enable a variant only at the locations that stock it. You can also tailor shipping profiles and Market eligibility to limit where those variants can be fulfilled.
How do I integrate a 3PL/WMS as a location and sync inventory?
Install the 3PL app (or create a private app), add the 3PL as a location, and sync via APIs:
Push per-location inventory (inventory_levels).
Pull and fulfill assigned fulfillment orders.
Send tracking on fulfillment.
Subscribe to relevant webhooks and ensure idempotent updates.
How should returns be routed and restocked across multiple locations?
Define rules by channel and product. Common patterns:
DTC: return to nearest DC or original ship-from.
Store returns: restock to store, then transfer to DC if needed.
Automate tags and notifications with Flow, and reconcile inventory at the correct location.
