Logistics Dispatch System
A regional 3PL with 400+ daily shipments ran dispatch through a spreadsheet, a call rota, and the judgement of three senior planners. We replaced the judgement with an engineered decision layer.
A 40-person creative agency in London was losing 1.5 FTE of project-management time to coordination that wasn't coordination. We rebuilt the intake-to-invoice spine.
System view — not vague business talk.
Every new engagement touched six systems and four humans before a single billable hour was tracked. Project managers were not managing projects — they were running a translation layer between tools.
Each new project required a PM to resolve scope, team, timeline, and budget by ad-hoc Slack messages to partners. No two intakes produced the same record.
Who staffed what was decided by the partners based on who seemed 'available that week'. Capacity data existed in Harvest but was never queried against upcoming work.
Harvest entries were reviewed by PMs, re-entered into a spreadsheet, and uploaded to Xero. 8% of billable time leaked between steps, per the partner audit.
Nobody could answer 'which engagements are at risk this week' without asking every PM. The agency ran on collective memory refreshed every Monday morning.
Partners filled every coordination gap, which masked the gap. Shrinking margin was the only signal that something was wrong.
Workflow as it existed, with failure points marked.
Six tools, three PMs, two partners as overflow. A project's state was reconstructed weekly from Slack messages, Harvest reports, and everyone's standups.
no canonical intake · partner-dependent
manualtemplate drift · no schema
manualby memory · no capacity query
bottleneckmanual task rebuild from Notion · drift
manualinconsistent project codes
manualPDF export + Excel · 4h / wk
bottleneckre-entered from spreadsheet · timing leaks
brokenTrigger · Decision · Execution · Data · Observability.
One intake, one engagement record, one allocation query, one automated path from logged time to draft invoice. Partner approval retained as a gate, not a glue.
Canonical intake regardless of channel
Single structured form (external + internal) emitting an `engagement.requested` event
Inbound briefs normalised into the same event schema, with a partner-owned review step
Scope, staffing, budget as encoded policy
Rule set that maps brief type → standard scope templates, budgets, and timelines
Live view of team capacity over the next four weeks, queryable by skill and seniority
Human approval step with full context assembled — scope, team, budget, capacity — not a blank Slack message
Engagement spin-up and ongoing sync
Creates the Asana project, Notion workspace, Slack channel, Harvest project, and Drive folder from a single event
Daily sync from Harvest → engagement record → Xero draft invoice, with reconciliation holds
Automatic flags when time-to-budget, timeline, or scope drift beyond thresholds
Engagement event log + capacity model
Append-only log of every engagement's state transitions, from brief to close-out
Per-person allocation over time, projected against committed work
Portfolio-level visibility for partners + PMs
Every active engagement, state, risk, and projected close — one screen
Realtime margin per engagement, not monthly reconstruction
Auto-generated Monday summary: at-risk engagements, capacity gaps, billing leaks
External form + email parser collapsed into a single engagement event. Every new engagement starts with the same schema.
Projects team capacity four weeks ahead, queryable at intake time. Replaces 'who's free?' Slack questions.
Single event creates Asana project, Notion workspace, Slack channel, Harvest project, Drive folder, and partner notification.
Daily Harvest → engagement → Xero draft invoice. Reconciliation holds for scope changes, and explicit partner sign-off.
Every live engagement, state, margin, and risk — replacing Monday catch-ups with a shared source of truth.
Streaming detectors on budget burn-rate, timeline slip, and scope drift. Alerts routed to PM + partner.
Numbers out of the production system — not testimonials.
Measured across PM + partner time spent on coordination vs. delivery, rolling 8 weeks.
Concurrent active engagements handled per PM before quality signals degraded.
Engagements closed within the agreed timeline, pre- vs. post-deployment quarter.
Primary driver: reclaimed partner time and closing the Harvest → Xero leakage.
The shift was not productivity. The shift was the work becoming a graph that could be queried, instead of a story that had to be re-told every Monday. Once coordination had a system, the partners stopped being the system.
A regional 3PL with 400+ daily shipments ran dispatch through a spreadsheet, a call rota, and the judgement of three senior planners. We replaced the judgement with an engineered decision layer.
A DTC health & beauty brand scaled from 50 to 500 orders a day using humans as the integration layer. We rebuilt the spine so the next 5× happened without adding headcount.
Every case on this site started as an audit. If this study described a system that looks like yours, the fastest next step is a formal operations diagnostic.