Carrier invoice auditing, automated

Audit your carrier invoices and recover overcharges.

Facto recalculates every line of every carrier invoice against your contract, flags what you were overcharged, and prepares the claim. No sampling. No spreadsheets. No guesswork.

100% of lines checked Deterministic — not AI guesswork Any carrier, any format
facto · reconcile · GLS_May2026.xls
Live reconciliation scanning…
Overcharges found €0.00
Works with every carrier invoice GLS DHL DPD SEUR CTT UPS Correos
The problem

Carriers bill you thousands of lines a month. You check none of them.

Carrier invoices run to thousands of lines. Verifying each against your contract by hand is impossible, so overcharges go straight through to payment — month after month.

01

Wrong weight brackets

A 10kg parcel billed at the 15kg rate. Volumetric weight inflated by a few centimetres. Small per-line errors that repeat across every invoice.

02

Uncontracted charges

Services and surcharges that were never in your agreement, applied quietly and paid automatically because nobody catches them.

03

No time to verify

Your team pays on time to avoid disputes. Manual checks cover a handful of lines at best. The rest is trust — and trust costs money.

How it works

Audit. Claim. Recover.

Facto turns your signed contract into a rate engine, then runs every invoice line through it. Three steps, fully automatic.

01

Audit

Upload your contract once. Facto extracts the rate card, then recalculates the expected cost of every invoice line — weight, zone, service, surcharge — and compares it to what you were charged.

expected€5.16
charged€5.31
delta+€0.15
statusOVERCHARGED
02

Claim

Every flagged line is grouped into a claim, with the contract reference and exact delta attached. Facto drafts the dispute, ready to send to your carrier.

03

Recover

Track every claim from sent to credited. Facto watches the next invoice to confirm the correction actually lands — and flags it if the same error repeats.

submitted€1,789.35
credited€1,789.35
recurring?monitored
statusRECOVERED
The product

Open any invoice. See every flagged line.

Not a summary you have to trust — the full line-level breakdown, with the exact rule that fired and the money attached to it.

facto · audit
InvoiceLinesStatus
GLS · Apr7,204Clean
GLS · May7,594Issues
DPD · May3,118Issues
SEUR · May1,902Clean
GLS — May 2026
15,489 lines · €105,472.25 invoiced
Lines
15,489
Clean
13,149
Flagged
2,340
Recoverable
€1,789
ReferenceZoneBilledExp.Flag
1261118762NAC€5.31€5.16 bracket +€0.15
1264906217PRV€4.42€3.92 bracket +€0.50
1261030013NAC€5.89 no contract rate
1260893530NAC€14.16€14.16 OK
1264881042NAC€7.12€6.75 bracket +€0.37
Under the hood

Multiple checks on every single line.

Each invoice line passes through a full battery of deterministic checks. Every flag is traceable to a contract clause and a euro figure.

Weight brackets

Catches lines pushed into a higher weight bracket than your contract allows.

Volumetric weight

Recomputes L×W×H volume and checks it against the carrier's stated figure.

Box dimensions

Matches declared dimensions to your real packaging and flags inflation.

Duplicates

Finds the same shipment billed twice, within an invoice or across months.

Zone accuracy

Verifies the billed zone matches the destination postcode.

Uncontracted services

Flags service codes and surcharges with no agreed rate in your contract.

Surcharge logic

Checks fuel and energy surcharges are applied at the published, uniform rate.

Recurring errors

Watches whether a corrected error reappears on the next invoice.

Why it's trustworthy

Math, not a model's best guess.

Reconciliation runs on a deterministic engine. The same invoice always produces the same result — every flag is reproducible and defensible in front of your carrier.

AI handles the messy parts it's actually good at: reading the contract PDF into a structured rate card, and drafting the claim. The arithmetic that decides what you're owed is pure code.

# expected rate, line by line
def expected_rate(line, rate_card):
  w = max(line.weight,
      ceil(l*w*h / 4000))
  rate = rate_card[origin][svc][zone]
  return rate.for_weight(w)

# compare vs charged
delta = charged - expected
status = "OVERCHARGED" if delta > 0
     else "OK"

Send us one invoice.
We'll show you what it's hiding.

Upload a recent carrier invoice and your contract. We'll return a full line-level audit — free.