Allocating Inbound Freight Per Unit For Container-Shipped SKUs

A practical guide to spreading a container's freight and duty across SKUs so per-unit COGS reflects true landed cost — and which allocation key (weight, volume, or value) keeps contribution margin honest for mixed catalogues.
Quick answer
Allocate inbound freight per unit using volume (CBM) as the default key for mixed-catalogue containers, because ocean freight is priced on space, not weight. Switch to weight only for dense, uniform SKUs (glass, ceramics, hardware), and never use invoice value — it overcharges premium SKUs and hides losses on cheap-but-bulky ones.
Allocating Inbound Freight Per Unit For Container-Shipped SKUs
Spreading a container's freight, duty and fees across SKUs so per-unit COGS reflects true landed cost, not supplier invoice cost.
When you import a mixed container, the supplier invoice tells you what each SKU cost at the factory gate. It does not tell you what each unit cost to land in your warehouse — ocean freight, fuel surcharges, port fees, customs brokerage and duty all arrive as container-level totals. Allocating those totals down to a per-unit figure gives you landed cost, and landed cost is what your contribution margin should be built on.
The allocation method you pick — by weight, by volume, or by invoice value — quietly determines which SKUs look profitable and which look like dogs. Getting it wrong on a mixed catalogue means you'll scale the wrong products.
Most Shopify brands under €10M in revenue skip this step entirely. They book freight to a single COGS bucket, divide by units received, and move on. That works when your catalogue is uniform. It falls apart the moment you ship apparel and hardgoods in the same container.
Why invoice-cost COGS misleads you
A 40ft container from Ningbo to Rotterdam costs roughly €4,000–€7,000 today, before duty. On a 500-unit shipment that's €8–€14 per unit if you spread it flat. But units aren't equivalent: a folded T-shirt takes 0.002 CBM, a ceramic planter takes 0.03 CBM. Flat allocation charges both the same.
The T-shirt absorbs freight it didn't cause. The planter under-absorbs. On paper the planter looks like your margin hero. In reality it's eating 15x more container space per unit and your next PO of planters will blow your freight budget.
The symptom to watch for
If your bulky SKUs consistently show best-in-class contribution margin while your small, light SKUs look mediocre, your freight allocation is almost certainly wrong. See how reallocating landed cost reveals secretly loss-making SKUs — the pattern is nearly universal on mixed catalogues.
The three allocation keys, and when each one holds up
Volume (CBM) is the honest default. Ocean carriers price by container slot, and the container fills up on volume long before it hits its weight limit for anything lighter than metal or liquids. If one SKU takes 5% of the container's CBM, it should carry 5% of the freight bill. This is covered in depth in the guide on choosing a freight allocation key by weight vs volume vs value.
Weight works when your catalogue is dense and uniform — a homewares brand shipping only stoneware, or a supplements brand shipping only bottled product. It breaks the moment you add a light-and-bulky SKU like a foam pillow or a lampshade, because weight-based allocation dramatically under-charges the SKU that's actually eating the container.
Value-based allocation (each SKU absorbs freight proportional to its factory-invoice value) is the accountant's shortcut and almost always wrong. It punishes your premium SKUs with freight they didn't cause and subsidises cheap bulky items. Avoid it unless your finance team can defend it in a specific edge case.
Same container, three allocation methods: per-unit freight for a mixed apparel + homewares shipment (€6,000 total freight, 40ft container)
| SKU | Units | Unit CBM | By volume | By weight | By value |
|---|---|---|---|---|---|
| Cotton T-shirt | 1,200 | 0.002 CBM | €0.42 | €1.15 | €3.80 |
| Ceramic planter | 300 | 0.030 CBM | €6.30 | €3.10 | €4.20 |
| Foam floor cushion | 180 | 0.055 CBM | €11.55 | €2.40 | €5.10 |
| Stoneware mug set | 600 | 0.008 CBM | €1.68 | €3.90 | €2.20 |
How to detect that your allocation is off
Pull your last 12 months of container invoices and your SKU-level contribution margin. Rank SKUs by CM %. If the top of the ranking is dominated by physically large items — planters, cushions, lampshades — your allocation is smearing freight onto small SKUs. That's the fingerprint.
A second signal: your realised gross margin at month-end is 3–8 points below the blended margin your product-level report predicts. That gap is almost always inbound freight and duty you booked to a general COGS line instead of loading into per-unit landed cost. Reconciling estimated vs actual landed cost after invoice settlement usually closes most of it.
How to fix it: the working process
Step one: separate the container bill into freight, duty, and one-offs. Freight allocates by volume (or weight, if you've earned the right). Duty allocates separately by HTS code — the HTS-code approach is worth its own workflow because a leather jacket and a cotton jacket carry different rates. One-off surcharges like demurrage should not smear across every SKU on the container.
Step two: decide per-PO or rolling average. Per-PO allocation is more accurate — each container's actual freight loads onto exactly the units that came in it. Rolling average is easier for accounting but delays the signal when freight rates spike. For most brands under €15M, per-PO freight allocation beats rolling average because it surfaces cost changes in real time.
The practical setup
Store landed cost as a per-SKU field in your inventory system, refreshed on every PO receipt. Feed it into your P&L instead of the supplier invoice cost. Your contribution margin dashboard should now recalculate automatically, and secretly loss-making SKUs will appear within one reporting cycle.
Experiments to run once landed cost is clean
Once per-unit landed cost is honest, three experiments become obvious. First, re-price your bulky SKUs — most brands find they've been under-pricing them by 8–15% for years. Second, test dropping the bottom-decile CM SKUs from paid acquisition and watch blended ROAS. Third, renegotiate factory MOQs on the SKUs whose landed cost is dominated by freight, not product.
Mixed-density brands — apparel plus hardgoods, or beauty plus accessories — get the biggest lift from this work because their allocation error is largest. A shampoo-and-hairbrush brand we've seen shifted from weight to volume allocation and discovered the hairbrush line was contributing 40% less margin than reported. See freight allocation for mixed-density containers on apparel and hardgoods brands for the specifics.
Frequently asked questions
By volume (CBM) for most mixed catalogues, because ocean containers fill up on space before weight. Use weight only if your SKUs are uniformly dense — stoneware, glass, canned goods, supplements. Never mix methods across a single container; pick one key and apply it consistently.
Allocate duty separately from freight, by HTS code, because different SKUs carry different duty rates. Lumping duty into the freight pool overcharges low-duty items and undercharges high-duty ones. A leather bag and a canvas bag in the same container will have meaningfully different duty exposure.
Keep them out of your per-unit landed cost. One-off surcharges are period costs, not product costs — if you smear them into COGS you'll distort every future margin comparison. Book them to an inbound-logistics variance account and review monthly.
Per-PO is more accurate and surfaces freight-rate changes immediately. Rolling average is easier to maintain but lags the signal by weeks or months. For brands with volatile freight costs or seasonal PO cadence, per-PO wins. For steady, high-frequency reordering, rolling average is defensible.
On every PO receipt, at minimum. If you're on rolling average, refresh the SKU's landed cost after each container settles. Waiting until quarter-end means you spend three months making pricing and paid-media decisions on stale COGS.
Yes, and it's even more important. LCL rates are already priced by CBM at the freight forwarder level, so volume allocation matches your invoice mechanics exactly. Weight allocation on LCL will produce large errors on any non-uniform shipment.
Estimate landed cost at PO placement using forecast freight rates, then true it up when the final freight, duty, and brokerage invoices settle — usually 30–60 days after arrival. The variance goes to a landed-cost adjustment account and refines your next estimate.
Almost certainly yes. Brands that reallocate landed cost properly typically find 10–25% of their catalogue is running at a lower contribution margin than reported, and a handful of SKUs are outright loss-making at current prices. Your paid-media targeting should shift within one cycle.
Shopify's native cost field is a single number per variant — it can't distinguish invoice cost from landed cost. You'll need an inventory or ERP layer (Cin7, Katana, Brightpearl, or a spreadsheet workflow) that stores landed cost separately and pushes it into your margin reporting.
Inbound freight is one of the variable cost components that flows into COGS, alongside product cost, duty, inbound handling, and merchant fees. Getting it allocated correctly at the SKU level is what turns COGS from a blended average into a decision-grade number for pricing and paid media.
See Metricuno on your data
Bring your stack — Google Analytics, Stripe, a CRM, anything — and we'll walk through the metric tree that turns your funnel into one number.