A national logistics operator
Live stock reconciliation across 200+ depots, replacing a nightly batch that told operators where inventory was fourteen hours ago.
- Engagement
- 18 weeks
- Year
- 2024
- Disciplines
- Web Dev · Backend
- Stock position latency
- 14 hours → Live
The problem
The client's depot managers worked from a report generated at 2am. By mid-afternoon it described a warehouse that no longer existed, so every urgent stock query became a phone call to another depot. The batch job itself had grown to five hours and was starting to overrun into business hours, which was the trigger for the project.
What we did
- 01
Stream the deltas, not the state
Rather than recomputing global stock, each depot's scanner events are published as a stream and the dashboard maintains a running position per SKU. The nightly batch survives as a reconciliation check that flags divergence, which is the job it should always have had.
- 02
Design for the warehouse floor
The primary users are on a tablet, standing, often in gloves and poor light. Minimum tap target is 56px, the palette is high-contrast, and the three most common actions are reachable without scrolling on the smallest supported device.
- 03
Degrade honestly
A depot with a dropped connection shows its last known position and the time it was accurate, rather than a stale number presented as live. Operators trust the screen because it tells them when not to.
What changed
Inter-depot stock calls dropped by roughly three quarters in the first month. The overrunning batch job was retired as a source of truth and now runs as a nightly audit that has not found a material discrepancy since week six.
- Stock position latency
- 14 hours< 3s
- Depots live
- 214
- Inter-depot stock calls
- -74%
- Nightly batch runtime
- 5 hours11 min (audit only)
Built with
- Next.js
- TypeScript
- Kafka
- PostgreSQL
- Redis
- Google Cloud
“The detail that won the floor over was the timestamp. When a depot goes offline the screen says so, and the managers stopped second-guessing it after about a week.”