The DTC guide to true margin, not just revenue.

CRM-Connected Attribution: A Board-Ready Framework for B2B SaaS Marketing Teams.

A framework for calculating CM1, CM2, and CM3 correctly on Shopify data, so you're not rebuilding the same reconciliation every Monday.

Shopify tells you what sold. It doesn't tell you what you made.

Shopify shows revenue. It doesn't show CM2, CM3, shipping, duties, or discounts, not without pulling every report by hand.

So the real numbers live in a spreadsheet on someone's laptop, not in any system the rest of the team can open.

And that spreadsheet usually has one owner. The founder, or whoever inherited the job, holds every login and every piece of tribal knowledge about how the numbers actually get built: which SKUs are missing a cost, which discount codes get treated as markdowns, which refunds are already accounted for. If they're out for a week, no one else can answer a basic margin question. Not because the business doesn't know its margin. Because the business only knows it through one person's head and one spreadsheet.

This guide gives you a way to fix that: a clear, correct definition of CM1, CM2, and CM3 for a Shopify-based DTC business, a template you can copy into a spreadsheet today, and a weekly routine that turns the calculation into a five-minute check instead of a half-day rebuild.

What this actually looks like on one product

Definitions are easier to hold onto with real dollars attached. So before the field-by-field rules, here's the full walk from revenue to CM3 on a single product: a $100 pair of Nike Air Force 1s.

A few of these figures are real, sourced numbers. The rest are typical DTC assumptions layered on top, since Nike doesn't publish its own per-unit DTC fulfillment costs (Nike sells through both wholesale and DTC, not through a single Shopify store, so there's no public "this is what an Air Force 1 nets on nike.com" figure to point to). Treat this as a teaching example of how the math flows, not a claim about what Nike itself actually earns per pair sold direct.

Model

Credit logic

Board credibility

Revenue

COGS (materials, factory labor and overhead)

Inbound freight and import duty

= CM1

Outbound shipping to customer

Discounts (blended average)

Refunds provision

=CM2

Marketing and acquisition spend

=CM3

$100

-$25

-3$

72$

-8$

-5$

-4$

55$

-8$

47$

Illustrative round DTC retail price

Sourced: Nike's widely cited $100-shoe manufacturing cost breakdown (Matthew Kish, Portland Business Journal, republished by Investopedia and WearTesters)

Sourced: same breakdown, roughly $1 freight and $2.50 duty, rounded

72% of revenue

Illustrative: a typical DTC parcel shipping cost, not Nike-specific

Illustrative: a typical blended promo and discount-code participation rate

Illustrative: a typical footwear return-rate provision

55% of revenue

Sourced: Nike's FY2023 demand creation expense ran 7.9% of sales, per its public SEC filing, applied here per unit and rounded

55% of revenue

Two of these lines are cite-able facts: the manufacturing cost breakdown and the marketing spend percentage both come from public sources. The shipping, discount, and refund lines are stand-ins for what a typical DTC brand carries at that stage, not figures Nike has ever disclosed. Keep that line clear in your head (and in front of any reader) whenever a worked example mixes real data with round assumptions: know which parts you'd defend in a board meeting and which parts you picked to make the math legible.

There's a companion visual for this exact walkthrough, "From Revenue to CM3: A $100 Sneaker, Walked Through," a margin waterfall chart color-coded to show which bars are sourced and which are illustrative. It's built in a horizontal ad format, so it also works as a standalone LinkedIn ad promoting this guide, not just an illustration inside it.

Margin waterfall chart of a Nike Air Force 1 Triple White sneaker, showing revenue of $100 stepping down through cost of goods, shipping, discounts, refunds, and marketing spend to a final CM3 of $47.

A Triple White Air Force 1: from $100 in revenue to $47 kept, walked through CM1, CM2, and CM3.

This is the shape of the calculation: revenue steadily eaten by real costs at each stage, from what it costs to make the product, to what it costs to ship and discount it, to what it costs to acquire the sale in the first place. What follows is the set of definitions and data rules that make CM1, CM2, and CM3 accurate for your own product line, rather than a rounded illustration on somebody else's.

Gross margin, CM1, CM2, CM3: what each one actually measures

Most DTC teams use "margin" to mean three or four different numbers, often in the same meeting. Here's how to keep them straight, and the specific data rules that make each one accurate rather than approximately right.

The revenue line comes first, and it's where most calculations already go wrong

