Freight Quote AI Calls: Catch Wrong Weights and Lanes

On this page
A shipper says "fifty-five hundred pounds." The agent hears "fifteen hundred." It rates the load, reads back a price, and books it. Nobody notices until the carrier reweighs the pallet. The invoice adjustment lands weeks later. This post is for the product team that built that agent. You quote for many brokers and 3PLs, and every prompt change reaches all of them at once. You need to know how often the quote record is wrong and which fields break. You also need to test a change before it ships. That is what freight quote AI accuracy work is about.
What freight quote AI accuracy means on a shipper call
Freight quote accuracy: the share of quotes where every rated field matches the freight as tendered. The final carrier invoice then lands inside an agreed tolerance of the quote.
That definition matters because a quote call is not a chat. It is the front door to an agentic workflow. The agent captures a record and calls a rating engine. It reads a price, books the load, and writes a bill of lading into the TMS. Each step trusts the step before it. A wrong digit at capture becomes a clean, confident number everywhere downstream.
AI freight quoting is already at volume. C.H. Robinson said in April 2025 it was "at well over 1 million price quotes delivered by AI." It also reported at least a 30% monthly jump in AI-delivered LTL quotes. Freight-tech platforms now sell agents to brokers too. Augment, for example, describes its agent Augie as handling quoting, dispatch and billing across email, phone, TMS and portals.
This post covers the shipper side: inbound calls asking "what will it cost?" The carrier side has its own failure set. There, an agent negotiates rates and lanes with dispatchers. We cover that in testing AI carrier calls for brokers. For the wider map of freight voice use cases, start with the freight voice agent QA pillar.
The quote record: ten fields that decide the price
An LTL quote needs more fields than most voice flows. An FTL quote needs fewer, but equipment and dates carry more weight. Every field below is spoken, so every field can be misheard.
| Field | What the caller says | Typical speech failure | What it breaks later |
|---|---|---|---|
| Origin ZIP | "six oh six oh seven" | Digit dropped or swapped | Wrong lane, wrong terminal, wrong rate |
| Destination ZIP | "four eight one two six" | "eight" heard as "eighty" | Wrong lane or out-of-network point |
| Pickup date | "next Tuesday" | Relative date resolved in wrong time zone | Missed pickup, spot rate expired |
| Weight | "fifty-five hundred" | Heard as "fifteen hundred" | Reweigh, reclass, invoice adjustment |
| Dimensions | "forty-eight by forty by sixty" | Inches stored as feet, or per-pallet stored as total | Wrong density and freight class |
| Pallet count | "three pallets, twelve hundred each" | 1,200 stored as total weight | Underweight quote by 2,400 lb |
| Freight class / NMFC | "class sixty-five, I think" | Caller guess accepted without a density check | Reclass after inspection |
| Hazmat | "it's paint" | Never asked, or "no" assumed | Refused tender, regulatory exposure |
| Accessorials | "it's a house, no dock" | Residential and liftgate not added | Accessorial charges added to invoice |
| Equipment (FTL) | "needs to stay cold" | Reefer not set, temperature not captured | Wrong truck, rejected load |
Two patterns stand out. First, most errors are plausible. A 1,500 lb pallet is a normal pallet. Nothing in the rating engine flags it. Second, the costliest fields are the ones callers do not volunteer. Shippers rarely say "I need a liftgate." They say "it's going to a church."
Why weights and dimensions break silently
Speech recognition does not hand your LLM a doubt. It hands it a string. "Fifteen hundred" and "fifty-five hundred" differ by one syllable. The "-teen" versus "-ty" contrast is weak on a speakerphone in a loud warehouse. Inverse text normalization then turns the words into "1500." The model sees a clean integer with no confidence score attached. It has no reason to ask again.
Dimensions fail in a different way. Callers mix units in one breath: "four foot by forty by sixty." Some give per-pallet numbers, others give totals. Some round the height and forget the pallet itself. Your schema probably wants `length_in`, `width_in` and `height_in`. The LLM fills those slots with whatever numbers it heard, in whatever unit it assumed.
Corrections are the third trap. Shippers revise mid-call: "Actually, make that four pallets." The SpokenWOZ benchmark built 5.7k human-to-human spoken dialogues across 8 domains to study this. It added cross-turn slots and reasoning slots. These are values spread across turns, or implied rather than stated. The strongest dialogue state tracker reached only 25.65% joint goal accuracy. Joint goal accuracy means every slot right at once. A freight quote is exactly that kind of all-or-nothing record.
Entity type matters too. Earnings-21 scored commercial ASR on 39 hours of real earnings calls. Dates were among the easiest entities, at 4.6–9.8% entity WER for most systems tested. Organization names ran 31.4–44.3%. For quote calls, that means consignee and shipper company names will be misheard far more often than the pickup date. Do not key anything important off a spoken company name. We go deeper on this in STT accuracy for names and entities.
Worked math: how one misheard number moves the class
NMFTA's Docket 2025-1 took effect on July 19, 2025. Since then, many commodities rate on a 13-subprovision density scale, up from 11. Freight class density is now the main pricing lever for that freight. The new bottom tiers are class 55 (35 to under 50 pcf) and class 50 (50 pcf or more). The full scale is published by the NMFTA and repeated in carrier guides such as FedEx Freight's. Not every item uses the density scale, so your agent must know which commodities do.
Density is weight over volume. The NMFTA method measures each handling unit at its greatest dimensions in inches, including projections. Multiply length by width by height, divide by 1,728 for cubic feet, then divide weight by cubic feet.
Take the pallet from the opening. It measures 48 × 40 × 60 inches.
- Volume: 48 × 40 × 60 = 115,200 cubic inches. 115,200 ÷ 1,728 = 66.67 cubic feet.
- Heard weight, 1,500 lb: 1,500 ÷ 66.67 = 22.50 pounds per cubic foot. That is class 65 (22.5 to under 30 pcf).
- True weight, 5,500 lb: 5,500 ÷ 66.67 = 82.5 pcf. That is class 50.
So the misheard quote is wrong twice: wrong weight and wrong freight class. Now the cost. The rates below are illustrative assumptions, not from any tariff. Say the lane rates class 65 at $26.00 per hundredweight in the 1,000–1,999 lb break. Say it rates class 50 at $14.58 per hundredweight in the 5,000 lb break. The quote is 15 × $26.00 = $390. The invoice after reweigh is 55 × $14.58 = $801.90. The shipper sees a $412 adjustment on a load they were told cost $390.
Now look at the boundary. At exactly 1,500 lb, density sits on the 22.5 line. If the caller says 60 inches but the carrier measures 61, density falls to 22.13 pcf. That is class 70, not 65. A quote can be "right" on every spoken field and still reclass because a field sits on a tier edge. Your test set needs these edge cases on purpose.

