Before the session I wrote that the person who negotiated your carrier contract and the person who approves the invoices are rarely the same person: one knows what shipping should cost, while the other sees a file with thousands of lines and a payment date. On 23 September, Pieter Schalk and I sat between the two and ran a carrier invoice through nShift Audit live, from the raw file to a dispute with the evidence attached.

Pieter opened with a story from earlier in his career: the paper invoices on his desk stacked up to half a meter every two weeks. Most invoices arrive as files now, with more lines than any team can read, so we spent the session checking all of them.

Watch Solved Episode 5 on demand

The full audit, from upload to dispute, run live in the platform. Watch the full session.

Key takeaways in one glance

  • A freight invoice has no purchase order to match against, so the check has to use the contract and the record of what actually shipped. nShift Audit runs seven checks on every line, after an integrity check when the invoice is read in.
  • The AI read a 312-line PDF in a format it had never seen, with no template. A person confirms the first invoice in a new format; later invoices in that format process on their own.
  • You decide what is worth a dispute. Tolerances and pre-accepted surcharges keep small, expected deviations out of the queue, and a person decides on the rest.
  • The dispute went out with the evidence attached while the invoice itself was cleared for payment.
  • The same invoice data shows your shipping profile: cost per kilogram, which surcharges you pay and how often, and the outliers worth a closer look.
  • You do not need to book every shipment through nShift to start. The more contract and shipment data you connect, the more of the checks can run.

The setup: eight carriers and a spreadsheet

We ran the session through Weather Warriors, the fictional company that has appeared in earlier Solved episodes. This time they are a mid-sized manufacturer and distributor across Europe, with eight carriers under contract and freight spend rising as the business grows. All the data on screen was fictional too, anonymized from real-life scenarios.

Their audit process today is a spreadsheet. Someone takes the highest invoice lines, checks them against the contract documents and rate cards, and does it in whatever time the month-end close leaves. Errors surface late, if at all. The team has a gut feeling that not every invoice is right, but building a dispute invoice by invoice takes more time than they have, so the cost gets absorbed.

That matches what Pieter and I have heard from customers and prospects over the last months. Published freight audit benchmarks put recoverable overcharges at 3 to 7% of freight spend. The Journal of Commerce shipper benchmark study found that one in five freight invoices is inaccurate. And nShift research with more than 120 companies found that roughly three in four check their invoices by hand or not at all. Some customers told us plainly that the work is heavy and the yield feels low, so they do not touch the invoice.

Some nShift customers hold up to 500,000 rate lines per carrier in the system. Some ask us to process CSV files of 60,000 to 80,000 lines. One customer with less than EUR 10 million in freight spend receives a 168-page PDF from a single carrier every week. Finding the anomalies in that by hand is very difficult.

Pieter described the relationship between shippers and carriers like this:

"It's a bit of a marriage between our customers, the merchants and the carriers. And in the marriage, you have to work together."

That only works when both sides measure against the same, correct data. I added that reading the invoice quickly is only part of the job: you also have to interpret the rate card and the contract correctly before you can call a line wrong.

What needs to be in place first

My pre-session post covered the checklist, and Pieter walked through it again live: contracted rates set up so the platform can predict what each shipment should cost, bookings that carry that predicted rate, and delivery events for time-critical shipments. Delivery events can also show when an invoice arrives before the shipment is delivered.

You do not have to book through nShift to use Audit. Shipments booked elsewhere can come in through the Shipment Data API. Without contracted rates, the price checks have nothing to compare against, so you start with fewer checks and add the rest as the rate cards go in.

Reading the invoice, first time, no template

Pieter started in the settings, because the first question people ask is whether the tool will flag every cent. You set the tolerances yourself, based on your contract and your shipping profile. Some teams do not want deviations under EUR 5, or EUR 2.50, in the queue at all, and some surcharges can be approved automatically.

Then he uploaded a PDF invoice in a format the system had not processed before. It came back with 312 lines. The screen showed the original PDF on the left and the same invoice as structured data on the right. The first invoice line alone split into four charges: freight, fuel, handling and a regional surcharge. A person confirms that the first invoice in a new format has been read correctly. After that, invoices in the same format can arrive automatically by email, FTP or API.

nShift Audit Validate Extraction screen with the original carrier invoice PDF on the left and the extracted charge lines on the right

The first invoice in a new format: the original PDF on the left, each charge line as structured data on the right. Demo data.

A double bill, a missing delivery and a EUR 30 question

In an earlier job I worked in procurement, and invoice control there always came back to the three-way match: purchase order, goods receipt, invoice. So I asked Pieter whether Audit works the same way.

It does not work the same way, because parcel, pallet and postal freight at volume comes without purchase orders. As the invoice is read in, Audit checks its integrity: VAT, taxes, and whether the lines add up. Then every line runs through seven checks: whether the shipment exists in your shipping data, whether it was already billed on an earlier invoice, whether it was delivered, whether it met the agreed service level, whether the billed weight and volume match what shipped, whether the price matches the contracted rate, and whether each surcharge is one you should be paying.

nShift Audit Review Deviations screen listing flagged invoice lines by amount, with the invoice compared to the shipment record and the seven audit checks

Flagged lines ranked by amount. The panel on the right sets the invoice against the shipment record and shows which of the seven checks failed. Demo data.

