Allocating Import Duty Per SKU When HS Codes Carry Different Rates

Metricuno
September 14, 2026
6 min read
Allocating Import Duty Per SKU When HS Codes Carry Different Rates — How to allocate import duty per SKU when HS codes carry different rates — the line-item method that keeps landed COGS defensible and contribution margin accurate.
Quick answer

Freight allocates by weight or CBM across a container; duty doesn't. Here's the line-item method for assigning import duty per SKU when HS codes and rates differ.

Quick answer

Don't allocate duty like freight. Duty is calculated per line item on the commercial invoice: (declared customs value of that SKU) × (duty rate for that SKU's HS code). Then divide by units received to get duty per unit. Pooling duty across the container and splitting by weight or CBM will overcharge low-duty SKUs and hide the true landed cost of high-duty ones.

Definition
Landed cost & COGS

Allocating import duty per SKU when HS codes carry different rates

Assigning duty to each SKU line-by-line using its own HS code rate and declared value, rather than pooling and splitting duty across the shipment.

Import duty is a per-line-item tax: customs calculates it on each SKU's declared customs value multiplied by the tariff rate tied to that SKU's HS code. When a single container carries SKUs classified under different codes — say a knit top at 12% and a synthetic jacket at 16% — the total duty on the entry is a sum of per-line calculations, not a pool that can be split by weight or volume. Allocating that total by CBM the way you'd allocate freight moves cost between SKUs incorrectly and distorts landed COGS. The defensible method mirrors what the customs broker actually filed: duty per SKU = (unit customs value × units × duty rate) ÷ units received.

Also known as
line-item duty allocation
per-SKU duty assignment
HS-code-based duty allocation

This is the sibling problem to inbound freight allocation, but the math is opposite. Freight is one container-level pool you split proportionally. Duty is already itemised on the entry summary — your job is to attach those line-item numbers back to the right SKU in your inventory system.

Why duty doesn't behave like freight

Freight is a physical-space cost. A 40-foot container costs the same whether it's carrying t-shirts or ceramic mugs, so you allocate it by weight, CBM, or unit count across everything inside. Every SKU pays into the same pool.

Duty is a legal-classification cost. Customs looks at each line on your commercial invoice, matches it to an HS code, and applies that code's rate to that line's declared value. A silk blouse and a polyester one ship in the same box but can carry duty rates 6-8 percentage points apart. There's no shared pool to split.

The overcharge trap

If you allocate duty by CBM across a mixed container, a bulky low-duty SKU (like packaging-heavy homeware at 3%) absorbs duty that legally belongs to a compact high-duty SKU (like a leather accessory at 15%). Your homeware COGS looks too high, contribution margin looks too low, and you'll under-price or de-list a product that's actually profitable.

How to detect the problem in your current data

Pull one recent container's entry summary from your broker (the CBP 7501 in the US, the C88/SAD in the EU/UK) and compare the duty line for each HS code to whatever your inventory system booked as duty against those SKUs. If the numbers don't reconcile line-by-line, duty is being pooled somewhere upstream.

The other tell: check whether two SKUs with clearly different HS codes — for example a cotton tee (roughly 16.5% in the US) and a leather belt (roughly 2.7-8%) — are carrying the same duty-per-unit rate in your landed cost report. If they are, someone is splitting a duty total by units or CBM instead of by line.

The line-item method, step by step

Start from the commercial invoice and the entry summary — those are the two authoritative documents. For each SKU line, take the declared customs value (usually FOB or CIF depending on your Incoterm and jurisdiction), multiply by that SKU's duty rate, and you have the duty owed on that line. Divide by units received to get duty per unit.

Worked example. A container carries 2,000 units of a knit dress (HS 6104.43, 16% duty, $8 declared unit value) and 500 units of a synthetic jacket (HS 6201.13, 27.7% duty, $22 declared unit value). Dress duty: 2,000 × $8 × 16% = $2,560, or $1.28/unit. Jacket duty: 500 × $22 × 27.7% = $3,047, or $6.09/unit. Total $5,607 — but never split $5,607 across the 2,500 units as $2.24 each. That would overcharge the dress and undercharge the jacket by roughly 75% and 63% respectively.

Don't forget the fees that DO pool

MPF (Merchandise Processing Fee), HMF (Harbor Maintenance Fee), broker fees, and any container-level customs charges behave more like freight — they're not tied to HS code. Allocate those by declared value or units across the container, keep them in landed cost, but keep them in a separate bucket from HS-code duty so you can audit each independently.

Experiment ideas once your duty is clean

Re-rank your catalogue by true contribution margin after per-SKU duty. On most apparel and accessory catalogues, 5-15% of SKUs move a full margin tier — usually high-duty synthetics and leather goods drop, natural-fibre basics rise. Test pricing or promo depth changes on the SKUs that moved most; the delta is real money that was hidden by pooled duty.

Second experiment: revisit HS classification with your broker for the top 20 SKUs by duty burden. A borderline classification (e.g. a garment with mixed fibre content near the 50% cotton threshold) can legitimately sit in a code 4-8 points lower. On a $200k annual duty spend for one SKU family, that's $8-16k recovered per year with zero product change.

Frequently asked

Frequently asked questions

No — the blended rate is the average across the entry, weighted by declared value. Applying it uniformly to every SKU replicates the pooling error. Use the per-line duty amounts on the entry summary, not the blended percentage.

Freight is one container-level cost pool split by weight, CBM, or units across all SKUs — see our page on allocating inbound freight per unit for container-shipped SKUs. Duty is already per-line on the entry, so you attach those amounts directly rather than pooling and splitting.

Use whatever value customs actually assessed duty on, which is on the entry summary. In the US it's typically FOB (transaction value). In the EU/UK it's CIF (transaction value plus freight and insurance to the border). Match what was filed, not what your PO shows.

Treat them exactly like regular duty: they're line-item, tied to specific HS codes and country of origin, and appear as separate lines on the entry summary. Allocate them to the affected SKU only — never spread across the container.

Ask for the underlying customs entry (CBP 7501, C88/SAD, or equivalent). The 3PL's invoice is a passthrough; the entry document has the HS-code-level breakdown you need. Any 3PL that can't produce it on request is a red flag for landed cost accuracy.

Every shipment, potentially. Duty per unit depends on declared unit value, and declared value shifts with FX, supplier price changes, and Incoterm changes. Recalculate landed duty per unit at each receipt — don't cache it as a static field.

That happens when classification changes or when the same SKU ships from two origins with different preference rules. Store duty per SKU per receipt (or per PO line), not per SKU globally. Then weighted-average across on-hand inventory for reporting.

No — the method is the same. FTAs change the rate applied to a qualifying SKU (often to 0%), but the calculation stays per-line on the entry. Preference claims appear as duty-free lines on the entry summary, which flow through as $0 duty per unit for that SKU.

Into COGS, capitalised into inventory value at receipt. That's both GAAP/IFRS-correct and what your contribution margin math needs. Keep it as a distinct sub-line (Product cost / Freight / Duty / Other landed) so you can audit and re-negotiate each independently.

They apply to entries filed after the effective date, so shipments in transit at the change moment can straddle both rates. Book duty per unit at the actual rate on that shipment's entry — don't retroactively re-value inventory received before the change.

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.