Percentage or Fixed Margin? Freight Margin Rules That Hold

Written by Martin Nivel · Founder of Cargavo Updated 10 min read

A percentage margin scales with the carrier buy rate; a fixed margin adds the same amount whatever the shipment costs. Percentage protects full loads. Fixed protects small consignments, where a percentage returns too little to be worth booking. The two rules cross at exactly one buy price: p* = f × (1 - m) / m. Cargavo, the TMS for freight brokers, applies whichever rule you configured — per bracket, per grid or per customer — server-side.

What is the difference between a percentage margin and a fixed margin?

A percentage margin is a share of the sell price and grows with the carrier buy rate: sell = p/(1-m). A fixed margin adds a constant amount: sell = p + f. Percentage keeps the margin rate stable across shipment sizes; fixed keeps the euro amount stable and lets the rate collapse as buy prices rise.

Every margin rule in road freight brokerage is one of two shapes. Cargavo, the TMS for freight brokers, names them percent and absolute, because those are the only two things a pricing engine can do to a buy price it has just read out of a rate grid.

Percent takes a target margin m, expressed as a share of what the customer pays, and returns p / (1 - m). Absolute takes a fixed amount f in the grid's currency and returns p + f. Both are trivial. What is not trivial is that they behave in opposite directions as the shipment gets bigger.

Rule typeEngine tokenFormulaSell on €120.00 buySell on €1,800.00 buyMargin obtained
Percentagepercentp / (1 - m)€146.34€2,195.1218.0% and 18.0%
Fixed amountabsolutep + f€145.00€1,825.0017.2% and 1.4%

Both columns use m = 18% and f = €25.00. On the small shipment the two rules are €1.34 apart and either is defensible. On the full load they are €370.12 apart, and the fixed rule has quietly reduced your margin from 17.2% to 1.4% on the same lane, with the same customer, under the same contract.

That divergence is the whole decision. A percentage rule assumes your commercial risk scales with the value of the movement — more money at stake on a €1,800.00 load than on a €120.00 one, so more margin. A fixed rule assumes your cost of producing the quote and running the file is roughly constant — the same booking, the same tracking, the same invoice, whatever is on the trailer. Neither assumption is true across the whole range, which is why brokers end up needing both.

If the margin-versus-markup arithmetic itself is what you are after, that is covered in detail in margin-safe freight quoting. This guide assumes you already know the formula and asks the next question: which rule, at which level, and where the two collide.

How do you convert a markup percentage into a margin percentage?

Use m = k / (1 + k) to turn a markup k into a margin m, and k = m / (1 - m) to go the other way. A 20% markup is a 16.7% margin. A 20% margin needs a 25% markup. The gap widens with every point: a 50% markup is only a 33.3% margin.

The sell-price formula falls out of the definition of margin. Margin is a share of the sell price, so s = p + m·s. Move the margin term left: s - m·s = p, factor it: s(1 - m) = p, and divide: s = p / (1 - m). That is why the divisor is 1 - m and never 1 + m. Markup, by contrast, is a share of the buy price, so s = p × (1 + k).

Two directions, two tables. First, what a markup actually delivers as margin, on a €500.00 carrier buy price:

Markup on buyMultiplierSell priceMargin amountGross margin
10%1.100€550.00€50.009.1%
15%1.150€575.00€75.0013.0%
20%1.200€600.00€100.0016.7%
25%1.250€625.00€125.0020.0%
33.3%1.333€666.67€166.6725.0%
50%1.500€750.00€250.0033.3%

Now the direction that matters when you configure a grid, because a margin target is what management sets and a divisor is what the engine needs:

Target marginDivisor 1 - mSell on €500.00 buyEquivalent markup
10%0.90€555.5611.1%
15%0.85€588.2417.6%
18%0.82€609.7622.0%
20%0.80€625.0025.0%
25%0.75€666.6733.3%
30%0.70€714.2942.9%

Read the two tables together and the practical consequence appears: a team that "adds 20%" in a spreadsheet and reports "20% margin" to the owner is overstating gross margin by 3.3 points on every file. Across a year of quoting that is not a rounding difference, it is a wrong picture of which lanes are worth defending. Configure the target as a margin, store the rule as a margin, and let the engine derive the multiplier — see also the markup vs margin definition and the freight margin calculator.

