If your business ships in volume, your courier invoices almost certainly contain errors. Not because carriers act in bad faith — but because their billing runs on rate cards, surcharges, volumetric rules and zone tables that change often and get applied automatically. When the automation on their side meets a contract negotiated on your side, discrepancies appear. And unless someone checks, you pay them.
This guide covers how courier billing actually works, how to verify an invoice against your contract by hand, where manual checking breaks down, and what the realistic options are when it does.
Why courier invoices contain errors

A courier invoice line is not a single price. It is the output of several variables applied together:
- Base rate determined by weight bracket, destination zone and service level
- Volumetric weight carriers bill the greater of actual weight and dimensional weight, calculated with a divisor that varies by carrier and contract
- Surcharges fuel (updated weekly or monthly), remote area, residential delivery, oversize, handling, customs presentation
- Contract-specific conditions negotiated discounts, minimums per shipment, caps on certain surcharges
Each variable is a place where the carrier's billing system and your contract can disagree. The most common discrepancies we see in practice:
- Wrong rate bracket a 4.8 kg parcel billed in the 5–10 kg bracket
- Volumetric weight applied with the wrong divisor or applied when the contract excludes it for certain services
- Outdated fuel surcharge percentage the index changed, the invoice didn't
- Surcharges your contract caps or excludes billed anyway, line by line
- Duplicate billing the same tracking number invoiced twice across billing cycles
- Zone misclassification a destination billed as remote area when it isn't on the carrier's own current list
Individually these are cents or a few euros. Across hundreds of lines per billing cycle, they quietly erode shipping margin — and they only ever err in one direction often enough to matter.
What checking an invoice manually actually involves

Verifying a courier invoice properly means reconstructing, for every line, what the price should have been — then comparing. Here is the process, step by step.
Step 1: Get the invoice data in usable form
A PDF invoice is unworkable at volume. Ask your carrier for the billing data in CSV or Excel — every major carrier provides this, usually from the same portal where invoices are downloaded. You need, per shipment: tracking number, date, destination, declared weight, billed weight, service, base charge, and each surcharge as a separate column.
If the carrier only provides PDF, that alone is a signal you'll eventually need extraction tooling — more on that below.
Step 2: Build your contract as a rate table
Your contract is a document; to check against it, you need it as data. Build a spreadsheet with:
- Weight brackets × zones × service levels, with your negotiated rate in each cell
- The volumetric divisor that applies to each service
- Each surcharge: amount or percentage, what triggers it, and any cap or exclusion you negotiated
- Validity dates rates change, and you must check each invoice against the rates valid on the shipment date, not today's
This step is tedious and it is also where most internal checking projects quietly die. Do it once, properly, and keep it versioned.
Step 3: Recompute each line
For each shipment: determine the correct billable weight (max of actual and volumetric), find the rate in your table for that weight, zone and service, then add the surcharges your contract actually allows, at the rates valid on that date. Compare the result with the billed amount.
In a spreadsheet this means lookup formulas keyed on weight bracket and zone, plus conditional logic for each surcharge. It works up to a point.
Step 4: Classify discrepancies before disputing
Not every difference is a billing error. Separate them:
- Data discrepancies the carrier's measured weight differs from your declared weight. The carrier may be right: their sorting hubs weigh and measure automatically. Dispute only with evidence
- Rule discrepancies correct data, wrong rate or surcharge applied. These are the disputable ones
- Contract ambiguities the contract genuinely doesn't say. Flag them for the next negotiation rather than the dispute queue
Step 5: Dispute within the window
Carrier contracts typically set a deadline for billing disputes often 30 to 90 days from invoice date. A discrepancy found after the window is a lesson, not a refund. This is the strongest argument for checking before payment, every cycle, rather than auditing occasionally.
Where manual checking breaks down

