The situation
Lumen Logistics brokers truckload freight across the Midwest and Southeast. Eighteen dispatchers handle the quoting desk, and almost every request arrives by email: a shipper forwards a thread, attaches a rate confirmation from last quarter, or pastes a table of routes into the body. Some requests are two lines long. Some are a 40-page PDF with the actual ask on page 31.
The work to turn one of those emails into a quote was the same every time. Read it. Pull out the route, the equipment, the pickup window, and any add-on charges (accessorials). Look up what Lumen had paid carriers on similar routes recently. Apply a margin, type the quote into McLeod, and reply. Each cycle took 15 to 20 minutes of focused attention. The median time from email to quote was four hours, because requests sat in the queue behind phone calls and loads that were already moving.
Four hours matters in brokerage. A shipper who sends a request to five brokers often books with whoever answers first at a fair price. The ops team estimated they were losing a meaningful share of quotable freight to slower replies, and they had been "about to automate" the desk for two years.
What we built
A single n8n workflow that watches a Gmail label, pulls every quotable request into structured fields, checks route history, and files a draft quote for a dispatcher to approve. Nothing goes to a shipper until a person clicks approve.
The extraction step is where the AI model earns its place. Claude reads the email and any attachments and returns origin, destination, pickup and delivery windows, equipment, weight, commodity, and accessorials in a fixed format, with a confidence score per field. Anything below the threshold is marked in the draft so the dispatcher's eye goes straight to it. A missing pickup date is shown as missing, never filled in.
Route history lives in a nightly Postgres copy of McLeod. The workflow pulls the last 180 days of loads within 50 miles of each end of the route, computes a median carrier cost, and applies the margin rules the ops team already used on paper. The result is written to McLeod as a pending quote and to Gmail as a draft reply on the original thread. Dispatchers work from a queue view sorted by time received. Approve sends the reply and moves the quote to active. Edit opens the draft. Reject records a reason, which we review weekly.
The rollout
Week one. A half-day on site watching three dispatchers quote. We exported 300 past request emails with their final quotes. This evaluation set let us test extraction before writing any workflow logic. Field accuracy on that set was 96.5% at launch, and the errors clustered in two places: pickup windows written as "next Tues" and weights hidden inside attachments. Both got their own fixes.
Week two. We ran shadow mode with three dispatchers. The workflow produced drafts while the dispatchers quoted by hand as usual, and we compared the two every afternoon. The rate suggestion sat within 4% of the human quote on 88% of routes. The rest were routes with no recent history, where the draft now says so instead of guessing.
Week three. All 18 dispatchers, live. We tuned the confidence threshold twice, added a rule for multi-stop requests, and recorded the walkthrough. Dana's team stopped retyping emails on the first day.
Results
| Measure | Before | After 60 days |
|---|---|---|
| Median time from email to quote | 4 hrs | 9 min |
| Quotes sent per dispatcher, per day | 22 | 29 (+31%) |
| Hours saved per dispatcher, per week | 0 | 14 |
| Requests needing manual re-entry | 100% | 4% |
| Extraction field accuracy | n/a | 97.2% |
The hours came from two places: the 15 minutes of reading and re-typing per request, and the queue time that disappeared once drafts were waiting before anyone opened the inbox. The extra quotes per day are the same dispatchers with the same hours, answering requests they used to reach too late.
What's next
Lumen kept us on a small retainer. The next two pieces are already scoped: automatic follow-up on quotes with no reply after 24 hours, and the same extraction applied to carrier rate requests coming the other direction. Both reuse the data format, the route lookup, and the approval queue that are already running.