Back to blogAnalytics & Integration

How to Calculate True Channel Margin for DTC Brands (And Why Most NetSuite Reports Get It Wrong)

GC Business Solutions
May 15, 2026
10 min read

If you run a DTC brand selling through your own site, Amazon, wholesale, and maybe a retail pop-up or two, here is a question worth asking your finance team: what is your gross margin by channel, exactly?

If the answer involves a saved search, a CSV export, and a spreadsheet with hardcoded fee assumptions, you are not alone. And if the answer is "around 50% blended", you are almost certainly leaving money on the table by not knowing where margin really lives.

This post walks through what true channel margin actually means, the four cost layers most NetSuite reports miss, and how to operationalize the report your team has probably been building manually every month.

Why "Gross Margin by Channel" Is a Misleading Number

Most DTC finance teams calculate channel margin like this:

Channel Revenue, less Product COGS, divided by Channel Revenue

That gets you something. But it gets you the same number you would have gotten if you were a single-channel brand, because it ignores every cost that varies by channel. And those costs vary a lot.

A pair of jeans sold on your DTC site is not the same financial event as the same pair sold through Amazon, or shipped to a wholesale account in a bulk order. The unit COGS is identical. Everything else is different.

If your channel margin report ends at "revenue minus COGS", you do not actually know which channels are profitable.

The Four Cost Layers Most NetSuite Reports Miss

These are the channel-specific costs that turn a clean-looking 50% gross margin into something very different at the contribution-margin level.

1. Marketplace and platform fees

Amazon takes a 15% referral fee on most apparel categories. Shopify takes 2.9% plus thirty cents per transaction on standard plans. Faire takes 25% on first orders, 15% on reorders. Wholesale through your own portal might be 0%.

These fees do not show up cleanly in your NetSuite item COGS. They typically land in a generic "selling expense" account that does not get attributed by channel unless someone explicitly sets that up.

Impact: A pair of jeans that nets 60% gross margin on your DTC site nets closer to 45% on Amazon after the referral fee. If you do not split those out, Amazon looks more profitable than it actually is.

2. Payment processing differences

DTC orders run through Shopify Payments, Stripe, or another gateway at roughly 2.9% plus thirty cents. Amazon orders include processing in the referral fee, so it is already accounted for. Wholesale orders paid via ACH cost almost nothing. Cards on file for B2B portals may run higher than DTC because of B2B card fee structures.

Impact: A small number per order, but at scale, processing costs alone can be 1 to 3% of revenue. If you are not allocating them by channel, your DTC channel looks better than it should and your wholesale channel looks worse.

3. Shipping and fulfillment cost differences

Single-unit DTC orders cost roughly $4 to $8 to pick, pack, and ship from a 3PL. A wholesale order of 200 units to a single account might cost $40, or twenty cents per unit. Amazon FBA charges a flat fulfillment fee per unit that varies by size and weight.

If your shipping income and shipping expense both live in one bucket in NetSuite, you cannot tell which channels are subsidizing which.

Impact: DTC shipping costs frequently exceed shipping revenue charged to the customer (especially with free shipping thresholds). Wholesale shipping is usually breakeven or charged to the customer. Amazon FBA fees are predictable but not free. Allocating these correctly often changes the channel ranking.

4. Returns rate differences

This is the killer for apparel. DTC return rates can easily run 20 to 35% (size and fit). Amazon return rates are similar or higher. Wholesale return rates are usually under 5%. Marketplace-fulfilled-by-marketplace returns may include restocking fees you never recover.

A returned unit costs you the original outbound shipping, the return shipping, the labor to inspect and restock (or write off), and sometimes 100% of the unit if it cannot be resold. Apparel that comes back used or worn is often a total loss.

Impact: Two channels with identical revenue can have wildly different contribution margins after returns. A channel running 30% returns at 50% gross margin is barely breakeven on a contribution basis. A channel running 5% returns at the same gross margin is hugely profitable.

The COGS Allocation Problem

There is a more subtle issue too. Most DTC brands sell the same SKUs across multiple channels, so per-SKU COGS is straightforward. But brands that produce small batches or use channel-exclusive inventory hit allocation problems quickly.

A few common gotchas:

  • FIFO vs. weighted-average costing. If you do FIFO and your earliest lot was made at a lower cost, you might be over-stating margin on whichever channel sold that lot first.
  • Inbound freight and duties. These should be capitalized into landed cost per unit, but in practice many NetSuite implementations book them to a separate freight account and never allocate.
  • Markdowns and end-of-season clearance. If you discount aged inventory through specific channels (often wholesale or outlet), that markdown belongs in the channel-margin math, not in a separate "promotional expense" bucket.

Get these wrong and your "channel margin" number is wrong even before you layer in the four cost categories above.

Building a Per-Channel P&L in NetSuite (And Why Saved Searches Fall Short)

NetSuite can build channel-level P&Ls. The native tools for it are Classes (or sometimes Departments or custom segments) tagged on every transaction. If your team set up channels as classes from day one, you are most of the way there.

