How to audit a ShipBob invoice, line by line
ShipBob5 min read
A ShipBob invoice arrives as one long list. There are no section headers, no subtotals by activity, and no comparison against last month. Everything you need in order to check it is in the file, but nothing about the layout helps you check it.
Step 1: get the invoice in a form you can sort
The PDF is the worst version of your invoice. Use the API instead. ShipBob exposes billing at https://api.shipbob.com/2.0/invoices, paginated by cursor, and each invoice carries its fee lines with an amount, a quantity, a date, and a description string.
If you would rather not deal with a token, export the invoice to CSV from the merchant dashboard. Everything below works the same way. The only thing that matters is that each fee ends up as one row you can group and sum.
Step 2: collapse the description strings into fee types
The description field is free text written by whoever configured the fee. You will see Pick Fee - First Item, Pick Fee First Item, and Picking (1st item) describing the same activity in the same account across different months. If you group by the raw string, your totals move whenever someone edits a label.
Map every string to a small set of canonical types first. A workable starting set:
- pick, split into first item and each additional item
- pack
- storage, split by unit: bin, shelf, pallet
- receiving, split into per unit and per labor hour
- returns processing
- kitting and assembly
- shipping postage, kept separate from shipping markup
- surcharges: peak, card payment, everything else
- monthly minimum
- account or platform fee
- credits and adjustments
Two details save you from wrong numbers later. Check the additional-item pick before the first-item pick, or Pick Fee - Additional Item collapses into the first-item bucket and you end up comparing two different rates as if they were one. And classify by the sign of the amount, not only by the words: a line called Fulfillment Adjustment Surcharge that arrives as a positive number is a charge, not an adjustment, no matter what it is called.
Step 3: the eight places errors actually hide
These are ordered by how often they turn up on a real invoice, not by how much money each one carries.
1. The same charge twice
Group lines by order reference, fee type, and amount. Two identical pick fees against the same order id on the same day is not a coincidence. Duplicates usually come from a retried sync or a manual correction that got posted instead of replacing the original.
2. A surcharge that quietly became permanent
Take every fee type that is not in your rate card and check how many months in a row it appears. A one-off accessorial is normal. The same accessorial in four consecutive invoices is a rate change nobody told you about.
3. A fee type you have never been billed before
Diff the set of fee types in this month against the union of the last six. Anything new deserves one email before it becomes the new normal. This is the cheapest check on the list and the one people skip.
4. Rates above the quote
Divide the line amount by the quantity and compare against the rate card. Do this per fee type, not on the total. A pick fee that moved from $0.20 to $0.25 is invisible in a monthly total and worth four figures a year at 8,000 orders a month.
5. Credits that were promised and never arrived
Keep a list of every credit anyone promised you in email or on a call, with a date and an amount. Then check the invoices after that date for a matching negative line. Credits agreed in a support thread and never issued are the single most recoverable category, because the promise is in writing and nobody disputes it.
6. Storage billed above what you actually stored
Compare the billed storage units against your own inventory snapshot for the same period. Storage is billed on occupancy the warehouse recorded, and occupancy records lag physical moves. Pallets consolidated mid-month are frequently billed for the whole month.
7. Receiving above the free allowance
Most contracts include a number of free receiving hours per shipment or per month. Sum the hours billed, subtract the allowance, and check that only the overage was charged.
8. Peak surcharges outside the peak window
Your contract names the window. A peak surcharge dated outside it is not a judgement call, it is a date comparison. This is the easiest finding to win an argument about, because there is nothing to interpret.
Step 4: three numbers to compute even when nothing is wrong
| Number | How to compute it | What it tells you |
|---|---|---|
| Cost per order | Total invoice minus postage, divided by order count | Your real fulfillment cost, independent of shipping mix |
| Minimum utilization | Billable activity divided by the monthly minimum | Whether you are paying for volume you never used |
| Shipping markup | Billed postage against the carrier rate for the same service | Whether the markup is inside the cap you agreed to |
None of these three is a billing error. All three are money. Cost per order that drifts up while your order mix is unchanged is the earliest signal that something in the fee structure moved.
What to do with what you find
Write one email per invoice, not one per finding. List each disputed line with its line id, its date, its description exactly as it appears on the invoice, the amount, and one sentence saying why it is wrong. Ask for a credit on the next invoice rather than a refund: it is easier for the other side to approve and it lands faster.
Keep the arithmetic in the email. A claim that says 21 duplicated pick fees on orders listed below, $46.20 gets processed. A claim that says your invoice looks too high gets a phone call.
If you want the whole thing done for you, WareAudit connects to ShipBob and runs these checks on every invoice, then hands you the letter. There is a sample report with real engine output if you want to see the shape of it first.