Freight Invoice Audit: AI Checks Carrier Bills Against Quotes

Coding Liquids tutorial cover featuring Sagnik Bhattacharya for Freight Invoice Audit: AI Checks Carrier Bills Against Quotes.
Coding Liquids tutorial cover featuring Sagnik Bhattacharya for Freight Invoice Audit: AI Checks Carrier Bills Against Quotes.

A forwarder can check carrier invoices against quotes with AI by turning both into tables with the same charge names, matching them line by line in a spreadsheet, and asking the model to explain every difference. A person then accepts, queries or disputes each gap.

This is the small-forwarder version of a freight audit: no outsourced service, no software to buy, just your quote, the carrier's bill and an hour a week. The model reads and explains; the spreadsheet does the arithmetic; you decide what to pay.

Follow me on Instagram@sagnikteaches

Fix the quote first, or there is nothing to compare against

An invoice can only be wrong against something firm. If your quotes are a single total in an email, the audit starts by making them lines. Before you touch AI, change the quote template so each shipment quote lists the same charges in the same order, with a status for each.

Connect on LinkedInSagnik Bhattacharya
  1. Base charge (ocean, air or road freight), with the unit: per container, per kilogram of chargeable weight, per cubic metre or per pallet.
  2. Fuel or bunker adjustment: fixed amount, percentage or "at carrier's published rate for the sailing week".
  3. Origin and destination handling charges.
  4. Documentation and release fees.
  5. Inland haulage or collection and delivery, and any equipment fee such as a chassis.
  6. Seasonal or congestion surcharges: "included", "excluded" or "if applied, at cost".
  7. Time-based charges (free days, detention, demurrage, waiting time): the free period and the daily rate.
  8. Quote validity: the date range for which the quote holds.

Give each charge a short code (for example OCEAN, FUEL, THC-O, THC-D, DOCS, HAUL, EQUIP, PEAK, DET) that you will use everywhere. Codes are what make a lookup work. If your carriers' rate sheets arrive as PDFs, extracting carrier rates from PDFs with AI shows how to land them in the same structure.

Subscribe on YouTube@sagnikteaches

Turn the invoice into a table you can trust

Invoices arrive in every shape: tidy PDFs, scans, spreadsheets, even emails with the charges typed in the body. Ask the model for the same fixed output every time, so the next step never changes.

Extract every charge line from the attached carrier invoice into a table with these
columns: invoice_number, shipment_ref, invoice_date, currency, charge_description,
charge_code, quantity, unit, unit_rate, amount.

Rules:
- Use only these charge codes: OCEAN, FUEL, THC-O, THC-D, DOCS, HAUL, EQUIP, PEAK,
  DET, DEM, OTHER. Use OTHER for anything else and keep the carrier's wording in
  charge_description.
- Copy numbers exactly as printed. Do not round or convert currency.
- After the table, state the invoice total as printed, the sum of your amount column
  and whether they match. If they do not, list the lines you are unsure about.

The last rule is the safety net. If the extracted lines add up to the printed total, a misread digit is unlikely, though two errors could cancel out. If they do not add up, the model should say where it is unsure. Even when they match, check three lines by eye.

Do the same for the quote: paste the quote email or sheet and ask for the same columns. Matching shape means a straightforward comparison.

The Complete Excel Course with AI Integration thumbnail

The Complete Excel Course with AI Integration

From formulas and pivot tables to Power Query, DAX, VBA and AI with Copilot, ChatGPT and Claude — hands-on from the first lesson.

By Sagnik Bhattacharya and Virginia Thorn, Primetime Emmy Award winner

Buy now

One container, one quote, one invoice: the main example

This is an illustration with made-up figures. A small forwarder quoted a customer for a 40-foot container, with these lines, in dollars. The carrier's invoice arrives afterwards.

CodeQuoteInvoiceDifference
OCEAN$2,800$2,800$0
FUEL (bunker adjustment)$420$465+$45
THC-O (origin handling)$180$180$0
THC-D (destination handling)$210$235+$25
DOCS$60$85+$25
HAUL (inland haulage)$350$350$0
Fuel on haulage (quoted at 8%)$28$42 (12%)+$14
PEAK (seasonal surcharge)not quoted$200+$200
DET (2 days)not quoted$150+$150
EQUIP (chassis split)not quoted$75+$75
Total$4,048$4,582+$534

