LogisticsAI Implementation & Best Practices
Machine learning freight matching in logistics: the models that pair loads with carriers
Machine learning freight matching is the use of predictive models to pair a load with the carrier most likely to move it well, at a price both sides accept. In logistics it is not one model but a stack: matching, rate prediction, acceptance probability, carrier reliability and cold-start — each trained on a different label.

Key takeaways
- Freight matching is not one model. It is a stack of at least seven: assignment, spot rate prediction, contract bid pricing, carrier acceptance, reliability scoring, cold-start for new carriers, and sequential matching for the next load. Each trains on a different label and fails in a different way, so treating them as one project is the most common architectural mistake in the domain.
- The offer log is the asset, not the model. An acceptance model can only learn from offers you actually recorded — including the rejected ones. Brokerages that log covers but not rejections have no training data for the single most valuable prediction in the business, and no amount of model work substitutes for the two years of logging they skipped.
- Rank by expected margin, not by lowest quoted rate. A carrier who quotes cheapest and accepts one offer in six is more expensive than a carrier who quotes higher and accepts four in five, once you price re-tender time, routing-guide depth and the cost of falling to spot.
- A freight marketplace is a closed feedback loop: your own prices generate the data your next price model learns from. Without a budgeted, monitored exploration share and off-policy evaluation, the price band narrows onto your current policy and the model becomes confidently wrong everywhere else.
- Matching quality does not fix brokerage unit economics. Convoy — well funded, technically strong, and further up this ladder than almost anyone — ceased core operations in October 2023. The lesson is structural: matching models move gross margin per load and cost to serve, and they move nothing else on the P&L. Report a unit-economics ledger next to every matching metric or the programme will be judged on the wrong number.
Abbreviations used on this page
- TMS
- Transport management system — the system of record for a load
- TL
- Truckload — a shipment that fills a trailer and moves point to point
- LTL
- Less-than-truckload — freight consolidated with other shippers' loads
- RFP
- Request for proposal — the annual contract freight bid
- EDI
- Electronic data interchange (204 load tender, 990 tender response, 214 status)
- MC / DOT
- Motor Carrier and Department of Transportation operating-authority numbers issued by the FMCSA
- FMCSA
- Federal Motor Carrier Safety Administration — the US carrier authority and safety regulator
- SCAC
- Standard Carrier Alpha Code — the four-letter carrier identifier used on tenders
- CSA
- Compliance, Safety, Accountability — the FMCSA's carrier safety measurement programme
- RPM
- Revenue per mile — the unit price a lane is quoted and settled in
- GM/load
- Gross margin per load — linehaul revenue minus carrier cost on a single covered load
- OPE
- Off-policy evaluation — estimating how a new pricing or ranking policy would have performed from logs of the old one
Free · 8 questions · ~3 minutes
Score your matching operation on the ladder
Eight questions, one at a time, about three minutes. Answer them and we build your personalised matching report — your rung on the ladder, your score on each of the four dimensions, and the specific blocker standing between you and the next rung — and send it to your inbox. Your result doubles as the baseline for your offer-log instrumentation.
0 of 8 answered
Pick an option to continue
Report ready
Your personalised matching report is ready
Tell us where to send it. Your rung appears on screen straight away, and the full report — dimension scores, the offer-log gaps that cap your acceptance modelling, and a 90-day plan for your weakest dimension — arrives in your inbox.
Your result
Your full matching report is on its way to your inbox.
Stage 1 · Manual matching
Manual matching is coverage by relationship and phone call — a person decides who gets the load, and the reasoning leaves no trace a system could learn from.
Your next moveLog every offer, not just every cover: carrier, price shown, offer window, rank position and outcome, on contract and spot alike.
Stage 2 · Assisted matching
Assisted matching is a person still deciding, but with a market rate index, a filtered carrier list and a suggested price on the screen beside them.
Your next moveReplace the index lookup with a model that predicts your realised carrier cost on this lane at this hour, trained on your own rate confirmations, and rank the carrier list by expected margin rather than by quoted price.
Stage 3 · Model-ranked
Model-ranked matching is a system that orders the carrier list and sets the opening price, with a person still constructing and sending every offer.
Your next moveLet the system construct and send the offer itself inside explicit guardrails — a price ceiling, a carrier-tier floor and a one-switch fallback to the human routing guide.
Stage 4 · Auto-matched
Auto-matched means a defined segment of loads is offered, priced and booked with no human touch, inside stated and monitored bounds.
Your next moveBudget an exploration share — a monitored slice of offers priced off-policy on purpose — and evaluate every pricing change off-policy before it reaches a carrier.
Stage 5 · Self-pricing marketplace
A self-pricing marketplace sets prices continuously against its own measured supply and demand, and knows which part of what it learns is its own reflection.
Your next moveReport contribution per load after operations cost next to every matching metric, and make the pricing forum accountable for both numbers rather than one.
0 / 24
Matching signal quality
— / 6
Pricing & acceptance modelling
— / 6
Marketplace integration
— / 6
Unit-economics measurement
— / 6
Your score maps to a rung on the matching ladder. The dimension breakdown matters more than the total: the lowest dimension is what actually caps you, and in this domain it is usually matching signal quality — the offer log — rather than the models everyone assumes are the problem. Your lowest-scoring dimension is —, and that is where the next investment belongs.
Your score maps to a rung on the matching ladder. The dimension breakdown matters more than the total: the lowest dimension is what actually caps you, and in this domain it is usually matching signal quality — the offer log — rather than the models everyone assumes are the problem.Your four dimensions score evenly, so there is no single weak link to attack — follow the stage’s next move above rather than picking a dimension.
Want this read against your own offer log?
We will take a quarter of your offer and tender history, measure first-tender acceptance, routing-guide depth and price error by lane, and show you where a matching model would and would not have changed the outcome. You keep the analysis either way.
How the score maps to a stage
- 0–5 — Stage 1, Manual matching. Manual matching is coverage by relationship and phone call — a person decides who gets the load, and the reasoning leaves no trace a system could learn from.
- 6–11 — Stage 2, Assisted matching. Assisted matching is a person still deciding, but with a market rate index, a filtered carrier list and a suggested price on the screen beside them.
- 12–16 — Stage 3, Model-ranked. Model-ranked matching is a system that orders the carrier list and sets the opening price, with a person still constructing and sending every offer.
- 17–21 — Stage 4, Auto-matched. Auto-matched means a defined segment of loads is offered, priced and booked with no human touch, inside stated and monitored bounds.
- 22–24 — Stage 5, Self-pricing marketplace. A self-pricing marketplace sets prices continuously against its own measured supply and demand, and knows which part of what it learns is its own reflection.
What machine learning freight matching is — and what has to happen for a match
A definition, the seven prediction problems hiding inside the phrase, and the lifecycle a load actually travels from tender to covered truck.
Machine learning freight matching is the use of predictive models to decide which carrier should be offered which load, at what price, in what order — and to book the result. It replaces a chain of human judgements (who runs this lane, what will they take, will they actually show up) with a chain of predictions, each trained on a different label drawn from the operation's own history of offers, rate confirmations and delivery events.
The phrase hides at least seven distinct modelling problems, and conflating them is the most common architectural mistake in the domain. There is an assignment problem (which carrier gets which load, across the whole board at once). There is a short-horizon price prediction (what will this lane clear at in the next 24 to 72 hours) and a completely different long-horizon one (what should we bid in the annual RFP (opens in a new tab)). There is an acceptance prediction, a reliability score, a cold-start problem for carriers with no history, and a sequential problem about what the truck does next. Each trains on a different label, each fails differently, and a single team treating them as one system typically ships the easiest and calls it matching.
This page is about the network side of logistics AI — loads, carriers, lanes, prices and offers. It deliberately says nothing about what happens inside the four walls of a warehouse; picking, slotting, labour planning and robotics orchestration are a different problem with different systems of record and are covered separately. The systems of record here are the TMS, the load board, the carrier master and the settlement ledger, and the KPIs are first-tender acceptance, routing-guide depth, deadhead per covered load and gross margin per load.
How a load becomes a covered truck
The lifecycle a single load travels, with the model layer in the middle lane. Read the bottom-right edge first: every rejection is a training label, and the operations that throw it away are the ones that later cannot build an acceptance model. The load side and the carrier side both feed the model layer; only the model layer decides who is asked, at what price, in what order.
- Data & feeds
- System-of-record action
- AI / model
- Human in the loop
- Where value leaks
The process, in words
- On the load side, a shipper tender (EDI 204) or a spot request creates the load in the TMS, and a hard feasibility filter removes every carrier who cannot legally or physically take it — wrong equipment, lapsed authority, insufficient insurance, no hours of service left, appointment window unreachable. This filter is deterministic and belongs in code, not in a model; putting it in a model is how forbidden matches reach a carrier.
- In the model layer, candidate generation narrows the feasible set to carriers with relevant history — this lane, an adjacent lane, or a plausible repositioning move — then the price model predicts your own cost to cover at this hour, and the acceptance model attaches a calibrated probability to each carrier at each price. The list is then ranked by expected margin, which is the only ranking objective that is not systematically wrong.
- On the carrier side, capacity arrives through a load-board search, the carrier app or an inbound call, and reliability and compliance signals — FMCSA authority and CSA, tracking compliance, historical fall-off — feed the ranking rather than the filter, because behaviour is a matter of degree while authority is not.
- The edge that matters most is the dashed one from rejection back into the model. A rejection is the single most informative event in the whole diagram, because it tells you a price a specific carrier would not take on a specific lane at a specific hour. Operations that log covers and discard rejections are discarding the training set for the only model that would have made the next offer better.
Step-by-step insights
- The feasibility filter belongs in code, not in a model
- Equipment type, operating authority, insurance limits, hazmat endorsement, hours of service and appointment feasibility are hard constraints with legal and safety consequences, and none of them is a probability. Teams occasionally fold them into the ranking model as features because it is convenient, and the model then learns to strongly disprefer infeasible matches rather than to forbid them — which means that under distribution shift it will eventually surface one. Keep the filter deterministic, version it, test it, and let the model rank only what has already been declared legal to run.
- Candidate generation is where the latency budget is spent
- Scoring every carrier in the network against every open load is computationally straightforward and operationally pointless — the useful candidate set for a given load is almost always in the low hundreds, defined by lane history, adjacency and plausible repositioning. Published work on truckload matching leans hard on spatial bucketing of origin and destination for exactly this reason: it turns an intractable pairwise problem into a lookup plus a rerank. Get candidate generation wrong and the ranking model never gets a chance to be right, because the good carrier was never in the list.
- Cost to cover is not the market rate
- A market index reports what a lane has been paying across all buyers. Your cost to cover is what this carrier base will take from you, this week, given your payment terms and your reputation for detention and quick pay. The two diverge most on exactly the loads where the money is: thin lanes, awkward hours, seasonal peaks. Train the price model on your own rate confirmations with the market index as one feature among many, and the residual — the gap between the index and your realised cost — becomes a measurable property of your carrier base rather than an unexplained variance.
- Rank by expected margin, never by quoted price
- Sorting the carrier list by cheapest quote optimises a number you do not pay. What you pay is the realised cost of the carrier who eventually accepts, plus the time spent reaching them, plus the risk of falling through the routing guide to spot. Expected margin — predicted revenue minus predicted cost, weighted by calibrated acceptance probability — collapses all three into one orderable number. Reps resist the change for about a month, because the top of the list is visibly dearer, and the offer log settles the argument every time.
- Every rejection is a labelled counterfactual you already paid for
- You showed a specific carrier a specific price on a specific lane at a specific hour and they said no. That is a labelled data point about the shape of supply, and it cost you nothing extra to generate because the offer was going to be made anyway. Log the carrier, the price shown, the offer window, the rank position and the outcome, including no-response as distinct from explicit refusal. Operations that start this log two years before they need it are the ones whose acceptance models work on the first attempt.
- Routing-guide depth is the cost of being wrong
- On contract freight, a rejection is not just a lost match — it moves the load to the next carrier in the routing guide, at the next price. Depth three or worse usually means the contracted rate is gone and the load is heading to spot, where the margin the annual bid assumed no longer exists. Measuring first-tender acceptance and mean routing-guide depth per lane converts model quality directly into money, and it is the cleanest way to show a finance team what an acceptance model is worth without ever mentioning a model metric.
The five rungs in detail
For each rung: what it looks like on a live board, the diagnostic signals a reviewer can check in an afternoon, the anti-pattern that traps operators there, and what leaving costs.
Matching maturity is a ladder with five rungs, and the rung you are on is decided by where the decision is made rather than by how good the model is. Manual matching keeps the decision in a person's head; assisted matching puts information beside them; model-ranked matching orders the list and sets the opening price; auto-matched removes the touch entirely for a defined segment; and a self-pricing marketplace closes the loop and then has to manage the fact that it has closed it.
Contribution released as the matching loop closes
The curve is not linear. Contribution stays close to flat through rungs 1 and 2, because information on a screen changes what a rep knows and not what the operation does. It inflects at rung 3, when ranking and pricing start to change which carrier is asked first, and again at rung 4, when the human touch finally leaves the load and cost to serve moves. It flattens again at rung 5 — not because the technology stops improving, but because the constraint has moved off the model and onto the unit economics of the business.
Contribution released per covered load by stage
- Stage 1 · Manual matching — 22% of operators. Manual matching is coverage by relationship and phone call — a person decides who gets the load, and the reasoning leaves no trace a system could learn from.
- Stage 2 · Assisted matching — 38% of operators. Assisted matching is a person still deciding, but with a market rate index, a filtered carrier list and a suggested price on the screen beside them.
- Stage 3 · Model-ranked — 26% of operators. Model-ranked matching is a system that orders the carrier list and sets the opening price, with a person still constructing and sending every offer.
- Stage 4 · Auto-matched — 11% of operators. Auto-matched means a defined segment of loads is offered, priced and booked with no human touch, inside stated and monitored bounds.
- Stage 5 · Self-pricing marketplace — 3% of operators. A self-pricing marketplace sets prices continuously against its own measured supply and demand, and knows which part of what it learns is its own reflection.
Curve shape: logistic, plotted from the stage data above. Distribution: Illustrative, consistent with publicly reported marketplace disclosures.
Each rung below is written for a practitioner rather than a buyer. The hallmarks describe observable conditions on a live board, the diagnostic signals are checks you can run against your own TMS and offer log this week, and the anti-pattern is the specific mistake most often made trying to leave that rung.
Select a rung
Every rung's full detail is in the page source — the selector only changes which panel is visible, so nothing here depends on JavaScript to exist.
Stage 1
Manual matching
22% of operators sit here
Manual matching is coverage by relationship and phone call — a person decides who gets the load, and the reasoning leaves no trace a system could learn from.
Rung 1 is not incompetence, and it is important to say so before anything else. A good rep covering freight manually is genuinely fast, genuinely accurate about which carrier runs which lane on which day, and genuinely better than a badly specified model. Freight brokerage was built on exactly this skill and a great deal of it still is. The problem with rung 1 is not the quality of the decision — it is that the decision is stored in a person rather than in a system, so it cannot be examined, transferred, improved or compounded.
The economic shape of rung 1 is linear and unforgiving. Every additional load costs roughly the same number of human touches as the one before it, so cost to serve scales with volume in a straight line. Growth therefore requires headcount at almost exactly the rate it requires freight, which is why manual brokerages have a natural ceiling that has very little to do with how good their people are. Nothing about a matching model changes this until the touches actually come out of the load.
The thing that is missing at rung 1 is not a model. It is a log. Every day a rung-1 operation generates the exact dataset a matching system would need — hundreds of offers made, prices quoted, carriers approached, refusals given, reasons stated — and throws almost all of it away, keeping only the covers. Two years later, when someone finally proposes an acceptance model, the honest answer is that the training data does not exist and the first eighteen months of the project is collecting it. Starting the log is cheap, it is boring, and it is the single highest-return thing an operation at this rung can do.
In practice
The rep who was the routing guide
A mid-sized brokerage covered a difficult reefer lane out of the Central Valley at consistently better margin than any of its peers. One night-shift rep had spent four years learning which twelve carriers would take that lane late, which of them would take it at a discount if the appointment was flexible, and which would say yes and then fall off. When she moved to a competitor, cover rate on the lane fell and cost per covered load rose within a fortnight. Nothing had been written down, so nothing could be rebuilt — the operation had been running a highly effective matching model that lived entirely in one person's head.
What it looks like
- Coverage depends on which rep is on shift and who they know
- Pricing is anchored to the last rate confirmation on the lane
- Rejected offers exist only in call notes, email threads and memory
- No structured record of who was offered what, at what price
Diagnostic signals you can check this week
- Ask for last month's rejected offers. If the answer is that you do not keep those, you are at rung 1
- Count the systems a rep touches to cover one load — load board, TMS, phone, email, a personal spreadsheet
- Ask two reps to price the same lane on the same morning, independently, and compare the numbers
- Ask what happens to cover rate on a difficult lane when the rep who owns it takes a fortnight off
Anti-pattern · Buying a matching engine before you have an offer log
Vendors demo matching engines on their own data, where the offer history already exists. Bought into a rung-1 operation, the engine arrives with nothing to learn from, so it falls back to filtering by equipment and authority — which is what the TMS already did — and gets quietly abandoned inside two quarters. The engine is not the problem; the sequence is. Instrument the offer log first, run it for two quarters, and the same engine arrives with a training set instead of a cold start.
What holds you here
Nothing records what was offered, to whom, at what price and what came back — so there is no dataset any matching or pricing model could be trained on.
Highest-leverage next move
Log every offer, not just every cover: carrier, price shown, offer window, rank position and outcome, on contract and spot alike.
Cost of leaving
- Effort
- 2–4 months
- Team
- One data engineer and one operations lead, part-time
- Risk
- Low — logging is purely additive and nothing in production depends on it yet
- To next stage
- 2–4 months
If this is you, the next step is
A two-week engagement: define the event schema, wire it to the TMS, start collecting.
Stage 2
Assisted matching
38% of operators sit here
Assisted matching is a person still deciding, but with a market rate index, a filtered carrier list and a suggested price on the screen beside them.
Rung 2 is where most of the industry sits, and it looks like progress because it is progress — the screen genuinely has more on it than it did. A market index tells the rep roughly what the lane has been paying. A filter has removed carriers without the right equipment or valid authority. A suggested rate appears in the box. All of this is real work, correctly done, and none of it has moved the decision: a person still chooses the carrier and a person still chooses the price.
The specific trap at this rung is that a published market index is not your cost. An index is an average of what a market paid across a lane, and your cost to cover that lane depends on your own carrier base, your payment terms, your reputation among small fleets, and what you tendered last week. Operators discover this the moment they compare the suggestion against their realised rate confirmations: the index is right on average and wrong exactly where the money is, which is at the tails — Friday afternoons, holiday weeks, produce season, the lane with four qualified carriers instead of four hundred.
Time spent at rung 2 is not neutral. Reps learn, correctly, that the suggested rate is advisory, and the override becomes reflexive rather than considered. Worse, the overrides are where all the information lives — a rep overriding a suggestion by fourteen per cent is telling you something the model does not know — and at rung 2 nobody is reading them. An operation that sits here for three years usually ends up harder to move than one at rung 1, because the tooling has been discredited internally before it ever had a chance to be right.
In practice
The index that was right on average and wrong on Fridays
A brokerage wired a purchased market index into its load screen and measured the suggestion against its own realised carrier cost for a quarter. Averaged over all loads the index was close enough to be useful. Split by day of week and season, it was systematically low on Friday-afternoon pickups out of two produce regions and systematically high on Monday-morning reloads into a saturated market. Reps had already learned both patterns and were overriding accordingly. The overrides were the model everybody needed and nobody was capturing — the fix was not a better index but a prediction trained on the brokerage's own rate confirmations, with day-of-week and region as features.
What it looks like
- A market rate index sits next to the load inside the TMS
- The carrier list is filtered by equipment, authority, insurance and lane history
- A suggested rate exists, is advisory, and is overridden constantly
- The offer log covers contract tenders reliably and spot freight patchily
Diagnostic signals you can check this week
- Measure the override rate on suggested rates, then ask whether anyone reads the overrides
- Check whether the suggested rate is a market index or a prediction of your own cost to cover
- Ask whether rejected spot offers reach the same log as contract tenders, or no log at all
- Look at whether the carrier list is ranked by anything, or merely filtered
Anti-pattern · Buying a second market data feed
When the suggestion is wrong, the instinctive fix is more market data — a second index, a broader panel, a finer lane granularity. It rarely helps, because the error is not noise in the market signal, it is the gap between the market's price and yours. Two indices disagreeing produces an average that is wrong in a new way. Spend the same quarter training a cost-to-cover model on your own rate confirmations with the market index as one feature among several, and the error usually halves without any new subscription.
What holds you here
The suggestion is advisory and anchored to a market average rather than to your own realised cost, so it is overridden exactly when it matters most.
Highest-leverage next move
Replace the index lookup with a model that predicts your realised carrier cost on this lane at this hour, trained on your own rate confirmations, and rank the carrier list by expected margin rather than by quoted price.
Cost of leaving
- Effort
- 4–8 months
- Team
- One ML engineer, one integration engineer, a named operations owner
- Risk
- Medium — the first model that sets a price needs a ceiling and a tested fallback
- To next stage
- 4–8 months
If this is you, the next step is
The rung 2 → 3 move: predict your cost, not the market's average. Typically one quarter.
Stage 3
Model-ranked
26% of operators sit here
Model-ranked matching is a system that orders the carrier list and sets the opening price, with a person still constructing and sending every offer.
Rung 3 is the first rung where the models change what happens rather than what is displayed. The mechanical change is small and the conceptual change is large: the carrier list stops being sorted by quoted price and starts being sorted by expected margin, which is the predicted revenue minus the predicted cost, weighted by the predicted probability that the carrier says yes inside the offer window. A carrier who quotes cheapest and accepts one offer in six is genuinely more expensive than a carrier who quotes higher and accepts four in five, once you price the re-tender, the routing-guide depth and the risk of falling to spot.
The discipline that arrives with rung 3 is calibration, and it catches most teams by surprise. An acceptance model with excellent ranking quality and poor calibration will order the carrier list beautifully and price catastrophically, because pricing needs the probability itself to mean something. If the model says thirty per cent and the realised acceptance in that decile is fifty-five, every expected-margin calculation built on it is wrong in the same direction. Plot predicted probability against realised acceptance by decile, insist the line is close to diagonal, and re-check it monthly — calibration drifts with the market even when ranking does not.
The constraint that emerges here is throughput, and it is human. The models improve every decision, and a person still constructs and sends every offer, so touches per covered load barely moves and cost to serve barely moves with it. That is why rung 3 operations often report better margin per load and no improvement at all in operating leverage — the models are doing their job and the organisation has not yet let them do the part that removes work.
In practice
The list that stopped being sorted by price
A brokerage re-sorted its carrier list from lowest quoted rate to highest expected margin and, for the first month, reps hated it: the model was putting more expensive carriers at the top. The offer log settled the argument. On the lanes where the change was live, the number of carriers contacted before cover fell by roughly a third and the share of loads that fell through to spot fell with it, so realised cost per covered load improved even though the first carrier contacted was nominally dearer. The reps had been optimising the quoted price; the model was optimising the price actually paid.
What it looks like
- A cost-to-cover model, not a purchased index, sets the opening price
- An acceptance model ranks the carrier list by expected margin
- Every offer — carrier, price, window, rank, outcome — is a first-class logged dataset
- Model health is watched on calibration, not only on error or ranking quality
Diagnostic signals you can check this week
- Plot predicted acceptance probability against realised acceptance by decile — if the line is not near-diagonal, the model cannot be used for pricing
- Ask what the ranking objective is; if the answer is lowest cost, the model is not doing the job
- Check whether the price model trained on your own rate confirmations or on a purchased index
- Count touches per covered load — at this rung it should have stopped rising, even if it has not yet fallen
Anti-pattern · Optimising ranking quality instead of calibration
Teams report AUC because it is the metric the modelling literature hands them, and AUC is indifferent to whether a predicted probability is right. A model can rank every carrier correctly and still be systematically over-confident, and every expected-margin decision downstream inherits that bias silently. Add a reliability diagram to the same dashboard as the ranking metric, gate deployments on both, and treat a calibration regression as a stop-ship even when ranking improved.
What holds you here
A person still constructs and sends every offer, so the models improve margin per load without touching cost to serve.
Highest-leverage next move
Let the system construct and send the offer itself inside explicit guardrails — a price ceiling, a carrier-tier floor and a one-switch fallback to the human routing guide.
Cost of leaving
- Effort
- 9–15 months
- Team
- Two ML engineers, a platform engineer, an operations product owner
- Risk
- Medium — the first system-set price changes who is accountable for a bad rate
- To next stage
- 9–15 months
If this is you, the next step is
We plot decile calibration against your own offer log and mark where pricing inherits the bias.
Stage 4
Auto-matched
11% of operators sit here
Auto-matched means a defined segment of loads is offered, priced and booked with no human touch, inside stated and monitored bounds.
Rung 4 is where a matching programme finally deletes a cost line rather than improving a rate. Cost to serve — the operations headcount required per hundred covered loads — is the only item on a brokerage P&L that a matching model touches directly, and it only moves when the touches genuinely leave the load. That is a discrete change, not a gradual one: a load either books without a person or it does not, and the segment that books without a person is the number worth reporting.
The engineering at this rung is guardrails, and the guardrail that matters most is the price ceiling. A ceiling frozen at training time is a ceiling calibrated to a market that no longer exists; in a turning market it will either block every booking or wave through prices that destroy the margin on the segment. Index the ceiling to a live market feed, review the index choice quarterly, and page a human when the auto-book rejection rate moves sharply in either direction — a collapse in bookings and a surge in bookings are both symptoms of the same stale bound.
Rung 4 is also where sequential matching starts to pay. Matching one load in isolation is a bipartite assignment; matching a load knowing what the truck will do next is a sequential decision problem, and the difference shows up as empty miles. The reinforcement-learning literature on dispatching and repositioning has been explicit about this for years — optimising each assignment greedily strands capacity in the wrong place and the cost lands two loads later. Evaluate sequential matching at the network level, on deadhead per covered load and pool coverage, never on the quality of the individual pairing.
In practice
The lane set that books itself
A brokerage designated nine dense, high-frequency lanes as its auto-book segment, chosen because each had at least forty qualified carriers and at least two hundred comparable rate confirmations a month. Inside that segment the system constructed the offer, priced it against a ceiling indexed to a live market feed, sent it to the top-ranked carrier and booked the acceptance straight into the TMS. Touches per covered load in the segment fell close to zero; everywhere else it did not move at all. The segment definition — dense lanes with predictable prices — was doing more work than the model.
What it looks like
- A named segment of loads books end to end without a human touch
- Every auto-booked load is bounded by a price ceiling and a carrier-tier floor
- Touches per covered load is a reported operating metric with a named owner
- Sequential matching considers the next load, not only this one
Diagnostic signals you can check this week
- Ask what bounds an auto-booked price, and whether that bound moves with the market or only with a release
- Check whether the auto-book segment is defined by lane density and price predictability, or by whoever asked loudest
- Measure deadhead per covered load; if sequential matching is genuinely live, it should be falling
- Exercise the fallback — can one switch return a lane to the human routing guide today, and when was that last tested?
Anti-pattern · Extending auto-book by lane count instead of by evidence
The segment works, so it grows, and the growth is measured in lanes added rather than in evidence gathered. Thin lanes with six qualified carriers and no comparable rate history get added because they are adjacent on a map, and the first bad automated booking on one of them typically results in auto-book being switched off entirely — a two-rung regression from a single incident. Every new lane should re-earn inclusion from its own offer history: density, comparables, calibration in that lane specifically.
What holds you here
The models are trained entirely on offers you chose to make, so the price band narrows onto your own policy and the system becomes confidently wrong outside it.
Highest-leverage next move
Budget an exploration share — a monitored slice of offers priced off-policy on purpose — and evaluate every pricing change off-policy before it reaches a carrier.
Cost of leaving
- Effort
- 15–24 months
- Team
- Platform team, operations product owner, and a finance partner who owns the margin line
- Risk
- Higher — an unbounded auto-book segment in a turning market is a fast, quiet loss
- To next stage
- 15–24 months
If this is you, the next step is
Which loads may book unattended, at what ceiling, with what fallback — and how each is monitored.
Stage 5
Self-pricing marketplace
3% of operators sit here
A self-pricing marketplace sets prices continuously against its own measured supply and demand, and knows which part of what it learns is its own reflection.
Rung 5 is rarer and narrower than the phrase suggests. It requires genuine liquidity — enough loads and enough carriers in the same lanes at the same time that a price can be discovered rather than looked up — and that condition holds for a small fraction of freight. On thin lanes a self-pricing marketplace is a self-pricing marketplace of one, which is just a price. Operators who reach this rung do so in a defined, dense subset of their network and quite deliberately never extend it beyond that subset.
The hard problem at this rung is epistemic rather than technical. A marketplace that sets its own prices generates the data it will learn from next week, so the model's confidence is highest exactly where the policy already operates and its ignorance is invisible everywhere else. The counter-measures are well established in the recommender and dynamic-pricing literature — a deliberate exploration budget, off-policy evaluation before deployment, monitoring the width of the realised price band as a first-class metric — and they are unglamorous enough that they are usually the first thing cut. Cutting them does not produce an error message; it produces a model that is quietly, increasingly wrong about a market it can no longer see.
The honest part of rung 5 is that it is not a business model. Convoy was a heavily funded digital freight brokerage with genuinely strong technology, sat near the top of this ladder on every technical axis, and ceased core operations in October 2023. Matching and pricing quality move two lines on a brokerage P&L — gross margin per load and cost to serve — and they move nothing else. A marketplace can be the best matcher in the market and still lose, and any programme whose business case rests on matching quality alone has mistaken a capability for an economic model.
In practice
The exploration budget that had to be defended every quarter
A marketplace ran roughly one offer in twenty at a deliberately randomised price inside a bounded window, purely to keep variance in the training data. Every planning cycle somebody proposed cutting it, because on any single quarter's numbers the exploration offers looked like margin given away. The argument that kept it alive was an off-policy evaluation showing that the last three pricing changes — each of which did improve realised margin — could not have been validated at all without those randomised offers, because every in-policy log was concentrated in the band the old policy already used.
What it looks like
- Prices move continuously with observed supply and demand, not with a release cycle
- A budgeted, monitored exploration share keeps training data from collapsing onto the policy
- Pricing changes are evaluated off-policy before they reach a carrier
- A unit-economics ledger is reported next to every matching metric
Diagnostic signals you can check this week
- Ask for the exploration share as a number, and who owns the budget line it comes out of
- Ask how the last pricing change was validated; if the answer is an in-policy A/B test only, the loop is still closed
- Check whether contribution per load after operations cost is reported alongside cover rate
- Ask what happens to the price band when the market turns — the answer should name a mechanism, not a person
Anti-pattern · Treating marketplace maturity as the business case
This is the Convoy lesson, and it is a lesson about arithmetic rather than about engineering. A programme that reports acceptance rate, cover rate and price error to a board is reporting model health, and a board hears business health. When the market turns and gross margin per load compresses for every broker at once, a technically excellent marketplace looks exactly like a technically poor one on the only line that matters. Publish a unit-economics ledger — gross margin per load, cost to serve, contribution after operations cost — beside the matching metrics from the first quarter, so nobody has to reconstruct the argument under pressure.
What holds you here
Matching and pricing quality are no longer the binding constraint — the constraint is the unit economics of the business the marketplace sits inside.
Highest-leverage next move
Report contribution per load after operations cost next to every matching metric, and make the pricing forum accountable for both numbers rather than one.
Cost of leaving
- Effort
- Continuous
- Team
- Platform team plus a standing pricing-governance forum with finance in the room
- Risk
- Concentrated — a mispriced auto-book segment compounds losses at machine speed
If this is you, the next step is
We take one lane set and run the loop against a simulated market turn, then read the ledger.
Where freight operations actually sit on the ladder
The distribution across the five rungs, and why the assisted-to-model-ranked transition is the largest single loss.
Most freight operations sit at rung 2, assisted matching. The distribution is heavily weighted toward operations that have bought market data and wired it onto the load screen without changing who makes the decision or what gets recorded about it. A minority have models ranking the carrier list, and a very small minority let a defined segment of loads book with no human touch at all.
Distribution of freight operations across the five matching rungs
Rung 2 is both the mode and the plateau. The drop from rung 2 to rung 3 is the largest single transition loss on the ladder, and the reason is almost never modelling capability — it is that the offer log needed to train an acceptance model was never collected.
Share of operations
- 22% — 1 · Manual matching
- 38% — 2 · Assisted matching (the plateau)
- 26% — 3 · Model-ranked
- 11% — 4 · Auto-matched
- 3% — 5 · Self-pricing marketplace
The reason rung 2 is so crowded is that it is the last rung reachable by purchase. A market rate index can be bought and wired onto a screen in a quarter; DAT's published market trendlines (opens in a new tab) and equivalent feeds make the spot side of that trivially available. Everything above rung 2 requires a dataset nobody sells you, because it is a record of your own offers and your own rejections. That asymmetry — buyable information, unbuyable behaviour — is what makes the second transition the expensive one and the reason so many operations stall with excellent data on screen and no model behind it.
The other structural reason is that freight brokerage is a fragmented market of small carriers. The FMCSA (opens in a new tab) registers hundreds of thousands of interstate operating authorities, and the long tail of one-to-five-truck fleets is where most flexible capacity actually lives. A matching model therefore spends most of its life reasoning about carriers with very little history, which is why cold-start is not an edge case in this domain — it is roughly half the problem, and any framework that treats it as a footnote will systematically underserve exactly the carriers who move the difficult freight.
The freight-matching model stack: seven problems, seven labels
Every model in the stack, what it predicts, the label it trains on, where that label comes from, and the specific way each one fails.
There are seven models behind a working freight-matching system, and the single most useful thing to know about them is that they do not share a label. The assignment model learns from realised covers, the price models from rate confirmations, the acceptance model from offers made and refused, the reliability model from delivery events, and the cold-start model from the first handful of loads of every carrier ever onboarded. A team that plans one dataset and one training pipeline for all seven will build whichever model that dataset happens to support and describe it as freight matching.
| Model | What it predicts | Label it trains on | Where the label comes from | The way it fails |
|---|---|---|---|---|
| Matching / assignment | Which carrier should take which load, across the whole open board at once | Realised assignments and their eventual cost | Rate confirmations and cover events in the TMS | Optimises each load greedily and strands the hardest loads for last |
| Spot rate prediction | The clearing price for this lane over the next 24 to 72 hours | Rates actually paid on comparable lanes and hours | Your own rate confirmations, plus a market index as a feature | Learns your own buying behaviour and reports it as the market |
| Contract bid pricing | What to quote in an annual RFP, and what honouring it will cost | Awarded lane volume and realised cost across the award year | Last year's bid file, award file and settlement ledger | Prices the average week and loses money in the six weeks that matter |
| Carrier acceptance | P(this carrier accepts this load at this price inside the offer window) | Accept, reject and no-response on offers actually made | The offer log and the EDI 990 tender-response stream | Trains only on offers you chose to make, so it cannot see the rest |
| Carrier reliability scoring | Whether this carrier will deliver on time, track the load, and not fall off | On-time events, tracking compliance, fall-off and claim events | TMS status events, EDI 214 and the visibility feed | Punishes small carriers for having less history rather than worse behaviour |
| Cold start for new carriers | Expected behaviour of a carrier with no history with you | The first ten to twenty loads of every carrier ever onboarded | Onboarding cohort history plus FMCSA authority and CSA data | A confidence floor new carriers can never climb out of |
| Sequential / round-trip matching | The next load after this one, and where the truck should be for it | Realised multi-leg sequences and the deadhead between them | GPS and ELD traces joined to subsequent rate confirmations | Optimises the pair beautifully and starves the pool around it |
Two of these deserve to be built first, and they are not the two that get proposed. The acceptance model is the highest-leverage prediction in the stack because it is the only one that changes both the order of the carrier list and the price, and it is trained on data you generate free every day. The cost-to-cover price model is second, because without it the acceptance model has no price to condition on. Assignment optimisation, which is the model everybody wants to start with, is worth very little until the first two are calibrated — an optimiser fed bad costs and bad acceptance probabilities will confidently produce an optimal solution to the wrong problem.
The assignment problem is a solved algorithm and an unsolved data problem
Optimally assigning a set of loads to a set of carriers is a bipartite matching problem with a well-known polynomial solution, and it has been for decades. What is not solved is the cost matrix: every cell in it is a prediction of what a specific carrier will charge and whether they will accept. Published work on large-scale truckload matching spends almost all its effort on generating plausible candidates and estimating those cells — see recent work on spatially bucketed truck matching (opens in a new tab) — because the optimiser itself is the cheapest component in the system.
Acceptance prediction is a censored-data problem, not a classification problem
You observe outcomes only for offers you made, which means the dataset is selected by your own past policy. A carrier you never offer a lane to generates no label, forever, and the model concludes nothing about them because it has been shown nothing. This is structurally the same problem the recommender-systems literature calls a degenerate feedback loop (opens in a new tab), and the counter-measures are the same: deliberate exploration, off-policy evaluation, and treating the absence of a label as information rather than as a missing value to impute away.
Carrier reliability scoring is where fairness and accuracy actually collide
A score built from raw counts of on-time deliveries will rank a hundred-truck fleet above a three-truck owner-operator who has never been late, purely because the fleet has more history. That is not a better prediction, it is a volume tax, and it systematically excludes the small carriers who move the awkward freight. Score on rate-adjusted behaviour with an explicit uncertainty term, publish the components, and give carriers a route to contest a score — the same evidential discipline the FMCSA applies to its own CSA measurements.
Cold start is half the problem, not an edge case
In a market of predominantly small fleets, a large share of the carriers who could take your load have no history with you at all. Treating them as low-confidence and therefore low-rank means they never get an offer, never generate history, and remain low-confidence permanently. The workable pattern is an explicit exploration allocation for new carriers — a budgeted share of offers reserved for carriers below a history threshold, with authority and insurance checked hard through FMCSA registration data (opens in a new tab) and the outcome fed straight back into the cohort model.
Sequential matching is where the empty miles are
Matching one load in isolation is a static assignment; matching it knowing what the truck should do afterwards is a sequential decision problem, and the difference shows up as deadhead. The reinforcement-learning work on multi-driver dispatching and repositioning (opens in a new tab) and on mean-field approaches to large-scale order dispatch (opens in a new tab) both make the same point: greedy per-load optimisation moves cost forward in time rather than removing it. Evaluate on network deadhead and pool coverage, never on the quality of an individual pairing.
Identifiers are the boring precondition for all seven
None of these models works if the same carrier appears three times in the carrier master under three spellings, or if a location is a free-text address rather than a resolvable identifier. Standard carrier codes, consistent MC/DOT keys and structured location identifiers of the kind GS1 maintains (opens in a new tab) are not a data-governance nicety here — they are the join keys the entire feature layer depends on, and entity-resolution debt in the carrier master shows up downstream as a reliability model that cannot see half a carrier's history.
Pricing and acceptance: spot and contract are two different problems
Why the same lane needs two unrelated models, how acceptance probability turns a price into a decision, and where each pricing approach belongs.
Spot pricing and contract pricing are different modelling problems that happen to share a lane name. Spot asks what this lane will clear at in the next few days and gets its answer back the same day; contract asks what it will cost to honour an award across a year of unknown weeks and gets its answer back after a full bid cycle. They have different horizons, different label latencies, different loss functions and different failure modes, and building one model for both produces something that is mediocre at spot and dangerous at contract.
| Dimension | Contract (routing guide) | Spot |
|---|---|---|
| Horizon | Twelve months, priced once in the annual RFP | Hours to days, repriced continuously |
| What you are predicting | Your cost to honour an award across a year of unknown weeks | The clearing price in this lane over the next 24 to 72 hours |
| Label latency | A full bid cycle before you know whether the price was right | Same day, on every covered load |
| Dominant risk | Winning lanes you cannot cover at the awarded rate | Bidding into your own price signal and calling it the market |
| Right model class | Distributional — predict the cost distribution and price the tail, not the mean | Short-horizon time series with market and capacity features |
| What breaks it | Peak weeks, lane-mix drift after award, and a shipper who tenders a different shape than they bid | Feedback loops, thin lanes, and stale market feeds |
| The metric that matters | Realised cost versus awarded rate, by lane, across the award year | Gross margin per covered load, weekly |
| The governance question | Who may override the bid price, and on what evidence | Who sets the auto-book price ceiling, and what it is indexed to |
The contract side is genuinely a distributional problem. Pricing an annual award at the mean expected cost guarantees losing money in the tail weeks, because the weeks where your cost blows out are precisely the weeks where the shipper tenders most volume. The relevant research frames this as a bidding problem under advance commitment — reinforcement-learning approaches to dynamic bidding in truckload markets (opens in a new tab) make the commitment structure explicit — and the practical translation is simple: predict the distribution of your cost on the lane, price against a chosen percentile rather than the mean, and record which percentile you chose so the following year's post-mortem has something to argue with.
The spot side is a short-horizon forecasting problem with an unusual amount of exogenous signal — capacity posting density, load-to-truck ratios, fuel, weather, and the shape of the lane's own recent history. Work on transportation marketplace rate forecasting (opens in a new tab) and on driver-facing surge pricing (opens in a new tab) both point at the same structural insight: the price is only half the decision. The other half is the probability that the price is accepted, and a price model without an acceptance model beside it cannot tell you whether a quote is good or merely low.
Where to point your matching investment, by lane type
Plot lane price predictability against carrier supply depth. Three of the four quadrants are not asking for a better model — one is asking for a better bid, one is asking for a wider exploration budget, and one is asking you to pick up the phone.
Rank, don't price
- Plenty of carriers, no reliable clearing price
- Let acceptance modelling discover the price by asking
- Short offer windows and a wide exploration budget
Auto-match
- Both signals strong — this is the auto-book quadrant
- Set a market-indexed price ceiling and let it run
- Where rung 4 actually pays for itself
Pick up the phone
- Neither signal exists; a model adds latency, not value
- Experienced reps still win here and should
- Instrument the calls anyway, so the log exists in two years
Price well, book manually
- You know the price; you do not have the trucks
- The value is in the annual bid, not in the match
- Dedicated capacity and committed lanes beat spot matching
The quadrant map is worth running against your own lane list before any modelling work is commissioned, because it usually reveals that the auto-book quadrant is smaller than assumed and the bottom-left quadrant is larger. Operations that skip this step tend to build a general matching capability, deploy it everywhere, and then discover that it performs well on the ten per cent of lanes that were already easy and adds nothing but latency on the rest.
The marketplace feedback loop: your prices become your training data
The structural problem that makes freight matching different from every other supervised-learning problem in logistics — and the three counter-measures that work.
In a freight marketplace, the model's own decisions generate the data the next model is trained on, which means the training set is not a sample of the world — it is a sample of your policy. Every price you quote and every carrier you choose to approach becomes a label; every price you did not quote and every carrier you did not approach becomes silence. Over enough cycles the model becomes extremely confident inside the band it already operates in, and has no opinion whatsoever about anything outside it.
How a pricing model learns its own reflection
The loop that closes on itself. The top lane is what you do, the middle lane is what actually gets recorded, and the bottom lane is what the model concludes. The dashed edges are the censored half of the data — the offers you never made — and they are invisible to every metric on the dashboard. The single node marked as an action is the only thing that reopens the loop.
- Human in the loop
- System-of-record action
- Data & feeds
- Where value leaks
- AI / model
The process, in words
- What you do: a pricing and ranking policy decides which carriers see which loads, at which price, for how long. That policy is a choice, and every choice it makes is a choice not to observe the alternative.
- What gets recorded: clean accept and reject labels for the offers you made, and absolutely nothing for the offers you did not. The second category is far larger than the first and appears nowhere on any dashboard, because a missing row does not raise an alert.
- What the model learns: a function fitted to your own policy, most confident exactly where the policy already operates. Each retraining cycle narrows the realised price band a little further, and the narrowing looks like improving precision right up until the market moves and the model has never seen the region it now needs.
- The counter-measure is the one action node in the diagram: a budgeted, monitored share of offers priced off-policy on purpose, feeding an unbiased signal back into the next policy. It costs measurable margin every quarter and it is the only thing keeping the loop open.
Step-by-step insights
- Why this is worse in freight than in retail recommendation
- A retail recommender that over-narrows shows fewer novel products and loses some incremental revenue. A freight pricing model that over-narrows sets prices, and prices move supply. If your model has never quoted above a certain band on a lane, it does not merely fail to recommend that band — it has actively prevented the market from telling you whether carriers would have taken it, while your competitors' offers continue to shape the same carriers' expectations. The loop is not only closed, it is closed around an asset that is moving.
- Exploration budget: what it costs and how to size it
- The usual shape is a low single-digit percentage of offers, priced at a deliberate offset from the policy price inside a bounded window, concentrated in lanes where you most need signal — thin lanes, new carriers, regions you are trying to enter. Size it against the value of the decisions it unblocks rather than as a fixed rate: if you cannot validate a pricing change without it, its cost is the price of being able to change prices at all. Give it a named owner and a line in the plan, or it will be cut in the first quarter that misses.
- Off-policy evaluation before anything ships
- Off-policy evaluation estimates how a proposed pricing or ranking policy would have performed using logs generated by the current one. It is not a substitute for a live test, but it is the gate that stops obviously bad policies reaching carriers and it is the only tool that can compare several candidate policies without running several experiments. Its estimates are only as good as the overlap between the old and new policies, which is precisely why the exploration budget and the evaluation method have to be funded together.
- Monitor the width of the realised price band, not just the error
- Prediction error can improve while the model becomes more dangerous, because a model that only ever operates in a narrow band will have low error inside it. Track the interquartile range of realised prices per lane over time as a first-class metric. A steadily narrowing band with steadily improving error is the signature of a loop closing, and it is a warning, not an achievement. Alert on the trend, not on a threshold.
- Carrier expectations are part of the loop too
- Carriers learn your pricing behaviour just as your model learns theirs. A marketplace that consistently opens low on a lane trains its own carrier base to wait, which lengthens time to cover and pushes loads down the routing guide — a second-order effect the model will attribute to market softness because it has no feature for its own reputation. The mitigation is unglamorous: hold the offer window and the opening-price policy stable long enough for the effect to be measurable, and treat time-to-cover drift on stable lanes as a signal about you rather than about the market.
Three counter-measures, in the order they should be built
Log the counterfactual, not just the outcome
Record the full candidate set considered, the rank position of each carrier, the price that would have been shown, and which of them actually received the offer. This costs nothing at decision time and turns an unrecoverable gap in the data into a recoverable one — you at least know what you chose not to do.
Fund an exploration share with a named owner
A budgeted, bounded slice of offers priced off-policy on purpose, concentrated where signal is thinnest. Report it as a line item so that cutting it is a visible decision rather than a quiet one, and monitor the realised price band it produces as evidence that it is working.
Gate every pricing change on off-policy evaluation
No pricing or ranking policy reaches a carrier without an off-policy estimate of its effect on gross margin per covered load and first-tender acceptance. The gate catches the changes that look better on validation loss and worse on money, which in this domain is a surprisingly large share of them.

