Fuel Surcharge Billed Wrong: How to Check a Carrier Invoice Against the Rate Confirmation
The short answer: do not argue about the total. Recompute the fuel surcharge yourself from the basis written on the rate confirmation, then compare that
NexaSphere Team
Author

The short answer: do not argue about the total. Recompute the fuel surcharge yourself from the basis written on the rate confirmation, then compare that number to the invoice line. A fuel surcharge is arithmetic, not opinion, and once you have the four inputs (the structure, the index price, the index week, and the mileage or linehaul it multiplies), a wrong invoice becomes a one line dispute instead of a phone call.
Most gaps I have seen come from a short list of causes: the invoice used a different index week than the rate confirmation specified, it used a national average where the agreement named a regional one, it applied a percentage to the all in rate instead of linehaul only, it multiplied a per mile surcharge by a different mileage than the one that was quoted, or it billed a table based surcharge on top of a flat amount that was already confirmed. None of those require a forensic audit. They require ten minutes and a spreadsheet.
Here is how to do that properly, and then how to make it run itself.
Pull the documents before you touch the math
You need six things, and skipping any one of them turns the check into guesswork:
- Every revision of the rate confirmation, not just the last one you happen to have in your inbox. Disputes often come down to someone matching an invoice against rev 1 while the carrier billed rev 3.
- The invoice, with the fuel line broken out. If fuel is buried inside a single total, that is the first thing to ask for.
- The fuel surcharge schedule or tariff language the rate confirmation points to. If it points to nothing, that fact is itself your argument.
- The published diesel price for the relevant week. The U.S. Energy Information Administration publishes a weekly retail on highway diesel price, national and by region, released Mondays (Tuesday when Monday is a federal holiday). It is free, it is downloadable, and it is the index most surcharge formulas reference.
- The mileage report, including which routing engine and which version produced it, and whether it is practical or shortest miles.
- The bill of lading and delivery receipt, for the actual pickup and delivery timestamps.
Identify which structure you actually agreed to
Fuel surcharges show up in four common shapes, and the dispute usually dies right here because the two sides are computing different shapes.
All in. The rate confirmation states one number and says fuel is included. Any separate fuel line on the invoice is a billing error, full stop.
Flat amount. A fixed dollar figure per load, stated on the confirmation. Easy to check, easy to double bill by accident when a system also applies a table.
Cents per mile. The classic truckload structure. The surcharge per mile is derived from the published diesel price minus a base or peg price, divided by an assumed miles per gallon. Both the peg and the MPG assumption are negotiated terms, not universal constants, so read them off your own schedule rather than from memory.
Percentage of linehaul. Common in less than truckload. The percentage comes from a published table keyed to the diesel price. The word that matters is linehaul. A percentage applied to linehaul plus accessorials is a different and larger number.
Recompute the number
Write the expected value out explicitly rather than eyeballing it. The structure of the calculation is small enough to hold in one function, and having it as code means you can replay it against any load later.
from decimal import Decimal, ROUND_HALF_UP
def expected_fsc(structure, *, diesel_price=None, peg=None, mpg=None,
miles=None, linehaul=None, flat=None, pct=None):
if structure == "all_in":
return Decimal("0.00")
if structure == "flat":
return money(flat)
if structure == "cpm":
per_mile = max(Decimal("0"), (diesel_price - peg) / mpg)
return money(per_mile * miles)
if structure == "pct_linehaul":
return money(linehaul * pct)
raise ValueError(f"unknown structure: {structure}")
def money(x):
return Decimal(x).quantize(Decimal("0.01"), rounding=ROUND_HALF_UP)
Then compare against the invoiced amount with a tolerance. A one or two dollar gap on a long haul is rounding and is not worth anyone's time. A gap that scales with distance is a formula disagreement, and a gap that is a clean multiple of something is usually a double bill.
The failure modes worth checking first
Wrong index week. Surcharge schedules usually specify the price published on the Monday before a particular date, effective for a defined week. Whether that anchor date is pickup or delivery is a term, and a load that picks up Friday and delivers Tuesday can legitimately fall in either week depending on what the schedule says. If your confirmation is silent, that silence is the bug.
Wrong index region. National average and regional averages diverge, sometimes meaningfully. If the schedule names a region, a national figure is simply the wrong input.
Base applied too broadly. Percentage surcharges belong on linehaul. Watch for them landing on detention, stop offs, lumper fees, or the invoice total.
Miles. This is the quiet one. Practical versus shortest miles, ZIP to ZIP versus actual stop addresses, loaded miles versus loaded plus deadhead, and different versions of the same routing engine all produce different totals for the identical lane. If your confirmation does not name the engine, the version, and the miles type, you have no defensible mileage number, and neither does the carrier.
Stacking. A flat fuel amount on the confirmation plus a table driven surcharge from the billing system is a real and common duplicate.
Write the dispute so that approving it is boring
The goal is to make paying you the path of least resistance. A short note that contains the load number, the exact clause from the rate confirmation with its revision and timestamp, the published index price with its source and week, the arithmetic in one line, the invoiced amount, the variance, and the specific remedy you want (corrected invoice or credit memo) gets settled. A note that says the fuel looks high does not.
Keep the whole packet attached. Also keep an eye on time limits: freight charge and overcharge actions for motor carriers carry a statutory limitation period under federal law, and your own contract almost certainly sets a shorter window for disputing an invoice. Read the contract, and get counsel involved before anything becomes a claim.
Automate it, but never let the model do the arithmetic
If you are processing more than a handful of loads, the right architecture is a strict split. Use a language model for extraction only: pull structured fields out of the rate confirmation PDF and the invoice PDF into a fixed schema, with the surcharge structure as an enumerated value and every dollar figure as a string you parse yourself. Then compute in code, against an index table you ingested from the source rather than from the model's memory.
Three rules make this hold up:
- Store the raw documents and the extracted fields side by side. When a dispute goes sideways, you need to show the clause, not your summary of it.
- Fail loudly on anything ambiguous. If the structure cannot be determined, if the schedule is not referenced, or if the mileage basis is missing, that load goes to a human queue. It does not get a guessed default.
- Snapshot the index. Store the diesel price you used, its region, its publication date, and where you fetched it. Recomputing a two year old load against today's table proves nothing.
Extraction is probabilistic and improving. Arithmetic is not, and it should never be delegated.
FAQ
Is the fuel surcharge negotiable? Yes. It is a contract term like any other. The peg price, the MPG assumption, the index, the region, and the anchor date are all negotiated. Treat a schedule you were handed as a starting position, not as physics.
The rate confirmation does not mention fuel at all. Who wins? Generally, a confirmed all in rate with no fuel language is exactly that, and a separate fuel line is unsupported. Practically, fix the template before the next load rather than relitigating this one.
Which diesel price should I use if my schedule is vague? Ask for the schedule in writing before the next load moves. For the load in front of you, compute it both ways, show both results, and let the size of the gap decide whether it is worth pursuing.
Is a small variance worth disputing? One load, no. A recurring pattern across a lane, absolutely, because you are not disputing a number, you are fixing a formula. The value is in every load after this one.
Early access
The gap between delivered and invoiced
We are building the weekly check described above, so delivered loads, accessorials and missing documents surface before month end rather than during it. Early access is open and we are talking to brokers about what it has to do.
Early access. No card, no launch date promised.
Related Posts
Detention and Lumper Accessorials: How to Audit a Carrier Invoice Line by Line
September 14, 2026
Guard Hours to Invoice: Turning a Weekly Timesheet Into a Client-Ready Bill Without Rekeying
September 14, 2026
How to Reconcile a Carrier Invoice to a Rate Confirmation Without Missing Accessorials
September 14, 2026