To price for profit, you need a unit-level “true product cost” you can trust. In ecommerce, that usually means calculating COGS (Cost of Goods Sold) per unit for each SKU (and for each variant when costs differ). The most common pricing mistakes happen when COGS is treated as “supplier price only” and important per-unit costs are omitted or misallocated.
What COGS means at the unit level (for ecommerce)
Unit COGS is the cost that scales with the number of sellable units you bring into inventory and then sell. It typically includes: the product itself, packaging and labeling required to sell it, inbound freight to your warehouse/3PL, quality inspection, and any prep/kit labor needed to make the unit sellable.
COGS is not the same as “all business costs.” Some costs are variable (increase with units) and belong in unit COGS; others are fixed (do not change with units in the short run) and should be handled separately when you build your full pricing model.
Break COGS into components (what to include and what people forget)
1) Manufacturing / supplier unit cost
This is the factory price per unit (or landed ex-works unit cost). Confirm whether it includes any components like inner packaging, inserts, or labeling—never assume.
- Include: base unit price, paid add-ons (custom color, upgraded materials), per-unit tooling amortization if charged per unit.
- Common omission: supplier charges listed as “misc” or “handling” that are actually per-unit.
2) Packaging
Packaging is part of COGS when it is required to sell the unit (retail box, polybag, protective insert, dunnage inside the unit box).
Continue in our app.
You can listen to the audiobook with the screen off, receive a free certificate for this course, and also have access to 5,000 other free online courses.
Or continue reading below...Download the app
- Include: retail box, insert card, protective foam, polybag, shrink wrap.
- Common omission: “free” packaging that is actually embedded in a higher unit price—still part of manufacturing cost, but you should know it exists for comparisons.
3) Labeling
Any label required for compliance or selling (barcode label, country of origin, warning labels) belongs in unit COGS.
- Include: FNSKU/UPC labels, suffocation warnings, compliance stickers.
- Common omission: label labor (applying labels) when done at a 3PL or prep center.
4) Inbound freight (to your warehouse/3PL)
Inbound freight is part of landed unit cost. Track it from the supplier to the location where units become available for sale (your warehouse, 3PL, or fulfillment network receiving point).
- Include: ocean/air freight, trucking, fuel surcharges, port/terminal fees, drayage, customs brokerage, duties/tariffs, cargo insurance (if tied to shipment).
- Common omission: duties and brokerage, or “destination charges” billed after the main freight invoice.
5) Inspection / quality control
If you pay for pre-shipment inspection, lab testing, or random sampling tied to a batch, allocate it across the units in that batch.
- Include: third-party inspection fees, lab test fees required for that product line.
- Common omission: re-inspection after a failed first inspection.
6) Prep / kit labor
Any labor needed to make the unit sellable is part of unit COGS: bundling, kitting, inserting cards, bubble-wrapping, applying labels, assembling multi-packs.
- Include: 3PL prep fees per unit, kitting fees, assembly labor charged per unit.
- Common omission: “one-time” setup fees that are actually required each batch (treat as batch cost and allocate).
Variable vs fixed costs: where COGS stops
Use this rule: if the cost is incurred because you produced/received those specific units, it is usually part of unit COGS. If the cost exists even if you sell zero units this month, it is usually fixed overhead.
| Cost item | Usually variable (unit/batch COGS)? | Usually fixed (not in unit COGS)? |
|---|---|---|
| Supplier unit price | Yes | No |
| Retail box / insert | Yes | No |
| Barcode labels + application labor | Yes | No |
| Inbound freight + duties + brokerage | Yes | No |
| Pre-shipment inspection | Yes (allocate per batch) | No |
| 3PL kitting / prep per unit | Yes | No |
| Warehouse rent | No | Yes |
| Salaried operations manager | No | Yes |
| Software subscriptions | No | Yes |
| General marketing spend | No | Yes |
Note: Some costs can be mixed. For example, storage fees may scale with inventory levels (semi-variable), but they are not typically included in unit COGS for pricing; instead, treat them as fulfillment/operating costs in your broader profitability model.
How to allocate batch costs to units (the core skill)
Many ecommerce costs arrive as batch costs (one invoice for a shipment or production run). To convert them into unit COGS, allocate them across the units that benefited.
Allocation methods you can use
- Per-unit allocation (most common): divide the batch cost by the number of sellable units received.
- By carton/case: if costs are tied to cartons (e.g., special cartons), allocate per carton then per unit.
- By weight or volume: for inbound freight across multiple SKUs, allocate by chargeable weight (kg) or cubic meters (CBM).
- By value: for duties/insurance sometimes allocated by declared value (useful when freight is not weight-based).
Choose the method that best matches how the cost is actually incurred. Freight is often best allocated by weight/volume; inspection is often per batch (per-unit allocation); packaging is per unit.
Important: allocate using sellable units, not ordered units
If 2% of units are damaged or fail inspection and cannot be sold, the batch costs should be spread over the sellable units (or you should record the loss separately but still reflect its impact). Otherwise, your unit COGS will be understated.
Step-by-step template: calculate true unit COGS for one SKU
Use this replicable worksheet structure. The goal is to compute:
Unit COGS = Manufacturing + Packaging + Labeling + (Inbound Freight + Duties + Brokerage + Insurance)/Sellable Units + Inspection/Sellable Units + Prep LaborStep 1: Define the batch and the sellable units
- SKU: Example: “Stainless Water Bottle 24oz”
- Batch size ordered: 1,000 units
- Units not sellable (damage/failed QC): 20 units
- Sellable units: 980 units
Step 2: List per-unit costs (direct unit costs)
| Component | Type | Input | Per-unit cost |
|---|---|---|---|
| Manufacturing (supplier price) | Per unit | $4.20 | $4.20 |
| Retail box | Per unit | $0.35 | $0.35 |
| Insert card | Per unit | $0.08 | $0.08 |
| Barcode label | Per unit | $0.03 | $0.03 |
| Label application labor | Per unit | $0.05 | $0.05 |
| Prep/kitting labor | Per unit | $0.12 | $0.12 |
Per-unit subtotal (direct): $4.20 + 0.35 + 0.08 + 0.03 + 0.05 + 0.12 = $4.83
Step 3: List batch costs (shipment/run costs) and allocate to units
| Batch cost item | Invoice amount | Allocation basis | Allocated per unit |
|---|---|---|---|
| Ocean freight + destination charges | $1,470 | Sellable units (980) | $1.50 |
| Duties/tariffs | $392 | Sellable units (980) | $0.40 |
| Customs brokerage | $147 | Sellable units (980) | $0.15 |
| Cargo insurance | $49 | Sellable units (980) | $0.05 |
| Pre-shipment inspection | $196 | Sellable units (980) | $0.20 |
Batch allocation subtotal: 1.50 + 0.40 + 0.15 + 0.05 + 0.20 = $2.30
Step 4: Compute true unit COGS
Unit COGS = Direct per-unit subtotal + Batch allocation subtotal
$4.83 + $2.30 = $7.13 true unit COGS
Step 5: Build an “omissions check” before you trust the number
- Did you include all inbound invoices (main freight + destination charges + duties + brokerage)?
- Did you include packaging and labeling that is required to sell?
- Did you include prep/kitting needed for the channel (e.g., labeling rules)?
- Did you allocate using sellable units?
- Did you accidentally include fixed overhead (rent, salaries) inside unit COGS?
Replicable worksheet template (copy/paste structure)
Use this structure for any SKU. Keep per-unit and batch costs separate so you can update quickly when freight or batch size changes.
| Field | Value |
|---|---|
| SKU | |
| Batch ordered units | |
| Unsellable units | |
| Sellable units | |
| Manufacturing per unit | |
| Packaging per unit (box/insert/etc.) | |
| Labeling per unit (labels + labor) | |
| Prep/kitting per unit | |
| Batch: freight total | |
| Batch: duties/tariffs total | |
| Batch: brokerage total | |
| Batch: insurance total | |
| Batch: inspection/testing total | |
| Direct per-unit subtotal | =sum(per-unit items) |
| Batch per-unit subtotal | =sum(batch totals)/sellable units |
| True unit COGS | =direct per-unit subtotal + batch per-unit subtotal |
Variant family template: allocating shared costs across multiple SKUs
Variant families (sizes/colors) often share a single inbound shipment and sometimes a single inspection invoice. The key is to allocate shared batch costs fairly across variants, then add variant-specific per-unit costs (e.g., different packaging or manufacturing cost).
Step-by-step example: one family with 3 variants
Example family: “Yoga Mat” in three thicknesses. One shipment contains all variants.
- Variant A (4mm): 400 ordered, 392 sellable, manufacturing $6.00
- Variant B (6mm): 350 ordered, 343 sellable, manufacturing $6.80
- Variant C (8mm): 250 ordered, 245 sellable, manufacturing $7.60
- Total sellable units: 392 + 343 + 245 = 980
Shared batch costs:
- Freight total: $1,960 (best allocated by weight/volume; we’ll use weight)
- Duties + brokerage total: $735 (often by value; we’ll use declared value)
- Inspection total: $196 (per-unit allocation across all sellable units)
Step 1: Allocate freight by weight (or volume)
Assume chargeable weight per unit:
- A: 1.2 kg/unit
- B: 1.5 kg/unit
- C: 1.9 kg/unit
Compute total weight by variant using sellable units:
- A total kg = 392 × 1.2 = 470.4
- B total kg = 343 × 1.5 = 514.5
- C total kg = 245 × 1.9 = 465.5
- Total kg = 1,450.4
Freight per kg = $1,960 / 1,450.4 = $1.351
Freight per unit by variant:
- A: 1.2 × 1.351 = $1.62
- B: 1.5 × 1.351 = $2.03
- C: 1.9 × 1.351 = $2.57
Step 2: Allocate duties/brokerage by declared value (or manufacturing cost share)
Assume declared value approximates manufacturing cost per unit (simplification for learning). Compute total declared value:
- A: 392 × $6.00 = $2,352
- B: 343 × $6.80 = $2,332.40
- C: 245 × $7.60 = $1,862
- Total value = $6,546.40
Duties+brokerage rate = $735 / $6,546.40 = 11.23%
Duties+brokerage per unit:
- A: $6.00 × 11.23% = $0.67
- B: $6.80 × 11.23% = $0.76
- C: $7.60 × 11.23% = $0.85
Step 3: Allocate inspection per unit across all sellable units
Inspection per unit = $196 / 980 = $0.20 for each variant.
Step 4: Add variant-specific per-unit packaging/labeling/prep
Assume packaging/labeling/prep differs slightly:
- A: $0.40
- B: $0.45
- C: $0.50
Step 5: Compute true unit COGS per variant
| Variant | Manufacturing | Packaging/Prep | Freight | Duties+Brokerage | Inspection | True unit COGS |
|---|---|---|---|---|---|---|
| A (4mm) | $6.00 | $0.40 | $1.62 | $0.67 | $0.20 | $8.89 |
| B (6mm) | $6.80 | $0.45 | $2.03 | $0.76 | $0.20 | $10.24 |
| C (8mm) | $7.60 | $0.50 | $2.57 | $0.85 | $0.20 | $11.72 |
This is why variant-level COGS matters: even within one family, landed costs can diverge meaningfully due to weight/volume and value-based allocations.
Common COGS omissions and how to prevent them
Omission checklist (use before finalizing a price)
- Inbound “extras”: destination charges, port fees, drayage, fuel surcharges, residential delivery, appointment fees.
- Compliance: required labels, testing, certification fees tied to a batch.
- Channel-required prep: barcode relabeling, polybagging, suffocation warnings, bundle assembly.
- Damage/shortage: allocating batch costs over ordered units instead of sellable units.
- Currency and payment fees: if you pay supplier in another currency and fees are consistently tied to purchasing inventory, track them as batch costs and allocate (be consistent).
Simple control: keep a “COGS invoice folder” per batch
For each production run or inbound shipment, store every invoice that should flow into landed cost: supplier invoice, packaging invoice (if separate), freight invoices, duties statement, brokerage invoice, inspection invoice, and 3PL prep invoice. If an invoice exists because the units exist, it likely belongs in unit COGS (unit or batch allocated).