One detail that catches people out when they move from a spreadsheet to a pricing engine: the equivalence only holds if both rules are applied to the same base. If your spreadsheet adds the markup to the linehaul and then adds the fuel surcharge on top, while the engine applies the margin to a buy price that already includes fuel, the two will disagree on every quote by the margin on the surcharge — and neither is wrong, they are answering different questions. Decide which base is yours, write it down next to the percentage, and check any rebuilt grid against it before you trust the first quote it produces.

When is a fixed margin better than a percentage on freight quotes?

A fixed margin is better on small shipments, where a percentage returns too few euros to cover the work of booking the file. On a €38.00 buy, 18% returns €8.34. A fixed €20.00 returns €20.00 and a 34.5% margin. Above roughly €150.00 of buy price the logic reverses.

Take a 45 kg groupage consignment on a short regional lane. The grid returns a buy price of €38.00, minimum charge included. Apply an 18% margin: 38.00 / 0.82 = €46.34, of which €8.34 is yours. That file still needs a quote, a booking with the carrier, a pickup confirmation, a delivery check and an invoice line. Suppose you have decided that any booked shipment must contribute at least €20.00 towards running the brokerage — a number you set, not a market figure. The percentage rule misses it by €11.66; a fixed €20.00 rule sells at €58.00 and returns a 34.5% margin.

Now run the same fixed rule up the size range and watch it fail:

Carrier buySell at 18% marginSell at fixed €20.00Margin, percentage ruleMargin, fixed rule
€38.00€46.34€58.00€8.34€20.00
€91.11€111.11€111.11€20.00€20.00
€260.00€317.07€280.00€57.07€20.00
€2,400.00€2,926.83€2,420.00€526.83€20.00

The last row is the one that ends brokerages: a €2,400.00 full load sold for €2,420.00, a margin rate of 0.8%, produced by a rule that looked perfectly reasonable when it was written for parcels. Nobody decided to do that. A rule that was correct in one part of the range was left running over the whole range.

So the honest answer to "percentage or fixed" is: fixed below a buy-price threshold, percentage above it. The useful question is where the threshold sits, and that is not a matter of taste — it is a single arithmetic point, worked out in the next section. Note that the same reasoning applies to accessorials priced as a flat amount, and to minimum charges inside the grid itself; if your carrier tariff already carries a minimum charge, your fixed margin sits on top of it, not instead of it. The four grid shapes that produce these buy prices are set out in the four types of freight rate grids.

At what buy price do a percentage margin and a fixed margin give the same sell price?

At p* = f × (1 - m) / m. With a fixed margin f = €25.00 and a target margin m = 18%, p* = 25.00 × 0.82 / 0.18 = €113.89, and both rules return €138.89. Below p* the fixed amount pays more; above p*, the percentage does.

Set the two margin amounts equal. The percentage rule yields a margin of p·m/(1 - m); the fixed rule yields f. Equate them and solve for p:

f = p·m / (1 - m)p* = f × (1 - m) / m

Worked end to end with f = €25.00 and m = 18%: p* = 25.00 × 0.82 / 0.18 = 20.50 / 0.18 = €113.89. Check both rules at that buy price. Percentage: 113.89 / 0.82 = €138.89. Fixed: 113.89 + 25.00 = €138.89. Identical, as designed. One euro of buy price below it, the fixed rule pays more; one euro above, the percentage does.

Fixed amount fTarget margin mCrossover buy p*Sell at crossoverBetter below p*Better above p*
€15.0015%€85.00€100.00FixedPercentage
€25.0018%€113.89€138.89FixedPercentage
€25.0020%€100.00€125.00FixedPercentage
€40.0020%€160.00€200.00FixedPercentage
€50.0025%€150.00€200.00FixedPercentage
€60.0030%€140.00€200.00FixedPercentage

Two things fall out of this table that are worth having in your head. First, raising the target margin lowers the crossover: at f = €25.00, moving from 18% to 20% drags p* from €113.89 down to €100.00, so the percentage rule takes over earlier. Second, the crossover moves proportionally with f — double the fixed amount and you double the buy price at which it stops being generous.

