What Is Contribution Margin? A Ecommerce Brand's Guide

Most DTC dashboards show revenue and ROAS. Neither tells you whether an order made you money.

That's the job of contribution margin. Once you start reading it weekly, you stop running your business off vanity metrics.

This guide breaks down what contribution margin means for a Shopify brand, how to layer it (CM1, CM2, CM3), what a healthy number actually looks like by category, and how to use it to decide what to scale and what to kill. By the end, you'll have a working formula you can apply to your catalog tonight.

What contribution margin actually means for a DTC brand

Contribution margin tells DTC brands how many dollars are left from an order after every variable cost tied to that order is paid. Said differently: take the revenue from one transaction, strip out everything that scaled with it, and what's left is the contribution that order made to covering fixed costs and profit.

For a Shopify operator, that means starting at net sales and walking down through the cost layers that fire on every order: cost of goods, payment processing, pick and pack, shipping, returns, and (in the modern DTC stack) the paid media that brought the customer in.

The reason it matters: a brand can be growing revenue 30% year-over-year and quietly destroying profit because each new order costs more to fulfill and acquire than the last. Gross margin won't catch this. Blended ROAS won't catch it. Contribution margin will.

Operators we work with describe it as the metric they use to decide whether to keep scaling a SKU, a channel, or a market. One DTC co-founder put it like this on a recent call: "Net sales tells me what happened. Contribution margin tells me what I should do next."

Want the parent guide first? See our ecommerce analytics fundamentals for the wider metric system this fits into.

The contribution margin formula (with a real Shopify example)

The basic formula is simple. The layers are where it gets interesting.

Contribution Margin = Net Sales - Variable Costs

For a DTC brand, "variable costs" is not one number. It's a stack. Most teams that get serious about profit split it into three (sometimes four) levels.

Here's a worked example for a single $80 order, an apparel SKU sold direct on Shopify:

Line item Value Layer
Net sales (after discount) $72.00 Starting point
COGS −$22.00
CM1 $50.00 (69%) Product profit
Payment processing fees −$2.30
Fulfillment (pick/pack) −$3.50
Outbound shipping −$6.00
Returns reserve −$2.50
CM2 $35.70 (50%) After fulfillment & payment
Customer acquisition cost −$14.00
CM3 $21.70 (30%) Real DTC number

CM1 = $50.00 (69%): product profit alone. CM2 = $35.70 (50%): after all variable fulfillment and payment costs. CM3 = $21.70 (30%): after acquisition costs. This is the real DTC number.

Run your own order
Contribution margin calculator
Drop in the economics of a single order. We walk it down the stack — CM1 (product), CM2 (after fulfillment & payment), CM3 (after acquisition). Pre-filled with the $72 apparel example from the guide.
CM1 · product profit $50.00 69%
CM2 · after fulfillment $35.70 50%
CM3 · after CAC $21.70 30%
Healthy CM3. This order clears its acquisition cost and contributes to fixed costs.
Define this stack once in Synthesizer and CM1/CM2/CM3 by SKU, channel and cohort appear everywhere — dashboards, scheduled reports, and Ask Polar — off the same numbers.

The contribution margin stack
One $72 order, three honest stories
Each layer strips away another category of variable cost. Most Shopify reports stop at CM1. The real DTC number is CM3.
Net sales
$72.00 100%
− COGS $22.00
CM1
$50.00 69%
− Payment $2.30  ·  − Pick & pack $3.50  ·  − Shipping $6.00  ·  − Returns $2.50
CM2
$35.70 50%
− Customer acquisition cost $14.00
CM3
$21.70 30%
Gross margin would have shown you the 69%. Contribution margin shows you the 30% — the number that decides what to scale and what to kill.

CM1: product profit

Net sales minus cost of goods. Most Shopify reports stop here, and most operators stop reading here. CM1 helps spot product-level pricing or sourcing problems, but it lies about your real economics because it ignores everything that happens after the customer hits "buy."

CM2: after fulfillment and payment

Net sales minus COGS minus the variable costs of getting the order out the door: payment processing, 3PL pick-and-pack, outbound shipping, packaging, returns reserve. For most brands, this is the right number for product-mix decisions: which SKUs to push, which bundles to build, which shipping thresholds to set.

CM3: after CAC and returns

CM2 minus the acquisition cost attributed to that order. CM3 is where ad-funded DTC brands either prove they have a real business or discover they've been buying revenue. It's the version operators look at when they decide whether a campaign should keep running. Polar ships CM3 as a built-in metric (it landed in August 2023), so once you connect your data, CM3 by SKU, channel, or cohort appears in reports without your team modeling the formula.

