Contribution Margin per Unit: Find Which Shopify Products Are Worth Promoting
What contribution margin per unit actually tells you
Contribution margin per unit is the money left from one sale after you subtract the variable costs of making and fulfilling that sale. It is the amount that unit contributes toward fixed costs and profit.
The formula is simple: selling price minus variable cost per unit. In an illustrative example, a $48 product with $31 of variable cost has a contribution margin of $17. That $17 is what one kept sale can put toward rent, salaries, software, and profit, before you count fixed overhead.
That opening formula is contribution margin per completed unit, a sale the customer keeps. If some orders will be refunded, do not compare ad spend with that figure until you convert it to expected contribution per order. The refund section shows how, so refunded revenue, recovered inventory, and return costs stay on the same definition.
Contribution margin ratio is the same figure as a percentage of price: contribution margin per unit divided by selling price. On that same hypothetical $48 product, $17 divided by $48 is about 35%. Ratio is useful for comparing products at different price points. Per-unit margin is more useful when you are deciding whether one more sale is worth the ad spend, discount, or reorder.
Contribution margin per unit answers a narrower question than net profit: if you sell one more of this SKU, how much cash is left to cover fixed costs and fund the next decision?
Net profit subtracts fixed costs as well. Fixed costs do not change with one extra unit, so they distort product comparisons. A slow SKU can look unprofitable on a fully loaded P&L even when each sale still covers its own costs and helps pay the rent. A fast SKU can look healthy on revenue while every extra order barely covers shipping and ads.
Which Shopify product costs belong in the calculation
Only costs that rise when you sell one more unit belong in variable cost. Costs that stay roughly the same whether you sell 10 or 1,000 units stay out. Misclassifying either side is the most common reason a contribution margin looks precise and still leads you to promote the wrong product.
Costs that usually move with each unit
- Landed product cost: unit cost from the supplier, plus inbound freight, duties, and packaging allocated to that unit. On a completed sale, count it once. On a refund, keep it only if you write the unit off.
- Payment processing: the percentage fee plus the fixed per-transaction fee, if you can tie the fixed fee to a typical order of one unit. Note whether a refund returns that fee.
- Outbound shipping you pay and do not fully recover from the customer.
- Pick, pack, and per-order fulfillment fees charged by a 3PL.
- Marketplace or sales-channel fees that are a percent of the order, if that SKU sells on a fee-based channel.
- Return costs on refunded orders: return shipping, outbound shipping you do not recover, payment fees you do not get back, packaging you cannot reuse, and variable restock labor. These sit on the refund outcome, not as a second product cost.
- Variable advertising, only when you are scoring a specific campaign. Do not bake a storewide ad budget into every SKU's base margin.
How to treat refunds in expected contribution
Pick one definition and stay with it. Contribution margin per completed unit covers sales the customer keeps. Expected contribution per order placed averages every order you take, including orders you later refund. Compare ad cost with the second number. A fully refunded order does not leave you with the sale price, even when the inventory comes back sellable.
- Completed unit: use the price the customer keeps, subtract landed cost once, and subtract fulfillment costs of that sale. Leave returns out of both revenue and the unit count. Do not also subtract a return allowance inside this figure, or you will haircut a sale that was not refunded.
- Expected contribution per order: start from expected net revenue. For full refunds, that is price times the share of orders that are not refunded, plus any amount you keep on partial refunds. Then subtract the cost outcome that matches each order, not a full landed cost on every order plus a small fee.
- Resellable full refund: net revenue on that order is the amount you did not refund, often zero. Credit the landed cost back, because the unit is inventory again. Still subtract costs you do not recover, such as outbound shipping, return shipping, payment fees the processor does not return, packaging you cannot reuse, and variable restock labor. A later sale of that unit carries its own fulfillment costs, not a second inbound product cost.
- Write-off: use the same unrecovered costs, and do not credit landed cost back. The refund already removed the revenue, and the inventory is gone, so landed cost is a loss on that order. Count it once, on the write-off, not also as the cost of a completed sale of the same unit.
- Partial refund or exchange: set revenue to the net amount you keep. Add only the extra shipping, fee, or write-off the return creates. If the original unit comes back sellable and a replacement ships, the replacement carries its own fulfillment cost.
Expected contribution per order equals the kept-sale share times completed-sale contribution, plus the refunded share times the contribution of a refunded order. On a resellable full refund, that contribution is zero minus unrecovered return costs. On a write-off, it is zero minus unrecovered return costs minus landed cost. If 10 of 100 orders are fully refunded, 8 units come back sellable, and 2 are written off, average those three outcomes. Do not keep the full price, keep the full landed cost, and then subtract only a return fee.
If your revenue line is Shopify net sales, the refund is already removed. Shopify's sales reports define net sales as gross sales minus discounts minus sales reversals, and sales reversals include the value of returned products. On the total sales by product report, net quantity equates to the number of sold items minus the number of returned items. Pairing net sales with landed cost on every gross unit removes refunded revenue and still treats recovered inventory as consumed. If the unit count is already net of returned items, do not subtract those units' landed cost again. Add landed cost back only for returned units you write off, and add unrecovered return costs, which net sales does not include.
Costs that usually stay fixed
- Shopify subscription, theme, and most apps.
- Salaried staff, rent, insurance, and accounting.
- Photography, brand shoots, and one-time product development.
- Warehouse minimums that do not change with one extra order.
Discounts belong in the price, not as a vague "marketing cost." Use the price the customer actually pays. In the same hypothetical, a 20% sitewide code turns a $48 product into a $38.40 sale before you subtract variable cost. If you calculate margin on the sticker price and then run a standing discount, you will overstate what each order contributes.
Multi-item orders complicate the fixed per-order fees. Payment fixed fees and a flat shipping label do not double when someone adds a second item. For promotion decisions, calculate the one-unit case first, then check a typical two-item order if that SKU is often bought with something else. The one-unit case is the conservative number for paid traffic, because many ad clicks land on a single product page.
A worked example: two products, same revenue, different decisions
The figures below are a hypothetical illustration, not a benchmark. Take two imaginary SKUs that both did $4,800 in revenue on sales the customer kept. On a revenue report of kept sales they look equal. On contribution margin per completed unit they are not. This table excludes returns. The next paragraph turns the serum into expected contribution per order before any ad-spend comparison.
| Line | Serum, 100 kept units | Candle, 160 kept units |
|---|---|---|
| Selling price | $48.00 | $30.00 |
| Landed product cost | $14.00 | $9.50 |
| Packaging | $1.20 | $0.80 |
| Payment fees (2.9% + $0.30) | $1.69 | $1.17 |
| Shipping you absorb | $6.50 | $7.25 |
| Variable cost per completed unit | $23.39 | $18.72 |
| Contribution margin per completed unit | $24.61 | $11.28 |
| Contribution margin ratio | 51.3% | 37.6% |
| Total contribution on kept sales | $2,461.00 | $1,804.80 |
In this illustration, the serum contributes $24.61 per completed sale. The candle contributes $11.28. Even though the candle sold 60% more units, the serum still produced $656.20 more contribution on the same kept revenue. That ranking is for sales the customer keeps. It is not yet the number to set against cost per acquisition.
For the serum, suppose 10 of 100 orders are fully refunded, 8 units come back sellable, and 2 are written off. Suppose unrecovered costs on every refunded order are the table's packaging ($1.20), payment fee ($1.69), and absorbed shipping ($6.50), plus $5.00 of return shipping. That $5.00 is an illustration, not a benchmark, and the fee is assumed not recovered. Unrecovered cost on a resellable refund is $14.39. A write-off adds the $14.00 landed cost, so that order costs $28.39 and keeps no revenue.
- 90 kept orders contribute $24.61 each, or $2,214.90.
- 8 resellable full refunds contribute -$14.39 each, or -$115.12. Landed cost is credited back.
- 2 write-offs contribute -$28.39 each, or -$56.78. Landed cost stays, because the inventory is gone and the revenue is already zero.
- Expected contribution per order is ($2,214.90 - $115.12 - $56.78) / 100 = $20.43.
The wrong shortcut, full $48 price minus full $14 landed cost minus a blended return fee, would still book refunded revenue and would still treat recovered inventory as consumed. The $20.43 figure does neither. It is the serum number to put next to ad spend in this illustration.
That does not make the candle a bad product in the example. At $11.28 of completed-sale contribution it can still be worth organic placement, bundles, and reorders, as long as you are not paying more than expected contribution per order to acquire it. A hypothetical $12 cost per acquisition is already above the candle's $11.28 completed-sale margin. A full refund contributes less than a kept sale, so the candle's expected contribution per order would sit below $11.28. Paid candle orders lose money in this illustration before and after returns.
Break-even ad spend per order is expected contribution per order, if you treat ad cost as the extra variable cost of that campaign and assume one unit per order. The same $12 CPA on the serum still leaves $8.43 of the $20.43 expected contribution toward fixed costs. Spending against the $24.61 completed-sale margin would overstate what a paid order is expected to leave.
Why a high conversion rate can still be a poor promotion signal
Conversion rate tells you how often a visit becomes an order. It does not tell you whether that order is worth the visit. A product can convert often and still be a poor thing to push if variable costs eat the price.
Pair the two numbers before you move budget. A rough contribution per session is contribution margin per completed unit multiplied by a product conversion rate. That estimate assumes each converting session produces exactly one unit of that product, and that the conversion rate's denominator and product attribution match the sessions you are scoring. If orders often include more than one unit, or the session is attributed to a landing page rather than the SKU that sold, multiply by units per attributed order or treat the result as a directional proxy, not a precise profit figure. Before you move paid budget, swap in expected contribution per order so refunded revenue is already out.
| Product | Conversion rate | Completed-sale contribution | Contribution per 100 sessions |
|---|---|---|---|
| Serum | 2.4% | $24.61 | $59.06 |
| Candle | 5.1% | $11.28 | $57.53 |
| Sample tin | 8.0% | $2.10 | $16.80 |
These rows continue the same hypothetical, use completed-sale contribution, and assume one unit per converting session. They do not yet remove refunded revenue. The candle converts more than twice as often as the serum, and the contribution per 100 sessions is almost the same. The sample tin wins the conversion report and loses the economics. Promoting it because "it converts" spends traffic on a product that, in this illustration, leaves $2.10 after variable costs on a sale the customer keeps.
Shopify's sales reports can show product quantity and net sales by product. Sessions and online store conversion are reported separately. The sessions by landing page report and the conversion rate report cover storefront behavior, often by landing page or for the online store as a whole, not as a native per-product conversion rate sitting on the product sales report. To score a SKU, merchants usually need to combine or proxy those views, for example by joining product sales to sessions on the product's landing page, then apply their own cost sheet. Shopify can store a cost per item and report profit from that product cost, but that profit figure is not the full contribution margin in this article. You still need to account for costs Shopify's product-cost profit does not cover on its own, including unrecovered shipping, payment fees, and return losses.
If you already track product conversion rate, keep that metric, including any proxy you use when Shopify does not report sessions on the product itself. Use it as an estimate of how often a visit becomes an order, then multiply by expected contribution per order for paid traffic, or by completed-sale margin for sales the customer kept, under the one-unit assumption above.
How to use margin with traffic, conversion, and stock
Contribution margin per unit is a filter, not a ranking by itself. A high-margin product with no sessions cannot absorb ad spend you have not tested. A lower-margin product that is about to stock out should not get a new campaign. Read three signals together. The thresholds below are illustrative operating heuristics, not statistical rules or published benchmarks.
- Margin floor. Set your own minimum expected contribution per order for paid promotion. A practical starting heuristic is: expected cost to acquire one order should stay below expected contribution per order, after refunded revenue is removed and recovered inventory is credited back.
- Traffic quality. Check where sessions come from before you scale. A high-margin SKU fed by low-intent traffic can still waste spend. Product-level source data, covered in how to read product traffic sources, shows whether the visits are even capable of converting.
- Stock cover. Only promote what you can fulfill. Days of cover equals units on hand divided by recent daily sales. If cover is shorter than your supplier lead time, a successful campaign creates a stockout, not contribution.
- Collection placement. Put higher-contribution products where cold traffic lands, if they also convert at a rate you are willing to accept. Keep thin-margin products available for organic discovery and bundles, where you are not paying for the click.
- Discount guardrail. The deepest discount a SKU can take is the amount that still leaves expected contribution per order above your own acquisition cost. If a discount code drops that expected contribution below your typical CPA, that code is a revenue event, not a profitable one.
A weekly review is an operating heuristic, not a proven rule, and there is no evidence here that it is enough for most stores. For a catalog under a few hundred active SKUs, a weekly pass is a reasonable starting cadence to try: export units and net sales, then join sessions from the closest available report, such as landing-page sessions, if product reports do not include them. Join your cost sheet using expected contribution per order, not gross quantity times landed cost on top of net sales. Sort by total expected contribution, then scan for products where your proxied contribution per session is high and stock cover is healthy. Those are the SKUs that deserve the next campaign, email feature, or collection pin. Shorten the cadence if costs, refunds, or ad spend move faster than a week.
Product segmentation helps you avoid averaging unlike items into one margin. A hero size and a travel size can share a product page and have very different variable costs. Segment first, then calculate, or the average will hide the SKU that is actually funding the catalog. See product segmentation for a practical way to split the catalog before you average margins.
A cost sheet you can maintain without a finance team
You do not need a full activity-based costing model to make better promotion calls. You need one row per SKU that you update when supplier cost, shipping, or return rate moves.
- Price the customer keeps on a completed sale, after the discount they actually use, not the compare-at price.
- Landed unit cost, refreshed when a purchase order lands at a new cost.
- Average shipping subsidy, from a recent window of fulfilled orders for that SKU, such as the last 30 to 90 days.
- Payment fee, calculated from your processor rate on that price, with a note on whether a refund returns the fee.
- Full-refund rate from your own orders, the share of those returns you can resell, and unrecovered cost per refunded order. For expected contribution per order, drop refunded revenue, credit landed cost back on resellable returns, and keep landed cost only on write-offs.
- A notes column for anything weird: hazmat fees, inserts, free gift with purchase.
Review the sheet when something changes, not on a ceremonial monthly close. A small increase in inbound freight can wipe the gap between two products that looked far apart last quarter. If you only recalculate annually, you will keep promoting last year's economics.
Where this metric misleads
Contribution margin ignores fixed costs, so a catalog of healthy per-unit margins can still lose money if total contribution does not cover rent, payroll, and apps. Check total contribution against fixed costs at least monthly. The per-unit figure decides which products to push. The total decides whether the store is covering its overhead.
It also ignores capacity. If your bottleneck is a single embroiderer or a 3PL that caps daily picks, the right ranking is contribution per constraining hour, not contribution per unit alone. A lower-margin item that ships quickly can beat a higher-margin item that needs a custom pack-out you cannot scale.
New products will not have a stable return rate or a real conversion rate. Use supplier cost and a conservative shipping assumption, label the margin as provisional, and do not scale paid spend until you have enough of your own orders to see returns. There is no universal order count that proves the rate. Treat any minimum you set, such as waiting for a few dozen orders, as an operating heuristic for a first look, not a statistical rule.
What to do with the number this week
Pick your top products by revenue. Calculate contribution margin per completed unit, then expected contribution per order with refunded revenue removed, recovered inventory credited back, and landed cost kept only on write-offs. Cap paid promotion on any SKU whose expected contribution per order is below what you usually pay to acquire an order. Feature the SKUs where that expected contribution, conversion, and stock cover all clear the bar you set for your store.
If you want that comparison without maintaining the join by hand, Skymetrics product analytics is built to put product-level sales, traffic, and conversion next to the operational calls merchants actually make, including what deserves promotion and what is running out. The margin math still starts in your cost sheet. The point of the analytics is to stop ranking products on revenue alone.