The quote totals $4,048, the invoice $4,582: $534 over. Ask the model to sort the seven differences into three groups, and then check each group yourself.

  • Likely explained and verifiable ($59): the $45 bunker adjustment and the $14 haulage fuel difference. If your quote said "at carrier's published rate for the sailing week" and the carrier's notice shows the higher rate, these stand. If your quote fixed the amount, they are disputable.
  • Charge-level variances to query ($50): destination handling up $25 and documentation up $25. Check whether the quote said "at cost" and whether the carrier's tariff changed between quote and shipment.
  • Charges that were not in the quote ($425): the seasonal surcharge ($200), detention ($150) and chassis split ($75). The surcharge turns on whether it applied to this sailing and whether the quote marked it "excluded" or "at cost". Detention needs the gate-out and gate-in dates against the free days. The chassis fee needs the haulage terms.

So the amount in question is $475 (the $50 variances plus the $425 not quoted), and $59 to verify. The customer's invoice should not simply pass the difference on until you know which is right. Every line you cannot explain costs you margin or goodwill.

For the detention line, tracking free days and drafting disputes goes through the date checks.

Let the spreadsheet do the sums, and the model do the reading

With both tables in a sheet, a lookup is more reliable than asking a chat model to subtract line by line. Ask the model to write the formulas, then check them on two shipments by hand. For a sheet with the quote on one tab and the invoice on another, keyed by shipment reference plus charge code, a typical request is:

I have two tabs. "Quote" has columns A shipment_ref, B charge_code, C amount.
"Invoice" has the same columns plus D invoice_number. On a new tab "Diff", list every
unique shipment_ref + charge_code from both tabs, then show quote_amount,
invoice_amount, difference and a status column that says:
- "Match" if the difference is 0
- "Within tolerance" if the absolute difference is 2 dollars or less
- "Not quoted" if the quote amount is blank
- "Not invoiced" if the invoice amount is blank
- "Check" otherwise.
Give me formulas I can paste into Excel or Google Sheets. Explain each in one sentence.

If you want a primer on the lookup functions this relies on, using ChatGPT with Excel shows how to ask for and test them. Add a tolerance column that you control: a $2 difference caused by rounding or an exchange rate is not worth a dispute email.

Once the "Diff" tab works, the model's role returns: paste the rows marked "Check" and "Not quoted" and ask it to explain each possible cause and the evidence you would need. The answers are suggestions and a person must test them, but they save the first ten minutes on each line.

Accessorial charges: what each is, and what proves it

Accessorial charges (extras beyond the base freight) are where most differences sit. This table gives the check for each.

ChargeWhat triggers itEvidence to ask for
Fuel or bunker adjustmentFuel price movement; a published rate that changes periodicallyThe carrier's published rate for the sailing or shipping week
Peak or seasonal surchargeDemand season on a laneThe carrier's notice and its start and end dates
Terminal handlingLoading or unloading at the terminalThe tariff or the quote line marked "at cost"
Documentation or release feeIssuing, amending or releasing the paperworkThe tariff and any amendment request
Detention and demurrageEquipment or cargo held beyond the free daysGate-out, gate-in and discharge dates, free days in the contract
Chassis, pre-pull or split feesEquipment or trucking arrangementThe haulage terms and the delivery order
Redelivery or waiting timeA failed or delayed deliveryDriver notes, timestamps and the consignee's record
Re-weigh, re-class or inspectionThe carrier finds a different weight or classThe weighing ticket, photos and the declared figures
Currency adjustmentExchange rate movementThe rate used and the date

Add a column to your sheet for "evidence needed" and a second for "evidence received". A charge without evidence is a query, not a debt. Where your own shipping documents might be the source of a re-weigh dispute, cross-checking the commercial invoice against the packing list shows how to catch weight and count mismatches before the carrier does.

The dispute email: three versions for three situations

Keep disputes short, factual and tied to an invoice line. Ask the model for a template and then fill it with the real evidence yourself.

Write a short, polite email from a freight forwarder to a carrier's billing contact.
Situation: invoice [number] for shipment [ref] includes a peak-season surcharge of
$200 that was not on our quote [quote ref] dated [date], valid until [date].
Ask them to send the notice and the dates that apply, or to remove the charge.
Ask for a written reply by [date]. No accusations, no legal language, under 120 words.

A sample result (illustrative):

Subject: Invoice [number] / shipment [ref] - query on peak-season surcharge

Hello [first name],

Invoice [number] for shipment [ref] includes a peak-season surcharge of $200. This
was not on quote [quote ref], dated [date] and valid until [date].

Could you send the notice and the dates that apply to this sailing? If it does not
apply, please issue a corrected invoice. We would be grateful for a reply by [date].

Thank you,
[your name]
[company]

The other two versions you will use most are the "evidence request" (for detention, where you ask for the dates behind the charge) and the "accepted, with thanks" note (for a charge you checked and will pay, so the file shows you looked). Keep a tracker of every query: invoice number, line, amount, date sent, reply date, outcome and amount recovered. A line queried and conceded still tells you something about the carrier's quoting.