Some teams add a CM4 layer that nets out a share of operating expenses (rent, salaries, agency fees) to approach true net profit per order. It's the most complete view, and one we see used by brands that have integrated their full P&L into their data stack rather than just their ad spend. Polar customers build CM4 once in Custom Metrics: define the formula in Synthesizer's semantic layer and it inherits the same governance as the built-in CM1, CM2, and CM3, and shows up everywhere CM3 does (dashboards, AI queries, exports).

Contribution margin vs gross margin (and why DTC operators confuse them)

These two metrics look similar on paper. They behave nothing alike in practice.

Gross Margin Contribution Margin
Formula (Sales − COGS) / Sales (Net Sales − all variable costs) / Net Sales
Includes shipping & fulfillment? No Yes
Includes payment fees? No Yes
Includes ad spend? No Yes (at CM3)
What it tells you How profitable the product is How profitable the order is
When it lies When fulfillment and CAC are large (i.e. every DTC brand) Rarely

Gross margin made sense as a primary metric in retail and wholesale, where someone else paid to get the product in front of the buyer. In DTC, you pay for that twice. Once to ship the unit, once to acquire the customer. Gross margin pretends those costs don't exist. Contribution margin builds them in.

The practical implication: a SKU with 65% gross margin can have a deeply negative CM3 if it's heavy, returnable, discount-promoted, and acquired through paid social. Many brands only discover this when they pull their first real CM3 report, and it's usually a quiet, uncomfortable meeting.

What's a "good" contribution margin for DTC brands?

There is no single right number. Healthy ranges depend on category, AOV, repeat rate, and channel mix. Based on what we see across thousands of Shopify brands, the rough shape looks like this:

Category Typical CM1 Typical CM2 Typical CM3 (post-CAC)
Apparel & accessories High 60s–70s % High 40s–50s % Low to mid teens %
Beauty & personal care Low 70s–80s % High 50s–60s % Mid to high teens %
Supplements & wellness High 60s–70s % Mid 50s–60s % Low to mid teens %
Home goods & accessories High 50s–60s % Mid 30s–40s % Low to mid single digits %

A few patterns to flag:

  • Beauty consistently runs the strongest CM3. Small parcel size, repeat-purchase behavior, and lower return rates translate into structural margin advantage.
  • Apparel CM3 lives or dies on returns. A 2-point return rate swing can be the difference between a healthy CM3 and a negative one.
  • Home goods get crushed by shipping. Anything heavy or oversized turns shipping into a structural drag on CM2. Bundles, free-shipping thresholds, and zone-based pricing become survival tools, not marketing tactics.
  • First-order CM3 is often negative on purpose. That's only fine if your repeat purchase rate funds the second order's CM3 fast enough. If you can't see CM by cohort, you can't make that call honestly.

The thresholds to worry about: a sustained CM2 under 30% in any category, or a CM3 that goes negative on repeat customers (not just on first orders). One signals a unit economics problem. The other signals a brand problem. Polar surfaces both views without rebuilding either model per cut: CM2 by SKU and channel for the unit economics question, cohort CM3 by acquisition source for the brand question.

How to calculate contribution margin by SKU, channel, and cohort

A single blended CM number tells you very little. The interesting questions are downstream.

By SKU. Which products actually carry your contribution margin, and which ones drain it? This requires clean COGS per SKU and a way to allocate shipping and fulfillment correctly (heavier items absorb more cost, not the blended rate). For brands working out of a 3PL with a variable rate card, that allocation has to be done at the order line, not the order header. Otherwise a hoodie and a sticker look identical in your reports, and one of them just ate the other's margin. Polar handles cost allocation at the SKU line: heavier SKUs absorb their actual shipping cost, returns hit the SKUs that came back, and bundles decompose to their component SKUs. Most spreadsheet CM models fall apart at exactly this step.

By channel. CM3 by channel is where the real reallocation conversations happen. Meta CAC isn't the same as Google CAC isn't the same as organic. When you walk down to CM3 by channel, the channels that "look great" in ROAS often look very different. A campaign at 2.8x ROAS can have a healthy CM3 if the AOV is high and the product is light. A 3.5x ROAS campaign can have a negative CM3 if it's discount-stacked and ships heavy.

By cohort. A first-order CM3 view alone is misleading for any brand with repeat purchase. The honest version is CM3 over the first 90, 180, and 365 days post-acquisition. This is how brands with negative first-order CM3 stay in business: the second and third order pay back the acquisition cost, and the LTV-adjusted CM is healthy. Without cohort CM, this argument is just a vibe.

