Allocating 3PL and Fulfillment Costs Per Order

Metricuno
August 10, 2026
6 min read
Allocating 3PL and Fulfillment Costs Per Order — How to turn ShipBob, ShipHero, or any 3PL invoice into a clean per-order fulfillment cost line inside your contribution margin. With worked examples.
Quick answer

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.

Definition
Unit economics

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.

Also known as
Per-order fulfillment cost allocation
3PL cost attribution

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.

Benchmark

Typical 3PL invoice breakdown for a €3M apparel brand shipping ~4,500 orders/month (US East + EU warehouse)

Cost bucket% of invoicePer-order equivalentWhere it belongs
Pick + pack fees48%€3.20Above CM (variable)
Outbound packaging12%€0.80Above CM (variable)
Receiving / inbound9%€0.60 (amortized over PO units)Above CM (variable, per PO)
Storage18%€1.20 (if divided by orders)Below CM (period cost)
Peak surcharges (Nov-Dec)8%€0.55Above CM, seasonally
Returns processing5%€0.35Above 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.

Chart

Per-order fulfillment cost: flat average vs bucket-allocated method

0€2€4€6€8€10€JulAugSepOctNovDecCost per orderMonth

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.

Frequently asked

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.