Explaining each difference: prompt and a sample answer

With the Diff tab filled in, ask the model to turn the odd rows into a work list. Paste only the rows marked "Check" or "Not quoted", with the quote terms for each charge.

Here are the rows from my Diff tab that need a decision (code, quote amount, invoice
amount, quote terms for that charge). For each row give:
1. The most likely cause, in one sentence, from this list: published rate change,
   surcharge not quoted, time-based charge, equipment or haulage fee, weight or unit
   difference, billing error, other.
2. The evidence I should ask the carrier for.
3. Whether I should pay, query or dispute, and why, based only on the quote terms.
Flag anything you cannot judge without more information. Do not state tariff rates
or rules from memory.

A sample reply for the example above (illustrative): "PEAK, $200 not quoted: surcharge not quoted. Ask for the carrier's notice and its start and end dates; your quote marked seasonal charges 'if applied, at cost', so this may be payable if the notice covers the sailing: query first. DET, $150: time-based charge. Ask for gate-out and gate-in dates and the free days on the booking; do not pay until you have counted the days. EQUIP, $75: equipment fee. Your quote does not mention a chassis split; ask which terms it comes from: dispute if absent."

The reply gives a first position, not a ruling. Pay attention to the phrase "based only on the quote terms": it stops the model from inventing a rule to justify a charge.

Air freight: when the chargeable weight is the difference

The same method works for other modes, but each has its own trap. In air freight the base charge usually depends on chargeable weight, the larger of actual weight and volumetric weight. Volumetric weight is usually length × width × height in centimetres divided by 6,000, though some carriers and express services divide by 5,000, which makes bulky cargo heavier on paper; a divisor that differs from the one you quoted on is itself a source of differences. Say a small forwarder quotes a shipment at 180 kilograms chargeable, at $3.10 a kilogram, so $558. The airline's invoice arrives at 212 kilograms, so $657.20. The difference of $99.20 is entirely the weight.

Ask the model to line up three weights: the quoted chargeable weight, the weight on the air waybill and the weight on the invoice. If the waybill agrees with the invoice, the airline re-weighed or re-measured the cargo, or the booking was made on a wrong measure. If the waybill agrees with the quote, the invoice is the odd one out. In both cases, the proof lies in the weighing ticket and the dimensions on the packing list. The check is a good reason to keep the shipping documents together in one folder per shipment.

Road freight has its own version: a pallet quoted as one space that turns out to occupy two because of overhang; a rate per pallet against a rate per linear metre. Whatever the mode, add one "unit and basis" row to your quote template so the invoice can be compared with the same measure.

A vague quote against a coded one

The audit is only as good as the quote. A before and after shows the difference.

Vague quote (before)Coded quote (after)
"Ocean freight door to door, around $4,000, plus extras."OCEAN $2,800 per 40-foot container; FUEL at carrier's published rate for the sailing week; THC-O $180; THC-D $210; DOCS $60; HAUL $350 plus fuel at 8%; PEAK excluded, at cost if applied; DET: 3 free days, then $75 a day; valid until [date]
Invoice arrives at $4,582: the customer asks what the extras are, and no one can say which are agreed.Invoice arrives at $4,582: the Diff tab lists seven differences, each with a status and the evidence needed.

It takes ten minutes more to write the second quote, and the saving appears at the first invoice. Ask the model to turn your existing quote emails into this format for the next five shipments, then compare with what you used to send.

A tracker row, filled in

For the main example, a row in the query tracker might read like this (illustrative): invoice [number]; shipment [ref]; line PEAK; amount $200; type "not quoted"; date sent [date]; evidence asked for "carrier notice and dates"; reply due [date]; outcome blank; recovered $0; owner [name]. The row tells anyone on the team what is outstanding, so the file does not depend on one person's memory. When the reply comes in, fill in the outcome and the amount recovered, and tag the cause so that the monthly summary can count it.

A weekly hour that finds the pattern

A single audit finds a handful of errors. A routine finds what repeats. A workable weekly rhythm for a forwarder handling a few dozen shipments a month:

  1. Monday, 15 minutes: gather the invoices received last week, save each as CARRIER_invoice-number.pdf and add them to the intake sheet.
  2. Tuesday, 20 minutes: extract each invoice with the fixed prompt; check the totals; paste the rows into the Invoice tab.
  3. Wednesday, 15 minutes: read the Diff tab; sort "Check" and "Not quoted" by amount; ask the model for likely causes and the evidence needed.
  4. Thursday, 10 minutes: send the queries; update the tracker.
  5. Friday, 10 minutes: note anything repeated, such as the same carrier adding the same surcharge on three shipments.

