Contribution margin is what an order leaves you after every cost that scales with it: product, fulfillment, shipping, payment fees, returns and the marketing that bought it. It should set your ad spend, because it tells you how much you can pay for an order before growth starts costing money. Calculate it per SKU and per channel, not only for the whole store.
Why revenue growth can hide losses
Three things commonly push revenue up while profit falls:
- Discounting. Every discount dollar comes straight out of contribution while product and shipping costs stay the same.
- Spending past efficient scale. Each extra prospecting dollar buys pricier customers, so the newest orders carry the least contribution.
- Mix shift. Growth arrives in cheap, heavy or high-return products that barely cover their own shipping.
A hypothetical brand grows monthly net revenue from $400,000 to $500,000 by running a deeper sitewide discount and adding prospecting budget. Contribution before marketing falls from 46% to 38%, and marketing spend rises from $120,000 to $170,000. Contribution after marketing drops from $64,000 to $20,000. The revenue chart looks great; the bank account disagrees.
The MER vs ROAS post derives break-even ROAS and target MER from contribution margin. This post builds the cost model underneath.
CM1, CM2 and CM3: which costs belong where
Each layer isolates a different kind of cost:
- CM1 = net revenue − landed product cost. Is the product priced right?
- CM2 = CM1 − variable order costs. What is one order worth before anyone paid to acquire it? Ad spend has to fit inside this number.
- CM3 = CM2 − variable marketing. What’s left to pay fixed costs and profit?
Net revenue is gross product sales minus discounts and refunds, excluding sales tax. Count shipping fees customers pay either as revenue or as an offset to shipping cost, and never switch. I use the offset, so revenue reflects product sales only.
| Cost | Level | Notes |
|---|---|---|
| Supplier product cost | CM1 | Per unit, from purchase orders |
| Inbound freight, duties, brokerage | CM1 | Spread across the units in each shipment |
| Pick, pack, boxes and per-order 3PL fees | CM2 | Include per-additional-item fees |
| Outbound shipping labels | CM2 | Net of shipping charged to the customer |
| Payment processing | CM2 | Percentage plus fixed fee per transaction |
| Return shipping, processing, write-offs | CM2 | Unsellable returns at product cost |
| Per-order apps and platform fees | CM2 | Anything billed by order volume |
| Paid media on every platform | CM3 | |
| Affiliate commissions, creator fees, seeding | CM3 | |
| Salaries, software, retainers, rent, 3PL storage | Below CM3 | Paid out of contribution |
Two calls matter most. Treat discounts as a revenue reduction, never as marketing, or CM1 looks better than the product really is. And keep 3PL storage below the line: it moves with inventory, not orders, and it distorts per-order math.
Pulling the inputs from your P&L, Shopify and 3PL data
No single system holds every input. Build a monthly model from five sources:
- Shopify sales reports for gross sales, discounts, returns, net sales and shipping charges, split by product and by first-time vs returning customer.
- Purchasing and accounting records for landed cost. Shopify’s cost-per-item field feeds its profit reports, but it often holds the supplier price only. Build landed cost from purchase orders plus freight and duty invoices, and update it with each shipment.
- 3PL and carrier invoices for pick and pack, packaging, labels and returns processing. Divide monthly totals by orders shipped for per-order averages, and keep the rate card for per-SKU modeling.
- Payout and billing reports for payment fees and for apps billed by volume.
- Ad platforms, affiliate networks and creator invoices for marketing spend.
Then reconcile. Multiply your per-order costs by monthly orders and compare against the P&L lines for COGS, fulfillment, shipping and merchant fees. If they differ by more than a few percent, a cost is missing: usually return write-offs, dimensional weight surcharges or a forgotten app. Fix the model before trusting any per-SKU number.
Contribution per order and per SKU
Per order
A hypothetical average order with free shipping:
| Line | Amount |
|---|---|
| Gross product sales | $90.00 |
| Discount | −$10.00 |
| Refund allowance (6% of $80) | −$4.80 |
| Net revenue | $75.20 |
| Landed product cost | −$24.00 |
| CM1 | $51.20 (68%) |
| Pick, pack and box | −$4.50 |
| Outbound shipping | −$8.00 |
| Payment processing | −$2.60 |
| Return handling and write-offs | −$1.00 |
| Per-order apps | −$0.60 |
| CM2 | $34.50 (46%) |
That $34.50 is the ceiling on what you can pay to acquire this order if it has to pay for itself. Spend $30 in ads per order and CM3 is $4.50, before rent and salaries.
CM1 at 68% looks comfortable, yet fulfillment and shipping alone take $12.50, more than half of product cost. Brands that plan from gross margin miss exactly this gap.
Per SKU
Store averages hide the products that can’t carry ad spend. Calculate CM2 for each key SKU as if bought alone, using your 3PL rate card and each product’s actual shipping weight:
| SKU (hypothetical) | Net price | Landed cost | Fulfillment + shipping | Fees + returns | CM2 alone | CM2 % |
|---|---|---|---|---|---|---|
| Starter kit | $120 | $34 | $14 | $8 | $64 | 53% |
| Premium bundle | $210 | $78 | $18 | $14 | $100 | 48% |
| Refill pack | $32 | $8 | $11 | $3 | $10 | 31% |
| Accessory | $18 | $5 | $10 | $2 | $1 | 6% |
Then calculate each SKU as an add-on, counting only incremental costs. The accessory that earns $1 alone adds roughly $10 when it joins an order that’s already shipping, because only a per-item pick fee is incremental.
Decisions follow:
- Rank by CM2 dollars, not percent. CAC is paid in dollars, so the premium bundle can carry more spend than the starter kit despite a lower percentage.
- Lead acquisition ads with SKUs whose solo CM2 covers your target CAC. At a $40 target, that’s the kit and the bundle.
- Sell the accessory in cart, post-purchase and in bundles, never as a paid landing page.
- Keep the refill pack for returning customers through email and SMS, where acquisition cost is near zero.
Contribution by channel and customer type
The same product earns different contribution depending on the channel. Channels differ in discount depth, commissions, product mix, return rates and share of first-time buyers. Calculate CM3 per order by channel using one consistent attribution view, such as UTM-based last click, and use it to compare channels, not to prove incrementality.
| Channel (hypothetical) | Net revenue / order | CM2 / order | Marketing / order | CM3 / order |
|---|---|---|---|---|
| Paid social, new customers | $76 | $33 | $38 | −$5 |
| Google Shopping and Search | $84 | $38 | $22 | $16 |
| Affiliates and coupon sites | $68 | $25 | $8 | $17 |
| Email and SMS, returning | $82 | $38 | $3 | $35 |
Paid social shows a loss per order, but it may be creating the customers who later buy through email. Coupon sites look profitable, but many of those buyers were already at checkout hunting for a code. Channel CM3 shows where contribution is booked, not what caused it.
Split by customer type too. Store-level CM3 blends returning customers, who cost little to reach, with new customers, who carry the full acquisition cost. A store can show healthy blended contribution while every new customer is bought at a loss, and that only works if those customers come back.
First-order vs lifetime contribution
First-order contribution is first-order CM2 minus CAC. For DTC brands acquiring on paid social it’s often thin or negative. Lifetime contribution adds CM2 from repeat orders over a fixed window, net of retention discounts and email and SMS costs.
Use cohorts: group customers by first-order month and track cumulative repeat CM2 per customer, not repeat revenue. Continuing the example with a $40 CAC:
| Days since first order | Repeat CM2 per customer (hypothetical) | Contribution after CAC |
|---|---|---|
| 0 | $0 | −$5.50 |
| 90 | $9 | $3.50 |
| 180 | $18 | $12.50 |
| 365 | $28 | $22.50 |
This cohort pays back by day 90. To set the most you can pay per customer, add first-order CM2 to the repeat CM2 earned inside a payback window your cash can fund. With a 90-day window, that’s $34.50 + $9 = $43.50. With 365 days it’s $62.50, but you’re financing each customer for a year.
Count only repeat contribution you’ve measured in real cohorts, never a projected LTV. And check that new cohorts behave like old ones, because customers acquired with deeper discounts or through newer channels often repeat less.
Levers that improve contribution, ranked
Ranked by how quickly and how much they usually move CM2:
- Stop advertising products that can’t carry spend. Shifting budget toward high-CM2 SKUs changes contribution within days and costs nothing.
- Reduce discount depth and frequency. An extra 20% off an $80 order removes $16 of revenue while costs barely move, cutting that order’s CM2 of about $35 nearly in half. The post on ecommerce discount strategy covers running sales without training customers to wait.
- Raise order value. Bundles, multi-unit pricing and a free-shipping threshold set above your current average spread per-order fulfillment and shipping across more revenue.
- Fix shipping costs. Right-size boxes to avoid dimensional weight charges, renegotiate carrier rates as volume grows, and test charging for shipping below the threshold.
- Cut returns at the source. Better size guides, product detail and photos reduce refunds, return shipping and write-offs together.
- Lower landed cost. Supplier renegotiation, larger runs and slower freight modes can move CM1 the most, but they take months and tie up cash.
This model is where my ecommerce growth work starts: which SKUs get ad spend, which channels scale and what CAC the business can actually afford.
Get it built
If revenue is growing and cash isn’t, the Growth Audit starts with your contribution model by SKU, channel and customer type. It’s $1,500 fixed and credited if we continue. See pricing or get in touch.