Accessorials and hazmat: the fields callers never volunteer
Weight errors are loud once the invoice arrives. Missed accessorials are quieter. They show up as small line items that erode margin and trust. One US LTL carrier's rules tariff, effective March 16, 2026, shows the scale:
| Accessorial | Charge in that tariff | What the agent must ask |
|---|---|---|
| Liftgate | $80 (51–2,000 lb) up to $274 (over 15,000 lb) | "Is there a loading dock at pickup and delivery?" |
| Residential delivery | $8.50 per cwt, $85 min, $250 max | "Is the delivery address a home or a business?" |
| Inside delivery | $6.25 per cwt, $67 min, $775 max | "Does it need to go past the door?" |
| Notify or appointment | $39 per shipment | "Does the consignee require an appointment?" |
| Hazardous materials | $27 per shipment | "Is any of this regulated hazmat?" |
Charges vary by carrier and contract, so treat these as one example, not market rates. The same tariff lets the carrier inspect any freight tendered. It also applies a minimum class of 150 when the bill of lading lacks a valid description and NMFC class. A vague commodity name captured on the call can therefore cost more than any accessorial.
Hazmat is a safety question, not only a pricing one. Under 49 CFR 172.202, the shipping description lists the UN number, proper shipping name, hazard class and packing group, in that order. Quantity and package count follow. Say the agent hears "it's just paint" and quotes general freight. That record cannot be correct. Many teams route any hazmat "yes" to a human. That is a sound default. This is not legal advice; check the rule and your carrier contracts with counsel.

