
Costing a D2C or Ecommerce Business: The Product, the Order and the Margin Stack
A blended report can show a profitable product while one channel carries the losses of another. Costing the order, not only the product, is how you find out which.
Summary
- A D2C business has two cost objects: the product, which costs the same however it is sold, and the order, whose cost changes with channel and payment method.
- Build CM1, CM2 and CM3 per channel: discounts off the price before CM1, marketplace advertising in CM3, shared costs apportioned on what consumes them.
- On the illustrative SKU here, CM1 barely moves across three channels while CM3 halves, from 30% of realised price on prepaid to 15% on cash on delivery.
D2C has an unusual advantage and an unusual trap, and they are the same thing.
The advantage: every order, shipment, return and rupee of ad spend sits in a system, timestamped and attributable. The trap: the data arrives blended, so almost nobody separates it. The dashboard shows one gross margin and one acquisition cost, each an average of channels with little in common.
The product and the order are two cost objects
The product is what the unit costs to make or buy, landed, including inbound freight and duty. The order is what it costs to get that unit to one customer through one channel.
A single SKU has one product cost and as many order costs as there are ways to sell it. Prepaid from your own site, cash on delivery, a marketplace, quick commerce and a distributor each have their own.
Cost only the product and all of them look the same. They are not close.
Building CM1, CM2 and CM3 for every channel
The stack has three levels, computed for each channel and never averaged across them. The definitions are in the Founder's Guide; for costing, what matters is which line sits at which level.
- CM1: realised price minus landed product cost; what most brands call gross margin.
- CM2: CM1 minus every cost of getting the unit to that customer through that channel, as itemised in the table below.
- CM3: CM2 minus the acquisition spend attributable to that channel.
Discounts come off the top. CM1 starts from the price realised after coupons, markdowns, codes and your share of platform-funded offers: a discount is revenue never received. Keep the month's discounts as one rupee tally between label and realised price, read against that month's CM2. How deep a discount can go is a breakeven calculation of its own.
Marketplace advertising goes in CM3. Sponsored listings are that channel's acquisition spend, as performance marketing is your own site's; charging both at one level keeps channels comparable. Brand spend that benefits every channel sits after CM3 as one block, never apportioned.
What one SKU earns in each channel
Take an illustrative SKU with a ₹1,299 label price and a ₹420 landed product cost.
One SKU, three channels, per delivered order (percentages of realised price)
| ₹ per delivered order | Own site prepaid | Own site COD | Marketplace |
|---|---|---|---|
| Label price | 1,299 | 1,299 | 1,299 |
| Discounts | (100) | (100) | (130) |
| Realised price | 1,199 | 1,199 | 1,169 |
| Landed product cost | (420) | (420) | (420) |
| CM1 | 779 (65%) | 779 (65%) | 749 (64%) |
| Shipping and packaging | (95) | (95) | (25) |
| Gateway (2% of 1,199) or COD handling | (24) | (40) | 0 |
| Commission (18% of 1,169) | 0 | 0 | (210) |
| Fulfilment and storage fees | 0 | 0 | (95) |
| Own warehousing (volume, picks) | (30) | (30) | (15) |
| Customer service (tickets) | (10) | (25) | (20) |
| Returns after delivery | (30) | (30) | (70) |
| RTO share | 0 | (80) | 0 |
| CM2 | 590 (49%) | 479 (40%) | 314 (27%) |
| Acquisition | (225) | (300) | (120) |
| CM3 | 365 (30%) | 179 (15%) | 194 (17%) |
CM1 hardly moves: ₹779 on both own-site columns, ₹749 on the marketplace after a deeper platform offer. Everything that separates the channels happens below it, and the ranking flips. On CM2 the marketplace is weakest, ₹314 against ₹479 for COD. On CM3 it overtakes COD, ₹194 against ₹179, because refused COD orders consume acquisition spend as well as freight. Put marketplace advertising in CM2 instead, and the CM2 row would compare the marketplace after its acquisition spend with your own site before its own. That would make the marketplace look worse than it is.
Return to origin behaves like scrap
Manufacturers call it scrap. In D2C it is return to origin, and it is costed the same way. A refused order consumes shipping both ways, packaging and handling, may bring back an unsellable unit, and earns nothing, so the delivered orders carry its cost.
RTO cost per delivered order = refusal rate ÷ (1 − refusal rate) × cost of one refused order.
At 25% refusal the ratio is 0.25 ÷ 0.75, or one third. A refused order here costs ₹240: ₹95 of forward shipping and packaging, ₹75 of reverse shipping and ₹28 of handling. The other ₹42 is there because one returned unit in ten is unsellable (10% of ₹420). One third of ₹240 is the ₹80 in the COD column.
The ratio reaches CM3 too. Site ads cost ₹225 per order placed, refused or not, so each delivered COD order carries ₹225 ÷ 0.75 = ₹300. Prepaid refusals are left at zero here.
Tag every order with the RTO drivers
A single COD refusal rate is itself an average. Refusals vary by product and order value, by city and pin code, by how the order was placed, by delivery partner and by time since order. Longer waits bring more refusals, which makes the delivery promise a cost driver in its own right.
Record each as a dimension on every order and run the formula per cell. A product-and-pin-code cell at 40% refusal loads two thirds of a refused order onto each delivered one (0.40 ÷ 0.60). A cell at 10% loads one ninth (0.10 ÷ 0.90). A few cells usually carry a disproportionate share. What this load does to price, and what to do about the worst cells, is the argument of the COD margin trap.
Offline distribution needs its own stack
The table's three columns take a line each, and the pricing piece's worked example runs all three. Prepaid from your own site is almost always the best channel. COD is usually let down by its payment method, not its platform. A marketplace pays in commission, fees and visibility advertising. Quick commerce is tighter still, on its own fulfilment model.
Offline retail and distribution is a different stack entirely. It fits the same three levels only if each line is placed deliberately:
- Distributor and retailer margin comes off the price before CM1. Realised price is what the distributor pays you, not the shelf price.
- Trade schemes are discounts, and join the monthly tally at the top of the stack.
- Damages and expiry are yield loss, the offline form of unsellable returns, charged in CM2.
- The credit period is a financing cost in CM2. Sixty days at a 14% cost of capital is about 2.3% of the invoice (14% × 60 ÷ 365).
Apportion shared costs on what consumes them
Warehousing and customer service are usually spread by revenue, and should not be. The general method is in cost apportionment; in D2C the drivers are specific. Marketing, the third shared cost, is placed by channel as set out above.
Warehousing goes on cubic volume and orders picked. Say a ₹4,00,000-a-month warehouse holds a serum earning 70% of revenue in 15% of the space, and a bulky hair-care kit earning 30% in 85%. By revenue the kit carries ₹1,20,000; by space alone, ₹3,40,000, nearly three times as much.
Customer service goes on tickets per channel. COD and marketplace orders generate materially more contacts than prepaid ones, hence ₹10, ₹25 and ₹20 in the table: cost to serve, applied to orders. Both are activity charges. Where the warehouse is a fixed lease and the team salaried, the split ranks SKUs and channels. But the cost does not fall if one channel shrinks. For a decision to drop or discount a channel, read CM2 before these two lines.
Cost a cohort, not only its revenue
Most brands track repeat rate and revenue by cohort. Few track cost. Customers won during a sale cost less to acquire and frequently behave worse; returns and discount dependence vary by cohort too. A cohort healthy on repeat revenue can be unprofitable at CM3 if it only ever buys on discount.
Cohort CM3 is realised revenue over a fixed window, minus product, order and discount costs on every order the cohort placed, minus the acquisition spend that won it. RevenueOS for D2C already reviews repeat rate by cohort each month; this is the cost column beside it.
Four costing exercises for your best-selling SKU
- A cost-per-order card: one column per order type, every line from label price to CM3, on three months of actuals.
- Re-split warehousing and service on volume, picks and tickets, and see which SKUs and channels change rank.
- A monthly discount tally: every coupon, , code, scheme and platform offer share as one rupee total, against that month's CM2.
- One cohort's CM3: a cohort at least six months old, every order carried through the stack, acquisition included.
Our Pricing Maturity Assessment then shows whether order costing is your largest pricing gap, or whether something upstream matters more.
Frequently asked questions
Where do discounts and marketplace advertising sit in CM1, CM2 and CM3?
Discounts come off the price before CM1, so CM1 is measured on realised price. Marketplace advertising is that channel's acquisition cost and sits in CM3, beside performance marketing for your own site.
How do I calculate RTO cost per delivered order?
Refusal rate ÷ (1 − refusal rate) × the full cost of one refused order. At 25% refusal, a ₹240 refused order adds ₹80 to each delivered order.
How useful was this article?
One tap. It tells us what to write more of.
About the author
SRF Capital Studio
The next one
Get what we publish next, by email.
Working notes on raising, borrowing, protecting, growing and structuring capital in India. One email a week at most, and you can leave any time.
We use your address only to send this. See our privacy policy.
We store your address to send you these emails and nothing else. See our privacy policy.
Related reading