Doing this in Shopify alone isn't possible. Doing it in spreadsheets is possible but fragile: every refund, every rate-card change, every new channel breaks the formula. Doing it in a semantic layer where CM is defined once and applied everywhere is how operating teams actually live with it day to day.

See also: blended marketing efficiency, the partner metric most brands track alongside CM3.

5 ways DTC brands quietly destroy contribution margin

Where the margin leaks
5 silent contribution-margin killers
None of these are exotic. Each happens one decision at a time, in a workflow nobody owns — and only becomes visible once CM crosses marketing, fulfillment and finance in one place.
1
Discount stacking
Sitewide 10% + welcome 15% + free-shipping threshold. Each is fine alone; each tool reports its own saving against full price.
Cost → routinely strips 8–12 pts off CM2.
2
Free-shipping thresholds
A $95 threshold set to "boost AOV" — until the average order at that line carries $9 shipping against $12 of CM3.
Cost → the threshold costs money instead of making it.
3
Returns on heavy items
Apparel and home brands absorb both legs of shipping plus restocking on a 25–35% return rate. The order looked profitable at checkout.
Cost → the second leg of shipping kills CM2 entirely.
4
Bundle pricing vs mix
A 15% bundle discount assumes balanced mix. If customers consistently bundle the lowest-margin SKUs, it drags the whole catalog down.
Cost → only visible in CM2 by bundle vs standalone.
5
Paid traffic on bad SKUs
A product converts well, so it gets the Meta creatives. Three months later it's your #1 acquisition SKU — and structurally unprofitable.
Cost → without CM3 by ad/SKU, the conversation never happens.
Each leak hides in a different tool. They surface together only when CM is defined once and read across marketing, fulfillment and finance.
That's the job of a semantic layer.

Most CM erosion is invisible. It happens one decision at a time, in workflows nobody owns. The patterns we see most often:

  1. Discount stacking. A sitewide 10% promo plus a Klaviyo welcome 15% plus a free-shipping threshold pulled below cost. Each one alone is fine. Stacked, they routinely strip 8-12 points off CM2, and the team running the promo plan rarely sees the cumulative effect because each tool reports its own savings against full price.

  1. Free shipping thresholds set without margin math. Setting the threshold at $95 to "boost AOV" sounds smart until the average order at that threshold has a $9 shipping cost and a $12 CM3. Suddenly the threshold costs you money instead of making it.

  1. Returns on heavy or large items. Apparel and home brands frequently absorb both legs of shipping plus restocking on a 25-35% return rate. The order looked profitable at checkout. The second leg of shipping killed CM2 entirely.

  1. Bundle pricing that doesn't account for mix. A bundle priced at a 15% discount assumes balanced product mix. If customers consistently bundle the lowest-margin SKUs, the bundle pulls CM2 down across the whole catalog. Most teams find this only by looking at CM2 by bundle vs. CM2 standalone, and they rarely look.

  1. Paid traffic on negative-CM3 SKUs. A single product gets featured in Meta creatives because it converts well. Three months later, it's the brand's #1 acquisition SKU and structurally unprofitable. The right move was either to raise the price, drop the spend, or use it strictly as a top-of-funnel hook with bundled checkout. Without CM3 by ad/SKU, this conversation never happens.

None of these are exotic. All of them happen at brands we've worked with, and most only became visible once the team had a view that crossed marketing, fulfillment, and finance in one place.

Using contribution margin to make weekly decisions

Weekly decision
Scale, hold, or kill this SKU / channel?
Answer from your CM report, not your gut. This mirrors the rules in the section above — it doesn't replace your numbers, it makes them act-on-able.
Answer the three questions →
Each question pulls straight from a contribution-margin report you should already be reading weekly.

The point of contribution margin isn't to know the number. It's to use it.

When to scale a SKU. CM2 above category benchmark, CM3 positive on first order, and a healthy repeat curve. Scale until either of the first two move. Don't wait for "ROAS to dip" because by then CM3 has already turned.

When to cut a channel. CM3 negative on the channel and stuck there for two consecutive weeks after creative refresh. Don't bargain with this. Reallocate the spend or kill the channel.

How CM links to your MER target. Most brands carry an MER target ("we need to hit 3.2x to be profitable"). That target is downstream of CM2. If your variable costs drift (say a 3PL rate hike or a heavier product mix) your old MER target is no longer the right one. Re-derive it from CM and reset.