Before you touch a single cost line, get the revenue number right. Use pre-tax item revenue, the subtotal, not the order total that folds in shipping charged to the customer and tax. If your Shopify reporting already pulls revenue ex-VAT (common with Shopify's built-in reports), don't apply a VAT deduction again. Doing that strips tax out twice and understates revenue, which understates every margin figure built on top of it.

Exclude gift card sales from revenue entirely. A gift card sale is deferred revenue: the cash comes in now, but the sale that actually earns it happens later, when the card gets redeemed. Counting it as revenue at the point of purchase overstates your numbers for that period and creates a mismatch when it's redeemed later.

Gross margin

Gross margin is the simplest cut: revenue minus the direct cost of the goods sold, with nothing else subtracted. It answers one question: how much does each product cost to make or buy, relative to what it sells for. It doesn't touch shipping, discounts, refunds, or marketing. Most finance teams already track this, but it's the least useful number for a growth or marketing conversation, because it says nothing about what it actually costs to acquire and deliver the sale.

CM1: gross margin, done properly

CM1 is revenue minus COGS, but the accuracy of this number lives entirely in how well you've mapped costs to products.

Unit cost isn't sitting on the line item in your order data. It has to be built from a separate product-variant cost map, joined by SKU. That join is where most homegrown spreadsheets quietly fall apart: new SKUs launch without a cost entered, variants get renamed, and the cost map drifts out of date. So alongside any CM1 figure, always report your COGS coverage rate, the share of total order value that has a matched cost. If your coverage rate is 80%, your CM1 is only as trustworthy as that 80%, and the untracked 20% is very likely understating your true cost, not overstating it. A CM1 number with no coverage rate next to it is a number nobody should make a decision on.

One line item needs special handling here: gift-with-purchase (GWP) items. These show zero revenue on the order, but they carry a real unit cost, and that cost has to be included at CM1. What you should exclude is the GWP unit itself from any average order value calculation. Leave it in and your AOV looks lower than it is; leave the cost out of CM1 and your margin looks higher than it is. Either mistake distorts the number in the direction that makes the business look better than it actually is, which is exactly the kind of error that doesn't get caught until it matters.

CM2: after the costs that scale with each order

CM2 takes CM1 and subtracts the variable costs tied to fulfilling and discounting each individual order: shipping, discounts, and refunds.

Discounts split into two categories that behave very differently in your data. Standard discount codes are easy to capture; they're logged against the order and show up cleanly in most reports. Markdown or sale pricing usually isn't captured the same way. If a product is simply priced lower at checkout rather than discounted via a code, that discount is often invisible in the field your reporting normally checks. If your brand runs markdown pricing, calculate the true discount depth separately, against the original list price, or your reported discount rate will look understated even though the actual margin impact is real.

Refunds need a similar split by order age. For orders more than 30 days old, use actual refund data; by that point, most returns that are coming in have already come in. For very recent orders, only use actual refunds recorded so far, unless you have documented historical return-rate data you can apply as a provision. Don't estimate a return-rate percentage without that history behind it. A guessed rate dressed up as a real number is worse than no number at all, because it looks precise when it isn't.

CM3: after marketing spend

CM3 takes CM2 and subtracts the marketing cost of acquiring that revenue: your paid spend across ad platforms for the period. This is the number that answers the question a CM1 or CM2 figure can't: after everything it actually cost to make, ship, discount, and market the product, what's left. It's also the number most likely to swing sharply week to week, since ad spend and revenue rarely move in lockstep.

One more identification rule matters across all three CM levels, especially if you're segmenting by new versus returning customer: identify a new customer by whether this is that customer's very first order, not by account creation date and not by total order count. Both of those alternatives break the moment you look at historical data, since accounts get created for all kinds of reasons unrelated to a first purchase, and order counts can be wrong if past orders were imported, merged, or refunded to zero.

Contribution margin benchmarks across DTC brands ($5M–$75M revenue) put the median around 25%, with top-quartile brands running 54–56%. Below 20% is a warning sign regardless of category, below 15% is critical territory.

Sourced from Finaloop's P&L dataset across 800+ DTC brands, via Commerce Catalyst's 2026 benchmark report.

The fill-in template

Copy this structure into a spreadsheet. Run it at the order-batch or weekly level, whichever matches how your team already thinks about the numbers.

Line item

Source

Notes

Revenue

COGS

GWP cost

= CM1

Shipping cost

Discount (codes)

Discount depth (markdown)

Refunds

=CM2

Marketing Spend

=CM3

Shopify, pre tax item subtotal

Product-variant cost map, joined by SKU

Cost map, GWP SKUs

Revenue - COGS (incl. GWP cost)

Fulfillment / carrier data

Order discount field

Last price vs. actual sale price

Actual refunds (orders 30+ days old); actual only, or documented return-rate rovision, for recent orders

CM1 - shipping - discounts - refunds

Ad platform spend for the period

CM2 - marketing speed

Exclude gift card sales. Don't deduct VAT again if already ex-VAT.

Report coverage rate: % of order value with a matched cost.

Include the cost here. Exclude the GWP units from AOV.

Cost to you, not what the customer paid.

Straightforward, usually already captured.

Only relevant if you run markdown pricing. Calculate separately.

Never a guessed percentage with no history behind it.

Two columns worth adding once this is working: COGS coverage rate next to CM1 (so you always know how much of the number is trustworthy), and new customer revenue, tagged by first-order status, split out from CM2 and CM3 so you can see acquisition margin separately from repeat-customer margin.

The weekly routine that replaces the one-person spreadsheet

Run this every Monday, in this order, before anyone reports a number to the rest of the team:

  1. Check COGS coverage first. If it's dropped from last week, find out why before you trust any margin figure below it. A new SKU launch or a supplier change is usually the cause.

  2. Reconcile revenue against the order export. Confirm gift card sales are excluded and VAT isn't being deducted twice. This is the most common silent error and it's the easiest to check.

  3. Pull refunds for orders now past 30 days old and update CM2 for the affected period. Leave recent orders on actual-refunds-only unless you have a documented provision rate to apply.

  4. Check discount depth against list price if you ran any markdown or sale pricing that week. Standard codes will already be captured; markdowns won't be, unless you've built that check in.

  5. Pull the week's marketing spend from your ad platforms and calculate CM3.

  6. Log new-customer revenue separately, using first-order status, so acquisition margin and repeat-customer margin don't get blended into one misleading average.

That's the whole routine. It's not complicated. It's just tedious to do by hand every single week, and it depends on one person remembering every rule above, every time, without fail.

That last part is the actual problem this guide can't solve on its own. A framework tells you the right calculation. It doesn't run it for you, and it doesn't stop the rules from drifting out of someone's head over time.

DOJO keeps the fiddly parts of this routine running on their own: the SKU-joined cost map stays current as new variants launch, so your COGS coverage rate doesn't quietly decay; refunds get split by order age automatically, instead of someone remembering which orders are past 30 days; and markdown pricing gets checked against list price so a discount gap doesn't hide inside a number that looks fine on the surface. If you want to see what that looks like against your own Shopify data, try out DOJO AI has more.