Use p* as the boundary of your rule, not a round number picked in a meeting. If you have written "fixed €25.00 up to 300 kg, then 18%", translate the weight boundary into a buy price on the grid concerned and compare it with €113.89. If the 300 kg cell buys at €96.00, the fixed rule is still the right one there and your boundary is roughly in the right place. If it buys at €240.00, you are leaving €27.68 on every one of those shipments — 240.00 / 0.82 - (240.00 + 25.00) = 292.68 - 265.00 — for no reason at all.

Should the margin rule sit on the bracket, the grid or the customer?

All three, with a fixed precedence: bracket beats grid, grid beats customer, customer beats the organisation default. The most specific rule that matches the quote wins, and exactly one rule is applied. Without a stated precedence order, two rules match the same quote and the price depends on which one the code found first.

A margin rule is not one number, it is a number plus a scope. Cargavo, a TMS for freight brokers, lets a percent or absolute rule be attached at four levels, and resolves them most-specific-first so that a quote is always priced by exactly one rule.

ScopeSet onTypical ruleUse it forBeats
BracketA weight or LDM band in one gridabsolute €25.00Small consignments below p*Grid, customer, default
GridOne carrier tariffpercent 18%A carrier you buy well onCustomer, default
CustomerOne shipper accountpercent 12%Negotiated volume accountsDefault
OrganisationThe whole brokeragepercent 20%Anything not covered aboveNothing

The order matters more than the values. Consider a volume customer on 12% who ships a 60 kg consignment on a grid whose first bracket carries an absolute €25.00 rule. Bracket-first resolution charges buy + €25.00. Customer-first resolution charges buy / 0.88 — on a €42.00 buy, €47.73, a margin of €5.73 on a file that costs you a booking. Both answers are arithmetically correct. Only one of them is the rule you meant, and the difference only becomes visible once you write the precedence down.

Two practical consequences. First, a customer-level discount should be expressed as a lower percentage, not as a percentage that silently overrides your small-shipment protection — keep the bracket rule above it in the order. Second, when you negotiate an account, negotiate the level as well as the number: "12% on our grids" and "12% on everything" are different commitments, and the second one hands your small-shipment margin away.

Record the scope alongside the value in whatever you use to price. If the answer to "why did this quote come out at €138.89" cannot be given as "the bracket rule on grid X, absolute €25.00", the rule is not really configured — it lives in someone's memory. The grid side of this is covered in carrier rate grid management, and the wider set of pricing decisions in the rate grids and pricing resources.

Why does mixing percentage and fixed margins produce inconsistent prices?

Because the two rules grow at different speeds, a generous fixed amount on a low bracket can price above a percentage on the bracket above it. A 480 kg shipment then sells for €156.00 while 600 kg sells for €143.90 — the price goes down as the shipment gets bigger, and the customer notices.

This is the failure mode nobody expects, so here it is in full. One weight-zone grid, one zone, two adjacent brackets, two different margin rules — each of which was sensible when it was written.

Weight bracketCarrier buyMargin ruleSell priceMargin obtained
100–299 kg€68.00absolute €60.00€128.0046.9%
300–499 kg€96.00absolute €60.00€156.0038.5%
500–999 kg€118.00percent 18%€143.9018.0%
1,000–1,999 kg€162.00percent 18%€197.5618.0%

Quote 480 kg: €156.00. Quote 600 kg: €143.90. The heavier shipment is €12.10 cheaper. Your customer adds one pallet to an order and the freight price falls; the next time they ship 480 kg they ask why, and now you are explaining your margin structure to the person who pays it. Worse, a rep who spots it will "fix" the 480 kg quote by hand, and the fix will never make it back into the grid.

The cause is structural, not clerical: p + f and p / (1 - m) are two straight lines with different slopes and different intercepts, so they cross. Chaining them across bracket boundaries without checking the crossing point breaks the one invariant a freight tariff must satisfy — the sell price must never decrease as the shipment gets larger.

Three ways to hold the invariant. One: after any margin change, price the last kilogram of each bracket and the first kilogram of the next, and confirm the second is not lower. Four brackets means three comparisons; it takes two minutes. Two: put the switch from absolute to percent at the crossover p* rather than at a bracket boundary chosen for other reasons. Three: express the rule as max(p + f, p / (1 - m)) instead of choosing one per bracket. The maximum of two increasing functions is itself increasing, so that formulation cannot invert — it applies the fixed floor on small shipments and the percentage on large ones automatically, with no boundary to maintain. The risk-management view of that floor is in margin-safe freight quoting.

