Omnichannel Fulfilment
MILP assignment · Order-to-node matching
Given a set of online orders and a network of fulfilment nodes — distribution centres, ship-from-store locations, dark stores, pickup lockers — decide which node ships each order. Minimise shipping cost + labour cost + SLA-miss penalty, subject to per-node inventory and labour capacity. A canonical assignment MIP that powers every multi-channel retailer (Target, Walmart, Zara, Macy's) running same-day and two-day fulfilment at scale. Foundational papers: Acimović & Graves (2015); Gao & Su (2017); Bell, Gallino & Moreno (2018).
Why it matters
Where omnichannel cost and customer experience intersect
Where the decision sits
Order-by-order · minutes, not seasons
Omnichannel fulfilment is the operational decision a retailer makes when an online order lands: which node ships it? Options include the traditional DC (cheap per-unit but far from customer, slow), ship-from-store (uses store inventory and labour, shorter lead time, higher cost), dark stores (micro-fulfilment nodes, fast for quick commerce), and pickup lockers (customer picks up, zero last-mile). The decision is typically re-run every minutes-to-hours as new orders arrive, so solver speed matters. Upstream decisions (store location, multi-echelon inventory) set the geometry; downstream routing is logistics last-mile.
Problem & formulation
Assignment MILP with inventory and labour capacity
Sets and parameters
| Symbol | Meaning | Unit |
|---|---|---|
| \(i \in \mathcal{O}\) | Pending online order | finite |
| \(m \in \mathcal{M}\) | Fulfilment node (DC / store / dark store / locker) | finite |
| \(I_m\) | Inventory at node \(m\) (for the order’s SKU) | units |
| \(L_m\) | Labour capacity at node \(m\) (orders per cycle) | orders |
| \(c_{im}\) | Shipping cost from \(m\) to order \(i\)’s zone | $ / order |
| \(\ell_m\) | Per-order labour cost at \(m\) (pick, pack, hand-off) | $ / order |
| \(\tau_{im}\) | Promised delivery time from \(m\) to order \(i\) | hours |
| \(\tau^{\text{SLA}}_i\) | Order \(i\)’s promised SLA window | hours |
| \(\pi\) | Per-order penalty for missing SLA | $ / miss |
Decision variable
| Symbol | Meaning | Domain |
|---|---|---|
| \(x_{im}\) | 1 if order \(i\) is fulfilled by node \(m\) | binary |
Objective
Shipping + labour + SLA-miss penalty, summed over all order-node assignments. \(\mathbb{1}\{\cdot\}\) is the indicator; practitioners often pre-compute a composite cost matrix \(C_{im} = c_{im} + \ell_m + \pi \mathbb{1}\{\tau_{im} > \tau^{\text{SLA}}_i\}\) to simplify the MIP.
Constraints
The LP relaxation of this MIP has integer-valued extreme points (it is a transportation problem with all-integer RHS), so \(x_{im} \in [0, 1]\) gives the same optimum. In practice, the Hungarian algorithm solves it in \(\mathcal{O}(n^3)\); fast network-simplex solvers scale to tens of thousands of orders per cycle.
Myopic vs dynamic fulfilment
The formulation above is myopic — it optimises the current batch of orders. Acimović & Graves (2015) showed that myopic assignment can leave later-day orders stranded with no nearby inventory. They introduced a dynamic reformulation that uses a Lagrangian relaxation to price future-demand probability into the current assignment, achieving 1–5% additional savings. This is the frontier between myopic-assignment and assortment-aware / demand-forecasting fulfilment.
Interactive solver
12 orders × 4 nodes · greedy + 1-opt local search
Under the hood
The scenario generator places 4 fulfilment nodes (1 DC, 2 stores, 1 dark store) on a 100×100 grid and \(n\) random order destinations. Shipping cost is \(c_{im} = \alpha \cdot d_{im} + \beta_m\) (distance plus node-specific handling); labour cost differs by node (DC cheapest, dark store most expensive). Delivery time is \(\tau_{im} = \delta_m + \gamma d_{im}\) where \(\delta_m\) is node prep time. SLA is a per-order threshold (random 4–24 hours). The composite cost matrix is built, then a greedy assignment (each order picks its cheapest feasible node respecting inventory/labour), followed by 1-opt swaps (swap two orders’ assignments if it reduces total cost). Nearest-DC baseline assigns every order to whichever DC-type node is closest.
Reading the solution
Three patterns to watch for
- DC carries the long tail. The DC is cheapest per unit but slowest. Orders with long SLA windows (standard shipping) go to the DC even if a closer store has stock — the labour-cost differential wins.
- Stores catch the SLA-tight orders. Same-day and next-day orders are preferentially assigned to the nearest store even at higher labour cost, because the penalty \(\pi\) dominates.
- Dark store is the fastest but first to saturate. With low inventory, the dark store rations itself to the urgent / high-value orders. When it stocks out, the solver gracefully degrades to stores.
Sensitivity questions
- What if SLA penalty doubles? — more orders shift from DC to stores; labour cost goes up, total cost goes up but SLA misses drop.
- What if a store stocks out? — order reassigns to DC or dark store; SLA misses rise for its zone.
- What if we add a 5th fulfilment node (locker)? — the assignment re-optimises; cheap orders concentrate at the locker.
Model extensions
Dynamic fulfilment (look-ahead)
Acimović & Graves 2015 introduce future-demand shadow prices via Lagrangian relaxation — 1-5% extra savings over myopic.
BOPIS specialisation
Restrict fulfilment to stores where the customer will collect. Decision collapses to nearest-in-stock store.
BOPIS →Ship-from-store specialisation
Decision when stores are enabled as fulfilment nodes but with inventory depletion trade-off.
Ship-from-store →Multi-SKU multi-order
Orders with multiple SKUs; ship from one or split across nodes. Classic quadratic cost trade-off of split-shipment.
Returns-aware fulfilment
Some SKUs / zones have high return rates. Route returns-heavy orders away from high-return zones to save reverse logistics.
Returns management →Batching + routing
Outside the solver's scope: once assignments are made, bundle orders into delivery routes — link to logistics.
Delivery routing →Chance-constrained SLA
SLA as a probabilistic constraint: \(P(\tau_{im} \leq \tau^{\text{SLA}}) \geq 1 - \alpha\) rather than deterministic. Handles delivery-time uncertainty.
Network design feedback
Results here inform where to place future dark stores — frontier between operational fulfilment and strategic siting.
Store location →Key references
Back to the retail domain
Omnichannel fulfilment sits in the Place × Operational cell — minutes-to-hours decisions that determine retail e-commerce economics.
Open Retail Landing