On the demo invoice, that produced 41 issues. 36 were price deviations, and two lines referred to shipments that did not exist in the shipment data. Pieter sorted by deviation size so the largest amounts came first, and walked through four types.

  • Double invoicing. The AI had found the same shipment billed on an earlier invoice. The next step is to check which of the two charges was the mistake.
  • Delivery status. An invoice line for a shipment with no delivered event in the tracking data. Either the tracking data is incomplete, or the line was billed before delivery, and you want to know which before you pay.
  • Valid shipment. An invoice line with no shipment record behind it. In this case, a colleague in marketing had booked a shipment directly in the carrier's online portal. Pieter accepted the line, and the count dropped from 41 to 40.
  • Price. The platform predicted EUR 120. The invoice said EUR 150. All the surcharges were mapped correctly, so the open question was whether the prediction or the invoiced rate was wrong. That one needs a person to look at the contract.

Every one of those four needed a person to look at it. The software finds each deviation and explains it, and someone who knows the business decides what it means.

Disputing the lines, paying the invoice

The invoice now carried EUR 2,606 in open issues. Pieter disputed the flagged lines and cleared the invoice for payment, so the account with the carrier stays in good standing while those lines are worked out.

The platform then built the dispute from the 40 remaining issues: the original invoice, the evidence for each disputed line and the line details, ready to send to the carrier's account manager. When I said that beats tossing an email over the fence, Pieter replied:

"Until here, it is the merchant truth. It's not the carrier truth."

The carrier has its own view, and the tool is built for that conversation. The carrier might accept the first ten lines and give a reason for rejecting the rest, and the exchange stays in one thread on that invoice. When the credit invoice arrives, you settle the dispute and close it.

nShift Audit Draft Dispute screen with the dispute email preview, total disputed amount and attached original invoice and evidence

The dispute, drafted from the flagged lines with the original invoice and the evidence attached. Demo data.

Weather Warriors now had line-level detail on every charge and a dispute ready to send, with the evidence included. As I said on the day, you may not want to dispute two or three cents. A surcharge of 40 cents, repeated across enough shipments, adds up to real money.

Reading your shipping profile from the invoice data

I also asked Pieter what the invoices can tell you about your shipping profile over time.

He moved to the invoice explorer, loaded with five invoices from one carrier. Even that small sample gave an average cost of EUR 1.85 per kilogram, the services in use, spend per month and the countries that matter most.

In rehearsal I had said that one picture says more than a thousand words, and the surcharge view is the picture I meant.

nShift Audit Invoice Explorer charge code breakdown, a block chart of charge types sized by share of total spend

Charge types across five invoices, each block sized by its share of total spend. Demo data.

Fuel surcharges are hard to negotiate in the current economic climate. In the demo data, surcharges for large parcels came to EUR 5,887. Shippers and carriers often disagree about what counts as a large parcel, and a parcel can grow between your warehouse and the carrier's scanner. "It's like living material," Pieter said, "but you can quantify it here." The explorer shows how often it happens, and what it costs.

Pieter then opened the outlier view. The platform compares each line with your usual profile and flags what does not fit. One example was a shipment where the freight price was modest, but a surcharge came in higher than the freight itself. If certain product groups keep triggering a surcharge, you can price it into what you charge your own customers, so you stop losing margin on that cost.

Pieter also showed nShift Companion, the AI assistant that already works across other nShift products, now inside Audit too. You can ask it questions about your invoice data, and it helps find the right data sets and work with them. I called it AI helping AI. Pieter's addition: helping the customer, in the end.

The questions you asked

Here are the questions we answered live. We will answer the rest alongside the recording. (We have kept attendees anonymous.)

Does the audit look up the net freight cost in the rate card, and how much work is the setup?
Yes. nShift sets the rate card up with you, surcharges included. Pieter has seen rate cards arrive as Excel files with more than 25 tabs, so the effort depends on the contract.

Does nShift get negotiated prices directly from carriers through an API, or from the customer's ERP?
There are three routes. Prices can come from the carrier's API. Your rates can be loaded into nShift's own rate engine, which many customers prefer. And if you book outside nShift, you can upload the prices you have calculated yourself along with the shipment data.

How detailed can a rate card be?
In Pieter's words, "crazy detail." One customer runs around half a million rate lines covering 25 countries, six service levels, around ten options and, for a pallet carrier, weight classes up to 5,000 kilograms. Pieter has not yet seen a rate card the system could not handle, and the carrier's rate API is there as a backup.

Can Companion compare rates between different customers' carrier agreements?
No. All data stays within the customer's own domain.

If you run your own fleet, can you add those costs?
Yes, if you know the cost breakdown of your fleet. Give us the cost model and it can go in.

If you only do one thing from this session

Pull up last month's largest carrier invoice and count the lines someone actually checked, against the contract and against the shipment that ran. Those two numbers show how much of the invoice you are paying on trust.

Parcels are often measured and weighed again on the sorting belt, so what you ship and what you are billed for can drift apart. Checking every line against both the contract and the shipment is how a discrepancy becomes recovered cost.

Watch the full session on demand: Solved Episode 5: The invoice nobody checks. For the seven ways carrier invoices go wrong and a sample audit you can run on your own invoices, get the freight invoice audit guide. And if you want to see what the audit finds in your own invoices, book a demo and bring a recent one.

Luc Altorf

About the author

Luc Altorf

Delivery Management Expert, nShift

Luc Altorf works on ecommerce and parcel logistics at nShift, where he built the company's partner ecosystem. He studied logistics and supply chain management, spent his early career in procurement and operations, and has worked in delivery technology since 2019.

Read more from this author  →