Shopify order routing vs inventory transfers
Order routing decides which location ships an order; transfers decide where stock sits. A decision guide for split shipments, far-warehouse fulfillment, and starving stores — and how routing rules quietly rewrite the per-location velocity that transfer recommendations are built on.
Jeshua Leger
Founder, Leger Studio ·
A West Coast customer orders two items and both ship from the East hub, five days out, while the West 3PL is a two-day ground zone. Someone on the team says “fix the routing rules.” Someone else says “move stock west.” Both are levers, both live in Shopify, and picking the wrong one is expensive in opposite ways: a routing change that points orders at a location without stock produces splits and oversells; a transfer that solves a problem routing would have fixed for free puts boxes on a truck for nothing.
This post does one job: give you the decision rules for when a fulfillment problem is a routing problem, when it is a placement problem, and when it is both — plus the part nobody writes down, which is that routing rules decide what “sales at a location” even means for online orders, so every velocity-based transfer recommendation inherits your routing choices. It is not about which locations may feed which (location roles) or how big a move should be (multi-location transfers). It is the step before those: deciding whether a move is the right tool at all.
Two levers that answer different questions
Order routing answers: given where stock is right now, which location should fulfill this order? It lives under Settings → Shipping and delivery → Order routing, needs two or more active locations, and works as a filter chain — each rule is applied to the locations that survived the previous one. Shopify’s default sequence is Minimize split fulfillments, then Stay within the destination market, then Ship from closest location. You can add Use ranked locations (location groups, warehouses above stores) and Use location metafields (a boolean like has_capacity or a numeric rank), and per location you decide whether it fulfills online orders at all. Shipping profiles can pin specific products to specific locations.
Inventory transfers answer a different question: given where demand will be next week, where should units sit? That is cover math, safety floors, and a native Shopify transfer that physically moves boxes.
The asymmetry that causes trouble: routing is instant, reversible, free, and moves nothing. That makes it the lever people reach for first, and the lever that most often hides a placement problem instead of solving it. Routing can only spend stock that already exists at a location. It cannot create it.
For online orders, location velocity is a routing artifact
A POS sale at a store is demand at that store — the customer stood there. An online order is different. The customer chose a product and a shipping address; Shopify’s routing rules chose the fulfillment location, committed inventory there, and every per-location sales report from that point counts the sale against that location. Change the rule order and the same customers, buying the same products, become a different location’s velocity overnight.
That has three consequences for anyone sizing transfers from per-location sales:
- A routing change is a velocity discontinuity. Move Ship from closest location above a ranked rule and the West 3PL’s 30-day baseline is wrong — too low — for the next 30 days, while the East hub’s is too high. It is the same shape as a promo spike (velocity windows) and needs the same treatment: mark the date, and do not let the blended window size a move.
- Routing masks starvation. With a closest-location rule and a fallback, a West 3PL that is out of a SKU never records the West Coast sale — the East hub does. A recommender reading per-location velocity sees West cold and East hot, and either proposes nothing or proposes moving units east. The stockout is invisible because the order still shipped.
- Store-fulfilled online orders blur two demands. The moment a retail location is allowed to fulfill online orders, its velocity is walk-in demand plus whatever routing sends it. Its replenishment cadence, staffing, and reserve buffers were designed for the first number only.
The fix is not to stop using per-location velocity — it is still the right number for POS locations and for locations whose routing has been stable. The fix is to know which of your locations’ numbers are demand and which are routing outcomes, and to keep a second signal for the latter: online orders grouped by ship-to region, regardless of which location fulfilled them. When fulfillment-location velocity and ship-to-region demand disagree by more than about 30% for a SKU, the location’s velocity is telling you about your rules, not your customers.
Split shipments are a placement signal, not a routing bug
Shopify splits an order only when no single eligible location has every line in stock. Minimize split fulfillments picks the fewest packages it can; it cannot force one package when the units are not co-located, and no rule order changes that. So a rising split rate is not a routing setting to tweak. It is a list of product pairs that customers buy together and you stock apart.
Read it that way. Export the last 30 days of orders with more than one fulfillment, take the line-item pairs that were fulfilled from different locations, and rank pairs by how often they split. The top of that list is a transfer list: move the lower-velocity partner to the location that already holds the higher-velocity one. A ranked-locations rule that forces the pair to one building does not fix the split — if that building lacks one item, the order splits anyway or oversells.
Kits are the sharpest version of this. A pack sold as one product expands into its real component lines at checkout, and if the components live at different locations, the customer bought one thing and receives two boxes. If you run packs with Better Bundles, scope pack availability to the locations that actually pick kits (inventory locations in the docs) so a pack never advertises stock that cannot ship together. That makes availability honest; it also shrinks it to the shortest branch at those locations (kit inventory sync). The permanent fix is still placement: transfer the constraining component to the kit location.
Decision rules: routing, transfer, or both
- Stock is in the right places, orders ship from the wrong one → routing. Symptom: the near location has cover for the SKU and still does not get the order. Usual causes: a ranked-locations rule set during a 3PL onboarding and never revisited, Ship from closest location placed above the market rule, or the near location not enabled for online orders. Fix the sequence; keep closest location last as the tie-breaker Shopify intends it to be.
- Routing already prefers the right location and it still ships from elsewhere → transfer or PO. The preferred location does not have the units; Shopify moved on to the next survivor. Size the move from ship-to-region demand, not from the starving location’s own velocity (PO vs transfer timing decides which inbound wins).
- A location is overstocked and can pick online orders acceptably → routing as a drain valve. Rank it up for the affected SKUs’ market for a fixed period and let customers empty it. No freight, no receiving, no count risk. Write the revert date down when you make the change.
- A location is overstocked and cannot pick online orders well (a retail door, a returns cage, a showroom) → transfer. Ranking a store to the top of ecommerce routing to clear surplus turns floor staff into pickers and mixes demands you will never separate again.
- A retail store is starving while online ships fine from the hub → not a routing problem at all. POS orders fulfill where they ring; routing rules do not move stock to the store. Transfer, via whichever path your location roles allow.
- Two locations both have it and delivery cost is the complaint → routing, but check the market rule first. Stay within the destination market above closest location prevents a Canadian location from “winning” a US order on straight-line distance.
Sequence: stock first, then routing
When the answer is “both,” order matters. Pointing routing at a location before its stock lands produces exactly the splits and oversells you were trying to avoid, for the entire transit window. The sequence that works:
- Snapshot per-location velocity for the affected SKUs and note today’s date in the same log you use for promos.
- Create and ship the transfer. Receive it in the admin the day it lands, partials as partials.
- Confirm available at the destination reflects the receipt — not on hand, available.
- Change the routing rule. Place a small order to the target region and check which location it was assigned to.
- Hold automated transfer approvals for the two locations involved for one full baseline window (30 days if that is your quantity baseline), or review them manually against ship-to-region demand.
Draining surplus runs the other way: routing first, transfer never. If you catch yourself scheduling a transfer back to the hub for units a routing rank would have sold from where they sit, stop. The one exception is when the surplus location’s delivery cost or promise to that market is unacceptable — then the freight is cheaper than the customer experience.
Worked scenario: two warehouses, six stores
An East hub, a West 3PL, six POS-only stores. Complaint: West Coast customers get East shipments. Pull available at the West 3PL for the 50 SKUs that appear most in West-market orders.
- Case A — West has 44 of 50 in stock. Open Order routing: a Use ranked locations rule puts East first, added when the 3PL was onboarded so nothing shipped from it until the team trusted it. Nobody removed it. Delete the rank or put the 3PL in the same group as the hub, keep the market rule, keep closest location last. No transfer. Velocity at West will jump; that is not demand growth, do not replenish against it for 30 days.
- Case B — West is out on 30 of 50. Routing is fine; the 3PL lost on the first rule because it could not fill the order. Sizing the transfer from West’s own 30-day velocity undersizes it, because West has been out — its velocity is near zero for the very SKUs you need. Size from East’s West-market orders (ship-to state) over the same window, subtract West’s available and incoming, and move that. Then run the five steps above.
- Case C — West has the SKUs, orders still split. The pairs are co-purchased and half of each pair sits only in the East. Transfer the missing halves west; do not rank East above West to “fix” splits, because the East fill would then fail the closest rule for every single-item West order.
A 20-minute routing audit before peak
- Open Settings → Shipping and delivery → Order routing and write the rule sequence on one line. If closest location is not last, or a ranked group exists that nobody can explain, fix it now — before peak velocity makes the artifact expensive.
- For every location, confirm whether it fulfills online orders matches its role. A store that was enabled for one holiday season and never disabled is a hidden picker.
- From the last 30 days of orders: percentage with more than one fulfillment, the top ten split pairs, and the share of orders fulfilled from a location other than the nearest one that stocked every line.
- For the top 20 SKUs, compare fulfillment-location velocity with ship-to-region demand. Flag any location where they diverge by more than 30%; its velocity is a routing artifact until the divergence is explained.
- List every routing change planned in the next 60 days. Each one gets a stock move scheduled ahead of it, or an explicit decision that no move is needed.
Fix placement, then let routing be boring
Well-run routing rarely changes. It is the default sequence, a market rule, and maybe one ranked group that reflects a real contract — the rest is stock sitting where it sells, moved on a cadence that reads demand by destination rather than by whichever building happened to win the order. Run the audit, log routing changes like promos, and treat every split as a transfer waiting to be sized.