Financial Strategy
The DTC Chart of Accounts That Actually Shows Margin
A DTC chart of accounts should map to contribution margin: CM1 is net revenue minus landed COGS, CM2 subtracts fulfillment and payment fees, CM3 subtracts marketing, CM4 subtracts overhead. Booking shipping, Amazon fees, or freight in the wrong bucket inflates reported gross margin by 8 to 15 points.
Key Takeaways
- Misclassification typically inflates reported DTC gross margin by 8 to 15 percentage points. A brand booking 68% gross margin with shipping and fees below the line is often running a true CM1 nearer 55 to 58%. That gap changes pricing, fundraising, and channel decisions.
- The right architecture is CM1 through CM4, not one gross margin line. CM1 is product viability (net revenue minus landed COGS). CM2 is delivery efficiency. CM3 is growth unit economics. CM4 is fully loaded contribution after allocated overhead.
- Amazon referral plus FBA fees run 15 to 20% of gross Amazon revenue. Coded to marketing instead of variable fulfillment, they can overstate blended gross margin by up to 18 points on the Amazon share of revenue.
- Inbound freight and duty belong in COGS as landed cost, not in operating expenses. Landed cost can add 15 to 35% on top of ex-factory product cost for Asia-sourced goods.
- You do not need hundreds of accounts to see channel profit. Class-based tagging in QuickBooks or Xero produces a P&L by channel from one clean set of accounts.
Most DTC founders can quote their gross margin from memory. They will tell you it is 68%, feel good about it, and then spend the rest of the call asking why cash is always tight. The number is not wrong so much as it is built for the wrong reader. Your chart of accounts (CoA), the list of buckets your bookkeeper drops every transaction into, was almost certainly set up to make tax filing easy, not to show you whether any given channel makes money. This post gives you the CoA structure that fixes that: revenue by channel, cost of goods sold (COGS), variable costs, marketing, and overhead, all mapped to contribution margin levels CM1 through CM4. Then it names the six misclassifications that most reliably hide your real margin.
Why your P&L is probably lying to you right now
The problem is structural, not sloppy. A standard bookkeeper's chart of accounts lumps every sale into one "Sales" account, drops product cost into COGS, and sweeps everything else into a pile of operating expenses. That produces a clean-looking gross profit line and a tax return that files without drama. It also makes it impossible to answer the only questions that matter to an operator: is Amazon actually profitable, is my first order profitable, and where did the cash go.
When I talk to founders running a brand between $5M and $30M, the thing they keep saying is that the P&L "looks fine but does not feel fine." That gap is almost always misclassification. Shipping is sitting inside COGS. Amazon fees are hiding in marketing. Returns are quietly netted against revenue. Each of those choices is defensible to a tax accountant and quietly fatal to a pricing decision.
The fix is not more accounts. It is the right accounts, mapped to the right decision layer. A brand booking 68% gross margin with 10% of revenue in outbound shipping that had been sitting inside COGS is not really a 68% margin business. Once you move shipping, fulfillment, and fees into the buckets they belong in, the same brand often reveals a true CM1 in the mid-50s and a fully loaded contribution in the low teens. Nothing about the business changed. Only the picture got honest.
The DTC chart of accounts structure that actually works
Here is the architecture. Four revenue types (DTC web, Amazon, wholesale, subscription), a landed-cost COGS bucket, a variable-cost bucket for the mechanics of delivering an order, marketing split by channel, and fixed overhead. The account ranges below are a convention, not a rule, but the grouping is what makes the P&L readable.
| Account range | Account name | CM level | Note |
|---|---|---|---|
| 4000-4099 | Gross sales, DTC / Shopify | Revenue | Separate account or class per channel |
| 4100-4199 | Gross sales, Amazon | Revenue | Or tag a single account by class |
| 4200-4299 | Gross sales, wholesale | Revenue | B2B / retail partner revenue |
| 4300-4399 | Gross sales, subscription | Revenue | Recognize per period, not upfront |
| 4400-4499 | Returns and allowances (contra) | Revenue deduction | ASC 606 contra-revenue, never net silently |
| 4500-4599 | Discounts (contra) | Revenue deduction | Promo codes and order discounts |
| 5000-5099 | COGS, product cost | CM1 | Ex-factory / supplier invoice cost |
| 5100-5199 | COGS, inbound freight | CM1 | Freight-in to warehouse, part of landed cost |
| 5200-5299 | COGS, duty / tariff / customs | CM1 | Import duties, part of landed cost |
| 5300-5399 | COGS, packaging and inserts | CM1 | Per-unit packaging tied to the product |
| 6000-6099 | Fulfillment, outbound shipping | CM2 | Variable per order, NOT in COGS |
| 6100-6199 | Fulfillment, 3PL pick and pack | CM2 | Variable per order or unit |
| 6200-6299 | Fulfillment, Amazon FBA and referral fees | CM2 | Transaction cost, NOT marketing |
| 6300-6399 | Payment processing fees | CM2 | Stripe / Shopify Payments / PayPal |
| 6400-6499 | Returns processing cost | CM2 | Return shipping and restocking labor |
| 7000-7099 | Marketing, paid social | CM3 | Performance spend only |
| 7100-7199 | Marketing, paid search | CM3 | Performance spend |
| 7200-7299 | Marketing, affiliate / influencer (DR) | CM3 | Direct-response tied to orders |
| 7400-7499 | Marketing, brand / PR / creative | CM4 / fixed | Not variable per order |
| 8000-8499 | Payroll, rent, SaaS, G&A | CM4 / fixed | Allocated fixed overhead |
The discipline that matters here is the CM-level column. Every account has a home, and its home is the decision it affects. Product cost and anything that lands the product in your warehouse sits at CM1. Anything that moves the order to the customer sits at CM2. Marketing that scales with orders sits at CM3. Everything fixed sits at CM4. Get that mapping right and the P&L reads like a decision tool instead of a tax document.
Returns are quietly eating your margin. See by how much.
Get our Real Cost of Returns calculator: plug in your numbers, see the true hit per return.
Check your inbox. We'll send the Real Cost of Returns calculator shortly.
CM1 through CM4: what each level tells you
Contribution margin is not one number. It is a staircase, and each step answers a different question. This is the single most useful reframe I bring to a founder call, because most operators have only ever seen the top step.
- CM1 is product viability. Net revenue minus landed COGS (product cost plus inbound freight and duty). If CM1 is thin, no amount of marketing efficiency saves you. The product itself does not work.
- CM2 is delivery efficiency. CM1 minus outbound shipping, 3PL pick-and-pack, Amazon fees, and payment processing. This is where a lot of "great margin" brands quietly bleed. Heavy or bulky products often lose 10 to 15 points here.
- CM3 is growth unit economics. CM2 minus performance marketing. Sophisticated operators want CM3 positive on the first order, and they read CM3 by channel, because a blended CM3 can hide a channel that is underwater.
- CM4 is fully loaded contribution. CM3 minus allocated fixed overhead (payroll, rent, SaaS, brand marketing). CM4 is the closest thing to "does this business make money at the unit level" once you carry your fixed base.
The chart below shows how steep that staircase can be. It is an illustrative model of an 8-figure DTC brand, not a specific client, and your numbers will differ by category and channel mix. But the shape is the point: a reported 68% gross margin becoming a 12% fully loaded contribution is not unusual, and every founder should know which step of that staircase they actually live on.
When we have walked founders through this for the first time, the reaction is almost always the same: the CM1 number feels fine, the CM2 number stings, and the CM3-by-channel view is where somebody realizes an entire channel has been losing money for a year. That is the whole reason to build the structure. You cannot manage a step you cannot see.
The 6 misclassifications that inflate gross margin
Six mistakes account for the vast majority of the gap between reported gross margin and reality. Three of them have a quantifiable point impact, shown in the chart below with denominator notes so the bars are comparable. The other three (inbound freight and duty, returns, and subscription timing) have variable or non-numeric margin effects and are covered in the table that follows.
1. Amazon referral and FBA fees coded to marketing. The referral fee is a standard 15% of gross Amazon revenue in most categories, and FBA fulfillment adds another 5 to 15% depending on size and weight. Booked as marketing, that full fee load never touches your gross margin or CM1, so the Amazon channel looks far healthier than it is. Fix: recode both to variable fulfillment at CM2. Check the current Amazon selling fees schedule at close, because the rates move.
2. Inbound freight and duty left in operating expenses. Freight-in and import duties are landed cost. They belong in COGS at CM1. Leaving them in opex understates COGS and inflates gross margin by the full landed-cost delta, which can be 15 to 35% on top of ex-factory cost for Asia-sourced goods. Fix: add freight-in and duty sub-accounts under COGS. A founder I worked with had been toggling between air and sea freight without watching CM1, and the air-freight months were quietly erasing product margin no one had priced for.
3. Outbound shipping buried in COGS or SG&A. Shipping the order to the customer is a delivery cost, not a product cost. Sitting in COGS it inflates gross margin by the full shipping percentage of revenue, typically 5 to 12 points. Sitting in SG&A it disappears from CM2 where you need it. Fix: move it to a 6000-series variable fulfillment account.
4. Returns netted from revenue. Silently reducing sales for refunds hides refund volume and distorts every trend line you draw. In fashion, where return rates run 15 to 30% of gross orders, this is not a rounding error. ASC 606 requires you to estimate returns at the time of sale as variable consideration. Fix: create an explicit contra-revenue account and a refund liability, so gross sales and net revenue both stay honest.
5. Payment processing in bank fees or SG&A. At roughly 2.9% plus 30 cents per transaction, processing scales directly with revenue and is a textbook CM2 variable cost. Parked in overhead it leaves 2 to 3 points of margin below the gross margin line where you cannot manage it. Fix: recode to a variable-cost account above CM2.
6. Subscription revenue booked upfront. Billing a six-month bundle and recognizing all of it in the billing month overstates that month and starves the next five, wrecking any trend or LTV analysis. Under ASC 606 the obligation is satisfied over time. Fix: set up a deferred revenue liability and recognize per period.
| Cost item | Wrong bucket | Right bucket | Typical margin effect |
|---|---|---|---|
| Amazon referral + FBA fees | Marketing (7000s) | Variable fulfillment (6200s) | Up to 18pp on Amazon revenue |
| Inbound freight + duty | Operating expenses (8000s) | COGS landed cost (5100-5200s) | Varies by landed-cost delta |
| Outbound shipping | COGS or SG&A | Variable fulfillment (6000s) | 5 to 12pp |
| Returns | Netted from revenue | Contra-revenue (4400s) | Masks refund volume |
| Payment processing | Bank fees / SG&A | Variable cost (6300s) | 2 to 3pp |
| Subscription revenue upfront | Revenue in billing month | Deferred revenue | Distorts period trend and LTV |
A 68% gross margin and a 12% contribution margin are the same business seen two ways. The first number is built for your tax return. The second is built for your next pricing decision. If you only ever read the first one, you will keep wondering where the cash went.
Channel visibility without exploding your account count
The reflex when a founder wants channel-level profit is to duplicate every account per channel: DTC shipping, Amazon shipping, wholesale shipping, and so on. That way lies a 400-line chart of accounts that no one reconciles. You do not need it.
QuickBooks Online classes and Xero tracking categories solve this cleanly. You keep one set of accounts and tag each transaction with a channel. The result is a full profit-and-loss by channel from a single, maintainable structure. Set up clearing accounts for the platforms too: a Shopify Payments clearing account and an Amazon settlement clearing account catch the gross-to-net difference (fees, refunds, reserves) so your revenue is booked gross and the fees land in the right CM2 bucket instead of vanishing into a net deposit.
The logic here is platform-agnostic. Whether you run QuickBooks, Xero, or something else, the rule is the same: one account structure, channel as a tag, clearing accounts to unwind the platform payouts. If you want the step-by-step QuickBooks version, our guide to QuickBooks for ecommerce walks through the setup. When we have done this with operators, the payoff shows up in the first monthly close, when a channel P&L that used to take a day of spreadsheet surgery just prints.
One caveat worth stating plainly. These CM1-through-CM4 layers are a management-reporting construct, not the GAAP income statement your tax accountant files. GAAP shows gross profit and operating income. The contribution staircase is for your decisions. Keep both, and do not let anyone tell you the tax P&L is the whole story.
Related reading. For the accounting setup underneath the chart of accounts, see QuickBooks for Shopify Plus and Xero bookkeeping for Amazon FBA. For how we build margin-visible books with brands, see our fractional CFO work.
Related reading. For the accounts to reconcile at year-end before handing off to a CPA, see the year-end close checklist.
Sources and methodology
Contribution margin levels (CM1 to CM4) are a management-reporting framework, not a GAAP presentation. The definitions used here follow standard DTC unit-economics practice: CM1 as net revenue minus landed COGS, CM2 after fulfillment and payment costs, CM3 after marketing, CM4 after allocated overhead. See flinder on contribution margin and the b2venture unit economics framework for the underlying definitions.
Returns and subscription treatment follow ASC 606. Returns are estimated at the time of sale as variable consideration and recorded as contra-revenue (ASC 606-10-32-5), and multi-period subscription revenue is recognized over the performance period rather than at billing. The FASB codification is at asc.fasb.org/606.
The chart of accounts structure is synthesized from published ecommerce accounting guidance. Account grouping, class-based channel tracking, and clearing-account practice draw on the Ottit Shopify-native CoA playbook and the Finaloop ecommerce chart of accounts guide. Account number ranges are a common convention, not a standard.
Fee ranges reflect published rate schedules as of mid-2026 and should be verified at close. Amazon referral fees (15% standard) and FBA fulfillment fees (roughly 5 to 15% by size and weight tier) come from the Amazon selling fees schedule; payment processing at approximately 2.9% plus 30 cents reflects standard Shopify Payments and Stripe published rates. These rates change periodically.
Illustrative figures are modeled, not client data. The 68% to 12% margin waterfall and the 8-to-15-point misclassification range are illustrative models based on typical DTC cost structures (outbound shipping 5 to 12% of revenue, landed-cost premiums 15 to 35% on imported goods). They are not a cited third-party benchmark study, and individual brand results vary widely by category and channel mix.
Frequently asked questions
what's the difference between gross margin and contribution margin for a dtc brand?
Gross margin is net revenue minus cost of goods sold, and most bookkeepers only put product cost in COGS. Contribution margin keeps going: it subtracts the variable costs of actually delivering the order (shipping, fulfillment, payment fees, marketing) to show what each sale really leaves behind. Contribution margin is the number that tells you whether a channel is profitable.
should outbound shipping go in cogs or below the line for a dtc brand?
Put outbound shipping in a variable fulfillment bucket at CM2, not in COGS. Shipping is a cost of delivering the order, not a cost of making the product, so burying it in COGS inflates gross margin by the full shipping percentage of revenue, typically 5 to 12 points. Keeping it at CM2 lets you see product margin (CM1) cleanly.
how do i classify amazon referral and fba fees on my p&l, are they cogs, fulfillment, or marketing?
Treat Amazon referral and FBA fees as variable fulfillment at CM2, never as marketing. They are transaction costs tied to each Amazon sale, so coding them to marketing overstates both gross margin and CM1. On the Amazon share of revenue that misclassification can hide 15 to 20 points of margin.
should returns be netted from revenue or shown as a separate line?
Show returns as an explicit contra-revenue line, not a silent reduction of sales. Under ASC 606 you estimate returns at the time of sale as variable consideration, so netting them invisibly hides refund volume and distorts your trend analysis. A separate contra-revenue account keeps both gross sales and net revenue honest.
what is cm1 vs cm2 vs cm3 and how do i calculate each?
CM1 is net revenue minus landed COGS (product plus inbound freight and duty), and it tells you if the product itself is viable. CM2 subtracts fulfillment, shipping, and payment fees for delivery efficiency. CM3 subtracts marketing to show growth unit economics. Each level answers a different question, which is why one gross margin line is not enough.
how should i account for inbound freight and import duties, are they cogs or operating expenses?
Inbound freight and import duties are part of landed cost and belong in COGS at CM1, not in operating expenses. Leaving them in opex understates COGS and inflates gross margin by the full landed-cost delta, which can be 15 to 35% on top of ex-factory cost for imported goods. Add dedicated freight-in and duty sub-accounts under COGS.
does payment processing (stripe or shopify payments) go in cogs, variable costs, or overhead?
Payment processing is a variable cost that belongs at CM2, not in bank fees or SG&A overhead. At roughly 2.9% plus 30 cents per transaction it scales directly with revenue, so parking it in overhead leaves 2 to 3 points of margin sitting below your gross margin line where you cannot manage it.
how do i show contribution margin by channel without setting up hundreds of accounts?
Use class or tracking-category tags instead of a separate account per channel. QuickBooks Online classes and Xero tracking categories let you tag revenue, COGS, and variable costs to Shopify, Amazon, wholesale, or subscription from one clean set of accounts, producing a P&L by channel without tripling your account count.
