Real-time tracking for a logistics fleet
Drivers and dispatchers were working from data that was half a minute old. An event-driven backend and an offline-first mobile app made every update arrive in about a second.
Vehicle positions were polled every 30 seconds, dispatch screens froze under load, and the driver app stopped working in areas with poor signal. Bursts of demand regularly overwhelmed the backend.
- 0130-second-old positions on every dispatch screen
- 02App unusable without a strong connection
- 03One slow service could stall the whole platform
How we got there
Stream, don't poll
Replaced polling with an event stream so positions and status changes flow to dispatchers as they happen.
Isolate failure
Split ingest, routing, notifications and billing into independent services so one slow part never blocks the rest.
Offline-first app
Built the driver app to work from local data first and sync in the background, so it feels instant on poor networks.
Observe everything
Added tracing, metrics and alerts from day one, so problems were found before drivers noticed them.
The shape of the change
A simplified before and after. The point is not the boxes, it is that each part can now change, scale and fail on its own.
- Dispatchers see movement as it happens
- The app works in tunnels, depots and dead zones
- Demand bursts are absorbed by autoscaling, not outages
- Fewer 'where is my delivery?' calls reach support
- 01Design the unhappy path first: offline, retries, duplicates.
- 02Events need owners and schemas, or they become a second monolith.
- 03Show users when data is stale rather than hiding it.
“Traffic spikes used to wake us up. Now we watch them on a graph and keep drinking our coffee.”