Last year a 3PL owner in the Inland Empire called me, furious. His biggest customer was disputing a $4,200 line on the monthly invoice — "pallet-day storage, March" — and wanted the full daily breakdown. The warehouse had the data buried in the WMS somewhere, but nobody could produce a clean daily ledger. The finance person spent two days pulling spreadsheets. The customer paid late, in a bad mood, and started shopping for a new 3PL the following quarter.
Here is what I told him, and what I tell every small 3PL: your customer does not leave because your forklift drivers are slow. They leave because your invoice looks like a guess. Billing is the one 3PL capability the customer sees every single month. Get it right and it is invisible. Get it wrong and it poisons everything else.
Break every charge into four buckets before you price anything
Most billing messes start at the quote stage. A salesperson promises something on a call, the contract carries a bundled price, and the WMS has no matching charge code. At month end, finance reconstructs reality from memory. That never works.
The first thing I configure in any WMS billing module is the charge-item master: every billable action gets a unique code, grouped into four categories. No code, no data, no invoice line.
Bucket one: storage. Pallet-days are the workhorse: how many pallet positions the customer occupied, multiplied by how many days. The classic dispute is the half pallet — full rate or prorated? Decide in the contract, not in the argument. My standard is position-equivalent billing, with anything under half a pallet rounded to half. For reference, FreightWaves' 2026 3PL cost guide puts ambient pallet storage in the US at roughly $10 to $25 per pallet per month, with climate-controlled running higher. Build an annual rate escalation clause into every contract, because that range moves every year.
Bucket two: handling. Receiving billed per pallet or per carton, picking billed per order with a per-unit add-on. These tie directly to WMS task records, which makes them the easiest lines to defend in a dispute. Typical US ranges: $1.50 to $3.50 for the first pick, $0.25 to $0.85 for each additional unit. One rule: never merge the per-order fee and the per-unit fee into a single code. You will need them split when the customer asks why March cost more than February.
Bucket three: value-added services. Labeling, repacking, kitting, returns inspection — billed per occurrence or per hour. This is the highest-margin bucket and also the most disputed, because most VAS starts as a phone call: "Can you rush-label those 500 cartons?" The work gets done, the system never records it, and the customer denies the charge at month end.
Bucket four: fixed fees. Monthly account management, system fees, minimums. The minimum monthly charge is a small 3PL's lifeline: a small customer consumes your customer service and your system whether they ship 50 orders or 5,000. Without a minimum, you are running a charity.
Once the four buckets exist, each charge item gets a rate, a unit of measure, and a trigger event — the specific WMS action that creates the charge. That table is your billing bible. The invoice template and the month-end automation both grow out of it.

One customer, one invoice face: the three-part template
With charge items defined, the next step is the invoice template. My rule: one template per customer. A B2B client billed on pallet-days and a small-parcel e-commerce client billed per order need invoices that look completely different. Most WMS billing modules support per-customer template binding. Twenty minutes of setup saves two hours of dispute handling every month.
I use a three-part invoice that has never failed me:
Part one: the header. Customer name, billing period, warehouse, issue date, and the total due — right at the top. The customer should see the number they owe before scrolling into detail. I also add a small "prior balance / payments received" line, which kills the "but I already paid last month" argument before it starts.
Part two: the detail, grouped by the four buckets. Storage shows pallet-days, rate, subtotal. Handling shows pallets received, orders picked, units picked. VAS lists each service with counts. Fixed fees get one line each. Every bucket carries a subtotal. Ninety percent of customer questions get answered in this section without a phone call.
Part three: adjustments and totals. Discounts, credits, and late fees sit here, separated from the fee detail — never mixed in. Then the total due and the payment deadline.
The three disputes that come up over and over, and how to kill them:
First, when does the pallet-day clock start? The customer says the freight arrived on the 3rd; you say the system did not complete putaway until the 5th. My iron rule: the WMS receiving-task completion timestamp is the single source of truth, written into the contract and footnoted on the invoice. One definition, half the disputes gone.
Second, unconfirmed value-added services. Rush labeling promised on a call, denied at billing time. My current policy: every VAS requires a work order in the WMS with customer confirmation — email or system approval — before execution. Operators are authorized to refuse work without a work order. This protects finance, and it protects the operators.
Third, rate version mismatch. Sales quoted a price in January, rates went up mid-year, finance billed the new rate, the customer argues from the old contract. The fix: every customer rate card in the WMS carries an effective date, and each invoice line references the applicable rate version. Rate changes go through the system workflow. Verbal rate changes do not exist.
A quick comparison for choosing your billing model:
| Simple bundled price | Activity-based billing | |
|---|---|---|
| Invoice line count | A dozen or so | Dozens to hundreds |
| Dispute difficulty | Low, customer gets it at a glance | High, needs detailed backup |
| Best for | Few customers, single business line | 20+ customers, mixed order profiles |
| Setup effort | Half a day | One to two weeks |
My honest advice: small 3PLs should not start with complex billing
This may offend some people: a young 3PL should not implement full activity-based billing on day one.
I have watched too many small warehouses hear a big 3PL's conference talk, come home, and build 80 charge codes. Then every operator has to scan three times and pick a charge code for each action, pick rates drop twenty percent, finance drowns in 80 codes at month end, and the customer gets a five-page invoice and calls to ask if they are being scammed.
My battle-tested sequence: under 10 customers, run a simplified model — storage by pallet-day, handling by order and by unit, VAS per occurrence, under 20 charge codes total. Past 20 customers and three business lines, then break it down finer. By then your WMS billing module is seasoned and your operators scan by habit. Granularity becomes a natural next step instead of a revolution.
Month-end automation is the last step, not the first. The order is: code the charge items, template the invoices, fix the dispute process, then automate the batch run. Many warehouses do it backwards: they buy auto-billing first, feed it messy master data, and get automatically wrong invoices — wrong at impressive speed.
Once automation is live, my month-end flow looks like this: on the 1st, the WMS batch-generates draft invoices per customer template; by the 2nd, finance reviews flagged exceptions — any customer swinging more than 20 percent gets highlighted; invoices go out on the 3rd with a 7-day dispute window. Disputes are accepted for data errors only; rate arguments go back to the contract. A 15-customer warehouse went from closing on the 20th to issuing on the 5th, and finance headcount went from two people to one part-timer.
A closing checklist for configuring WMS billing:
- Charge items split into the four buckets, every action with a unique code
- Each customer bound to their own invoice template
- Pallet-day calculation basis written into the contract and footnoted on invoices
- VAS requires a WMS work order plus customer confirmation before execution
- Rate cards carry effective dates; changes go through the system workflow
- Minimum monthly charges cover every small customer
- Exception review with variance flagging runs before the billing batch
- A clear 7-day dispute window policy after invoice issuance
An invoice is a 3PL's face and its backbone. A warehouse that bills cleanly barely ever fights with customers — because every dollar has a source. That is the real value of billing done right.











