Logistics & freight

Teaching a voice agent to negotiate a truck booking, not just take one

An outbound agent that calls transporters directly, holds a rate band instead of reading a script, and hands off to a human the moment a call needs one — built for a market that runs on phone calls, not portals.

Time to a confirmed booking
the better part of an hour → single-digit minutes
Loads placed without a dispatcher call
zero → a clear majority
Double-booked slots
occasional → zero, by design
Sector
Logistics & freight brokerage
Volume
~1,800 negotiation calls/week, 4 states
Engagement
Proof of value, then delivery pod
Duration
7 months to production

Stack

  • Twilio Voice
  • Deepgram streaming ASR
  • Regional-language TTS
  • Claude
  • GPT-4 class models
  • Redis
  • FastAPI
  • PostgreSQL
  • Kafka

Practices involved

Discuss a similar problem

The situation

Confirming a load meant a dispatcher working down a list of transporters by phone, negotiating rate and pickup slot one call at a time, in whatever language the transporter answered in. Most of the fleet the brokerage relied on was small owner-operators reachable only by phone — no app, no portal, no interest in one. The fastest dispatchers were fast because they had the list memorised, and the business could not hire its way to more of them.

The constraint

This was not a transcription problem, it was a transactional one. The agent would be authorising real cargo capacity on a real call, in Hindi and regional languages with heavy code-switching and highway background noise, and it had to sound like it was actually negotiating — making a concession, holding a line — rather than reading a script with variables filled in. At the same time it could never agree a rate outside the band the business had approved, and because a load can only go to one truck, calling several transporters at once for the same slot meant something had to resolve the race the instant anyone said yes.

What we built

A negotiation policy, not a script

The rate band, the concession steps and the acceptable slot windows are configuration, not prompt text. The model generates the actual words — it can vary tone, respond to a counter-offer, ask a clarifying question — but every offer it is allowed to make is checked against the policy before it leaves the model, so the business risk sits in a rule the ops team can read, not in phrasing.

Voice built for the actual callers

Streaming transcription tuned for phone audio and highway noise, language identification per turn, and barge-in handling, because a real negotiation involves people talking over each other and a system that cannot be interrupted reads as a script within one sentence.

Concurrent calling with one source of truth for capacity

For a time-sensitive load, several transporters are called in parallel. The instant one accepts, the load is locked atomically against the dispatch system, and every other in-progress call is closed out with a short, honest message rather than left hanging or, worse, allowed to also say yes.

A human handoff that is a first-class path

Any call that moves outside the approved band, turns into a complaint, or asks for something the agent is not authorised to promise transfers live to a dispatcher, with the transcript and the negotiation state already on their screen. The transporter does not repeat themselves, and the handoff rate is a monitored number, not an afterthought.

Every call graded like the extraction pipeline it is

A graded set of real negotiation calls, built with the dispatch team, scores outcome against a human-dispatcher baseline. Recorded calls near the decision boundary go into a review queue, and corrections feed back into the graded set — the same discipline as the evaluation harness we build for any production LLM feature.

What changed

Time to a confirmed booking fell from the better part of an hour to single-digit minutes, and a clear majority of loads now place without a dispatcher touching the phone at all. Dispatchers moved from routine outbound calling to the calls the agent hands them — which are, by construction, the ones that need a person.

What we would do differently

We initially fanned out to every transporter within radius simultaneously, to minimise time-to-fill. Transporters who got called and then heard the load was already placed twice in a week started declining to pick up at all. We added a tiered calling policy — best-fit transporters first, wider fan-out only if the top tier does not confirm within a window — in month three. It should have been the starting design, not a patch; the relationship with the transporter network is as much the product as the booking speed is.

Outcomes

Time to a confirmed booking
the better part of an hour → single-digit minutes
Loads placed without a dispatcher call
zero → a clear majority
Double-booked slots
occasional → zero, by design

Client identity withheld under a mutual NDA. Figures are illustrative — rounded and directional, meant to show the shape of the change rather than an audited result. We will walk through the real numbers, and how they were measured, under NDA on a call.

Next step

Tell us what you're trying to ship.

Send the brief, the RFP, or three messy sentences about the problem. You get a written point of view from an architect within two working days — not a sales deck.