The cadence: CM2 reviewed weekly at the channel and category level, CM3 reviewed weekly at the campaign and SKU level, full CM by cohort reviewed monthly. Anything less frequent and you're managing on a delayed signal.

How to track contribution margin without spreadsheets

Shopify's native reports won't get you here. They show gross margin per product if you've loaded COGS, but they can't blend in shipping rate cards, payment fees, ad spend, returns reserve, or anything you import from a 3PL. The moment a brand outgrows that view, the team ends up running CM in Sheets, and that's where it starts breaking.

The pattern we see at scale: brands define contribution margin once in a semantic layer (the place where every metric, CAC, MER, contribution margin, repeat rate, has a single, governed definition). Then every dashboard, every Polar Automations scheduled report, and every Ask Polar or Polar MCP query (Claude, ChatGPT, n8n, Lovable) pulls the same number. Marketing, finance, and ops stop arguing about whose CM is the "real" one because there's only one, and it's tied directly to the underlying Shopify, ad platform, and 3PL data.

Operators on this kind of stack typically have CM by SKU, channel, and campaign available as standard reports. They ask Ask Polar, or Claude through Polar MCP, questions like "what was my CM3 on Meta last week vs the week before, broken down by campaign?" and get an answer that matches the dashboard exactly, with Ask Polar Citations linking each number back to the source query. That match between AI answers, scheduled reports, and dashboards is what makes contribution margin a real operating tool instead of an analyst project.

For tooling comparison, see analytics platforms for DTC brands.

FAQ

Contribution margin is what's left from one order after every variable cost tied to that order is paid. It's the cleanest measure of whether an order made you money.
Gross margin only subtracts cost of goods. Contribution margin subtracts everything that scales with each order: fulfillment, shipping, payment fees, and (at CM3) ad spend. For DTC brands, gross margin overstates profit. Contribution margin doesn't.
Yes, that's CM3. CM2 (pre-CAC) is the right view for product-mix decisions. CM3 (post-CAC) is the right view for channel and campaign decisions. Track both.
A negative CM2 means the order itself lost money: the variable cost stack exceeded net sales. A negative CM3 means the order lost money once acquisition costs were added. Negative CM3 on a first order can be fine if repeat purchase pays it back. Sustained negative CM3 on repeat customers is a structural problem.
No. Contribution margin is profit before fixed costs (rent, salaries, agency retainers, tools). It's the dollars per order available to cover fixed costs and produce net profit, not the net profit itself.
CM2 weekly at the channel and category level. CM3 weekly at the campaign and SKU level. Cohort CM monthly.
Yes. Polar ships CM1, CM2, and CM3 as built-in metrics on Synthesizer (Polar's semantic layer). Connect your 40+ data sources (including 3PL cost uploads via Google Sheets when the 3PL has no API), and CM by SKU, channel, region, and cohort appears in reports without modeling. CM4, your fully-loaded variable view, is built in Custom Metrics on top of CM3. Most Polar customers have CM3 live within days of connecting their data.

The hard part of contribution margin isn't the math. It's getting one definition that survives across marketing, finance, and ops, and is the same number your dashboard, your scheduled report, and your AI assistant all give back. That's where the gains sit.

If you're still running CM in Sheets, the next step is consolidating it into Synthesizer, the layer Polar built to hold every variable cost (COGS via ERP or Sheets uploads, fulfillment via 3PL connectors, payment fees via Shopify, shipping rate cards, returns via Loop, ad spend across 40+ ad platforms) and expose it across every dashboard, scheduled report, AI query, and Claude or ChatGPT agent. From there, the weekly decisions get sharper, the monthly P&L lines up cleaner, and CM stops being a finance project and becomes a growth tool.

See how Polar handles contribution margin for $10M+ Shopify brands. Book a 20-minute walkthrough and we'll run your own CM3 by SKU and channel on live data.

Join 4,000+ leading Shopify brands around the world using Polar Analytics to stop manually compiling their data

Schedule a demo
Quad lock
Aimn'
Lifetime brands
Marcella New York
The Frankie Shop
Tiege Hanley
Polene
Seavees
Ripndip
Albion Fit
Kiss USA
Konges slojd
Lemaire
nohow
Maniere de Voir
Volcom
Coes
Razor Group
Oneskin
State & Liberty
Warren James
Dyper
Bonsoirs
From Future
RSVP
Merci handy
Soi Paris
Yellowpop
Olipop
Soko Glam
Fanjoy
Hero
Almond Cow
Polène