How do you make sure the right margin rule is applied on every quote?

Apply it on the server, not in the document. The engine reads the buy price from the grid, resolves the rule by scope, computes the sell price, and stores both against the quote reference. A rep can then discount deliberately, but cannot forget the margin or type the wrong divisor.

A margin rule written in a procedure is applied on a good day. A margin rule written in the pricing engine is applied on every quote, including the one sent at 18:40 on a Friday by whoever was still there. In Cargavo, the TMS for freight brokers, the buy price and the sell price are computed by the same engine — buy without margins, sell with them — so the two can never drift apart, and the customer-facing price is recalculated server-side rather than trusted from the browser.

What that gives you operationally is an answerable quote. Each quote carries a reference in the form Q-YYYY-NNNN, and when it is accepted the resulting shipment carries S-YYYY-NNNN. Against that reference sit the grid used, the buy price, the rule that fired and its scope, and the resulting margin — stored in a private financial record that customer-role accounts cannot read, in any of the seven supported currencies (EUR, USD, GBP, CHF, CAD, MAD, PLN). The customer sees one number. You can reconstruct how it was built, six months later, without asking anyone what they remember. On keeping buy prices structurally invisible rather than merely hidden, see how to show a price without revealing your buy rate.

What to check when you change a margin rule

  • Whether the change was expressed as a margin or a markup — a 5-point "increase" in the wrong unit is not the increase you approved.
  • Whether any bracket boundary now inverts, using the last-kilogram / first-kilogram test from the previous section.
  • Whether the fixed amounts are still on the correct side of p* = f × (1 - m) / m for the grids they sit on.
  • Whether customer-level rules still sit below bracket-level rules in the precedence order.
  • Whether the fuel surcharge is inside the buy price the margin is applied to, so the margin rate you report is the one you actually earn.

Run that list whenever a carrier reissues a tariff — which for most road freight contracts is at least annually, plus every fuel index revision. Cargavo has no carrier API or EDI connection and does not fetch rates for you: you rebuild the tariff yourself from Excel or CSV, and the five checks above are what turns a new file into a grid you can quote from. Plans start at €49/month, with a 14-day free trial and no credit card required — the full breakdown is on the pricing page.

Frequently asked questions

Should a freight broker use a percentage margin or a fixed amount?

Use a fixed amount on small shipments and a percentage above them. A percentage margin of 18% on a €38.00 carrier buy returns only €8.34, which rarely covers the work of booking and invoicing the file. On a €2,400.00 full load, a fixed €20.00 returns a margin rate of 0.8%, which is worse still.

How do you convert a 20% markup into a margin percentage?

A markup k becomes a margin with m = k / (1 + k), so a 20% markup is a 16.7% margin. Going the other way, k = m / (1 - m), so a 20% margin requires a 25% markup. On a €500.00 buy price, a 20% markup sells at €600.00 while a 20% margin sells at €625.00.

At what buy price does a fixed margin become worse than a percentage?

At the crossover point p* = f × (1 - m) / m. With a fixed margin of €25.00 and a target margin of 18%, the crossover is €113.89 of carrier buy price, where both rules return a sell price of €138.89. Above that buy price the percentage rule earns more, below it the fixed amount does.

Can you apply different margin rules to different weight brackets?

Yes, and it is often the right structure, provided the brackets are checked for price inversions afterwards. Cargavo supports percent and absolute margins per weight bracket, per grid and per customer, resolved most-specific-first so exactly one rule applies to each quote.

Why did my customer’s price go down when the shipment got heavier?

Because two different margin rules meet at a bracket boundary and cross. A fixed €60.00 margin on a €96.00 buy sells at €156.00, while an 18% margin on the next bracket’s €118.00 buy sells at €143.90. The fix is to test the last kilogram of each bracket against the first kilogram of the next after every margin change.

Does the customer see which margin rule was applied to their quote?

No. In Cargavo the buy price, the margin rule and the resulting margin are stored in a private financial record attached to the quote reference Q-YYYY-NNNN, which customer-role accounts cannot read. The customer portal shows only the sell price in the quote currency.

Related guides

More guides on this topic — Rate grids & pricing