The process above is sound. The problem is arithmetic: a few hundred lines per cycle, each needing a rate lookup, a volumetric calculation and several surcharge checks, against a contract that changes a few times a year. In practice that means 2–3 hours per billing cycle of concentrated, error-prone work done by someone who has other responsibilities and in most companies it degrades into spot-checking a sample, which catches the anomalies you happen to sample and misses the systematic ones.
Systematic errors are precisely the expensive kind: a wrong fuel percentage or a misapplied volumetric divisor doesn't appear on one line. It appears on every line, every cycle, until someone reconstructs the full calculation.
Your realistic options
Spot-checking a sample. Free, better than nothing, blind to systematic errors. Reasonable only at low shipping volume.
A serious spreadsheet. Lookup tables plus formulas can fully check an invoice if the billing data arrives clean in CSV and one person maintains the rate tables. The fragility is operational: the formula logic lives in one file that only its author understands a different version of the same risk. (We've written about where critical spreadsheets turn into operational risk.)
Freight audit services. Specialist firms audit invoices for a percentage of recovered amounts. Viable at high volume; the trade-offs are sharing your shipping and contract data with a third party, and a commercial model that rewards finding refunds rather than preventing errors.
A custom verification tool. A small piece of software that reads the carrier's file (CSV, or PDF where that's all you get), applies your contract rules, and produces a discrepancy report before payment. The contract logic is encoded once, transparently; rate updates become a settings change rather than formula surgery; and every line gets checked, every cycle.
What automation looks like in practice
This is a problem we've solved in production. A high-volume shipping operation was checking courier invoices line by line against their contract hours per billing cycle, with errors typically surfacing only after payment. We built a browser-based tool: upload the courier document, it reads every line, applies the contract logic, and produces a discrepancy report in about two minutes. The client updates the rate tables themselves when the contract changes. You can read the full case here.
The general shape of such a tool:
- Ingestion parse the carrier's billing file; where only PDF exists, extract the line data reliably
- Rules engine your contract encoded as data: brackets, zones, divisors, surcharges, validity dates
- Comparison every line recomputed and matched, with tolerance thresholds you define
- Report discrepancies grouped by type and amount, ready for the dispute email
- Self-service maintenance rate changes editable by your team, no developer needed for updates
None of this requires replacing your ERP or adopting a new platform. It sits beside the tools you already use and removes one specific manual job.
When it's worth automating and when it isn't
A rough rule of thumb: if checking takes more than an hour per cycle, or if you've found even one systematic error in the past year, automation usually pays for itself within months. If you ship a few dozen parcels a month on a simple rate card, a well-built spreadsheet is probably enough — and we'll tell you so.
If you're unsure which side you're on, that's exactly the question our fixed-price Workflow Audit answers: we analyse your current checking process, quantify the hours and the exposure, and give you a written report with realistic costs and ROI before you commit to building anything.
Frequently asked questions
How common are courier billing errors?
Common enough that a freight audit industry exists around them. The honest answer for your invoices: you don't know until a full cycle is checked line by line. One complete audit of a recent invoice is the cheapest way to size your exposure.
Can't I just trust the carrier's invoice?
The carrier's billing is automated and mostly correct against their current standard tables. Errors concentrate where your negotiated contract differs from their defaults: custom discounts, surcharge caps, excluded fees. The more you negotiated, the more there is to verify.
My carrier only sends PDF invoices. Is automation still possible?
Yes. Reliable line-level extraction from PDF invoices is a solved problem with the right tooling, and can run entirely on your own infrastructure — no invoice data sent to external cloud services.
What data do I need to start checking?
Three things: the billing data per shipment (ideally CSV), your contract with rate tables and surcharge conditions, and your own shipment records (declared weights and dimensions) for disputing measurement discrepancies.
Does this apply to pallet freight and forwarders too?
The structure is identical rates by weight/zone/service plus surcharges and freight typically adds more variables (pallet classes, minimums, accessorials), which makes verification harder by hand and more valuable to automate.
Have a courier invoice process that eats hours every cycle? Describe it to me or start with a fixed-price Workflow Audit.