Once a month, paste the tracker and ask: "Which carrier and charge code produce the most differences? What is the average amount? How much did we recover?" A sample finding (illustrative): "Carrier C accounts for 9 of 14 unquoted charges, mostly DOCS and EQUIP, averaging $38. Recovered $190 of $520 queried." That is your agenda for the next rate conversation with that carrier: which charges it adds, how often, and what it conceded when asked.

A quick sum on whether the hour pays

An illustration, not a promise. Say a forwarder checks 50 invoices a month. In one in five (10 invoices) there is an unexplained charge averaging $120. That is $1,200 queried a month. If half is conceded or credited, $600 comes back, or $7,200 a year, for roughly five hours a month of checking (the weekly routine above, about 70 minutes, four or five times). Even at a quarter of that recovery rate, the routine covers a chat subscription many times over. The real benefit is the pattern: knowing which carriers leave charges off quotes lets you price them in or move the work.

Your own numbers will differ. The way to find out is to run the check on the last three months of invoices. Do not start with a promise; start with a count.

How the audit can mislead you

  • The silent fix. Asked to "clean" a table, a model may round a figure or merge two lines, so the sheet looks tidier than the invoice. Keep the original PDF and compare the totals every time.
  • Units that do not match. A quote per 100 kilograms against an invoice per kilogram, or a chargeable weight against an actual weight, shows as a huge difference that is only a unit. Add a unit column and a chargeable-weight check.
  • Currency drift. A quote in one currency and an invoice in another is only comparable when converted at a stated rate and date. Put the rate and its source on the sheet.
  • Stale quotes. A quote that expired before the shipment will not match a new tariff. Check the validity dates before querying.
  • Assuming every difference is the carrier's fault. Some come from your own changes: an amended booking, a late cut-off, a changed delivery address. Check your own file first.
  • Sensitive data. Invoices carry customer names, references and prices. Use a plan or setting where your content is not used for training, and remove anything the check does not need.
  • Duplicate bills. The same invoice can arrive twice, once from the carrier and once from an agent. The method in catching duplicate invoices and payment fraud with AI adds a check for it.

Making the quote and the invoice match from the start

The cheapest dispute is the one you prevent. Three small changes make the next audit shorter.

  • Ask carriers for an "all-in" quote with the charges they usually add, or a written list of what is excluded.
  • Put quote references on every booking, so a carrier invoice can name the quote it relies on.
  • Pass your own customers a clear statement of what is included, excluded and at cost, mirroring the carrier's. A shipper who knows about the possible surcharge is less likely to dispute it later.

The quote itself can be drafted faster; AI freight quoting from customer emails shows how to produce a draft from the enquiry, which you then fill with the coded lines above.

If you would like help setting up the quote template, extraction prompt and weekly sheet around your own carriers, that is what my AI implementation consultation covers, and the contact page is the way to reach me.

Questions about checking carrier bills with AI

Can AI read a carrier invoice PDF reliably?

It reads clean, text-based PDFs well and scanned or photographed ones less so. Always check the extracted table against the invoice total and a few random lines. If the lines do not sum to the invoice total, something was misread. Ask for the table first, then compare, so errors are visible before the diff.

Should the comparison be done by the model or in a spreadsheet?

Let the model extract and explain, and let a spreadsheet do the sums. Models make occasional arithmetic slips across many lines. A lookup formula that matches each charge code and subtracts the quoted amount is exact, repeatable and easy to audit. Ask the model to write the formulas rather than to calculate.

Which charges are most often unexpected?

Surcharges and extras that were not in the quote: fuel or bunker adjustments, peak-season charges, detention and demurrage, chassis or equipment fees, terminal handling, documentation fees, redelivery and waiting time. Your quote template should list each one as included, excluded or at cost, so a gap is easy to spot.

How soon must I dispute a freight bill?

Check your carrier terms and your own customer terms. Some carriers set short windows for billing disputes, and your customer may too. Dispute on the day you find the gap and keep the shipment reference, quote reference and invoice number in the subject line so the claim is easy to match.

Is a weekly check worth it for a small forwarder?

Usually, if you handle more than a few dozen invoices a month. A weekly routine of about an hour finds recurring charges that a one-off audit misses, and it gives you evidence for rate talks. If volume is tiny, a monthly check of the five largest invoices may be enough.

Further reads

Sources: Maersk's guide to air cargo chargeable weight (higher of actual and volumetric weight; 6,000 divisor, some carriers 5,000), read 5 November 2026; general freight-billing practice; the worked example uses illustrative figures only. Check your carrier terms, quote validity and published surcharge notices for the actual rules.

Want carrier bills checked without the manual grind?

On a 1:1 call we'll look at how quotes and invoices reach you, design a quote template and weekly check that fits, and decide what a person always approves before paying.

Book a 1:1 call with me