ClearStock is live on the Shopify App Store.Install free →

← All blogs

Guides7 min read

Per-SKU profitability — find which products actually pay you

Contribution margin vs gross margin explained, and how to build per-SKU profitability from Shopify exports to find your death-row products early.

InventoryX is in development and not available today. ClearStock is the live Shopify app.

Contribution margin is what a product contributes toward your fixed costs and profit after you subtract the costs that vary with selling it — and it's the number that decides which SKUs deserve shelf space, because gross margin flatters products that are "profitable" on paper and expensive in practice. The gap between the two is where most small-catalog decisions go wrong: a SKU at 55% gross margin can contribute almost nothing once the units you mark down, ship back, and count twice are priced in. Here's the distinction, a before/after build from your own exports, and how the worst contributors become your pruning list.

Gross margin vs contribution margin

  • Gross margin = (revenue − COGS) ÷ revenue. COGS is the product cost of the units sold. It answers "is the item priced above its invoice cost?" — nothing more.
  • Contribution margin = (revenue − all variable costs) ÷ revenue. Beyond COGS, the costs that scale with each sale: shipping and packaging you absorb, per-order payment fees, discounts and markdowns, return shipping and refund losses on that SKU.

The philosophical difference: gross margin pretends every unit sells at full price, ships itself, and never comes back. Contribution margin charges the SKU for its actual behavior. Two SKUs at identical 50% gross margins can be 20 points apart on contribution once one of them carries a 12% return rate and a standing 15%-off habit.

Where each is useful: gross margin is fine for pricing checks per unit. Contribution margin is the decision number — which SKUs to keep, promote, or kill — because it reflects how the SKU behaves in your store, not in a pricing spreadsheet. (For the capital-efficiency version of profitability — profit scored against the inventory dollars invested — that's a different lens again, covered in GMROI.)

Before/after: the messy export vs the disciplined one (illustrative figures)

Before — what the default export tells you. Pull a sales-by-product export for a year. Sort by gross profit (Shopify computes this when the Cost per item field is maintained — per Shopify Help Center, cost-per-item and profit reports documentation, accessed October 2026; the setup is covered in Shopify COGS if it isn't). You'll see something like:

SKU Revenue Gross profit Gross margin
Board game — base $38,200 $19,900 52%
Board game — expansion $11,400 $5,900 52%
Aquarium starter kit $9,800 $4,700 48%
Aquarium test strips $4,100 $2,150 52%

By this table, test strips are a fine little SKU: 52% margin, quiet contributor. Nothing here says kill anything.

After — the disciplined view. Add three columns from data you already have, per SKU (illustrative figures):

  1. Discounts & markdowns taken — from the discount field on the order lines. Test strips: $610 (they're perpetually in a bundle promo).
  2. Refunds & returns net of resellable — from refunds reports. Test strips: $520 (three refunds plus return shipping you paid).
  3. Per-order shipping/packaging you absorb — allocate from your shipping spend by order profile. Test strips: $380 (small orders, thin parcel economics).

Recomputed:

SKU Gross profit − variable costs Contribution Contribution margin
Board game — base $19,900 $1,100 $18,800 49%
Board game — expansion $5,900 $2,300 $3,600 32%
Aquarium starter kit $4,700 $900 $3,800 39%
Aquarium test strips $2,150 $1,510 $640 16%

Same catalog, opposite conclusion. The expansion that looked identical to the base game contributes 17 points less because it lives on discount; the test strips that looked respectable contribute 16% — barely paying for the attention they demand. This is the arithmetic most stores have never run per SKU, and it routinely reshuffles the ranking.

Building your version

  1. Cost per item first. If the field isn't fully populated, the whole exercise is garbage-in — fix coverage before margins (again: Shopify COGS owns that setup; this article doesn't re-derive the cost mechanics).
  2. One year of sales by product export. Revenue, discounts, gross profit per SKU.
  3. Refunds report by product. Net refunds (refund amount minus units resold as new) — this is the return-rate penalty.
  4. Absorb-shipping estimate. You don't need precision: split orders by profile (single small item vs multi-item box) and assign your average absorbed shipping cost per profile. Label it an estimate — directionally right beats precisely wrong.
  5. Compute contribution per SKU, sort ascending, and look at the bottom decile.

What lands in the bottom decile is usually one of a few species: the perpetually-discounted line, the high-return product, the freight-eater, and the tiny-order parasite (low-value SKU that drags its own shipping). Each has a different fix — repricing, unbundling the promo habit, returns handling, or minimum-order changes — and only one of them is deletion.

Feeding the pruning decision

The bottom decile is not a kill list — it's the input to one. Contribution margin tells you what each SKU pays you; it doesn't know that the test strips drive the kit purchases, or that the expansion is what makes the base game a franchise. Those strategic links are why the deletion decision needs its own process — the four-question test (velocity, margin, cannibalization, operational drag) and the quarterly routine are covered in SKU rationalization. This article hands that process honest numbers; it doesn't make the cut.

One caution on the reverse side too: contribution margin excludes fixed costs (rent, your time, software). That's a feature — it means a SKU "contributing" anything positive is helping pay the rent — but it also means a 16%-margin SKU isn't automatically losing money. It's contributing too little to justify the attention. Those are different problems with different fixes, and conflating them produces panicked catalog cuts.

Common questions

What is contribution margin? Contribution margin is revenue minus all variable costs of selling — product cost, absorbed shipping, discounts, returns — expressed per SKU or as a percentage. Unlike gross margin, it charges each product for its actual behavior in your store: the discounts it takes, the units that come back, the parcel economics it creates.

How is contribution margin different from gross margin? Gross margin subtracts only COGS from revenue; contribution margin also subtracts variable selling costs like absorbed shipping, discounts and markdowns, and refund losses. Two SKUs with identical gross margins can differ by 20+ contribution points once returns and discount habits are priced in — which is why contribution is the better keep-or-kill number.

How do I calculate per-SKU profitability in Shopify? Start with the sales-by-product export using the Cost per item field (gives revenue, discounts, gross profit per SKU), then add refunds by product and an estimate of absorbed shipping per order profile. Subtract discounts, net refunds, and absorbed shipping from gross profit — that's contribution per SKU. It's a spreadsheet job; Shopify doesn't report contribution margin natively as of October 2026 (Shopify Help Center, profit reports documentation, accessed October 2026).

Should I kill my lowest contribution margin SKUs? Not automatically. Contribution margin identifies the candidates; the decision needs context those numbers don't hold — whether the SKU drives other purchases, anchors a range, or serves a strategic role. Feed the bottom decile into a structured pruning process before cutting anything.

Does contribution margin include fixed costs like rent? No — and that's deliberate. Contribution margin measures what each SKU adds toward covering fixed costs, so any positive contribution is helping. But it also means a low-but-positive margin SKU isn't "losing money"; it's under-earning relative to the attention it costs. Read it as a prioritization signal, not a profit-and-loss verdict.

Next step

Run the disciplined version on your bottom ten gross-profit SKUs this week — discounts, refunds, absorbed shipping, one column each. The ranking will almost certainly change, and the new bottom of the list is your agenda for the next quarterly range review, whether that's a reprice, an unbundled promo, or an honest goodbye.