But here is where most teams hit the wall:

  • Marketplace fees are often booked from a single Amazon settlement summary, not per order. Allocating them back to individual orders requires custom scripting or a workbook layer.
  • Payment processing is booked from your processor statement (Stripe, Shopify Payments), which lands in one account in NetSuite. Splitting it by sales channel requires joining the deposit data to the order data.
  • Shipping costs show up on 3PL invoices, often as line items per shipment. NetSuite does not natively join 3PL invoice lines back to specific sales orders unless you have built that integration.
  • Returns are tracked as Credit Memos and Item Returns in NetSuite, but reconciling the full economic cost (including original shipping and processing fees) requires combining multiple transaction types.

A saved search can give you revenue and COGS by class. Getting to true contribution margin by channel requires joining at least four other data sources, and that is where finance teams start exporting to Excel.

What True Channel Margin Looks Like (Worked Example)

Here is the same hundred-dollar pair of jeans across three channels, with realistic numbers for a mid-sized apparel DTC brand.

Direct-to-consumer (your own site):

  • Revenue: $100
  • Product COGS: $35
  • Shipping income: $5 (you charge for shipping over a threshold)
  • Shipping cost: $8 (3PL pick and pack plus carrier)
  • Payment processing: $3.20 (2.9% plus $0.30)
  • Returns provision: $20 (assuming 25% return rate, full unit loss)
  • Marketing CAC: not in gross margin, but worth knowing
  • Contribution margin: $38.80, or 38.8%

Amazon Seller Central:

  • Revenue: $100
  • Product COGS: $35
  • Referral fee: $15 (15% apparel referral)
  • FBA fulfillment fee: $5.95 (standard size)
  • Payment processing: included in referral fee
  • Returns provision: $25 (higher Amazon return rate plus restocking)
  • Contribution margin: $19.05, or 19.1%

Wholesale (200-unit bulk order, single account):

  • Revenue per unit: $50 (50% wholesale discount)
  • Product COGS: $35
  • Shipping cost per unit: $0.50 (single bulk shipment)
  • Payment processing: $0.10 (ACH)
  • Returns provision: $1 (2% return rate, typically defects)
  • Contribution margin: $13.40, or 26.8%

Notice the surprises. DTC is the highest contribution margin, but only because the customer pays partially for shipping and the return provision is bounded. Amazon looks worst on this math, but at high volume that 19% contribution might still be your largest absolute profit channel. Wholesale has the lowest gross dollar contribution per unit, but the operational overhead is minimal.

The point: without this math, most brands assume DTC > Wholesale > Amazon for profitability. The reality often inverts depending on return rates and volume.

Common Surprises When Teams Run This Report

A few patterns we see when DTC brands actually build a true channel-margin report for the first time.

  • The "premium" DTC channel is barely profitable. High return rates and shipping subsidies eat through what looks like a healthy gross margin.
  • Amazon is more profitable than people think, even after fees. The fees are real, but volume and zero CAC often more than make up for it.
  • Wholesale is more profitable per hour of operational effort than people think. Low gross margin per unit, but minimal returns, minimal fulfillment cost, and predictable payment cycles.
  • One or two SKUs distort the whole average. Your hero product on DTC drives the blended margin number, masking that several other SKUs are negative-contribution on that channel.

The right response to all of these is not "fire the DTC channel" or "shift everything to Amazon". It is to use this view to make pricing, promotion, and inventory allocation decisions with real data.

How to Operationalize It

For most brands, a monthly true-channel-margin report is the right cadence. Run it during close so it reflects actual fees, actual returns, and actual shipping costs from the prior month rather than estimates.

Three practical recommendations:

  1. Get your NetSuite classes right. Every sales order, credit memo, and inventory transaction needs a channel tag. Retroactively fixing this is painful, so audit it monthly.
  2. Build a returns provision rate per channel. Look at the last 12 months of return rates by channel and convert that to a percentage of revenue. Apply it to current-period revenue as the returns provision in your margin math.
  3. Stop relying on saved searches alone for this report. Saved searches give you revenue and COGS. The other four cost layers require joining transaction data, settlement data, 3PL data, and processor data. That is a true reporting layer job, not a saved search job.

The Channel Margin Analysis report in GC Analytics is built specifically for this. Revenue, COGS, and channel-specific costs side by side, refreshed automatically from NetSuite, Shopify, Amazon, and your processors. See it on our analytics page.

Bottom Line

"Gross margin by channel" is the number most DTC brands report. True channel contribution margin is the number that actually tells you which channels to invest in. The gap between the two is usually 10 to 20 percentage points, and it almost always changes the ranking.

If you want help building this view for your business, whether through better NetSuite saved searches, a custom report, or wired into a real analytics layer, contact us. We will walk through your current setup and propose a path to a per-channel P&L you can actually trust.

Need help with your NetSuite environment?

Our certified consultants are ready to help you optimize, troubleshoot, and get the most out of NetSuite.