← Freight accessorial invoice auditor
A partial review only ever finds what you already suspected. You open the invoice, look at the detention line that caught your eye, and never see the liftgate that was billed twice — because retyping every line into a spreadsheet is not worth an afternoon, so nobody does it.
The auditor now takes the carrier's own export. Load the file, confirm the columns, type your accessorial rates once, and the whole invoice is checked at once. The file is read inside your browser and never uploaded.
Invoice Number, PRO Number,
Charge Code, and Charge Amount are matched
automatically, and every guess is shown in a dropdown you can correct.CODE, amount per line, from the rate confirmation. This is
the half the carrier's file cannot supply.Six lines exported from a carrier portal:
Invoice Number,PRO Number,Charge Code,Charge Amount INV-4471,PRO-77120,LINEHAUL,912.40 INV-4471,PRO-77120,FUEL,187.30 INV-4471,PRO-77120,LIFT,125.00 INV-4471,PRO-77120,LIFT,125.00 INV-4471,PRO-77120,DET,300.00 INV-4471,PRO-77120,RESI,45.00
…and a three-line rate card from the confirmation:
LIFT, 75 DET, 75 RESI, 45
With only import lines whose code is in my rate card ticked, line haul and fuel are skipped — and the page says so rather than quietly dropping them. That leaves 4 accessorial lines totalling $595.00, of which $325.00 is above the rate card across 3 flagged lines:
| Line | Billed | Rate card | Above | Flag |
|---|---|---|---|---|
| LIFT | $125.00 | $75.00 | $50.00 | Over expected |
| LIFT | $125.00 | $75.00 | $50.00 | Over expected, possible duplicate |
| DET | $300.00 | $75.00 | $225.00 | Over expected |
| RESI | $45.00 | $45.00 | $0.00 | — |
Those figures are recomputed from the same code the page runs, by a test that fails if this write-up and the tool ever disagree.
see attached, a blank cell — is imported as-is and
flagged as an invalid billed amount. A dropped line in an audit reads as
"nothing wrong here", which is worse than refusing to import it.
Commas, spaces, colons, and equals signs all work, so a block pasted out of
a confirmation usually needs no editing. Lines starting with
# are ignored. A line that is not a code and an amount is
reported back to you rather than skipped:
# LTL accessorials, 2026 confirmation LIFT, 75 DET 75 RESI: $45.00 LUMPER = 90
Detention, storage, driver assist, and reweigh are rarely a single number. They are a rate per unit, usually past a free allowance and often under a cap — and they are the lines most worth checking, because the quantity is the part carriers and shippers disagree about. Write the rule the way the confirmation states it:
DET 65/hr after 2 hours, max 325 STO $40 per day after 1 day REWEIGH 4.50/cwt min 45 DRIVER ASSIST 35/hour, not to exceed 140 SORT 1.25/piece
Units understood are hour, minute, day, cwt, pallet, piece, mile, stop, and
unit. Order does not matter: max 325 after 2 reads the same as
after 2, max 325. The rate-card box reads every per-unit rule
back to you in its own words, so you can see the allowance was understood
as an allowance rather than folded into the rate.
A per-unit rule needs a quantity column mapped — hours, days, or weight. Map it in the same step where you map the amount column; headings like Detention Hours, Storage Days, and Billed Weight are guessed for you. If the quantity is in minutes and the rate is per hour, that one conversion is done and stated on the line. Any other mismatch — pallets against a per-hundredweight rate — is refused rather than guessed.
On a line billed $300.00 for detention with
5 hours on dock, against
DET 65/hr after 2 hours, max 325, the expected amount is
$195.00 and the line shows $105.00 above
the rate card. The review queue, the CSV, and the dispute draft all carry
the reason — 3 hours past 2 free × $65.00/hour — because a credit
request that quotes the contract term is something the carrier's rating
desk can check, and a bare expected figure is not.
If a per-unit code has no quantity, the line imports with the expected amount blank and the reason shown. It is never priced at zero: a $0.00 expectation would report the whole billed line as recoverable, which is a much more expensive kind of wrong than a gap you can see.
Complementary to the multi-line accessorial auditor (the review queue itself), the detention clock (one line against dock time), fuel percent versus linehaul, and who holds the cash (eat it, bill the customer, or review for a credit). This page is only about getting a whole invoice into the queue.
Export the invoice from the carrier portal or your TMS as CSV, load it into the auditor, confirm the guessed columns, and type your accessorial contract rates once as CODE, amount lines. Every imported line is then compared against your rate card. On a six-line example invoice, skipping line haul and fuel leaves four accessorial lines totalling $595.00, of which $325.00 is above the rate card — including a $125.00 liftgate billed twice.
No. The file is read inside your browser with the standard local file reader. There is no server, no account, no cookie, and no analytics vendor. Closing the tab discards everything you loaded.
It will not — a carrier invoice states what it billed, never what you expected. That is what the rate card is for: type each accessorial code and its contracted amount once and the importer applies it to every matching line. Lines whose code is not in your rate card still import and are still checked for duplicates, missing codes, and unreadable amounts.
Import the whole invoice rather than the lines you already suspect. A line repeating the same invoice, reference, code, and amount is flagged as a possible duplicate, with no rate card needed. Double-billed accessorials are the finding a partial review misses, because nobody retypes the lines they are not already suspicious of.