Allocating 3PL and Fulfillment Costs Per Order

A practical method to convert monthly 3PL invoices (pick, pack, storage, receiving) into a per-order variable cost inside your contribution margin — including where storage really belongs.
Quick answer
Treat pick, pack, and outbound pack materials as strictly variable — allocate them per order at the invoice's actual per-unit rate. Amortize receiving over the units in each purchase order. Keep storage below the contribution margin line as a period cost, because it scales with inventory age, not with orders shipped.
Allocating 3PL and Fulfillment Costs Per Order
The method of converting a monthly 3PL invoice into a single per-order variable cost line inside your contribution margin.
A 3PL invoice bundles four very different cost types: pick-and-pack (variable per order), outbound packaging (variable per order), receiving and inbound handling (variable per purchase order, not per shipment), and storage (a period cost tied to inventory volume and dwell time). Allocating fulfillment costs per order means splitting those buckets by their true cost driver, then translating each into a per-order figure your contribution margin calculation can use. Done right, the fulfillment line on your CM report matches what actually leaves your bank account each month — with no unexplained variance when order mix or PO cadence shifts.
Most Shopify finance dashboards show a single flat fulfillment number — often just last month's total 3PL invoice divided by orders shipped. That average hides everything useful.
Why a flat invoice-divided-by-orders average fails
The problem is that four different cost drivers get averaged together. Pick-pack scales with orders. Storage scales with inventory age. Receiving spikes whenever a container lands. Peak-season surcharges spike in November.
So when your Q4 CM tanks, you can't tell whether the culprit is a bad promo mix, a receiving-heavy month, or ShipBob's Q4 peak-season surcharges quietly adding €0.75 per order. You need the invoice split by driver before it hits your contribution margin.
The four buckets on every 3PL invoice
1) Pick + pack fees (per order, sometimes per additional unit). 2) Packaging materials (per order, if 3PL supplies them). 3) Receiving / inbound (per pallet, carton, or unit — belongs to a PO, not an order). 4) Storage (per bin, pallet, or cubic foot per month). Only the first two are cleanly per-order variable.
How to detect misallocation in your current numbers
Pull the last six months of 3PL invoices and your Shopify order counts. If your "cost per order" swings by more than 15% month to month without a promo or SKU-mix change, receiving or storage is bleeding into your per-order number.
The tell-tale sign: months right after a big inbound container show inflated per-order costs. That's receiving being wrongly divided across a small denominator of same-month orders instead of amortized across the units in the PO.
Typical 3PL invoice breakdown for a €3M apparel brand shipping ~4,500 orders/month (US East + EU warehouse)
| Cost bucket | % of invoice | Per-order equivalent | Where it belongs |
|---|---|---|---|
| Pick + pack fees | 48% | €3.20 | Above CM (variable) |
| Outbound packaging | 12% | €0.80 | Above CM (variable) |
| Receiving / inbound | 9% | €0.60 (amortized over PO units) | Above CM (variable, per PO) |
| Storage | 18% | €1.20 (if divided by orders) | Below CM (period cost) |
| Peak surcharges (Nov-Dec) | 8% | €0.55 | Above CM, seasonally |
| Returns processing | 5% | €0.35 | Above CM, on return rate % |
How to fix the allocation, bucket by bucket
Start with pick-pack. If your 3PL charges flat-rate ($3.20 first item + $0.50 each additional), calculate a blended per-order cost weighted by your actual SKU-mix — a two-item order costs $3.70, not two × $3.20. For weight-based 3PLs, the logic shifts to average shipped weight × the tier rate.
Next, receiving. Take each PO's total receiving cost (pallet fees, unit-in fees, appointment fees) and divide it by the units in that PO. That per-unit receiving cost then rides on every order that ships those units — usually a €0.40–€0.80 line depending on your SKU size.
Storage is the controversial one. Because storage scales with inventory dwell time (not with orders shipped), it belongs below the contribution margin line as a period cost. Keeping it in CM means slow-moving SKUs look artificially profitable in months you don't sell them — and unprofitable in months you do.
Per-order fulfillment cost: flat average vs bucket-allocated method
Naive (invoice / orders)
Bucket-allocated (used in CM)
The 5-line CM fulfillment stack
Pick-pack (SKU-mix weighted) + outbound packaging + receiving-per-unit-amortized + returns × return rate + peak surcharge (seasonal months only). Storage sits below the CM line, next to warehouse minimums and platform fees.
Experiment ideas once your CM line is clean
With a clean per-order fulfillment cost, you can finally test which levers move CM. A/B the free-shipping threshold: if lifting it from €50 to €65 raises AOV by one unit, your SKU-mix-weighted pick-pack cost only rises €0.50 — but you clear €15 more revenue per order. That's a legitimate CM experiment.
Second experiment: bundle offers. Two-item bundles crush per-order fulfillment as a % of revenue because the second pick is cheap. If your dashboard still averages storage into fulfillment, this win is invisible. Once cleaned up, the CM lift shows up immediately in the contribution margin calculator and justifies more aggressive bundle merchandising.
3PL cost allocation FAQ
Below the line. Storage scales with inventory dwell time and cubic volume, not with orders shipped, so treating it as variable per-order distorts CM in both directions. Track it as a period cost alongside warehouse minimums and platform SaaS fees.
Pull the ShipBob invoice, isolate the pick + pack fees and standard packaging, and divide by orders shipped that month. Add a receiving-per-unit figure (from the last inbound PO) multiplied by your average units per order. That gives a bucket-allocated per-order number that matches what you'd put on your CM report.
Flat-rate is easier to allocate because the cost is deterministic per SKU-count. Weight-based is more accurate for brands with wide product-weight variance (apparel vs supplements, for example). Neither is inherently better; the allocation method needs to mirror the pricing structure.
Add them as a seasonal line inside CM for the months they apply (typically November and December). Don't smooth them across the full year — that hides the real Q4 margin hit and lets you over-discount during the surcharge window.
Take each PO's total receiving cost and divide by the units inbounded on that PO. That per-unit figure then attaches to every future order that ships those units. It gives you a stable receiving line that doesn't spike in months you happen to land a container.
Multiply the 3PL's per-return processing fee by your rolling return rate, then add it to every outbound order as a probability-weighted cost. A €4.50 return fee on a 12% return rate adds €0.54 to per-order fulfillment cost across the board.
Calculate the per-order fulfillment cost for each warehouse separately, then weight by the share of orders each one ships. If US East ships 60% of orders at €4.80 and EU ships 40% at €5.60, your blended per-order figure is €5.12 — that's what goes into CM.
Variable. Every mailer, void-fill, and insert card ships with an order and only with an order. Include them above the CM line at their true per-order cost, especially if your brand uses premium unboxing packaging where the per-order figure can hit €2–€4.
Monthly for pick-pack and packaging. Quarterly for receiving (recalculate the per-unit figure with the latest PO). Annually for the storage below-line figure unless SKU count changes materially. Peak-surcharge lines get switched on and off by calendar.
Fulfillment is one of four CM cost lines: COGS, payment processing, fulfillment (this one), and marketing/CAC if you attribute it per order. Plug your bucket-allocated per-order fulfillment number in as a single line — the contribution margin calculator handles the rest.
Start tracking the metric that matters
Free for 30 days. No credit card. Connect your site in 4 minutes and see the one metric driving revenue.