Quote oracle testing: grade the agent against your rating engine
You already own the perfect judge. It is your rating engine. Quote oracle testing feeds the ground-truth shipment to the engine directly. It then compares the result with what the agent captured and said. This is the core of LTL quote accuracy testing. It splits one vague question ("was the quote right?") into two precise ones.
1. Capture fidelity. Did the agent's tool-call arguments match the shipment the scripted caller described? Compare field by field.
2. Read-back fidelity. Did the price the agent spoke equal the price the engine returned for those arguments? This catches rounding, stale cached quotes and an LLM that "summarizes" $1,188.40 as "about eleven hundred."
The sketch below is simplified. It assumes a `rate_fn` wrapper around your rating API and a scenario file holding the truth.
# Simplified quote oracle check. Density tiers per NMFC 13-sub scale (2025).
DENSITY_TIERS = [(1, 400), (2, 300), (4, 250), (6, 175), (8, 125), (10, 100),
(12, 92.5), (15, 85), (22.5, 70), (30, 65), (35, 60), (50, 55)]
def density_class(weight_lb, l_in, w_in, h_in):
pcf = weight_lb / ((l_in * w_in * h_in) / 1728)
for upper, cls in DENSITY_TIERS:
if pcf < upper:
return round(pcf, 2), cls
return round(pcf, 2), 50
EXACT_FIELDS = ["origin_zip", "dest_zip", "pickup_date", "pallet_count",
"weight_lb", "length_in", "width_in", "height_in",
"hazmat", "equipment"]
def score_call(truth, captured, spoken_price, rate_fn):
fails = [f for f in EXACT_FIELDS if captured.get(f) != truth[f]]
if set(captured.get("accessorials", [])) != set(truth["accessorials"]):
fails.append("accessorials")
if truth.get("density_rated"):
_, cls = density_class(truth["weight_lb"], truth["length_in"],
truth["width_in"], truth["height_in"])
if captured.get("freight_class") != cls:
fails.append("freight_class")
engine_on_captured = rate_fn(captured)
engine_on_truth = rate_fn(truth)
if abs(spoken_price - engine_on_captured) > 0.50:
fails.append("read_back")
if abs(engine_on_captured - engine_on_truth) > 0.01 * engine_on_truth:
fails.append("capture_drift")
return failsA typical failure on the opening scenario prints `['weight_lb', 'freight_class', 'capture_drift']`. That tells an engineer exactly which hop broke. A transcript-only grader would see a polite call with a confirmed price and pass it.
Tolerance bands should match the field. ZIPs, hazmat, pallet count and the accessorial set get zero tolerance. Weight gets zero tolerance against what the caller said. The spoken price gets a tight band against the engine, here 50 cents, for currency rounding. Captured-versus-truth price drift gets 1%. Anything wider hides real errors. This is the same shape we used for moving estimate accuracy, where small capture errors compound into a different bill.

How to test a freight quote voice agent before every change
Use this sequence before any prompt, model, STT or flow change reaches your broker tenants. It turns freight quote AI accuracy into a release gate.
1. Build a ground-truth scenario set. Write each scenario as a shipment record plus a caller script. Cover LTL and FTL, single and multi-pallet, density-rated and fixed-class items. Include at least 30 scenarios that sit within 0.5 pcf of a tier boundary.
2. Seed number traps on purpose. Add teen/ty pairs (15/50, 1,500/5,500), ZIPs with repeated digits, "oh" versus "zero," and per-pallet versus total weights. Add mid-call corrections such as "actually, four pallets."
3. Seed silent accessorial cues. Use phrases like "it's a school," "they have no dock," and "call before you deliver." Score whether the right accessorial code appears, not whether the agent sounded helpful.
4. Run every scenario under several caller profiles. Vary accent, pace, interruptions and background noise such as forklift beeps and dock doors. Evalgent's caller profiles cover these, and its simulator reaches the agent over PSTN, SIP or WebRTC. That matters because the misheard weight lives in phone audio, not in a clean text transcript. See testing STT under background noise for noise setup.
5. Score capture and read-back with the oracle. Grade tool-call arguments against truth, and the spoken price against the engine. Our guide to tool argument accuracy covers argument-level scoring.
6. Size the run for the claim you want to make. Zero failures in n scenarios supports an error rate below about 3/n at 95% confidence (the rule of three). To claim under 1% field error, you need about 300 clean scenarios. Fifty clean runs only supports "under 6%."
7. Gate per tenant. Brokers configure different accessorials, lanes and class rules. Run the suite against each tenant's configuration, then block the release on any regression. Our post on shipping prompt changes safely covers versioning and rollback.
This sequence answers the reader's real question: how do you test an AI voice agent that quotes freight without calling it by hand fifty times? Evalgent generates scenarios from the agent's prompt and flows, which helps find branches nobody scripted, such as a caller who mentions hazmat only after hearing the price.
Monitor quote vs final invoice in production
Pre-launch tests catch known traps. Production shows you the unknown ones. Freight quote AI accuracy is only proven once invoices agree with quotes. The best signal in freight is one most voice teams never join up: the carrier invoice.
Link every call to its quote ID, its bill of lading and its final freight bill. Then track the adjustment rate by reason code.
| Reason code | Likely voice cause | Field to check in the recording |
|---|---|---|
| Reweigh | Misheard weight, per-pallet vs total | Weight utterance and read-back |
| Reclass | Unit error, boundary density, caller-guessed class | Dimensions and commodity |
| Accessorial added | Location or dock question skipped | Delivery location turn |
| Address correction | ZIP or city misheard | Origin and destination turns |
| Refused or held | Hazmat not captured | Commodity description |
Slice the rate by tenant, lane and agent version. A rise in reweighs after a release points straight at the weight-capture turn. Then pull those recordings, not transcripts. The transcript will say "1,500" because the STT said so. Only the audio shows the shipper said "fifty-five hundred."
Invoice data lags by days or weeks, so pair it with faster signals. Watch for read-back turns the caller interrupted, quotes requoted within the same call, and tool-call errors from the rating API. Evalgent's production monitoring ingests pushed recordings, maps them to scenarios, and flags tool-call failures, latency spikes and policy failures with fix recommendations. For why sampling misses these rare, costly errors, see score every call, not a sample. For rating calls that fail without an error, read detecting silent tool failures.
The same habit pays off across the freight stack. Teams running AI check calls and driver support agents can join those calls to load events in the same way.
Frequently asked questions
How accurate are AI freight quotes?
AI freight quote accuracy depends on capture, not pricing math. The rating engine is exact; the risk is a misheard weight, ZIP or missing accessorial fed into it. No public benchmark reports field-level error rates for freight quote agents. Measure your own by replaying scripted calls and joining live quotes to final carrier invoices.
How do you test an AI voice agent that quotes freight?
Testing a freight quote agent means replaying scripted shipper calls with known ground truth over real phone audio. Score each captured field against truth, and the spoken price against your rating engine run on those fields. Include number traps, tier-boundary densities, silent accessorial cues and mid-call corrections. Run it before every prompt, model or STT change.
What causes LTL reweigh and reclass charges?
LTL reweigh and reclass charges happen when the carrier's measured weight, dimensions or commodity differ from the bill of lading. Common voice-agent causes are a misheard weight, dimensions stored in the wrong unit, per-pallet weight saved as total, and a caller's guessed class accepted without a density check.
How is freight class calculated from density?
Freight class from density uses the NMFC scale. Measure the handling unit in inches at its greatest dimensions, multiply, divide by 1,728 for cubic feet, then divide weight by cubic feet. Since July 2025 the scale has 13 tiers, from class 400 under 1 pcf to class 50 at 50 pcf or more.
How should a voice agent confirm freight weight?
A voice agent should confirm freight weight by reading it back digit by digit, such as "five, five, zero, zero pounds," and stating whether it is per pallet or total. It should also re-check density against the class. A sudden class 50 or class 300 result is a cue to ask again.
Can an AI agent quote hazmat freight?
An AI agent can capture hazmat details, but many teams route hazmat to a human. Under 49 CFR 172.202 the shipping description needs the UN number, proper shipping name, hazard class and packing group. The agent must ask the hazmat question every time. Carriers also add hazmat charges, so a miss breaks safety and price.
What tolerance should a freight quote test use?
A freight quote test should use zero tolerance for ZIPs, pallet count, hazmat flag and the accessorial set. Weight must match what the caller said exactly. The spoken price should match the rating engine within currency rounding. Captured-versus-truth price drift above about 1% should fail the scenario.
How do you monitor quote vs invoice variance?
Monitoring quote vs invoice variance means linking each call to its quote ID, bill of lading and final freight bill. Track adjustments by reason code: reweigh, reclass, accessorial added, address correction. Slice by tenant, lane and agent version, then review the call audio behind each spike.
The bottom line
Freight quote errors start as misheard words and end as invoice adjustments weeks later. Test capture against ground truth, test read-back against your rating engine, and watch the carrier invoice for what testing missed.
Related Articles

How to automate voice agent testing: synthetic callers vs manual QA
Learn how ai test automation replaces manual QA for voice agents. Compare synthetic callers vs human testers, with a 5-step framework to scale without hiring.
Read more
AI Agent Testing vs Voice Agent Testing: What General Tools Miss for Voice
AI agent testing measures text outputs. Voice agent testing measures behaviour through an acoustic pipeline. Five failure categories general tools miss.
Read more