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


Editorial illustration of a parcel in the center connected to a rate table, a dimensional measurement frame, a destination zone map, and surcharge symbols, with a red warning marker highlighting possible billing discrepancies.

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:

  1. Wrong rate bracket  a 4.8 kg parcel billed in the 5–10 kg bracket
  2. Volumetric weight applied with the wrong divisor  or applied when the contract excludes it for certain services
  3. Outdated fuel surcharge percentage  the index changed, the invoice didn't
  4. Surcharges your contract caps or excludes  billed anyway, line by line
  5. Duplicate billing  the same tracking number invoiced twice across billing cycles
  6. 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


Editorial process diagram with five connected stages for manually verifying courier invoices: billing document, contract rate table, calculator or rules check, side-by-side comparison, and final discrepancy report.


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


Split editorial illustration comparing manual courier invoice checking, with papers, spreadsheet tables, calculator, magnifying glass and red discrepancy marks, to automated verification showing document upload, a rules engine and an organized discrepancy report.


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:

  1. Ingestion  parse the carrier's billing file; where only PDF exists, extract the line data reliably
  2. Rules engine  your contract encoded as data: brackets, zones, divisors, surcharges, validity dates
  3. Comparison  every line recomputed and matched, with tolerance thresholds you define
  4. Report  discrepancies grouped by type and amount, ready for the dispute email
  5. 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.