One platform replaced a decade of spreadsheets

A national logistics operator ran dispatch on spreadsheets, phone calls, and a system no one fully understood. We built a custom dispatch-and-tracking platform with real-time assignment, a driver app, live status, and automated customer notifications. It integrates with their accounting, on architecture documented for their own team to extend.

44%
Faster dispatch
2.1×
Volume per coordinator
1
Unified system

What they came with

Dispatch ran across a dozen spreadsheets and a WhatsApp group. Which driver had which load was accurate only for as long as someone kept typing it in, so answering a customer asking where their delivery was meant scrolling back through a chat thread. At month end the numbers were rebuilt from exports by hand, and a single correction had to be applied in several places at once.

What the engagement covered

  • Real-time dispatch with a live operational view
  • Driver mobile app and automated customer updates
  • Clean, documented architecture owned by their team

Technical detail

One row per load, locked

Loads, drivers and status sit in one relational model rather than per-user sheets. Assigning a driver is a transaction that locks the load row, so two dispatchers cannot hand the same load to different people.

Status changes are appended

Each transition is written as an event with actor and timestamp instead of overwriting a field. Notifications and the finance reports read the same log, so a correction is visible as a correction rather than quietly replacing history.

Notifications through a Redis queue

Customer messages are sent by background workers with retries and an idempotency key per event, so a redelivered job does not message the same customer twice. If the provider is unavailable the job waits rather than failing the dispatch action behind it.

Live board without polling

Board updates fan out over websockets from Redis pub/sub as events land. The driver app writes to the same API the board reads, so the phone and the screen never hold different versions of a load.

The stack

Frontend

Next.jsReactTypeScriptTailwind CSS

Backend

NestJSNode.jsBullMQ

Data

PostgreSQLRedis

Infrastructure

DockerNginx
Practice
Custom Platform
Sector
Logistics
Shape
Client engagement
Stack
Next.js, Node.js, PostgreSQL