Fulfillment Centre Bottleneck Analysis

A fulfillment centre tests express prioritisation, machine maintenance windows, and throughput limits using constraint-based scheduling to find what really drives delays.

Setup

A fulfillment centre handles 10 job orders/day across 9 machines (Receiving, Storage, Picking, Packing, Shipping, Express Pick, Palletize, Inspection, Kitting). Six order types follow different routes through the facility:

Order Type Route Theo Duration Deadline
Standard B2C (×3) Rec→Store→Pick→Pack→Ship 16h 24–32h
Express (×2) Rec→ExpPick→Pack→Ship 11h 14–16h
B2B Pallet (×2) Rec→Store→Palletize→Ship 15h 27–31h
Kitting (×1) Rec→Store→2×Pick→Kit→Pack→Ship 21h 31h
Returns (×1) Rec→Inspect→Store→Pick→Pack→Ship 22h 34h
Heavy Pallet (×1) Rec→Store→Pick→Pack→Palletize→Ship 29h 42h

50 operations total, each pinned to a specific machine with fixed durations and precedence constraints. Picking (38h load) and Packing (34h) are the main bottlenecks. Express Pick (6h), Inspection (6h), and Kitting (5h) are lightly loaded.

We build the schedule as a constraint optimization problem using MiniZinc + OR-Tools CP-SAT, minimizing total tardiness. The baseline schedule achieves 55h makespan with 4 of 10 jobs late and 35 hours of tardiness, structural delays that can’t be scheduled away without changing either the policy or the capacity.


Experiment 1: Express Priority & Extra Packing

Does prioritising express orders help, and does adding a second Packing station pay off?

Scenario Makespan Total Tardiness Late Jobs Max Tardiness
Baseline (free schedule) 55h 35h 4/10 24h
Express First (E1 at t=0) 57h 37h 3/10 26h
Extra Packing (capacity=2) 54h 32h 5/10 23h
Express First + Extra Packing 57h 37h 3/10 26h

Forcing express priority reduces the count of late jobs but increases total tardiness, and the benefit of extra Packing capacity disappears when express is forced to the front. Prioritising Express cuts late jobs from 4 to 3, but total tardiness climbs by 2 hours, the cost of bumping standard orders. Adding a second Packing station shaves 3 hours off total tardiness in the unconstrained schedule. However, when both interventions are combined, the extra station’s benefit evaporates: the constraint shifts upstream, and Picking becomes the limiting factor.

The business case for a second Packing station is thin on its own: at $200/hour of tardiness cost, payback stretches to 50 weeks. It only makes sense as insurance, not as a throughput play.

comparison_gantt


Experiment 2: Machine Maintenance Windows

Which machine outage hurts the most?

We block one machine at a time for a 15-hour maintenance window and measure the scheduling impact vs. baseline.

Machine Down Window Makespan Δ Tardiness Δ Late Jobs
Picking t=10..25 +14h (+25%) +55h (+157%) 6/10
Packing t=10..25 +10h (+18%) +69h (+197%) 7/10
Palletize t=15..30 +3h (+5%) +14h (+40%) 5/10
Express Pick t=0..10 0h +17h (+49%) 5/10

Packing downtime has a disproportionately large effect on tardiness, worse than Picking downtime, despite Picking carrying more total load. A likely reason: Packing sits at the end of nearly every order’s route, so when it’s blocked, finished work accumulates with no downstream station to absorb it. The Picking outage is what you’d expect from the busiest machine: +14h makespan, +55h tardiness. The Packing outage tells a different story: only +10h makespan but +69h tardiness, nearly double the tardiness penalty. Packing is the final common step for most orders; when it stalls, there is nowhere downstream to recover.

Express Pick downtime is a sleeper risk: zero makespan impact but +17h tardiness. It only affects two jobs, but those are the Express orders with the tightest deadlines. Palletize downtime is manageable (+3h makespan, +14h tardiness), making it a sensible candidate for scheduled maintenance during operating hours.

comparison_gantt


Experiment 3: Throughput Saturation

How many extra Standard orders can the system absorb before it breaks?

We clone the Standard B2C order type incrementally (each clone adds 16h of work through the core Pick→Pack path) and test feasibility.

Extra Clones Total Jobs Makespan Tardiness Incremental Tardiness
0 10 55h 35h -
1 11 61h 53h +18h
2 12 70h 105h +52h ← 3× jump
3 13 76h 151h +46h
4 14 81h 195h +44h
5 15 86h 244h +49h
6 16 - UNSATISFIABLE -

The system doesn’t degrade gradually, tardiness jumps 3× between the first and second extra order, and the solver finds no feasible schedule beyond 15 total jobs (50% above baseline). Makespan grows linearly (+5–6h per clone), which is predictable. Tardiness does not. The first extra order costs 18h of additional tardiness. The second costs 52h. From there, each additional order piles on ~45–50h of new tardiness. At 15 jobs, cumulative tardiness hits 244h, a 7× increase over baseline. The sixth clone makes the problem unsatisfiable, the combined workload exceeds what the facility can schedule in any configuration.

The practical takeaway: the system absorbs +20% volume with manageable pain, but somewhere between +20% and +30% it crosses a threshold where every additional order cascades delays across the entire job set.

saturation_curve


Business Implications

  1. End-of-line capacity has outsized impact. Packing downtime produces a larger increase in tardiness than upstream bottlenecks, even when upstream stations carry more load.

  2. Hard prioritisation rules can distort performance. Forcing express orders to the front reduces late shipments in that segment but increases overall system delay.

  3. System performance degrades non-linearly with volume. The transition from manageable overload to infeasible schedules occurs over a small range of additional demand.

  4. Maintenance scheduling should focus on bottleneck sensitivity, not utilisation alone. Some lightly-loaded stations (e.g. Express Pick) still have high impact on deadline performance due to their position in the workflow.

  5. Redundancy decisions are driven by tail risk, not average load. The value of a second Packing station is better understood as protection against worst-case disruption than as a throughput upgrade.


Methodology

Experiments used MiniZinc with the CP-SAT solver on a validated job-shop model with real-world operation durations and deadlines. Each scenario was solved to optimality with a 60-second timeout. Raw solver outputs, constraint files, and per-run reports are archived in the experiment subdirectories.