The 3 to 15 percent you are not billing.
Ask a small 3PL what share of the work they do goes uninvoiced and you get a shrug and a number somewhere between "a little" and "I'd rather not know". The estimates that circulate in the industry put it between three and fifteen percent of revenue, and the range is wide because it depends on how the billing is done. A warehouse management system that bills from its own transactions leaks less. A workbook that somebody fills in on the first of the month leaks more, and leaks in predictable places.
This is a list of those places. Each one is something we have watched happen, or built a rule against, or both. None of them is a dishonest client or a lazy operator. They are all the gap between what the floor did and what the spreadsheet had a column for.
The checklist
- Client names that do not match. The export says
HGC, the rate card says Harbor Goods Co., and 212 rows fall off the bottom of the pivot table. In Tahona Billing: an Unknown client exception, fixed once by mapping the name, remembered as an alias. - Charges with no rate on the card. The warehouse started doing kitting in March. The rate card is from January. Every kitting row is work with no price. No rate exception; add the rate to the version in force from the exception itself.
- Labor hours that live in a different system. Kitting, rework, and special projects get logged on a timesheet, not in the WMS, and never meet the invoice. Put them in the spreadsheet template as
labor.kitting.hourrows; they price like anything else. - Returns nobody counted. Returns come in, get inspected and restocked, and the only record is a note on the receiving bench.
returns.unitrows, with the RMA as the reference. - Units past the included count. The order rate includes five units. The order had eight. The three extra are billable at the additional-unit rate, if anyone multiplies. The engine derives
pick.unit.additionalfrom the order's unit count; you never import it. - Storage counted on the wrong day. A snapshot on the 1st misses everything that arrived on the 2nd and left on the 28th. Prorated by the day: pallet-days divided by days in the month. See the storage article.
- Minimums never applied. The contract says $500 a month minimum. The client did $340 of work. The invoice says $340 because the workbook has no row for the difference. A visible minimum shortfall line, per client, per month, with the policy the contract names.
- A rate change applied to the whole month. Or to none of it. A rate that changed on the 16th is two contracts in one month. Effective-dated versions; each prices the days it was in force.
- Re-shipped orders billed once. An order ships, comes back undeliverable, ships again. Two picks, two labels, one line on the invoice. Two rows in the export with the same reference are two rows; the usage appendix lists both.
- Receipts logged after the close. The truck came on the 30th, the receiving was keyed on the 2nd, and September's invoice went out on the 1st. Imports into an issued month are refused, and a row dated inside an issued month is ignored by the next run, so a late receipt has to be billed on next month's run with next month's date, or as an adjustment line. The close page counts the ignored rows so you see them.
A worked month
The demonstration client on our page, Harbor Goods Co., does 1,206 orders, 14 receipts, 38 or so pallets in storage, 31 returns, and six and a half hours of kitting in September. Here is what happens when the rate card has rates for the first three and not the last two, which is the most common shape we see.
| Line | Qty | Rate | Amount | On the spreadsheet |
|---|---|---|---|---|
| Pallet storage, prorated daily | 38.4 | $22.00 | $844.80 | Billed |
| Receiving, per pallet | 14 | $12.00 | $168.00 | Billed |
| Pick and pack, per order | 1,206 | $3.25 | $3,919.50 | Billed |
| Additional units after 5 | 912 | $0.50 | $456.00 | Sometimes |
| Returns processing | 31 | $4.00 | $124.00 | Missing |
| Kitting labor | 6.5 hr | $38.00 | $247.00 | Missing |
| Invoice total | $5,759.30 | |||
| Of which recovered by adding two rates | $371.00 | 6.4 percent | ||
Three hundred and seventy-one dollars is not a dramatic number. It is six point four percent of one client in one month, which is squarely inside the range everybody quotes and nobody measures. Across twenty clients and a year, it is the salary of the person who does the billing.
What to do about it this month
You do not need software to run the checklist once. Take last month's export and the rate cards, and for each of the ten items ask whether the invoice could have been wrong that way. Write down the ones you cannot answer. Those are the rows a billing engine would have stopped on and asked about, which is all a billing engine is: a spreadsheet that refuses to drop a row.
The numbers are the demonstration month on the Tahona Billing page; the arithmetic is the real engine's. The rate card calculator shows the gap between a rate card and an invoice for your own client. If you run a 3PL with three to thirty clients, the pilot is open.