Unit economics: does each order make money?
Before you grow anything, check that one unit of it makes money: one order, one ride, one subscriber, one delivery to a shop. This lesson shows you how to build the money story of a single order line by line, add the customer layer (CAC, LTV and payback), find the lever that fixes a loss soonest, and use the same method for internal tools as cost to serve.
By the end you can
- Pick the right unit and sort every cost into variable, fixed and step costs
- Build a contribution margin per order, split it by segment, and work out break-even volume for a site
- Calculate CAC, LTV and CAC payback correctly, and spot the three most common LTV mistakes
- Rank the levers that move each line, with the smallest change that would fix a loss
- Measure cost to serve for an internal tool, such as the cost of a phone order against an app order
The everyday picture
A family runs a dumpling stall near a busy bus station. A plate sells for $3.00. Flour, filling and oil cost $1.20, the paper plate and sauce cup $0.15, and the card machine keeps 2%, so each plate leaves about $1.59. Rent and gas cost $900 a month however much they sell. At about 19 plates a day they cover the rent, and every plate after that is profit.
Then a delivery app offers them thousands of new customers. The app keeps $0.90 a plate, the stall funds a $0.60 first-order discount, and delivery needs a sealed box at $0.25. Each delivered plate now loses 10 cents. The stall is busier than ever and poorer every week, and selling more makes it worse, because every extra plate loses money. That is the whole idea of unit economics: look at one unit first, and grow only when that unit pays.
Pick the unit, then sort every cost
The unit is the thing you sell or serve again and again. For a delivery app it is an order; for ride-hailing, a trip; for a subscription, a subscriber-month; for wholesale, a delivery to a shop. Choose the unit where decisions are made. If you set prices and fees per order, analyse per order.
Then sort every cost into one of three groups:
- Variable costs come with each unit: the goods in the basket, the rider's pay for that delivery, the bag, the payment fee, any discount.
- Fixed costs stay the same for the month whatever the volume: rent, the store manager's salary, software licences.
- Step costs are fixed until you cross a threshold, then jump: a second picker on the evening shift, another rider shift on a rainy night, a bigger delivery van.
Contribution margin is revenue per unit minus the variable costs per unit. It is what each unit contributes towards the fixed costs. Once the fixed costs are covered, contribution becomes profit. It differs from gross margin, which only takes away the cost of the goods. A grocery basket can have a healthy gross margin and still lose money once you pay for the ride to the customer's door.
One rule follows directly. If the contribution margin is negative, more volume makes the loss bigger. Spreading fixed costs over more orders helps only when each order earns something to spread.
Quick check
For one app order from a Mangrove store, which cost is variable?
The rider's pay for the delivery happens once per order, so it scales with volume. Rent, the manager's salary and the engineering team cost the same this month whether the store sends 400 or 600 orders, so they are fixed costs that contribution has to cover.
One "Now" order, line by line
Mangrove's busiest city has a dark store: a small warehouse, closed to shoppers, that only picks 30-minute "Now" orders for the app. It handles about 600 orders a day. Tomás, the data analyst, pulled last month's average order:
Basket value $18.00
Goods margin 18.00 x 22% + $3.96
Delivery fee charged + $1.50
Rider cost - $3.60
Packaging - $0.40
Payment fees 2% x (18.00 + 1.50 - 1.50) - $0.36
Discount (promo codes, first orders) - $1.50
Contribution margin per order - $0.40Now add the fixed costs. The dark store's rent, power, pickers and supervisor cost about $18,000 a month. Break-even volume is fixed costs ÷ 30 days ÷ contribution margin per order. With a margin of −$0.40 there is no break-even: at 600 orders a day the store loses about $25,200 a month, and at 1,200 it would lose more. If the discount were removed, the margin would be +$1.07 and break-even would be about 561 orders a day. At 600 orders the store would make about $1,260 a month. Positive, and very thin.
Averages hide the story, so split the margin by segment. Tomás grouped the month's orders by basket size:
| Basket band | Share of orders | Average basket | Contribution per order |
|---|---|---|---|
| Under $10 | 30% | $7.00 | −$2.60 |
| $10 to $25 | 50% | $18.00 | −$0.40 |
| Over $25 | 20% | $34.50 | +$2.90 |
The rider and the bag cost the same whatever is in the bag, so a $7 basket can never pay for its own trip with a $1.50 fee. Small baskets are where the losses are. Other useful splits are time of day (rain and dinner peaks need more riders), distance, new against repeat customers, and payment type.
Real quick-commerce companies have lived this. Blinkit, the quick-commerce arm of India's Zomato, reported a contribution margin of −7.3% of gross order value in the July to September quarter of 2022. A year later it reported +1.3%, with average order value up to about 607 rupees, and it had first turned contribution-positive in June 2023. Getir went the other way: in April 2024 it said it would leave the Netherlands, Germany, the UK and the US, markets that were about 7% of its sales and heavily loss-making, and focus on its home market, Turkey.
Quick check
Starting from the −$0.40 order above, which single change makes it profitable?
Halving the discount adds $0.75 and saves a little in payment fees, giving about +$0.34. Free packaging only reaches exactly $0.00. A $19 basket adds $0.22 of goods margin minus 2 cents of payment fees, so it reaches −$0.20, and a $3.40 rider also only reaches −$0.20. Write the arithmetic down; intuition about "small" changes is often wrong.
What moves each line
Each line has its own levers, its own owner and its own side effects. Write them down before anyone argues about which to pull:
| Line | What moves it | Watch out for |
|---|---|---|
| Basket size | Assortment, bundles, "add one more" prompts, a minimum order or a free-delivery threshold | Fewer orders from people who wanted one item fast |
| Goods margin | Category mix (fresh produce, own brand), supplier terms, less waste and fewer write-offs | Pushing high-margin items customers didn't want |
| Delivery fee | Fees by distance or basket size, a small-basket fee, peak pricing | Conversion drops; customers compare fees across apps |
| Rider cost | Orders per rider-hour: density, batching two nearby orders, shorter waits at the store | Slower deliveries if batching goes too far |
| Payment fees | Payment mix: cards, wallets, cash on delivery | Cash has its own costs: handling, shortages, failed deliveries |
| Discount | Target first orders only, cap per customer, stop blanket promo codes | Growth slows if discounts were the only reason people came |
Two of these hide a mechanism worth knowing. Rider cost per order is rider cost per hour ÷ orders per rider-hour. In the dark store's area, riders are paid about $7.20 for each hour on shift and complete about 2 orders an hour, so each order costs $3.60. If picking is slow, riders stand at the counter waiting, and fewer orders fit in each hour. That is why the Store app's picking screens are a unit-economics lever: get riders 2.25 orders an hour and the cost falls to $3.20, which on its own brings the order to break-even.
Payment fees often have a fixed part. Stripe's standard price for US domestic cards is 2.9% + 30¢ per payment (checked October 2026). On a $50 basket that is about 3.5%; on a $7 basket it is about 7.2%. Fixed per-payment fees, like riders, punish small baskets most.
Quick check
Riders cost $7.20 an hour. Faster picking lifts deliveries from 2.0 to 2.4 orders per rider-hour. What does each order's rider cost become?
$7.20 ÷ 2.4 = $3.00, which turns the −$0.40 order into +$0.20. $3.20 is the cost at 2.25 orders an hour. $4.32 comes from multiplying by 2.4 instead of dividing, which would mean that more orders per hour make each order dearer.
Try it. The simulator opens on the dark store's average order: contribution margin −$0.40, break-even "never", LTV −$6. Read the Levers list: the smallest single fix is gross margin from 22% to about 24.2%, then basket value to $20 or rider cost to $3.20 (each about 11%). Now set Discount per order to 0: the margin becomes $1.07, break-even falls to 561 orders a day, and at 600 orders the store makes about $1,260 a month. Finally raise Monthly retention from 80% to 90% and watch LTV double from $16.05 to $32.10, still short of 3 : 1 against a $12 CAC.
- While the margin is negative, more orders a day only make the monthly loss bigger, and better retention makes LTV more negative. Fix the unit before you buy growth.
- Some levers can't fix the order alone: even free packaging only reaches zero. The list shows how far each lever must move, which is the question to take to its owner.
Customers: CAC, LTV and payback
Orders come from customers, and winning a customer costs money. Three numbers describe the customer layer:
- CAC (customer acquisition cost) = acquisition spend ÷ new customers it brought. Count paid channels against the customers they brought; customers who arrived on their own don't belong in the divisor.
- LTV (lifetime value) = contribution margin per order × orders per month × expected lifetime in months. With steady monthly retention r, the expected lifetime is about 1 ÷ (1 − r) months.
- CAC payback = the months of contribution it takes to earn back the CAC.
Mangrove pays about $12 to win a customer. Customers order about 3 times a month, and 80% of them are still ordering the next month, so the expected lifetime is 1 ÷ 0.2 = 5 months. With today's −$0.40 margin, LTV is −$0.40 × 3 × 5 = −$6: every customer won loses $18 in total, counting the $12 CAC. With the discount removed, LTV is $1.07 × 3 × 5 = $16.05, and LTV:CAC is about 1.3.
The curve flattens because retention compounds: after 6 months only about a quarter of the customers are left. That shape explains a common surprise. Paying more to acquire customers looks safe while you watch the early months, but if CAC rises above about $16, the curve never gets there.
Three LTV mistakes come up again and again, and Bill Gurley's 2012 essay on "the dangerous seduction" of the LTV formula lists them:
- LTV on revenue. $18 × 3 × 5 = $270 looks wonderful and means nothing: Mangrove keeps a few cents of each dollar. Always use contribution margin.
- Counting free customers in CAC. Dividing paid spend by all new customers, including those who came through word of mouth, makes paid channels look cheap.
- Assuming everything improves together. Raising fees tends to lower retention, and spending more on ads tends to raise CAC. Gurley's point is that these variables pull on each other, so a forecast where they all get better at once is unlikely to hold.
Rules of thumb come from software companies: David Skok's widely used guide says the best SaaS businesses have LTV more than 3 times CAC, often recover CAC in 5 to 7 months, and look weak if payback takes more than 12. Treat these as a starting bar. Grocery delivery has thinner margins and more frequent orders, so finance teams set their own bar. Mangrove's finance team asks for 3 : 1 before scaling paid marketing. Retention curves that flatten, which you met in pm-23, are a better input than a single retention rate once you have cohort data.
Quick check
Margin per order stays at $1.07 and customers still order 3 times a month. Monthly retention improves from 80% to 90%. What happens to LTV?
Expected lifetime is 1 ÷ (1 − retention): 1 ÷ 0.2 = 5 months, 1 ÷ 0.1 = 10 months. Going from 80% to 90% looks like a small step but halves the share who leave each month, so lifetime and LTV double. That is why retention work often beats acquisition work for LTV.
Unit economics for internal tools: cost to serve
Internal products have no revenue, but every unit of work they handle has a cost. Cost to serve is that cost per unit: per partner order, per goods received note (GRN), per wholesale delivery, per support ticket. A good internal tool lowers it, and the product's value is roughly the cost per unit saved × volume, plus the errors it prevents.
Here is the Partner app's version. About 4,000 partner orders arrive a week, and about 1,500 of them still come by phone to Mangrove's 40 sales reps. Mangrove's numbers for each channel:
Phone order rep time 10 min x $6/hour (fully loaded) $1.00
about 1 in 12 corrected after delivery x $9 per fix $0.75
cost to serve $1.75
App order support, servers and payment handling $0.20
Difference per order moved to the app $1.55
Target: app share from 62% to 75% = about 500 fewer phone orders a week
500 x $1.55 x 52 weeks = about $40,000 a yearTwo cautions keep this honest. First, the $1.00 of rep time becomes real money only if the reps' hours go to something that pays, such as signing new shops, or if hiring slows. Say which, and who decided. Second, the corrections are a real cost today: credit notes, a second delivery, and an annoyed shop owner. Count those even when nobody's salary changes. The business case lesson, pm-28, turns numbers like these into a decision a managing director can sign.
Do it
Build a one-page unit economics summary for one unit of your product, and end it with a decision.
Name the unit and the period
One delivered order, one subscriber-month, one GRN processed. Use a recent month of real data, not a plan.
List revenue and variable costs per unit
Pull each line from its source (finance, ops, payments) and note where it came from. Put each line in one place only.
Compute the contribution margin and split it
Split by the segment most likely to differ: basket size, distance, time of day, new or repeat, payment type. Look for the segment that carries the loss.
Add fixed costs and break-even volume
Per site or per city: fixed costs ÷ 30 ÷ contribution margin. Note any step costs near today's volume.
Add the customer layer
Paid CAC by channel, retention from cohorts, LTV on contribution margin, CAC payback in months.
Rank the levers
For each line: the change needed to break even, who owns it, and its side effects. Start with the smallest change and the fastest owner.
Write the decision
What you will change, what waits, and the result that would make you stop or scale.
Markdown# Unit economics: dark store, "Now" orders (September) Owner: Imran with Tomás and the app business lead · 18,000 orders Decision: fix the order before more marketing; review after 4 weeks ## Unit One delivered "Now" order. Fixed costs per dark store per month. ## Per order (USD) | Line | Today | Plan | Owner | |----------------------|-------|-------|--------------------------| | Basket | 18.00 | 19.00 | Category team | | Goods margin (22%) | +3.96 | +4.18 | Category team | | Delivery fee | +1.50 | +1.70 | App product (fees) | | Rider | -3.60 | -3.20 | Ops + Store app picking | | Packaging | -0.40 | -0.40 | Ops | | Payment fees (2%) | -0.36 | -0.40 | Finance | | Discount | -1.50 | -0.60 | Marketing | | Contribution margin | -0.40 | +1.28 | | ## By basket band (today) Under $10 (30% of orders): -2.60 · $10-25 (50%): -0.40 · over $25 (20%): +2.90 ## Site Fixed costs $18,000/month · 600 orders/day Break-even: never today · about 470 orders/day on plan ## Customer Paid CAC $12 · 3 orders/month · 80% monthly retention (5-month lifetime) LTV: -$6 today · about $19 on plan · LTV:CAC 1.6 (bar: 3.0) ## Levers, smallest change first 1. Rider cost 3.60 -> 3.20: picking 9 -> 6 min (Store app, 6 weeks) 2. Discount 1.50 -> 0.60: first orders only (marketing, now) 3. Small-basket fee $1 under $12 (app product, test in 2 zones first) ## Stop or scale Scale paid marketing only when margin > $1.00 for 4 weeks and LTV:CAC > 3. Stop the small-basket fee if conversion drops > 5%.
Bring it to your team
Ask these whenever someone proposes growth, a new fee or a discount.
- What is the contribution margin per order today, and which segment carries the loss?
- Is LTV built on contribution margin, and where did the retention number come from?
- Is CAC paid spend divided by paid customers only, by channel?
- Where is the first-order discount counted, and is it counted only once?
- Which line would we change first, who owns it, and what might it do to conversion or retention?
- For internal tools: what does one unit of work cost today, and which part of the saving becomes real money?
Red flags
- "We'll make it up on volume" while the margin per order is negative.
- LTV calculated on revenue or basket value.
- A blended CAC that includes word-of-mouth customers.
- Only the average order is shown, never the segments.
- A plan where price, retention and CAC all improve at the same time.
- Saved staff minutes counted as cash with no one agreeing to change any hours.
Practice
Code the margin and break-even
Write two functions. contributionMarginCents takes one order (money in integer cents, percentages as numbers such as 22) and returns its contribution margin, rounded to the nearest cent. Payment fees are a percentage of what the customer pays: basket + delivery fee − discount. breakEvenOrdersPerDay returns the orders a day needed to cover a month's fixed costs (use 30 days), rounded up, or Infinity when each order makes nothing or loses money. Money is in cents so that sums never pick up rounding errors such as 0.1 + 0.2.
// o: { basketCents, grossMarginPct, deliveryFeeCents, riderCents,
// packagingCents, paymentFeePct, discountCents }
function contributionMarginCents(o) {
// goods margin + delivery fee - rider - packaging - payment fees - discount
}
function breakEvenOrdersPerDay(fixedCentsPerMonth, cmCents) {
// fixed costs / 30 days / margin per order, rounded up
}
const base = { basketCents: 1800, grossMarginPct: 22, deliveryFeeCents: 150, riderCents: 360, packagingCents: 40, paymentFeePct: 2, discountCents: 150 };
test('the average Now order loses 40 cents', () => {
expect(contributionMarginCents(base)).toBe(-40);
});
test('payment fees are charged on basket + fee - discount', () => {
expect(contributionMarginCents({ ...base, discountCents: 0 })).toBe(107);
});
test('a $7 basket loses $2.60', () => {
expect(contributionMarginCents({ ...base, basketCents: 700 })).toBe(-260);
});
test('break-even orders are rounded up', () => {
expect(breakEvenOrdersPerDay(1800000, 107)).toBe(561);
});
test('an order that loses money never breaks even', () => {
expect(breakEvenOrdersPerDay(1800000, -40)).toBe(Infinity);
});
Show a solution
function contributionMarginCents(o) {
const goodsMargin = o.basketCents * o.grossMarginPct / 100;
const charged = Math.max(0, o.basketCents + o.deliveryFeeCents - o.discountCents);
const paymentFees = charged * o.paymentFeePct / 100;
const cm = goodsMargin + o.deliveryFeeCents - o.riderCents
- o.packagingCents - paymentFees - o.discountCents;
return Math.round(cm);
}
function breakEvenOrdersPerDay(fixedCentsPerMonth, cmCents) {
if (cmCents <= 0) return Infinity; // more orders only lose more
return Math.ceil(fixedCentsPerMonth / 30 / cmCents);
}Fix a growth deck's LTV
A slide says: "Each new customer is worth $270 (an $18 basket × 3 orders a month × 5 months). Last month we spent $120,000 and won 10,000 new customers, a CAC of $12, so LTV:CAC is 22 : 1. Let's triple the budget." Tomás adds three facts: 4,000 of the 10,000 arrived with no paid touch (word of mouth and referrals); every new customer gets a $5 first-order discount; and on repeat orders without a discount, contribution margin is $1.07. Monthly retention is 80% and customers order 3 times a month. Find the mistakes, recompute LTV, paid CAC and LTV:CAC, say whether the customer ever pays back, and recommend what to do with the budget.
- You replace revenue with contribution margin in LTV
- You divide paid spend by the 6,000 paid customers only
- You count the $5 first-order discount once, in CAC or in the first order's margin, and say which
- You compare LTV with CAC and conclude whether a customer pays back
- Your recommendation fixes the unit or the channel mix before spending more, and notes that CAC usually rises with spend
Show a model answer
LTV (contribution) $1.07 x 3 orders x 5 months = $16.05
Paid CAC $120,000 / 6,000 paid customers = $20.00
First-order discount counted in CAC + $5.00
Paid CAC, all in = $25.00
LTV:CAC 16.05 / 25 = 0.64 : 1
Payback never: lifetime contribution is below CACThree mistakes: LTV used revenue instead of contribution margin (about 17 times too high); CAC counted 4,000 customers that marketing didn't win; and the first-order discount was counted nowhere. On paid channels Mangrove loses about $9 on every customer it wins. Don't triple the budget: tripling spend usually pushes CAC higher, since the cheapest customers are bought first. Cut channels whose CAC is above about $5 (a third of LTV), fix the unit (small baskets, rider cost), and work on retention, because 90% retention would double LTV. Revisit spend when LTV:CAC passes 3 : 1 on paid channels.
Check yourself
A food delivery start-up loses $0.30 on its average order after rider, payment and discount costs. Its fixed costs are small. The growth lead wants to double marketing because "scale will fix the margin". What is the best response?
Spreading fixed costs only helps when each order contributes something. Here the loss is in the variable costs, so volume multiplies it, whatever the channel costs. Scale can help one variable line, rider cost through density and batching, but that is a claim to prove with numbers before spending. "Never spend on marketing" ignores that marketing is fine once the unit pays.
A language-learning app charges $5 a month, and its contribution margin is 70% after app-store fees and servers. Monthly retention is 90%. It pays $40 to acquire a subscriber. What do the unit economics say?
Contribution is $5 × 70% = $3.50 a month, and 90% retention means about 1 ÷ 0.1 = 10 months, so LTV is about $35 against a $40 CAC. Using the $5 price instead of contribution is the revenue mistake. A discount rate would refine the number slightly but wouldn't change the conclusion at this horizon.
Riders at a grocery app are paid by the hour on shift. A new packing step makes riders wait 4 more minutes at the store for each order. What happens to unit economics?
Rider cost per order is hourly cost ÷ orders per rider-hour. Waiting time cuts orders per hour, so each order costs more even though pay per hour is unchanged. Slower delivery is a second effect, through retention and LTV. Answers that look only at the hourly rate miss the mechanism.
Flashcards
Key takeaways
- Check one unit before you grow: if the contribution margin is negative, volume makes the loss bigger.
- Build the margin line by line from real data, then split it; the loss usually sits in one segment, such as small baskets.
- Every line has a lever, an owner and a side effect. Rider cost per order is cost per hour ÷ orders per hour, so picking speed is a margin lever.
- LTV uses contribution margin and real retention; CAC counts paid customers only. Compare them, and check payback in months.
- Internal tools have unit economics too: cost to serve per order, GRN or ticket, with savings counted as cash only where hours or errors really change.
Sources and further reading
- SaaS Metrics 2.0: A Guide to Measuring and Improving What Matters, David Skok, For Entrepreneurs
- The Dangerous Seduction of the Lifetime Value (LTV) Formula, Bill Gurley, Above the Crowd, 2012
- Zomato Q2: Blinkit turns contribution positive for the first time since acquisition, Inc42, November 2023
- Getir gives up on Western Europe and the United States, RetailDetail, April 2024
- Stripe pricing, Stripe (standard US card price, checked October 2026)