Logistics (under NDA)
Dynamic routing system and driver app that cut kilometers driven and improved on-time without adding fleet.
Problem
The operator served 4,000+ daily stops across five cities with routes planned in spreadsheets and WhatsApp. Dispatchers spent 3 hours every morning building routes; drivers improvised with Waze on the ground. On-time rate fluctuated between 76% and 82%.
Solution
We designed a routing engine with real constraints (time windows, vehicle capacity, restricted zones) on top of a mixed solver (OR-Tools + custom heuristics) and connected it to a real-time mobile driver app. Dispatch stopped manually building routes; the system prioritizes SLA and cost by load type.
Stack
- TypeScript
- Python
- Postgres + PostGIS
- AWS
- Flutter
"The best part isn't the direct savings, it's that we no longer depend on the best dispatcher to have a good day."
Context
The operation had ~120 drivers and was growing by adding enterprise customers that demanded explicit SLAs. Manual dispatch was the bottleneck and cost was rising: every additional driver added quadratic complexity to planning.
Technical decisions
We implemented the solver in Python with OR-Tools, wrapped in a Node (TypeScript) service that orchestrates planning + replanning when deviations occur. PostGIS for geospatial operations. The driver app is Flutter, offline-first, with an event queue that syncs via MQTT when network returns.
We sized the solver to resolve routes of up to 500 stops in under 3 minutes on a normal CPU; for denser zones we use prior clustering and parallel solving.
Lessons learned
The pure solver doesn’t earn dispatcher trust until they can validate and override it. The first iteration, 100% automatic, generated resistance. The second iteration lets the dispatcher move stops between routes and the system re-optimizes; adoption took off.