One number per product — price minus everything that scales with the order — tells you what no P&L will: which SKUs to kill, which to fix, and which deserve every ad dollar you can find.
The month you doubled down on your bestseller is the month profit went down.
You remember it because it made no sense. The ad account said the campaign was working. Orders were up. Revenue was up. The product has a 64% gross margin — you've quoted that number to yourself for a year. And yet the bank balance at month-end was thinner than the month before, and nothing on the P&L would tell you why. Total revenue, total COGS, total expenses. One blended margin, catalog-wide, channel-wide. A healthy-looking average sitting on top of a question it can't answer: which products made the money?
Maybe you even tried to answer it once. Opened a spreadsheet on a Sunday, listed your top SKUs, pulled unit costs from memory — and stalled the moment you hit "what does shipping actually cost me per order?" The spreadsheet is still in your drive somewhere, half-finished.
Here's the belief that spreadsheet was up against: "my gross margin tells me which products make money." It's the most natural assumption in retail, and it's wrong in a specific, expensive way. Gross margin — price minus cost of goods — ignores everything that happens between the sale and the money: processing fees, pick-and-pack, the shipping you gave away, the returns you'll eat. Those costs are not spread evenly across your catalog. They cluster. And where they cluster, a "64% margin" product can lose money on every order while your P&L reports a fine month.
The number that catches this is contribution margin — and for an ecommerce store, it's the single most decision-useful metric you're probably not computing.
Contribution Margin for an Ecommerce Store, Defined
Contribution margin is what's left of a sale after every cost that scales with that sale — and before every cost that doesn't.
For a store, per unit:
Contribution margin = price − landed COGS − variable selling costs
Where variable selling costs are, concretely:
- Payment processing fees — the 2.9%-and-up that comes out of every transaction, higher on some payment methods than others
- Fulfillment cost per order — pick, pack, box, label, whether you pay a 3PL or your own time
- Shipping subsidy — whatever the carrier charged minus whatever the customer paid. "Free shipping" is not free; it's a per-order cost you chose to absorb
- Returns allowance — the expected cost of returns on this SKU: the refunds, the return labels, the units that come back unsellable, averaged across every unit sold
What contribution margin deliberately excludes: rent, salaries, software subscriptions, insurance — anything you'd pay this month whether you sold 400 units or zero. Those are fixed overhead. They matter, but they belong in a different question ("is the whole business profitable?"), not this one ("does this product make money when it sells?").
That exclusion is the point. Fixed costs get covered by the pool of contribution from everything you sell, so each SKU's job is simple: contribute. A strong-contribution SKU funds your overhead and growth. A thin one runs in place. A negative one converts your ad budget and warehouse labor into losses — and blended reporting will never flag it.
Why the Blended Number Lies
A P&L margin is an average, and averages are where losers hide behind winners.
Two specific failure modes show up in almost every catalog that's never been through this analysis.
The hero subsidizing the loser. One or two SKUs — usually compact, cheap to ship, rarely returned — generate outsized contribution. Their surplus quietly absorbs the losses of a bulky, return-prone product elsewhere in the lineup. On the blended P&L the two average into "fine." Kill or fix the loser and the same revenue produces visibly more cash; scale the loser (because its gross margin looked good) and you grow revenue while shrinking profit. That's the mechanism behind the month that made no sense.
The channel that looks profitable before its true fee load. Contribution margin isn't just per-SKU — it's per-channel, because the variable costs change with the channel even when the product doesn't. The same duffel bag sold on your own site, on a marketplace, and through a wholesale order carries three different fee stacks, three different shipping arrangements, and often three different return profiles. Shopify's own fee stack typically runs 3–6% of revenue once you count processing, surcharges, and app-adjacent costs — and it hides inside net deposits, which is why most stores can't quote their real number (here's where Shopify fees hide and how to book them). Payment mix cuts the same way: a checkout heavy on installment plans pays roughly double the processing rate of a plain card transaction, a fee that lives in a different report than the one you check (how BNPL fees actually work in your books). A channel or payment mix can look like your growth engine right up until its full fee load is on the same line of the same spreadsheet as everything else.
In both cases the lie isn't in your math. It's in the resolution of the report. You can't see per-SKU truth in a whole-store number.
Three SKUs, Same Revenue, Wildly Different Truth
Here's the whole argument in one table. Three fictional products from a fictional outdoor-gear store — a mug, a hoodie, a duffel — each doing exactly $9,000/month in revenue, each clearing roughly a 65% gross margin. On the P&L, they are indistinguishable.
| Per unit | Trailhead Mug | Summit Hoodie | Basecamp Duffel |
|---|---|---|---|
| Price | $30 | $90 | $150 |
| Units/month | 300 | 100 | 60 |
| Landed COGS | $10 | $31 | $53 |
| Gross margin | 67% | 66% | 65% |
| Processing fees | $1 | $3 | $7 |
| Fulfillment per order | $4 | $6 | $15 |
| Shipping subsidy | $2 | $8 | $20 |
| Returns allowance | $1 | $16 | $25 |
| Contribution per unit | $12 | $26 | $30 |
| Contribution margin | 40% | 29% | 20% |
Same revenue. Same gross margin, near enough. And the spread is already wide: the mug converts 40 cents of every dollar into contribution; the duffel converts 20. The duffel is oversized — a 3PL charges real money to store and ship bulk — ships "free" at a $20 true cost, sells disproportionately through installment checkout, and comes back often.
Now add the number the table above deliberately left out — ad spend per order, which is also a variable cost the moment you're paying to acquire each sale:
| Per unit | Mug | Hoodie | Duffel |
|---|---|---|---|
| Contribution before ads | $12 | $26 | $30 |
| Ad spend per order | $4 | $20 | $48 |
| Contribution after ads | $8 | $6 | −$18 |
The duffel — the "hero" of the ad account, the product with the biggest price tag and the campaign budget to match — loses $18 on every advertised order. Monthly totals: the mug contributes $2,400 after ads, the hoodie $600, the duffel −$1,080. Blended, that's $1,920 of contribution on $27,000 of revenue, and the P&L calls it a fine month. Meanwhile the mug is funding the duffel's losses, and every dollar of "scaling the winner" makes the month worse.
(All numbers fictional and rounded for clarity — the pattern is what's real.)
Getting the Inputs Without a Data Team
The reason that Sunday spreadsheet died is that three of the five inputs weren't in it — they were buried in your books, or not in your books at all. Here's where each one actually comes from:
- Price — you have this.
- Landed COGS per unit — product cost plus freight, duty, and packaging, recorded so your COGS line moves with sales instead of with purchase orders. If your monthly profit currently swings with your reorder schedule, fix that first: COGS for Shopify sellers, done properly.
- Processing fees — this is the input that requires fee-separated books. If your bookkeeping records net deposits, your fees are invisible and this analysis is dead on arrival. If sales, refunds, and fees each post to their own lines, your true fee rate is a thirty-second lookup: fees divided by gross sales, by month, even by payment method. This is exactly what a sync tool exists to automate — LedgerPort, for example, books gross sales, refunds, and every fee from Shopify or WooCommerce onto separate QuickBooks lines on its own, so the fee number is sitting in your P&L instead of hiding inside deposits.
- Fulfillment cost per order — from your 3PL invoice (pick fee + per-item picks + packaging + a share of storage) or, if you self-fulfill, materials plus a real hourly rate on your packing time. The anatomy of a 3PL bill maps every line.
- Shipping subsidy and returns allowance — carrier costs minus shipping revenue, and refunds by product over the last 90 days. Both are in your store admin today; they just need to be divided by units sold.
One evening. Ten SKUs — your top sellers plus anything you're actively advertising. A spreadsheet with seven columns. That's the whole project, if the books underneath are clean.
What to Do With the Answer
Contribution margin is only worth computing because it maps directly onto decisions:
- Kill — a SKU with negative contribution before ads has no path. No volume fixes it; volume multiplies it. Discontinue, or liquidate and free the storage fees.
- Fix — a SKU that's positive before ads but weak has named, addressable leaks, because you itemized them. Raise the price. Charge for shipping on oversized items. Repack to drop a dimensional-weight tier. Attack the return rate with better sizing info. Renegotiate the unit cost. Each fix moves one specific line in your table.
- Scale — the SKUs with the fattest contribution after ads get the budget. Frequently they're not the products you'd have guessed — they're the boring, compact, never-returned ones.
- Cap ad spend per SKU — this is the payoff rule. Contribution before ads is the ceiling on what you can pay to acquire an order of that SKU and still make money. The duffel's ceiling was $30; the campaign was spending $48. A per-SKU spend cap set at a sensible fraction of contribution turns "is this campaign working?" from a feeling into arithmetic.
Run the same table by channel and the same decisions fall out: a marketplace whose fee load eats the entire contribution isn't a growth channel, it's a customer-acquisition expense — price it like one or leave it.
The Honest Caveat: This Is Only as Good as Your Fee Separation
One thing this analysis cannot survive: bad inputs. If fees are lumped into net deposits, your processing number is a guess. If COGS is booked when you pay suppliers, your unit costs are fiction. If refunds net silently against sales, your returns allowance is invisible. Contribution margin computed on messy books produces confident, wrong answers — worse than no answers, because you'll act on them.
So the unglamorous prerequisite is clean, fee-separated bookkeeping — gross sales, refunds, fees, and COGS each on their own line, every month, automatically. If your books aren't there yet, start with the foundation: the complete guide to e-commerce accounting. Once they are, this analysis stops being a project and becomes a monthly habit: the fee number is on the P&L, and the spreadsheet takes twenty minutes to refresh.
You thought the reason you'd never done SKU-level profitability was that you lacked a data team. You didn't. You lacked a fee line.
The numbers in this post are illustrative and fictional. For decisions with tax or entity implications — discontinuing product lines, inventory write-downs, channel restructuring — confirm the accounting treatment with your CPA.
