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