A fulfillment invoice is not a quote with numbers filled in. It is a record of work that happened, written by the party that did the work. The audit compares that record with three other documents: the signed rate card, the order-level detail behind each charge, and the Shopify export of what the store actually sold and shipped.
We run this audit for Shopify stores handling five orders or more on a normal day, after the service is live and at least one billing cycle has closed. A quote review belongs before signature. This work belongs after the first invoice, when the rates have met real parcels.
The output is a variance sheet, not a complaint. Each row names one billed line, the backup behind it, the rate card term it should match, the order record that proves the work and the amount in dispute. A line without a row is an opinion.
An Invoice Audit Is Not a Quote Review
A quote is a promise about future work. An invoice is a claim about past work. The two documents use different tenses; that difference is the audit. We are not asking whether the rate card is attractive. We are asking whether the invoice matches it, order by order.
A quote teaches what should be charged; an invoice shows what was charged. The difference is where money leaks: a unit that was billed twice, a service that was included and charged again, a surcharge that has no backup. The audit makes the gap visible before the next invoice repeats it.
The invoice gives charges; the rate card gives terms. The Shopify order export gives the demand side: what was ordered, what was canceled, what shipped and when. The warehouse's order-level backup connects a charge to a parcel or receipt. Without all four, a dispute becomes a memory contest.
We read the invoice in the order the work happens: goods in, space, the bench, the packing table, the parcel, the return, then the fees that fit no physical step. That order follows the goods.
An invoice is a claim.
Pick, Pack and the Order Count
The pick-and-pack charge looks simple: a charge per order, or per item, or a base charge with a per-extra-item fee. The audit starts with the unit. If the rate card bills per order, the invoice should carry one charge for each order shipped. If it bills per item, the count should match the units in the parcel, not the order header.
Then the order count itself. Compare the invoice's billable order count with the Shopify export for the same period. Canceled orders, refunded orders and orders split into several parcels are the usual differences. A canceled order that never left the building should not appear as a pick. A split order may legitimately appear as two shipments, but the rate card should say so.
Multi-item orders are the next check. Pull ten orders with three or more units and read the pick line on each. A per-item rate should scale with the unit count. A base-plus-additional rate should show the base once and the additional charge for the rest. A flat per-order rate should not move. If the invoice mixes the three, ask which one the rate card names.
The backup for this line is short: the invoice detail at order level, the Shopify order export and the warehouse's pick confirmation for a sample of orders. We ask for ten orders on the first pass. Ten orders usually show whether the billing unit is applied the way the rate card describes.
Count the orders, then the units.
Storage, Space and the Vacated Position
Storage bills on space and time, and the two are easy to mix. The rate card may bill by pallet, bin, volume or month. The invoice may follow one of those units and the stock report another. Start by converting both to the same unit before comparing a single number.
The vacated position is the line most often missed. A SKU sells out, the shelf is cleared, and the invoice still carries the space for a month or two. Space should follow occupancy, unless the rate card sets a minimum or a notice period for releasing a position. A minimum is legitimate when it is written. It is a billing error when it appears only after the stock is gone.
Our storage window opens with seven days free, and that inclusion belongs in the audit. A charge for space inside the free window should not appear on the invoice, and a charge that starts on the wrong day is a variance with a date attached. Ask for the stock snapshot on the billing date and the inbound dates behind it.
Watch the unit change. A provider that switches from pallet to bin, or from cubic measure to position mid-month, can produce two charges for one stack of cartons. That is not always an error, but it needs a note in the rate card and a matching note on the invoice. A unit change without a document is a variance.
Space bills by the day.
Inbound, Receiving and the Discrepancy Re-Charge
Receiving can be billed by carton, pallet, unit or hour, and the invoice should name the unit. Start with the count: cartons expected against cartons received, and units counted against units on the packing list. The second check is the condition. A carton that arrived crushed may generate a receiving exception, and ask whether that exception is a second charge or part of the receiving work.
Duplicate receiving is common when a delivery arrives in several trucks. The same carton count can be posted twice, once per arrival, and the invoice carries both. Compare the receiving report with the delivery notice and the carton marks. A delivery that arrives in three drops is one inbound with three receipts, not three inbound events.
Our own receiving opens and checks every arriving unit, never a sample, and that work belongs inside the receiving line rather than beside it as a separate inspection fee. If a provider charges inspection and receiving separately, the rate card should show both and the invoice should show what each one covered. The same rule applies to consolidation and FBA prep: a service the rate card lists as included should not reappear as a line with a new name.
The backup is the receiving report, the delivery notice, the carton list and the photographs taken at the dock. Ask for them at the carton level. A receiving charge that cannot be tied to a carton, a pallet or an hour is a line without a source.
Receiving is a counted event.
Outbound, DIM Weight and Surcharges
Outbound is the line with the widest range. The audit compares the billed weight with the packed weight on the order record. A small product in an oversized carton may be billed on dimensional weight, and that is legitimate if the rate card says so. It is a variance if the invoice uses dimensional weight on a parcel the rate card prices on actual weight.
We pull a sample of parcels, measure the packed carton and apply the divisor in the rate card. If the billed weight differs, the difference is a measurement error or a different divisor. Both need an answer in writing before the next invoice.
Surcharges sit beside the base freight. Residential delivery, remote areas, peak periods and address corrections can each carry a charge. The rate card should name them, and the invoice should tie each one to an order. A surcharge with no order number is a pool charge, and a pool charge is where duplicated billing hides.
Compare the outbound line with the carrier invoice when the provider passes carrier charges through. Two totals for the same parcels should agree, or the difference should be explained by a handling margin the rate card discloses. Ask which party sets the rate and which party bills it.
Weight is a measurement, not a guess.
Packaging, Returns and Exception Fees
Packaging and materials sit on the fifth line. The rate card may include a standard mailer or carton, or bill materials at cost plus a margin. The audit asks three things: what was used, what it cost and whether it was already included in the pick and pack charge. A branded box that the store supplies should not appear as a provider charge. A standard box that the rate card includes should not appear twice.
Returns form the sixth line and carry more than a processing fee. A returned parcel can generate a return freight charge, a grading charge, a repack charge and a relisting charge. Each one should map to a step in the returns process. Our returns are graded A, B or C, then repacked for resale, or photographed and set aside for your call. The invoice should show which path the unit took.
Duplicate return charges are the usual problem. One unit can appear as a return processing fee and again as a repack fee, when the rate card prices repack inside the processing charge. Read the returns section of the rate card beside the invoice and tick each step once. A step that appears twice needs a credit, not an explanation.
Exception and technology fees are the seventh line, and they are the least predictable. Look for setup, integration, API, compliance, account management and minimum-volume charges. A one-time setup fee should appear once. A technology fee should have a definition in the rate card and a billing period. If a fee appears on the invoice and nowhere in the contract, the first question is what it buys, and the second is why it was not quoted.
We audit these three lines as a group because they share a failure mode: a charge that is real but duplicated, or included but billed again. The invoice is not wrong because a fee exists. It is wrong when the same work is paid for twice.
Ask what the line includes.
Build the Variance Sheet, Then Send One Month of Invoices
The variance sheet has five columns. The first is the invoice line: date, description, unit, quantity and amount. The second is the order-level backup: the order number, the parcel or receipt it belongs to, and the document that shows the work. The third is the rate card reference: the clause and the rate the line should match. The fourth is the Shopify order export line. The fifth is the dispute list: reason, amount and evidence. Five columns, one row per charge.
Build it in a spreadsheet, one month per tab. Do not merge two months into one sheet. A billing cycle has its own tier, minimum and surcharge period, and merging them hides the line where a threshold was crossed. Keep the provider's invoice number on every row so a credit can be traced back to its source.
Then rank the rows. Start with the largest amount, then the rows that repeat every month. A one-off difference is a question. A repeating difference is a term to renegotiate or a process to fix. Send the sheet to the provider with the evidence, not with a demand. A documented variance opens a different discussion from a complaint.
Send one month of invoices and the signed rate card in a single file (/contact-us). Include the Shopify order export for the same month and the receiving reports behind the inbound lines. We reply with a variance sheet: what each charge should be, what the backup shows and which rows to dispute first. The work suits stores with live daily orders. The bench work itself has its own page (/b2c-fulfillment), and the agreement lists Dore Technology Co., Ltd. as the contracting party.
Build the sheet before you call.