How to price a freight RFP from rate history

Published . Updated .

A shipper's freight RFP usually arrives as an Excel file with hundreds of lanes, a few tabs of instructions, and a deadline. A sound way to price it for a small brokerage is to start from what you actually paid carriers on the same lanes, then add your margin. The hard part is not the arithmetic. It is matching each lane in the shipper's template to the right row of your own history, and noticing the lanes where there is no row to match.

This guide walks through that method by hand. The last section explains how LaneMapper does the same steps.

What you need before you start

Step 1: Read the whole RFP before touching a rate

Read every tab. Note the following:

  1. Which tab lists the lanes, and what each column means.
  2. Whether lanes are given as city and state pairs, ZIP codes or regions.
  3. What equipment each lane needs: dry van, reefer, flatbed, and so on.
  4. The expected volume for each lane, and whether it is a weekly or annual figure.
  5. Extra requirements: multiple stops, tarps, team drivers, appointment windows, accessorial charges.
  6. The bid format: all-in rate, linehaul plus fuel, or rate per mile.
  7. The due date and any question deadline.

Time spent here prevents re-pricing later.

Step 2: Define what counts as the same lane

Before you match anything, write down your matching rule. A lane in your history is only a valid match for a lane in the RFP when these all agree:

The last two are the ones people skip. A dry-van lane with two stops is a different piece of work from the same city pair with one stop. A lane you run twice a month is not priced the same as one the shipper expects seven times a week, and a blended average across both bands will be wrong for each.

Equipment matters just as much. If your history has a dry-van rate for a city pair and the RFP asks for a reefer, the dry-van rate is not evidence for the reefer lane.

Step 3: Normalize both lists

Matching fails on spelling, not on logistics. Before you compare:

  1. Put origin and destination in one format, for example city and state, in both files.
  2. Fix obvious variants such as "St. Louis" and "Saint Louis".
  3. Use one set of equipment names.
  4. Make sure rates are in the same unit. Flat rate per load and rate per mile cannot be compared directly.
  5. Remove duplicate history rows or merge them with a load-weighted average.

Step 4: Match each lane and write down the source

Go lane by lane. For each lane in the RFP, find the one history row that matches on every field in your rule, and record which row it was. That record matters later. When a shipper asks about a rate, or when you rebuild the bid next year, you want to see "this came from history row 14, 41 loads" and not a number with no origin.

A simple layout works well:

RFP laneEquipmentMatched history rowLoads behind itBuy rateStatus
Lane ADry vanH0141filledPriced
Lane BDry vannone0emptyNo history
Lane CReeferH0418filledPriced

The example figures above are placeholders. The point is the last two columns: every lane is either priced from a named row or marked as having none.

Step 5: Treat no-history lanes as their own list

Every RFP has lanes you have never run. The mistake is to fill them with a number from a similar lane, a rule of thumb or the shipper's incumbent rate and then forget it was a guess.

Instead, collect them in a separate list. For each one, decide:

You can skip lanes you cannot support, unless the shipper requires a bid on every lane, or bid them with a wider margin. Either is a business decision. What matters is that it is made on purpose.

Step 6: Add your markup, then fuel

With a buy rate for each supported lane, apply your markup on buy rate to get a bid linehaul, then add fuel if the bid format separates it. Keep the percentages in one cell or settings area and have every lane read from it, so changing your markup updates the whole sheet and you never end up with half the lanes on an old number.

Check one lane by hand. If your calculator and your spreadsheet disagree on a single lane, something is wrong in the formula and it is wrong on every lane.

Step 7: Sanity check before you submit

Run these checks on the finished sheet:

For a longer list of what tends to go wrong, see common freight RFP pricing mistakes.

How LaneMapper does this step

LaneMapper does the mapping and matching steps, not the pricing decision. You upload the shipper's RFP as it arrived, which can be an Excel workbook with any tabs and headers, a CSV, a Word or PDF file, or a photo of the lane sheet, together with your lane rate history. It reads the layout of the shipper's template, then matches each lane to the one history row with the same origin, stops, destination, equipment and volume band.

A lane is pre-filled only when it exactly equals its matched history row. Every other lane is flagged and left empty. Nothing is guessed or borrowed from a similar lane. A second, stronger AI model reviews every result, fixes what it can, and lists what is left for you to decide. Results are model output checked by code and by a second model; they are not verified by a person.

The markup on your buy rate and the fuel percentage are applied by code to each pre-filled lane, with fuel then applied on the marked-up linehaul. You get back a mapped-lanes workbook with live formulas and the source row beside the matched row, and a CSV. When the RFP is an Excel file with a rate column LaneMapper can identify, you also get the shipper's own workbook with the all-in bids filled into that column, never over a cell that already has a value. When the RFP is a CSV, Word or PDF file or a photo, it cannot be written into: with a rate column LaneMapper can identify, you get a new workbook rebuilt from its tables with the bids in that column, not the shipper's own file. With no rate column it can identify, there is no filled file and the bids are in the mapped-lanes workbook and the CSV.

The price is 7 credits per lane read, whether it comes back pre-filled or flagged, with no subscription. Create an account to try it on your next RFP.

Questions

How many months of rate history should I use?
Use a window that reflects what carriers charge you now. Twelve months covers a full year of seasons, which makes it a sensible starting point, but if the market moved sharply, weight recent loads more and say so in your notes.
Can I bid a lane I have never moved?
Yes, but treat it as a separate decision, not a lookup. Price it from a fresh carrier quote or a market rate you can defend, and keep it visibly apart from lanes backed by your own loads.
What if the shipper's template has several tabs?
Work out first which tab holds the lanes and which hold instructions, volumes or accessorial questions. Price only from the lane tab, but read the others before you commit to any rate, since they often change the cost of the work.

Your next RFP, mapped before the deadline.

Create an account, upload the file, download the priced lanes.