Guide
How to audit a 3PL warehouse invoice against your rate card
Warehouse invoices are long, itemized and mostly correct. The errors that cost money hide in a few lines: a rate that was never updated, a fee nobody agreed to, a line billed twice. This is the method behind WarehouseBillCheck.
1. Build the rate card CSV
Copy the agreed rates from the contract or the latest signed rate sheet into one row per rule: rule_id, fee_code, billing_unit, rate, currency, description. Use the same fee codes the 3PL prints on its invoices. Start from the rate card template.
- One currency per rate card. Rates may have up to 6 decimal places (
0.0125per parcel is fine). - If a fee has a different rate per unit (per pallet and per carton), make one row for each unit.
- Keep old rate cards: when a dispute turns out to be an outdated card, load the corrected one and re-test the same invoice.
2. Export the itemized invoice
Ask your 3PL for the line-level detail behind the invoice total as CSV, or export it from their portal. You need line_id, fee_code, billing_unit, quantity and amount; rate, invoice_number, service_date, description and currency are used when present. See the invoice template.
3. Match fee code and billing unit
A line is priced by the rule with the same fee code (case does not matter) and the same billing unit. Units are normalized only for common spellings: ea, unit and pcs are each; plt is pallet; hr is hour; pallet per month and plt/mo are pallet/month. A fee code on the card with a different unit is a unit mismatch, not a match.
4. Recompute quantity × rate exactly
Expected amount = quantity × agreed rate, computed with exact decimals and rounded once to cents, half away from zero. For example 1,431 parcels × $0.0125 = $17.8875, which rounds to $17.89. Spreadsheets using floating point can disagree by a cent; WarehouseBillCheck shows each calculation so you can check it by hand.
- Rate mismatch
- The invoice prints a rate other than the agreed one: 1,200 pallets at $2.75 instead of $2.40 is $420.00 overbilled.
- Amount mismatch
- The billed amount is not quantity × agreed rate, whatever rate the invoice printed.
- Invoice math error
- The invoice’s own quantity × rate is not its amount (1,430 × $0.60 is $858.00, not $868.00).
5. Duplicate line IDs, not duplicate descriptions
A real duplicate charge is the same invoice line billed twice: the same line_id appears more than once. Lines that merely share a description (“Labeling”, “Unit picks”) are normal, because the same service is performed many times a month, so they are never flagged on their own. Repeat occurrences of a line ID are totaled separately.
6. Unknown charges and ambiguous rules
- Unknown charge: the fee code is not on the rate card at all, such as a rush fee nobody agreed to. Ask the 3PL where it is in the contract.
- Ambiguous rate rule: two rate card rows price the same fee code and unit at different rates. Fix the rate card; an audit should never pick one silently.
- Malformed rows: missing values, a wrong number of columns or numbers such as
1Oor1.200,50. They are flagged and not priced.
7. Audit checklist
- Rate card is the version in force for the invoice period
- Fee codes and units on the card match the ones the 3PL prints
- Every rate mismatch and amount mismatch has a credit request or an explanation
- Every unknown charge is traced to a contract clause or disputed
- Repeated line IDs are confirmed as real repeat services or credited
- Malformed rows are re-exported or checked by hand
Audit your invoice Try the demo
WarehouseBillCheck audits the files you give it. It does not read your contract, so it cannot tell whether a fee code itself is allowed; it tells you which lines do not match your rate card.