Accounting & Finance

Moving-average cost and contribution margin

How weighted-average cost feeds an honest contribution margin for each product.

Last updated September 16, 2026

Contribution margin is only as honest as the unit cost under it. For most DTC catalogs that is weighted average cost, one blended number per SKU, not a stack of POs.

How weighted-average cost moves

WAC moves when goods actually land, when a supplier invoice disagrees with the PO, when freight and duty post, when a manufacturing order finishes, or when you revalue. Opening a PO does nothing. The math is (qty on hand times old average, plus qty received times receipt cost) divided by total qty. That pool is the whole SKU.

You hold 100 units at $8.00, $800 in the pool. Ten units land at $10.00. New WAC is $900 divided by 110, $8.18. The next sale of an old unit expenses $8.18, not $8.00. The same receipt of 200 at $10.00 is $2,800 divided by 300, $9.33. One expensive DDP container re-prices every unit you still hold.

How landed cost affects WAC

Landed cost is additive. Freight, brokerage, duties, and tariffs capitalize. Sales tax does not. Either put the fully loaded price on the receipt, or keep FOB and let landed cost add the rest. Doing both double-counts. A $2.94 freight line on a container is a pool allocated by value share, not $2.94 per unit. If this SKU is 11.25 percent of the container's value, it takes $0.33 of freight. Freight invoices arrive weeks late, so early sales expense a too-low cost. Corrections revalue what is still on hand and dump the rest into this period's COGS. Last quarter's margin is not restated.

Fields that are not valuation

Do not confuse fields. Last received price is a receipt, not valuation. BOM cost is a recipe, not the finished-good average until production completes. A kit built at ship time expenses live component averages even if the kit SKU still shows a $1 import leftover. Negative on-hand quantity will produce a nonsense average. Customer returns brought back as zero-cost POs recycle whatever error already sits on the SKU. A factory-direct FOB channel should show lower COGS than a DDP warehouse. That is not a bug.

Gross margin vs contribution margin

Gross margin is price minus WAC. Contribution margin is one layer down: price minus WAC minus outbound shipping, payment and marketplace fees, a returns allowance, and the variable ads you actually spent to get the order, over net revenue. A SKU at $10 against a $12.43 WAC is a pricing or costing problem, not an ads problem. Reconcile valuation to the GL monthly, SKU by SKU, before you argue about ads.

Run this with AI

Connect Claude or ChatGPT to your Fulfil data with the Fulfil MCP, then run this prompt on your own numbers.

You are the finance lead for a DTC brand.
Here is a SKU file: sku, on_hand, wac, last_received_price, bom_cost, sell_price, inbound_freight_pending, outbound_ship, payment_fee, ad_spend_per_order, returns_rate.
[paste a recent DDP receipt: qty, unit_price, freight_pool, duty_pool, sku_value_share]

Produce:
1. New WAC after the receipt, showing the pool math.
2. Whether freight/duty should replace or add (flag double-count risk), and the per-SKU freight if the line is a pool.
3. Gross margin vs contribution margin per unit and as % of net.
4. SKUs where sell price is below WAC.
5. Fields that should not be used as "the cost" (last received, BOM, leftover $1 kit cost).
Do not restate historical COGS. Say what hits this period vs on-hand.

See it run on
your data.

Fulfil runs inventory, fulfillment, purchasing, and accounting for scaling DTC brands in one system.