3PL Warehouse Invoice Audit: Checking Storage, Handling and Pick-and-Pack Fees Against the Rate Card
A third-party logistics warehouse bills you every month for storing, receiving and shipping your goods, and almost every number on that invoice comes from a system you do not run. The rates are in your agreement. The quantities are in the warehouse’s reports. This post explains how to pair the two and audit a 3PL invoice line by line before it is paid.
In brief
- A 3PL invoice is a set of quantities multiplied by rates: the rates come from the warehouse agreement, the quantities from the warehouse’s own activity data.
- Storage, receiving, outbound fulfillment and value-added services each need their own evidence, so the audit pairs every invoice line with a report, not only with the rate card.
- Storage is where most of the money sits and where the definitions matter: per pallet, per bin or per cubic foot, billed on a snapshot date or on the anniversary of receipt.
- An outbound order is billed once, with a first-unit fee and an additional-unit fee, so the order count on the invoice must equal the shipped orders in the period.
What a 3PL invoice actually bills
Whether the warehouse handles pallets for a distributor or individual orders for an online store, the invoice is built the same way: a charge type, a quantity, a rate and an amount. The charge types fall into a small number of families. Storage pays for space, measured per pallet position, per bin or shelf, or per cubic foot. Inbound handling pays for receiving, usually per pallet, per carton or per unit, sometimes with a separate fee for unloading a floor-loaded container. Outbound fulfillment pays for picking, packing and shipping, typically a fee per order plus a smaller fee per additional unit in the order.
Around those sit the value-added services: kitting, labeling, returns processing, cycle counts and special projects, each billed per unit or per hour. Packaging materials such as boxes, mailers and dunnage may be billed per piece. And many agreements carry a monthly minimum, a floor the warehouse bills when your activity in the period is worth less than that amount. Freight to your customers often appears on the same invoice or a separate one, and it follows its own audit, the one described in parcel invoice audit.
The rate card and the activity report are the source of truth
Every line on the invoice has two halves, and each half has a different source. The rate, the unit and the billing method come from the warehouse agreement and its rate card. The quantity comes from the warehouse management system: the inventory on hand, the receipts posted, the orders shipped. An audit that only checks the rate against the agreement catches price errors and misses every quantity error, which is where most of the money goes.
4
documents per audit: agreement, invoice, inventory snapshot, activity report
4
charge families: storage, inbound, outbound, value-added services
2
storage methods to tell apart: snapshot and anniversary
So the first step is to ask for the reports behind the invoice, every period, as a condition of payment. Most warehouse systems can export them: a storage snapshot listing each pallet or location on hand on the billing date, a receiving log with dates and counts, and a shipped order report with order numbers and units. With these, each line on the invoice can be recomputed independently.
| Charge | Rate and unit from | Quantity from |
|---|---|---|
| Storage | Agreement: unit and billing method | Inventory snapshot or receipt dates |
| Receiving | Rate card: per pallet, carton or unit | Receiving log |
| Outbound orders | Rate card: first unit and additional unit | Shipped order report |
| Value-added services | Rate card: per unit or per hour | Signed work order |
| Monthly minimum | Agreement: floor amount | Sum of the period’s activity charges |
Storage: where the definitions decide the bill
Storage is usually the largest recurring line and the hardest to check, because the same inventory can be billed in different ways. Under snapshot billing, the warehouse counts what is on hand on a fixed day, for example the first of the month, and bills the full period for each pallet. A pallet received on the second and shipped on the thirtieth is never billed; a pallet received on the thirtieth is billed for the whole next month. Under anniversary billing, each pallet is billed for every full period from its own receipt date, which follows the goods more closely and is harder to recompute by hand.
The agreement has to state the method, and the audit has to use the same one. With snapshot billing, the billed quantity should equal the count in the snapshot report for that date. With anniversary billing, the billed quantity should equal the pallets whose receipt date started a new period in the billing month. Either way, check the unit as well. A pallet that is billed as two positions because it is oversized, or a bin billed as a pallet, is a quantity error even when the count of items is right. Mixed pallets that were consolidated during the month should drop the positions they freed up.
Handling and fulfillment: counting orders and units
Inbound charges are checked against the receiving log: pallets or cartons received in the period, at the receiving rate. A container unloaded by hand may carry a separate unloading fee, which should match the containers in the log, not the pallets. Outbound fulfillment needs two numbers. The order fee multiplies the count of shipped orders, so it should equal the orders in the shipped order report, once each. The additional-unit fee applies to every unit after the first in each order, so its quantity should equal total units shipped minus total orders shipped.
Packaging is the quiet line. If you supply your own boxes, the warehouse should not bill packaging materials for those orders. Returns are another: a returned order is usually billed a returns processing fee, not a second outbound order. Value-added services are checked against the work orders you approved, with the units or hours they state. A charge with no work order behind it is a charge to dispute, however small, because it tends to repeat every month once it is paid once.
Where 3PL invoices go wrong
The exceptions are rarely fraud. They come from configuration: a storage method set up differently from the contract, a rate that was renegotiated in the agreement but not in the warehouse’s billing system, a minimum that is applied automatically even in months when activity exceeded it, or a work order billed twice because two shifts both logged it. Repeated charges across invoices also happen, and the near-match duplicate checks used for vendor invoices apply here as well.
Storage quantity above the snapshot
Rate differs from the agreement
Orders billed above shipped orders
Value-added service without work order
Minimum applied when activity exceeded it
Packaging billed on customer-supplied boxes
A rate difference is easy to see once the rate card is in the same table as the invoice. A quantity difference needs the report, which is why the request for reports comes first. And a minimum applied in error is only visible once the activity charges are summed and compared to the floor: if activity exceeded it, the minimum line should not appear at all.
Reconcile one billing period, end to end
Take one period and one warehouse. Extract the agreement terms once, then each month extract the invoice lines and the activity totals, and run every line through the same checks. The example below shows a September invoice with three findings: storage billed for more pallets than the snapshot held, an additional-unit rate above the agreement, and a kitting line without a work order.
{ "agreement": { "storage": { "unit": "pallet", "method": "snapshot", "snapshot_day": 1, "rate": 18.50 }, "receiving": { "unit": "pallet", "rate": 9.00 }, "outbound": { "per_order": 2.75, "per_additional_unit": 0.45 }, "monthly_minimum": 2500.00 }, "activity": { "period": "2026-09", "snapshot_pallets": 212, "pallets_received": 64, "orders_shipped": 3180, "units_shipped": 5210 }, "invoice": { "invoice_number": "WH-EXAMPLE-0926", "period": "2026-09", "lines": [ { "code": "storage", "quantity": 231, "rate": 18.50, "amount": 4273.50 }, { "code": "receiving", "quantity": 64, "rate": 9.00, "amount": 576.00 }, { "code": "outbound_order", "quantity": 3180, "rate": 2.75, "amount": 8745.00 }, { "code": "outbound_additional_unit", "quantity": 2030, "rate": 0.50, "amount": 1015.00 }, { "code": "kitting", "quantity": 120, "rate": 1.25, "amount": 150.00 } ] }, "checks": [ { "rule": "storage_quantity_equals_snapshot", "result": "fail", "expected_quantity": 212, "billed_quantity": 231 }, { "rule": "receiving_quantity_equals_log", "result": "pass" }, { "rule": "orders_equal_shipped_orders", "result": "pass" }, { "rule": "additional_units_equal_units_minus_orders", "result": "pass" }, { "rule": "rate_equals_agreement", "result": "fail", "line": "outbound_additional_unit", "expected_rate": 0.45, "billed_rate": 0.50 }, { "rule": "service_has_work_order", "result": "fail", "line": "kitting" } ], "decision": "short_pay_and_dispute", "approved_amount": 14156.50}The approved amount is the invoice recomputed from the evidence: storage at the snapshot quantity, the additional units at the agreed rate, and the kitting line held until a work order is produced. The difference goes back to the warehouse as a dispute with the report lines attached, which makes it a question of data rather than opinion. The same structure feeds month-end: if the dispute is still open at close, the approved amount is what you accrue, as in a GRNI accrual.
Rates and quantities are two audits
Before you automate: a short checklist
- Keep each warehouse agreement in fields: units, rates, storage method, snapshot day and monthly minimum.
- Make the storage snapshot, receiving log and shipped order report a condition of payment.
- Recompute storage from the snapshot or receipt dates, using the method and unit the agreement states.
- Check that billed orders equal shipped orders and that additional units equal units minus orders.
- Compare every rate on the invoice with the current rate card, including recent renegotiations.
- Hold value-added services and special projects until they match an approved work order.
- Drop the monthly minimum when activity charges for the period already exceed it.
- Send disputes with the report lines attached, and accrue the approved amount at month-end.
Where extraction fits
The checks are arithmetic and lookups. The work is getting the documents into fields: invoices arrive as PDFs in each warehouse’s own layout, agreements as long contracts with rate tables in an appendix, and activity reports as CSV or XLSX exports with columns that change between providers. Define the fields once in an extraction template, with quantities and rates as decimals, amounts as currency and periods as dates, as covered in designing extraction schemas. Parser extracts invoices, contracts and logistics documents into structured JSON, Excel or CSV against that template, through upload, email or the API, so every invoice line sits next to its rate and its quantity, and your team spends its time on the exceptions, not on retyping warehouse reports.