Revenue tells you nothing about whether a sale made money. Gross margin — price minus product cost — tells you almost as little, because it ignores every dollar that leaves the business between "unit sold" and "cash in the bank": freight, platform fees, fulfillment, payment processing, returns, and the ad spend that bought the sale. Contribution margin is the number that survives all of that. An agent managing e-commerce SKUs should treat contribution margin, not gross margin, as the pass/fail gate for every pricing, sourcing, or ad-spend decision.
Why gross margin is a vanity number
Gross margin answers one narrow question: how much room sits between selling price and physical product cost. It says nothing about whether the business keeps any of that room after everything else the sale triggers.
gross_margin = (price - COGS) / price
Business — why a healthy gross margin can hide a losing SKU. A SKU priced at $24.99 against a $6.50 landed product cost shows a 74% gross margin — the kind of number that greenlights more inventory and ad spend. But 74% never accounted for the marketplace's cut, the pick-and-pack fee, the processor's cut, returns, or the ad dollars spent to generate the sale. Subtract those and the same SKU can be sitting at 18%, or underwater. An agent that reports gross margin as "the margin" is reporting a number nobody can spend.
Technical — treat gross margin as a sourcing check, not a profitability check. It's legitimate for one purpose: comparing supplier quotes against each other, where freight, fees, and ad spend are held constant. It is not a substitute for contribution margin in any decision involving price, ad spend, or channel choice — those decisions all move a cost line gross margin doesn't see.
The full variable cost stack
Contribution margin subtracts every cost that scales with the unit sold — everything a SKU would NOT incur if that one sale never happened. A cost that doesn't move with volume (rent, salaries, software) is fixed and belongs in overhead, not here.
| Cost line | One-line definition |
|---|---|
| COGS / product cost | The manufacturing or wholesale cost to produce or acquire one unit, landed at the factory or supplier's dock. |
| Inbound freight | The per-unit cost to move the unit from supplier to fulfillment location (ocean/air freight, duties, customs — amortized across the shipment). |
| Marketplace / platform referral fee | The percentage of the sale price the marketplace charges for the right to sell through it (e.g. a category referral fee or commission). |
| Fulfillment fee | The pick-pack-ship fee charged by whoever fulfills the order — a fulfillment-network fee, a 3PL fee, or fully loaded in-house fulfillment cost. |
| Payment processing fee | The percentage-plus-fixed-fee the processor takes per transaction (e.g. 2.9% + $0.30). |
| Average return-rate cost | Expected cost per unit sold contributed by returns — return rate times the cost of a typical return (refund exposure, unsellable/discounted resell, return shipping). |
| Allocated ad spend per unit | Ad dollars spent to acquire that sale, divided across units sold — effectively the cost-per-acquisition (CPA) charged to this unit. |
Business — why every line here is "variable" even though some don't look like it. Return-rate cost and allocated ad spend are easy to skip because neither is a fee stated on an invoice — they're modeled, not billed. But both scale directly with units sold: sell zero, and both go to zero. A stack that stops at billed fees systematically overstates margin, worst on the SKUs most dependent on ads or prone to returns.
Technical — contribution margin is the stack subtracted in one pass.
contribution_margin = price
- COGS
- inbound_freight_per_unit
- referral_fee (price * referral_fee_rate)
- fulfillment_fee
- payment_processing_fee (price * processing_rate + fixed_fee)
- return_rate_cost (return_rate * cost_per_return)
- allocated_ad_spend_per_unit
contribution_margin_pct = contribution_margin / price
Compute every percentage-based line (referral fee, payment processing) off the actual selling price, not list price — a discount changes the dollar amount of those fees too, not just the revenue line.
Break-even ACOS: how much ad spend a SKU can actually afford
Contribution margin and ad spend solve the same equation for different variables. Instead of "what's my margin after ad spend," ask "how much ad spend gets me to zero contribution margin" — that's the SKU's break-even ACOS, the ceiling every campaign on it must respect.
Business — why break-even ACOS matters more than target ACOS. Ad platforms report ACOS as if any number "below target" is fine. But target ACOS is a campaign-management convenience; break-even ACOS is a business constraint. A SKU with thin non-ad economics might break even at 12% — spend even 15% and every ad-driven sale loses money, no matter how good 15% looks against a generic "keep ACOS under 25%" rule borrowed from a different SKU.
Technical — derive it from the non-ad contribution margin. Compute contribution margin with every line except ad spend — the non-ad contribution margin. That figure is the entire budget available for ad spend before the SKU goes to zero:
non_ad_cm = price - COGS - inbound_freight - referral_fee
- fulfillment_fee - payment_processing_fee - return_rate_cost
max_ad_spend_per_unit = non_ad_cm - target_cm // target_cm = 0 for break-even
break_even_acos = max_ad_spend_per_unit / price
Setting target_cm to zero gives the absolute break-even ACOS — the point past which every ad-driven sale actively loses money. Setting it to a positive figure (say, the margin needed to also cover a slice of fixed overhead) gives a stricter ceiling. Either way, compute this once per SKU before any campaign is built — not after, from whatever ACOS the campaign happens to produce.
Worked example
Placeholder SKU IX-10IN, priced at $24.99.
| Line | Amount | Running contribution margin |
|---|---|---|
| Price | $24.99 | $24.99 |
| – COGS | $6.50 | $18.49 |
| – Inbound freight | $0.75 | $17.74 |
| – Referral fee (15%) | $3.75 | $13.99 |
| – Fulfillment fee | $4.20 | $9.79 |
| – Payment processing (2.9% + $0.30) | $1.02 | $8.77 |
| – Return-rate cost (8% × $7.25 cost-per-return) | $0.58 | $8.19 — non-ad contribution margin |
| – Allocated ad spend | $3.50 | $4.69 — contribution margin |
Gross margin here is (24.99 - 6.50) / 24.99 = 74.0% — the number that gets a SKU approved for a bigger PO and a bigger ad budget. Contribution margin, after the full stack, is 4.69 / 24.99 = 18.8% — real and positive, but nowhere near what the gross-margin number implied.
The $8.19 non-ad contribution margin is also this SKU's entire ad budget before it hits zero: 8.19 / 24.99 = 32.8% break-even ACOS. The campaign spending $3.50/unit runs at 3.50 / 24.99 = 14.0% ACOS — well inside that ceiling, with room to bid more aggressively, but the real ceiling is 32.8%, not a generic "keep it under 25%" house rule.
Check contribution margin before scaling ad spend, not after
Business — why the order matters. Scaling ad spend on a SKU whose contribution margin was never checked is scaling on faith. If non-ad contribution margin is thin, every extra ad dollar accelerates a loss — and the mistake compounds with volume, since a bigger budget just means more units sold at a loss, faster. An agent that scales off "ACOS looks fine" instead of "contribution margin is confirmed positive at this ACOS" is optimizing a metric never connected to the P&L.
Technical — gate the scale-up decision on the number, not the trend. Before raising budget on any SKU: recompute non-ad contribution margin from current COGS, fees, and return rate (all three drift); confirm ACOS is meaningfully below break-even, not just below an arbitrary target; only then raise budget, and re-run the check on a fixed cadence rather than once at launch.
Common pitfalls
- Reporting gross margin as "the margin." It only subtracts COGS. Every pricing or ad-spend decision needs contribution margin — the full variable cost stack.
- Forgetting allocated ad spend and return-rate cost because neither appears on an invoice. Both are modeled, not billed, and both scale with units sold — skipping them overstates margin.
- Computing percentage-based fees off list price instead of actual selling price. A coupon changes referral-fee and payment-processing dollars, not just revenue.
- Using a single house-rule ACOS target across all SKUs. Break-even ACOS is SKU-specific, derived from that SKU's own cost stack — not a blanket "keep ACOS under 25%" policy.
- Trusting an ACOS trend without re-checking it against break-even. A trend can look fine right up until a COGS or fee change pushes break-even ACOS below current spend.