Margin-Safe Freight Quoting: the Costs That Erase a Broker's Margin
Underquoting rarely comes from a wrong percentage. It comes from applying a correct percentage to an incomplete buy price: a tail lift nobody priced, waiting time at a closed warehouse, a fuel surcharge from last quarter’s index. This guide works through the costs that erase a margin, where the fuel surcharge belongs in the calculation, and how a floor margin protects small files. Cargavo, the TMS for freight brokers, applies those rules server-side on every quote, so nobody prices from memory.
Which percentage does this guide use?
Everything below is expressed as a margin on the customer sell price, never as a markup on the carrier buy rate. The two are different bases and different numbers, and mixing them is the fastest way to lose money without making a bad decision.
Throughout this guide, a percentage always means a margin on the sell price, never a markup on the carrier buy rate. Margin is the number worth standardising on because it is bounded between 0% and 100%, so it is comparable between a small groupage file and a full-truck file.
Cargavo, the TMS for freight brokers and transport commissionaires, stores every rule the same way: a margin on the sell price, with an absolute amount available where a percentage makes no sense. The wider workflow sits in the quoting and automation category.
Full definition, conversion table and the p/(1-m) proof: markup vs margin.
How do you calculate a freight sell price from the carrier buy rate?
Use p/(1-m), where p is the total buy price and m the target margin as a decimal. A buy price of €504.68 at an 18% target margin sells at €504.68 / 0.82 = €615.46. Multiplying by 1.18 instead returns €595.52 and only a 15.3% margin — €19.94 less on a single shipment.
The derivation takes one line. You want gross profit to be m of the sell price s, so s - p = m × s, therefore s × (1 - m) = p, therefore s = p / (1 - m). Divide by one minus the margin; never multiply by one plus it.
What matters operationally is that p is the complete buy price, not the line-haul rate. Take a real file: 4 pallets of 1.2 × 0.8 m, 1,100 kg, Lyon to Barcelona, delivered to a site with no dock.
- Line haul read from the weight_zone grid, zone ES-2, 1,000-1,500 kg bracket: €412.00
- Indexed fuel surcharge for the current period, 14.0% of line haul: €57.68
- Tail lift at delivery, from the carrier option list: €35.00
- Total buy price p: €504.68
At an 18% target margin, the sell price is €504.68 / (1 - 0.18) = €504.68 / 0.82 = €615.46. Gross profit is €615.46 - €504.68 = €110.78, and €110.78 / €615.46 = 18.0%. The check is worth doing once by hand: divide the profit by the sell price and confirm you get the number you asked for.
Apply 1.18 to the same buy and you get €595.52, a gross profit of €90.84 and a margin of 15.3%. The €19.94 difference is not a rounding artefact — it is the whole gap between the margin you committed to and the margin you actually took.
Cargavo, the TMS for freight brokers, runs p/(1-m) inside the pricing engine rather than in a spreadsheet column, and the same engine produces both sides: the buy price is the calculation without margins, the sell price the calculation with them. To sanity-check your own numbers first, use the freight margin calculator.
Why doesn’t a 20% markup give you a 20% margin?
A 20% markup returns a 16.7% margin, because the two percentages divide by different bases. Reaching a genuine 20% margin takes a 25% markup: on a €500.00 buy price that is €625.00 instead of €600.00, a gap of €25.00 on every shipment quoted the wrong way round.
The operational consequence of the two bases is that every markup you apply lands below the margin you had in mind, and it lands below it by a predictable amount. Definitions and the algebra live in the markup vs margin glossary entry; what follows is the size of the gap and what it costs.
Read the table as "what you typed" against "what you actually took", on a €500.00 carrier buy price:
| Markup applied | Sell price | Margin actually obtained | Gross profit | Gross profit if that figure were a margin |
|---|---|---|---|---|
| +10% | €550.00 | 9.1% | €50.00 | €55.56 |
| +20% | €600.00 | 16.7% | €100.00 | €125.00 |
| +25% | €625.00 | 20.0% | €125.00 | €166.67 |
| +30% | €650.00 | 23.1% | €150.00 | €214.29 |
| +50% | €750.00 | 33.3% | €250.00 | €500.00 |
Two readings are worth taking from it. The first is that the shortfall widens as the percentage rises: €5.56 per shipment at 10%, €25.00 at 20%, €64.29 at 30%. Teams quoting part loads and full loads at the higher end are therefore the most exposed, and they are usually the ones with the fewest files a month in which to notice the anomaly.
The second reading is the monthly one. Take an illustrative month — this is a worked example, not a benchmark — of 200 shipments quoted at that €500.00 buy level, which happens to be exactly the quote quota of the Cargavo Starter plan. Applying +20% as a markup returns €20,000.00 of gross profit for the month; quoting the same files at a true 20% margin returns €25,000.00. The €5,000.00 difference was not lost to a discount, a bad negotiation or a rate war. Nobody underquoted. Everybody applied "twenty percent".
The fix is not vigilance, because the error is invisible at the moment it is made and only shows up as a gross profit line that never quite matches the plan. The fix is to store the rule in one form only. Cargavo, the TMS for freight brokers, keeps every rule as a margin on the sell price, so a customer configured at 20% returns €625.00 on a €500.00 buy whoever opens the quote. To convert a card of markup percentages before you enter them, the freight margin calculator shows both figures side by side.
Which costs get forgotten when quoting a road freight shipment?
The costs most often missing are the ones the carrier invoices after delivery: tail lift, waiting time beyond the free period, timed delivery, ADR handling, ad valorem insurance and the fuel surcharge of the current index period. On the €504.68 example, a forgotten €35.00 tail lift and €60.00 of waiting time cut gross profit from €110.78 to €15.78.
Underquoting rarely comes from a wrong margin percentage. It comes from applying a correct percentage to an incomplete buy price. Every item below is invoiced by the carrier whether or not it appeared on your quote.
| Cost line | Triggered by | Priced as | Usually discovered |
|---|---|---|---|
| Fuel surcharge | Current index period | % of line haul | On the carrier invoice |
| Tail lift | No dock at delivery | Fixed amount per shipment | At delivery |
| Waiting time | Beyond the free period | Per 30 minutes | After delivery |
| Timed delivery | Booked slot or window | Fixed amount per shipment | At booking |
| ADR | Dangerous goods class | Fixed amount plus % | At collection |
| Ad valorem insurance | Declared value | % of declared value | After a claim |
| Minimum charge | Buy below the grid floor | Grid minimum | On the carrier invoice |
Run the arithmetic on the Lyon to Barcelona file. Quoted at €615.46 with an 18% margin, it carries €110.78 of gross profit. Leave the €35.00 tail lift off the quote and add €60.00 of waiting time the driver spent at a closed warehouse, and the real buy becomes €599.68. Profit falls to €15.78 — a margin of 2.6% on a file you believed was an 18% one.
There is a quieter leak that no accessorial list contains: quoting on gross weight when the grid charges on chargeable weight. Four non-stackable pallets occupying 1.6 loading metres are billed on the linear-metre floor, not on their 1,100 kg, which can push the shipment two brackets up before any option is added. That mechanism is covered in the guide on linear metre (LDM) pricing.
The structural fix is to make every one of these a priced option inside the grid itself, so selecting "tail lift" on the request adds it to the buy price and to the sell price in the same movement. Cargavo, the TMS for freight brokers, treats tail lift, ADR, ad valorem insurance, delivery appointments and custom options as grid-level lines rather than as notes typed into an email.
Do you apply your margin before or after the fuel surcharge?
Apply the margin to the fuel-inclusive buy price. On the worked example, margining €469.68 returns €572.78 and a true 18% margin; passing fuel through at cost and margining only the €412.00 line haul returns €560.12 and 16.1%. The difference is €12.66 of gross profit on one shipment.
This is the most expensive quiet decision in freight pricing, because the fuel surcharge is a real cost you pay, not a pass-through your bank forgives. Three ways of sequencing it, same file, 18% target:
| Method | Base for the margin | Sell price | Gross profit | Margin on sell |
|---|---|---|---|---|
| Margin on fuel-inclusive buy | €469.68 | €572.78 | €103.10 | 18.0% |
| Fuel passed through at cost | €412.00 | €560.12 | €90.44 | 16.1% |
| Fuel at cost, base margin raised to 20.0% | €412.00 | €572.68 | €103.00 | 18.0% |
Row one is the default: €469.68 / 0.82 = €572.78. Row two is what most spreadsheets do without anyone deciding it — the margin lands on €412.00 only, giving €502.44, then €57.68 of fuel is added at cost for €560.12. Row three exists because some contracts oblige you to show the fuel surcharge at the carrier's published percentage; if you accept that, the base margin has to be raised to 20.0% for the shipment to still return 18.0% overall.
Note that all three rows are defensible commercially. What is not defensible is not knowing which one your team used on which customer.
There is a second reason to keep fuel as a separate indexed component rather than baking it into the rates: index periods change. If your grid stores the base rate plus a surcharge percentage, updating one number re-prices every lane. If it stores fuel-inclusive rates, every index change means re-importing every grid from every carrier — and the gap between the index change and the re-import is quoted at the old fuel level. The mechanics of indexation are set out in the fuel surcharge glossary entry.
Cargavo, the TMS for freight brokers, keeps the indexed surcharge as its own component of the buy price and applies margin rules after it, which is row one of the table above.
How do you set a minimum margin that a quote cannot go below?
Express the floor as max(percentage, absolute amount) rather than as a percentage alone. With a floor of max(15%, €45.00), a €90.00 buy sells at €135.00 instead of €105.88, because 15% of the sell price is only €15.88 — less than the cost of handling the file.
A target margin is what you aim for; a floor margin is what the quote is not allowed to go below, whoever is under pressure. They are different settings and both are needed.
A percentage floor on its own fails at the two ends of the range. Work through it with a floor of 15%:
- Small file, €90.00 buy. The percentage floor gives €90.00 / 0.85 = €105.88 and €15.88 of gross profit — you have processed a quote, a booking, a CMR and an invoice for less than the cost of the paperwork.
- Large file, €1,200.00 buy. The percentage floor gives €1,200.00 / 0.85 = €1,411.76 and €211.76 of gross profit, which is sound. Here the percentage works and no absolute floor is needed.
Writing the rule as max(15%, €45.00 of gross profit) fixes the small end without touching the large one. The €90.00 buy now sells at €135.00, a 33.3% margin that simply reflects the fixed cost of opening a file. The €1,200.00 buy is unaffected, because €211.76 already clears €45.00.
Three refinements are worth configuring once and then leaving alone:
- Set the floor per customer, not globally. A strategic account with 40 shipments a month and a spot enquiry from a stranger do not deserve the same protection.
- Set it per bracket where the grid is wide. A percentage that is right on a 100 kg groupage consignment prices you out of a full truck; absolute margins usually govern the top brackets. The trade-off is worked through in the guide on percentage versus fixed margin rules.
- Decide who may go below it, and record it. A floor nobody can override becomes a floor everybody works around by quoting outside the system.
In Cargavo, the TMS for freight brokers, margin rules live in the customer configuration and the grid configuration, so the floor applies to every quote for that customer without anyone remembering it exists.
How do you apply margins to carrier rates automatically?
Configure the rule once — percentage or absolute, per customer, per grid or per weight bracket — and let the server apply it to every quote. Cargavo computes the buy price and the sell price with the same engine, the buy price never reaches the browser, and each quote carries a Q-YYYY-NNNN reference.
Automating margin is not about calculating faster. It is about removing the moment where a human decides a percentage at 6 pm on a Friday.
Four properties make an automated margin trustworthy:
- One engine for both sides. The buy price is the calculation run without margins; the sell price is the same calculation run with them. Two separate implementations drift within months, and the divergence surfaces as unexplained gross profit variance.
- Rules attached to entities, not to people. A margin belongs to a customer, a grid or a bracket. A new hire quoting on day one gets the same price as the owner, because the knowledge is in the configuration rather than in someone's head.
- Server-side computation. The price that counts is recalculated on the server, and the customer portal receives a sell price and nothing else — the buy rate and the margin are never sent to the browser, which is a structural guarantee rather than an interface choice. See the guide on showing a price without revealing your buy rate.
- A reference on every price. Each quote carries a Q-YYYY-NNNN number and each accepted quote becomes a shipment numbered S-YYYY-NNNN, so a margin question six weeks later is answered from the record rather than from an inbox.
Two practical details. Percentage margins are currency-neutral across the seven currencies supported — EUR, USD, GBP, CHF, CAD, MAD, PLN — while absolute margins are stored with their currency and must be set per currency. And when no grid covers the lane, the request should still enter the same pipeline and be priced manually rather than disappearing into email: see quoting without a rate grid.
Be clear about the boundary. Cargavo, the TMS for freight brokers, is not accounting software and does not audit carrier invoices: it enforces the margin you quoted, and it has no view of what the carrier eventually billed. It also has no carrier API or EDI connectivity, is not a freight exchange and is not a fleet or dispatch system. Plans are €49, €149 and €399 per month with a 14-day free trial and no credit card — see the pricing page.
Frequently asked questions
Which costs are most often missing from a freight quote?
The ones the carrier invoices after delivery: tail lift, waiting time beyond the free period, timed delivery, ADR handling, ad valorem insurance, and the fuel surcharge of the current index period. On the €504.68 example in this guide, a forgotten €35.00 tail lift and €60.00 of waiting time cut gross profit from €110.78 to €15.78 — an 18% file that actually returned 2.6%.
What is the formula to calculate a freight sell price from a buy rate?
The sell price is p/(1-m), where p is the total buy price including fuel surcharge and accessorials, and m is the target margin as a decimal. A buy price of €504.68 at an 18% target margin gives €504.68 / 0.82 = €615.46. Multiplying by 1.18 instead is a markup and returns only a 15.3% margin.
Should the fuel surcharge be included before applying the margin?
Applying the margin to the fuel-inclusive buy price is the safest default, because the fuel surcharge is a cost you actually pay. On a €412.00 line haul with a 14.0% surcharge, margining the €469.68 total at 18% gives €572.78, while passing fuel through at cost gives €560.12 and only a 16.1% margin.
What is a good gross margin for a freight broker?
There is no universal figure, and any single number quoted as a benchmark ignores lane mix, shipment size and service level. What is measurable is whether a floor exists and holds: define a floor as max(percentage, absolute amount), apply it per customer, and re-price twenty past shipments to find out how often it was breached.
How do I stop my team from underquoting freight?
Move the margin decision out of the quoting moment and into the configuration. When percentage or absolute rules are attached to the customer, the grid and the weight bracket, and the server recalculates the price on every quote, there is no step at which a rate can be sent that the rules did not produce.
Related guides
- Digital Freight Quoting: The Complete Guide to Automating Freight Quote Requests
- How to Turn an Excel Rate Sheet Into Instant Freight Quotes
- Freight Quote Turnaround Time: From Hours to Seconds, Step by Step