What 3PLs Charge For, and Why Each Charge Exists
The charges you will find across B2B warehousing, cross-dock and e-commerce fulfillment, the different ways operators package them, and whether the cost behind your rates is one you can actually prove.

About this paper
Every charge on a 3PL invoice exists to recover one of five things: space, touches, systems, materials, or exceptions. Pricing models differ in how they package those five, not in whether they recover them. A model that looks cheaper has usually moved a cost into a line you are not looking at. A rate is only as good as the cost behind it, and that cost has to be recorded, attributed and earned by an efficient operation. And the best rate card in the world only earns what the operation actually records.
A rate card is a list of prices. An invoice is a list of events. The margin lives in the gap between the two.
Invoice · Month-end · illustrative
| Inbound receipt, 4 ASNs | Touches | $62.00 |
| Pallet storage, 42 positions | Space | $840.00 |
| Order fee, 1,282 orders | Touches | $3,525.50 |
| Additional units picked | Touches | $1,546.90 |
| Store integration, monthly | Systems | $150.00 |
| Mailers and dunnage | Materials | $769.20 |
| Parcel postage, cost plus | Materials | $9,412.18 |
| Receiving without ASN | Exceptions | $50.00 |
| Total due | $16,355.78 |
Illustrative figures. Not any operator’s rates.
“A rate card is a list of prices. An invoice is a list of events. The margin lives in the gap between the two.”
In the last paper I argued that you should price the work you actually do, not the work you assumed at onboarding. The most common question I got back was a simpler one: what should the work actually be priced as? What do other operators put on the invoice, and why?
This paper is the reference that goes underneath that argument. It lays out the charges you will find across B2B warehousing, cross-dock and e-commerce fulfillment, the different ways operators package them, and the reason each charge exists in the first place. Then it asks the harder question underneath every rate: is the cost behind it one you can actually prove?
I built it from real rate cards, proposals and monthly invoices from several 3PLs in the United States and Canada, shared with me for this purpose. No operator or client is named, and no real rate is quoted as theirs. Where I show numbers, they are illustrative ranges to make the math readable, not a price list.
I wrote it for two readers. The operator building or revisiting a rate card, and the brand trying to read one.
Strip away the labels and every line on every invoice I looked at is trying to recover one of five costs. Operators name them differently, split them differently and bundle them differently. The five underneath do not change.
| What it recovers | What drives the cost | Where it shows up on the invoice |
|---|---|---|
| Space | Rent, racking, the footprint a client occupies or reserves | Pallet, bin, shelf, square-foot or cubic-foot storage; dedicated space; pick-face fees |
| Touches | Labor every time a person or machine handles the product | Receiving, put-away, picking, packing, pallet handling in and out, labeling, returns |
| Systems and admin | Software, integrations, customer service, account management, billing itself | Setup, monthly platform or portal fees, per-integration fees, EDI, hourly CSR and account management |
| Materials | What the 3PL buys on the client’s behalf | Boxes, dunnage, pallets, shrink wrap, parcel postage, freight |
| Exceptions | Work caused by something not going to plan | Non-compliant receipts, rework, special projects, aging inventory, late payment, missed appointments |
The first two are where most operators focus. The last three are where most margin quietly leaks, because they are the ones most often absorbed instead of billed.
Keep this table in mind for the rest of the paper. Every model that follows is a different answer to the same question: which of these five do we show as separate lines, and which do we fold into something else?
One of the proposals I reviewed still had the 3PL’s working notes sitting in the margin beside the rates. The client never saw them. They are the most honest part of the document.
Next to the rate card were four numbers: annual rent, annual salaries, annual transport cost, and a staffing plan. One full-time person in the slow months. Three during the four-month peak. Every rate on the page had been backed out of those numbers.
That is what a quote really is underneath. It has three layers, and they produce the fourth thing, the one the client signs.
The proposal stated its assumptions plainly: the SKU count, an inventory range from low season to peak, the split between B2B and B2C orders, a same-day cutoff, a note that inventory could vary by fifteen percent, and a date the pricing expired.
The third layer is the one that matters later. A rate card is only fair for as long as its assumptions hold. When the SKU count doubles, when the peak moves, when the order split flips from wholesale to direct-to-consumer, the rates are still on the page but the math underneath them is gone. That is attribute drift, from the last paper, seen from the quoting side.
If your quote does not write down its assumptions, you have nothing to reopen when they stop being true.
Two habits separate the operators who handle this well. They write the assumptions into the proposal where the client signs, not in an internal spreadsheet. And they put an expiry date on the pricing, so a review is scheduled rather than negotiated.
A quote you can defend is built on a cost you can prove. Most 3PLs cannot prove theirs, and it is rarely because they are careless.
There is no standard costing model for warehousing. Almost every operator has built their own, usually in a spreadsheet, shaped by whoever built it and by the assumptions they made at the time. It works for the person who built it. Anyone else inherits assumptions they cannot see. So before asking whether your price is right, it is worth asking whether the cost model underneath it is.
The starting point needs no software. Take the last twelve months of your income statement and ask, line by line, which of these costs are fixed and which are truly variable.
| Type | How it behaves | Examples | How it reaches a rate |
|---|---|---|---|
| Fixed | Stays the same whether the building is busy or quiet | Rent, property tax, racking, WMS license, salaried management | Spread across pallet positions, square feet or clients |
| Variable | Rises and falls with every unit of work | Hourly labor, temp labor, packaging, per-transaction software fees | Priced per touch: per receipt, pick, order, pallet |
| Step | Flat until a threshold, then jumps | A supervisor per crew, a second shift, more square footage, a new WMS, automation, rented equipment for peak | Usually missed, because it only appears when volume crosses a line |
Fixed cost has one property that catches operators out: its cost per unit depends on how full the building is. Take an illustrative building costing $900,000 a year to run, with 10,000 pallet positions. Move the slider.
Exhibit A · Illustrative
Same pallet, emptier building
The pallet did not change. The building got emptier, and every remaining pallet carries more of the rent. That is the expansion trap from the last paper, expressed as a unit cost.
Volume grows more or less smoothly, a few hundred orders more each month. Fixed cost does not. It sits flat while the current setup absorbs the growth, then jumps when something has to be added to keep up. Some steps are operating costs: a second shift, another supervisor, more square footage. Some are capital: a new WMS when the old one cannot keep up, put-to-light or conveyor when manual picking hits its ceiling, racking for the new space. Capital steps tend to be the steepest, because the whole investment lands before the volume that justifies it.
Exhibit B · Illustrative
Fixed cost steps, volume climbs
Fixed cost / monthOrders / month
Fixed cost per order
The second chart is the one that matters for pricing. Fixed cost per order falls while volume fills the current step. Then the next step arrives and it jumps back up. More volume lowers your unit cost only while it is filling the step you already paid for.
That changes the answer to the most common request in a renewal: we are growing, so give us a better rate. Growth does not automatically earn a discount. It depends on where the client’s volume lands. Growth that fills existing capacity can fund a lower rate. Growth that forces the next step, a new shift, more space, a system or automation built for this client, has to pay for that step first. Two practical habits follow:
Is the cost recorded?
Labor hours coded to the client and the activity, not just to the building. Exceptions logged when they happen. And the hours nobody is paid for, which the book put at over $20,000 a year for an owner spending three hours a day covering gaps at thirty dollars an hour. If it is not recorded, it is not in the cost, and the price built on it is too low.
Is it attributed to the right place?
Shared costs should follow the activity that causes them, not revenue. Allocating overhead by revenue share makes large, simple accounts look expensive and small, complicated accounts look cheap, which is the averages problem from the last paper in another form. Most cost models assume an average travel distance across the building. For the building as a whole, that average holds. But if the only open space for your newest client is at the far end from receiving, every put-away and pick for that client takes far longer than the model assumed, and the rate card never knows.
Is the operation efficient enough to justify it?
A cost can be recorded perfectly and still be the wrong cost to price from. Small gaps compound with volume. A few extra seconds per order that nobody notices at a hundred orders a day become real money at a thousand. If your pickers do sixty picks an hour where a well-slotted operation does ninety, building the quote from your cost hands your inefficiency to the client. They will find a 3PL who does not. The LED client in the last paper was exactly this: the cost was real, but it came from a layout problem, not the work.
Does it hold at the volume you quoted?
Step costs arrive at thresholds. Utilization moves with every client who arrives or leaves. A cost that was true at 70 percent full is not true at 95 or at 50.
Exhibit C · Illustrative
Labor cost per pick, by productivity
The exhibit shows why the third question matters. At an illustrative $26 an hour fully loaded, a picker doing 30 picks an hour costs more per pick than the top of the market range. At 90 an hour, the same picker costs less than the bottom of it. The rate card is the same in both buildings. The margin is not.
So is a quote really cost plus profit? For most standard services, the market sets the price far more than your cost does. So work top-down. Take what the market pays for a pallet position in your area and what your building actually costs you. Work out how many positions you need, and how full they must be, before you break even. Then ask whether you can tolerate how long it takes to get there.
Your cost does not change what clients will pay. A building rented at the top of the market, or equipment far beyond what the work needs, raises your cost without raising the price anyone will accept. The real question becomes: if the price is X, what has to be true about my cost for the margin to be acceptable?
The market is not one number either. When I shopped 3PLs as a brand, I saw neighbors in the same area charging eight, twelve and eighteen dollars for the same storage. Some of that spread is service and location. A lot of it is operators who do not know their true cost.
So the market sets the ceiling, and your true cost, run through the four questions above, sets the floor. Your price lives between the two, and where you are in that gap tells you what to do.
A quote you can stand behind is one you would be comfortable walking the client through, line by line, if they asked to audit it.
That is the real test. Not whether the price wins the deal, but whether you can explain what drives every rate on it, show that the cost behind it was recorded and attributed honestly, and show that your operation earns it.
B2B warehousing has the oldest and simplest pricing in the industry, and it has survived because it maps cleanly onto the work. Product arrives on pallets, sits on pallets, and leaves on pallets or cases. The rate card follows the pallet.
One Midwest account I reviewed was billed on exactly six lines:
| Charge | Unit | What it recovers | Bucket |
|---|---|---|---|
| Inbound order charge | Per receipt | Dock appointment, paperwork, system entry, the first touch | Systems |
| Inbound pallet handling | Per pallet in | Unload, verify, label, put away | Touches |
| Initial storage | Per pallet, on arrival | The first storage period, charged the moment the pallet lands | Space |
| Recurring storage | Per pallet, per month | Rent for everything still in the building on the billing date | Space |
| Outbound pallet handling | Per pallet out | Retrieve, stage, load | Touches |
| Outbound order charge | Per order | Order entry, bill of lading, carrier coordination | Systems |
The inbound and outbound rates were identical. That is common and deliberate. Handling in and handling out are priced as mirror images, so the client pays for the round trip whether the pallet stays a week or a year.
The split between initial and recurring storage is the part most brands do not understand, and it matters more than the rate itself. Initial storage is charged when the pallet arrives. Recurring storage is charged on everything in the building at the start of each new period.
Most operators soften the initial charge with a split-month rule. A pallet received before the 15th pays a full month. A pallet received on or after the 15th pays half. The account above ran exactly that rule, and so did the billing setup behind it.
Here is what that does to a fast-moving account. In one month, that same client received roughly 540 pallets and shipped roughly 510. The initial storage charge on the pallets that arrived brought in more revenue than the recurring charge on the pallets that stayed. On freight that turns quickly, the storage money is earned at the dock, not in the rack.
On fast-turning freight, the storage revenue is in the arrival, not the stay.
The other B2B model is dedicated space. The client reserves a block of pallet positions or square feet, sized for their peak, and pays a flat monthly amount whether it is full or empty. One public warehousing agreement I reviewed billed storage as a single fixed monthly figure for a set block of square footage, with handling priced per case and per pallet on top. The proposal I described earlier did the same, sizing space for a peak of roughly three and a half times the low-season inventory. The client pays for the peak all year. In exchange, the space is guaranteed to be there when the peak arrives.
Once B2B orders go to large retailers, a new layer appears: EDI connections for purchase orders, advance ship notices and invoices, carrier-specific labeling, pallet builds to a routing guide, and delivery appointments. These are billed as setup fees per trading partner, monthly EDI fees, per-label fees and a flat retail order fee. The reason they exist is the retailer’s chargeback program. Every mislabeled carton or late ASN comes back to the brand as a deduction, and the 3PL is paid to prevent that.
Illustrative ranges only, not a quote, and highly dependent on market and volume: pallet storage from roughly $15 to $40 per pallet per month; pallet handling from roughly $4 to $12 per pallet each way; case picks from roughly $1 to $3.50 per case; EDI setup from roughly $500 to $2,500 per trading partner. Coastal and port markets sit at the high end. Inland markets sit at the low end.
Cross-dock is the one service where the client is paying you not to store anything. Freight comes in one door and leaves by another, ideally the same day. So the pricing drops the space bucket almost entirely and charges for touches and dock time.
Operators price it in one of four units:
Two terms decide whether a cross-dock account makes money.
Free time. Most cross-dock pricing includes a window, often a day or two, during which freight can sit on the floor at no extra charge. After that, staging is charged per pallet per day. Transload, which involves consolidating or re-sorting before the freight leaves, usually sits between cross-dock and storage: a per-container fee plus daily staging once free time runs out. Free time is where cross-dock quietly becomes warehousing without anyone repricing it.
Floor-loaded versus palletized. A floor-loaded container is unloaded by hand, carton by carton, and it ties up a door and a crew for hours. One rate card I reviewed charged a flat fee per floor-loaded container, by container length, on top of the hourly receiving labor, specifically to cover the dock time and the pallets needed to build the freight up. A palletized trailer can be cleared in a fraction of that time. If both are quoted at the same per-pallet rate, one of them is losing money.
Illustrative ranges only: same-day cross-dock at roughly $250 to $450 per standard container; transload with a few days of staging at roughly $350 to $650 per container, plus roughly $2 to $6 per pallet per day after free time; per-pallet cross-dock from roughly $5 to $30 depending on labor and market.
Picture a cross-dock account priced per pallet with two days of free time. For the first few months it runs as designed. Freight lands in the morning and leaves the same afternoon. Then the client’s outbound pickups start slipping. A day here, two days there. Pallets begin sitting four and five days, then a week before a full load is ready.
Nobody changes the pricing, because nothing in the operation was tracking how long each pallet sat on the floor. The dock doors reserved for same-day turns become a staging area. Inbound freight for other clients waits for space. The operator is now running a storage account, in the most expensive square footage in the building, at a cross-dock rate.
The fix is not a new rate. It is a clock. Every cross-dock pallet timestamped in and out, and staging billed from the first hour after free time ends. The rate card already allowed for it. The operation just never recorded it.
E-commerce is where pricing models multiply, because the work is small, repetitive and highly variable from one order to the next. The same five buckets are still underneath. What changes is how many lines the client sees.
Pulling together the e-commerce rate cards and invoices I reviewed, a full a la carte rate card usually carries most of these lines. The last column is the part nobody puts on the rate card: where each line tends to lose money.
| Charge | Unit | What it recovers | Where it goes wrong |
|---|---|---|---|
| Setup and onboarding Systems | One time | Account setup, SKU load, integration testing, training | Discounted to win the deal; the real onboarding hours are never recovered |
| Store or marketplace integration Systems | Monthly, per connection | Keeping each sales channel connected | The client adds a new channel and the fee never follows |
| Platform or portal fee Systems | Monthly or weekly | Software, client visibility, support | Extra users, reports and custom requests creep in at no charge |
| Receiving Touches | Per receipt, plus per carton or unit | Count, verify, label, put away | Loose cartons, mixed SKUs and missing ASNs take hours that a per-receipt fee never covers |
| Storage Space | Per bin, shelf, pallet or cubic foot | Space | Slow SKUs sit in prime pick locations at the same rate as fast ones |
| Order fee Touches | Per order | Order release, packing slip, label, first carton | Treated as all-in, so extra cartons and special packing ride along free |
| Pick fee Touches | Per additional unit or line | Each extra walk and reach | Bundles and promotions push units per order up while the quote assumed one |
| Packaging and materials Materials | Per box, or cost plus a markup | Boxes, mailers, dunnage | Vendor prices rise and the rate card does not |
| Inserts and custom packing Touches | Per order or per unit | Extra touches at the pack station | Marketing adds them after go-live and nobody adds a line |
| Returns Touches | Per return, plus per unit restocked | Receive, inspect, restock or dispose | Priced as a token fee when a real inspection takes minutes |
| Postage Materials | Carrier cost plus a markup | Parcel shipping | Address corrections and carrier surcharges absorbed instead of passed on |
| Peak or rush Exceptions | Per order surcharge, or a seasonal rate | Overtime, temp labor, extended shifts | Not written into the contract before Q4, so it cannot be charged in Q4 |
| Monthly minimum Space | Per month | The fixed cost of carrying a small account | Waived to win the client and never reinstated |
Every line maps back to one of the five buckets. And notice where the right-hand column concentrates: almost none of the leakage is in the order fee everyone negotiates. It is in receiving, returns, materials, inserts and the lines that were waived to close the deal.
To see how the lines stack, build an order. The default is three units of two SKUs, shipped in a mailer with a marketing insert.
Exhibit D · Illustrative
A la carte versus all-inclusive, one order
| Line | Qty | Rate | Amount |
|---|---|---|---|
| Order fee | 1 | $2.75 | $2.75 |
| Additional units picked | 2 | $0.50 | $1.00 |
| Mailer | 1 | $0.60 | $0.60 |
| Insert | 1 | $0.15 | $0.15 |
| Fulfillment before postage | $4.50 |
At $3.50 all-inclusive, the operator collects $1.00 less for this order than a la carte.
On an all-inclusive rate of $3.50, the default order collects a dollar less for the same work. A single-unit order with no insert comes to $3.35 a la carte, so the all-inclusive rate collects fifteen cents more. That is the whole trade between the first two models below, in one order.
Every activity is its own line. This is the most common model and the one that tracks the work most closely. The fulfillment fee alone is usually built in layers, and every rate card I reviewed layered it slightly differently:
One operator went a step further and priced the unit by its unit of measure: one rate for an each, a higher rate for an inner pack, another for a case. Another priced unaltered cases and pallets separately, meaning sealed cases or full pallets that leave untouched. That single definition matters more than it looks, and I will come back to it in the section on where invoices break.
One rate per order covers pick, pack and standard materials, sometimes more. The client gets a number they can budget. The operator carries the risk that orders get bigger, heavier or more complicated. Published comparisons put all-inclusive pricing roughly 15 to 25 percent above the equivalent a la carte bill, which is the price of that risk.
A fulfillment fee per order and a storage fee by cubic foot, and nothing else. Some network fulfillment models have run this way. It is simple for the brand and forces the operator to price materials, labor and systems into one number.
A single per-order fee, no storage charge at all, on one condition: the inventory keeps moving. Once product sits past a set age, it starts paying storage, and the charge steps up the longer it stays. The largest marketplace fulfillment networks run a version of this logic, with aging surcharges that start around six months and climb from there. For the operator, the model only works if the aging penalty is real and enforced. Without it, free storage becomes a warehouse full of someone else’s dead stock.
A fixed monthly amount for an agreed scope, sometimes with a volume band and an overage rate above it. It is common with smaller brands and with brands whose volume is steady. The operator is selling capacity, not transactions. It works until the scope drifts and nobody reopens the band.
Each of these models is built around an assumption about how inventory will behave. The margin depends on the client behaving that way.
In the book I described a 3PL doing about two million dollars a year that took on two early-stage e-commerce clients. The pricing was built on high storage and low activity charges, the right structure for slow, steady inventory. These clients turned inventory fast. They generated pick fees, pallet-in fees and labor the contract did not cover, and the two accounts lost about five thousand dollars a month.
The repricing conversation kept getting put off, because they were growing clients. Then Q4 arrived, both scaled, and those two accounts lost twelve and a half thousand dollars in a single quarter. A business that should have made around one hundred and fifty thousand dollars that year on its other accounts barely broke even. Nothing about the rate card was wrong on paper. It was the wrong model for how those clients moved.
The flat monthly fee fails the same way in the other direction. Picture a brand signed at a flat monthly amount for a band of around two thousand orders. A year later it ships four thousand, with more SKUs and heavier multi-unit orders. The fee is unchanged, because the overage clause was written but never triggered. The client feels they have a fair deal. The operator is doing double the work for the same fee.
The free-storage model has its own version: a catalog that moved fast at signing slows down, the aging threshold is written in the contract, and nobody enforces it because the client is otherwise easy to work with. Twelve months later, the fastest pick zone in the building is holding someone else’s slow stock for free.
Illustrative ranges only: a la carte fulfillment commonly lands around $2 to $3.50 for the first item in an order plus roughly $0.30 to $0.75 per additional item; one industry survey put the average B2C pick-and-pack fee near $3.20 per order before storage and materials.
Storage looks like the simplest line on the invoice. It is actually two decisions: what unit you charge by, and how you count it. Two operators can quote the same rate and send very different invoices because they made those two decisions differently.
Across the rate cards and invoices I reviewed, I found at least five storage units in use, sometimes three of them on the same client’s invoice:
| Unit | Best fit | Watch out for |
|---|---|---|
| Per pallet position | Uniform, palletized B2B inventory | Half-empty pallets billed as full ones |
| Per bin or shelf, by size | Small, high-velocity e-commerce SKUs | Who decides which size a SKU needs |
| Per square or cubic foot | Mixed sizes, oversized items, high SKU counts | Measuring it consistently month to month |
| Pick face versus backstock | Operations with a forward pick area fed from reserve | Whether moving stock between them is billed |
| Dedicated space | Seasonal peaks the client needs guaranteed | Paying for peak capacity all year |
One of those invoices charged the client for the order preparation area itself, by the square foot, as a separate storage line. It is a fair charge. That space is reserved for one client’s packing and it is rent the operator pays.
The billing period varies too. Most operators bill monthly. One rate card I reviewed billed every storage type weekly: small, medium and large bins, pickable pallets and backstock pallets, each at its own weekly rate. Weekly billing tracks real usage more closely and makes most of the next argument disappear.
There are three common ways to turn a storage rate into a monthly charge:
One operator published a worked example that shows why this matters. Same rate, same month, same inventory movements. Depending only on which day the snapshot was taken, the storage bill ranged from $875 to $1,500.
Exhibit E · Published example
One month, one rate, three snapshot dates
Two operators can quote the same rate and send invoices that differ by half. The rate card shows the rate. It does not show the counting rule.
None of these methods is dishonest. Each one fits a different operation. Snapshot is simple to administer. Anniversary protects the operator on fast-turning inventory. Daily proration tracks real use most closely but needs a system that knows where every pallet was every day. The mistake is not choosing one. The mistake is not writing down which one you use.
Every rate card I reviewed had a section of hourly rates. It is where operators put the work that is real but too irregular to price per unit.
The hourly layer was usually tiered by who does the work:
Each tier carried its own rate, rising from floor labor to IT. The logic is straightforward. A client who needs weekly calls, custom reports and proforma invoices is consuming management time, and that time costs more than a picker’s.
Replenishment is the clearest example of how differently operators think about the same work.
Both approaches are defensible. The first puts the cost exactly where it is caused and lets the client see what their SKU profile does to the floor. The second gives the client a simpler, more predictable bill and protects the operator as long as the storage rates were set with replenishment in mind. The dangerous version is a third one: replenishment is neither billed nor built into anything else. It simply disappears into overhead.
The same pattern showed up with inventory counts. One operator performed routine monthly cycle counts at no charge and billed full counts by the hour only when the client asked for one. Routine work is built into the rates. Work done on request is billed separately. That is a clean line, and it is worth copying.
On several of the monthly invoices I reviewed, freight was the largest line on the page. On some, it was larger than every warehouse charge combined. That is the first thing to understand about pass-throughs: they make a 3PL’s revenue look much bigger than the business it actually runs.
Three things get passed through most often: parcel postage, LTL and truckload freight, and packaging materials. Operators recover their cost, and sometimes a margin, in different ways:
| Approach | How it works | What it tells you |
|---|---|---|
| Cost plus a markup | Carrier or vendor cost plus a fixed percentage, commonly around 10 to 15 percent | Margin scales with spend, visible to the client |
| Cost plus a service fee | Freight billed at cost, with a flat fee per booking | Margin moves from the markup into a service line |
| Price list by item | Each box size or material priced as its own line | Easy to audit, needs updating when vendor prices move |
| Management fee | A percentage added as a separate line on top of materials | Honest about the margin, invites negotiation |
| Credits | Carrier rebates or negotiated discounts shown as negative lines | Shows the client the operator is sharing savings |
One rate card I reviewed did something subtle. It billed parcel at cost plus ten percent and materials at the operator’s own vendor pricing plus ten percent, but billed LTL and truckload freight at straight cost, with a flat fee every time the operator booked a load. The margin did not disappear. It changed form, from a percentage that grows with the freight bill into a fixed fee for the work of booking it.
Pass-through revenue is not margin. Know what your business looks like with it taken out.
Two cautions. First, if pass-throughs are a large share of revenue, a rising top line can hide a flat or shrinking warehouse business. Report both. Second, packaging is often priced once and never updated. Box prices rise, the per-box line on the rate card does not, and a pass-through quietly becomes a subsidy. On two invoices from the same operator, the same box size was priced differently for different clients, which is fine if it is a decision and a problem if it is an accident.
Some of the most important pricing on a 3PL rate card is not a rate at all.
One rate card I reviewed printed three columns for every line: the standard rate, the negotiated discount, and the rate after discount. Reading down the discount column tells you exactly how that operator thinks about margin.
That is a margin policy, written into the rate card. Printing the standard rate next to the discount does something else as well. It keeps the list price visible on every invoice, so when the contract is renewed, the conversation starts from the real rate and not from the discounted one.
Volume discounts deserve one more check before they go on any rate card. As the cost section showed, cost rises in steps. A tiered discount that drops the rate at every volume band assumes cost per unit keeps falling. It does not, at least not right after each step. Set the tiers where the volume actually fills capacity you already have, not at round numbers.
Several charges I found were not really there to earn money:
The receiving fee on that same rate card was designed the same way. The per-receipt fee covered the first hour of labor. Additional hours were billed only when the shipment broke the receiving guidelines. A client who ships clean freight never sees the hourly line. A client who does not, pays for it. The price is teaching the client how to ship.
A good penalty fee is one the client never pays, because it changed what they did.
The three operators priced technology three different ways. One charged a one-time integration fee plus a flat monthly portal and support fee. One charged a monthly fee per integration, plus a monthly WMS fee, and passed through the EDI network and shipping-label software as separate lines. The third charged a weekly platform fee, a monthly fee per additional user login, a per-user fee for its customer messaging channel, EDI connections sold in bundles of five, and custom work by the hour. All three are reasonable. What matters is that the systems bucket is recovered somewhere, and that it grows when the client adds integrations.
The invoices and proposals also carried terms that move real money: setup fees, monthly minimums, net payment terms, a credit limit, a surcharge on card payments, a higher fee on late invoices, a pricing expiry date, and, for one operator with a second facility across the border, rates adjusted for the exchange rate. None of these appear in a per-order comparison. All of them show up in cash flow.
A rate card is a list of prices. An invoice is a list of events. Between the two sits the thing that actually decides what you earn: how each charge gets triggered.
Every charge, in any billing system, from a WMS to a spreadsheet, has the same anatomy:
The rate is the part everyone negotiates. The trigger is the part that decides whether the rate is ever collected. In practice there are three kinds of trigger, and each one fails in its own way.
| Trigger | Examples | How it fails | The safeguard |
|---|---|---|---|
| Fires from a warehouse event | Pallet received, order shipped, unit picked | Bills what was scanned, not the work that was done | Clear unit definitions, and a review of unusual volumes before invoicing |
| Entered by a person | Labels applied, pallets shipped, boxes used, project hours | If nobody enters it, it is never billed | A checklist tied to the work order, closed before the job is |
| Fixed and recurring | Platform fee, integration fee, monthly minimum | Forgotten, or never updated when scope grows | A scheduled review of every recurring line against current scope |
One Midwest operator sent me several months of billing files, and each came with a tab of manual corrections, every one with a written reason. Every correction on that tab came from the same problem: what the system recorded was not the work that was actually done.
| Over-billed | More than 7,000 unit picks billed on an order that was really full pallets shipped untouched, corrected by roughly $1,800. | Event |
| Nearly never billed | Over 1,600 label fees and 1,250 case picks for a marketplace shipment, added back more than a month later. | Entered by a person |
| Under-billed | Nearly fifty pallets for an outbound marketplace shipment staged on the floor into the next month, outside any storage location, so the system never charged storage until they were billed by hand. | Event |
| Over-billed | A receipt billed as 42 pallets that was really 42 cases, inflating handling and storage. | Event |
| Over-billed | Internal replenishment transfers charged to the client as customer orders. | Event |
Two things stand out. The first is that the errors ran in both directions. A billing system that over-charges is a customer audit waiting to happen. One that under-charges is margin you earned and never collected.
The second is who fixed them. Every one of those corrections was made by a person, weeks after the month closed. That is the hidden labor I wrote about in the book: cost that sits on nobody’s P&L line because it is absorbed by someone’s extra hours.
The full-pallet correction is the pen example from the last paper in reverse. There, the same labor produced two different bills depending on how the rate card was written. Here, a pallet that left the building untouched was billed as though every unit had been picked by hand. The rate card I described earlier, with a separate rate for unaltered cases and pallets, would have billed that order correctly the first time. One definition on the rate card, and the correction never happens.
The rate card only earns what the system actually records.
The billing setup behind that operator’s invoices showed one more thing. One client carried seventeen separate charge lines, and their start dates were spread across more than a year. The order fee came first. Then boxes and outbound pallets. Then storage, receiving, returns and the store integration. Then a labeling service specific to that client. The shipping-label software fee arrived a year into the relationship. The same setup charged B2B and B2C orders the identical order fee, even though the work behind them is different.
Nothing about that is wrong. It is how accounts grow. But it means the pricing on a mature account was never designed as a whole. It was assembled one line at a time, and nobody has looked at all seventeen lines together since. That is attribute drift from the last paper, visible in the billing setup itself.
There is no correct pricing model. There is only a model that fits a particular operation and a particular client, and one that quietly does not. The table below is how I would read any rate card before signing it, from either side of the table.
| Model | Rewards | Punishes | Where the margin leaks |
|---|---|---|---|
| Pallet in, pallet out with initial and recurring storage | Predictable B2B freight, clean receipts | Brands that turn inventory quickly and feel they pay storage twice | Floor-staged or unlocated pallets that never trigger storage |
| Dedicated space | Clients who need peak capacity guaranteed | Clients whose peak shrinks after signing | Space sized for a peak that no longer comes |
| A la carte fulfillment | Accurate cost recovery, activity-level visibility | Clients who want one number to budget | Charges nobody enters, units that are defined loosely |
| All-inclusive per order | Brands with stable, simple orders | The operator, when order size or complexity grows | Rising units per order, heavier items, extra materials |
| Flat fee, storage free while it turns | Fast-moving catalogs | Slow or seasonal inventory | Aging penalties that are written down but never enforced |
| Flat monthly fee | Steady-volume clients, simple billing | Clients with seasonal swings | A volume band nobody reopens as the account grows |
| Replenishment billed hourly | Operators whose clients have complex SKU profiles | Clients who cannot predict the bill | Hours that are worked but never logged |
| Replenishment built into storage | Clients who value a predictable bill | The operator, if storage rates ignored it | A SKU profile that changes after the rate was set |
Notice that every row has a leak, and nearly every leak is the same shape as the ones in the last paper: an assumption made at signing that nobody checks again.
The last paper ended with a five-point pricing gut check. This one ends with a rate card gut check. It takes an afternoon, and it works whether you run the warehouse or buy from one.
Sort every line into the five buckets.
Space, touches, systems, materials, exceptions. Any bucket with no lines in it is being absorbed somewhere. Find out where.
Write down the counting rules.
For storage: snapshot, anniversary or daily, and what happens mid-month. For picks: what counts as an each, a case and an unaltered pallet. If it is not written down, it is not agreed.
Check the trigger on your ten largest charges.
Does it fire from a scan, depend on someone entering it, or recur on a schedule? For each one, name the safeguard.
Open last month’s corrections.
Count them, sort them by direction and by trigger, and estimate the hours spent making them. That number is the cost of your billing process, and it is probably not on anyone’s P&L.
Pull your oldest account’s rate card and read every line together.
When was each one added? Does the whole still describe the work you do for that client today?
Rebuild one rate from scratch.
Pick your most common charge, usually the pick or the order fee. Work out its true cost from recorded hours, attributed overhead and today’s utilization. Then compare it to what you charge and to what the market pays. If you cannot build it, that is the finding.
None of this changes a single rate. It tells you whether the rates you already have are being collected, and whether they still describe the work.
Every 3PL invoice is an argument about five things: space, touches, systems, materials and exceptions. The models differ in how they package that argument. Some show every line. Some fold everything into one number. Some give storage away and charge for time instead. None of them is wrong, and none of them is safe on its own.
What decides the margin is rarely the rate. It is whether the rate card writes down its assumptions and its counting rules, whether every charge has a trigger someone trusts, and whether anyone reads the whole thing again after the account has grown.
Price the work. Then make sure the work is what gets recorded.
I am always glad to compare notes on rate cards, from either side of the table.
This is a companion to the second paper in a series of operator-focused field guides for 3PLs scaling into fulfillment.
The Integration Moat
API and EDI architecture as a competitive advantage. How leading 3PLs onboard brands in a week, what the right integration stack looks like at each volume stage, and why integration breadth beats integration depth for most operators.
Labor That Survives a 5x Swing
Cross-training, temp-staffing partnerships, peak-season planning, and the design choices that make labor interchangeable.
Why the WMS Always Goes First
Vendor evaluation, implementation pitfalls, and surviving a WMS transition without losing clients.
Returns Are Reverse Manufacturing
Designing a returns operation at scale, and the technology that makes high-volume returns profitable.
Reading the Brand-Side Signals
How to detect a quiet exit before it happens.
The Fulfillment-Native 3PL
Synthesis. What the 3PL of the next decade looks like.
Vikrant Neb is an industrial engineer who has spent his career around operations. He has run e-commerce companies, led manufacturing operations through Kurieta during his consulting years, and worked with 3PLs across the full range of volumes and transitions covered in this series.
He is the founder of Leanafy, a warehouse management system built specifically for 3PL operators, and Kurieta Operations Consulting. His book, Execution Under Pressure: The Hidden Reasons Why 3PLs Stop Growing and How to Fix Them, came out in 2026. He hosts the Execution at Scale podcast and splits his time between Indianapolis and Vancouver.
This paper covers one slice of his work, what 3PLs charge for and why. He is always glad to compare notes with operators and brands working through a rate card.
vikrantneb.com · linkedin.com/in/vikrant-neb
Want a copy to keep or forward? Download the paper.
Real rate cards, proposals and invoices were shared privately and are not cited. Public figures used for illustration came from these pages, accessed September 2026: