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:
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.
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 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:
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
Most CM erosion is invisible. It happens one decision at a time, in workflows nobody owns. The patterns we see most often:
- 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.
- 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.
- 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.
- 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.
- 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
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
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.



