What happened
The dashboards said scale. The cohort table disagreed.
A few years into running a supplement subscription brand, we had a month where platform ROAS read 5x. Spend was up on the month before and Meta's share of it had gone from 46% to 67%. By every dashboard the media team looked at, it was working.
The cohort table said otherwise. We were buying more customers who were worth less, at a higher price, and the platforms were reporting it as a good month.
This is written for founders and CMOs at $20M to $100M DTC brands, and for the operators who already run cohort tables and want to argue with the details. Figures from that brand are relative and anonymised. Worked examples are illustrative and labelled that way.
The governing number
Everything ladders up to 90-day customer value to CAC. It's a cohort version of CAC payback, and an earlier, observed version of LTV:CAC. LTV is a model built on churn assumptions. This is what customers actually spent.
- A cohort is every customer whose first-ever order falls in the period, deduplicated by customer ID or email.
- Customer value includes the first order and every rebill inside the window. Rebills are the point.
- CAC loads all paid spend onto new customers only. Returning customers carry no acquisition cost.
- 1.0x means the cohort paid back its media by day 90. Under 1.0x, you're lending money to every new customer.
Everything below runs on contribution unless it's labelled gross. The real numbers from that brand are on gross sales, because that's what was being reported at the time.
Trap 01
Banked and projected are different numbers
The month after that 5x read, an all-hands slide showed 90-day CV:CAC at 1.10x and 1.23x. Both were projections, pulled up by two low-CAC months that hadn't reached a rebill yet. The fully matured cohorts behind them sat at 0.51x and 0.61x on gross sales. The blended 12-month payback ratio across all cohorts was 0.77x.
Nothing on the slide was false. It just led with numbers that hadn't happened. The fix is a labelling rule that never bends.
| Label | Definition | How it's shown |
|---|---|---|
| Banked | Cohort has lived its full 90 days | Headline. Green at 1.0x or better, red under |
| Projected | Cohort is younger than 90 days | Amber, footnoted, never the headline |
The honest headline when projections look good is "leading indicator on track, banked payback still maturing." It is never "we hit 1.23x."
One more trap sits inside monthly cohorts. Reading month index 3 gives a customer acquired on the 1st about 120 days of value and a customer acquired on the 30th about 90. Index 3 is generous by up to a month. Move to weekly cohorts read at week 13, or footnote every slide with "index 3 reads 90 to 120 days."
Trap 02
Contribution is the real payback
1.0x on gross sales pays back the media and nothing else. Discounts, landed COGS, pick and pack, shipping, gift COGS and returns all come out before a dollar repays CAC.
The illustrative cohort further down reads 1.39x gross and 0.87x on contribution. Run both in parallel for eight weeks, then move the headline to contribution and keep gross as the trend line. Never put a gross number next to a net number without a label, and footnote any series that crosses an analytics tool change. Two tools on the same brand reported the same month's discount rate at 15.4% and 17.5%.
Trap 03
Average CAC hides your last dollar
Cohort CAC is an average. The decision you make every week is about the next dollar, and that's marginal CAC.
An illustrative month. Spend goes from $200,000 to $260,000 and new customers go from 2,105 to 2,210. Average CAC moves from $95 to $118, which looks like a manageable 24% rise. The extra $60,000 bought 105 customers at about $571 each.
That's the shape of the month at the top of this piece. Average CAC rose 31% and the blended number made it look like a pricing problem. It was a ceiling. Meta spend had nearly doubled without a proportional rise in new customers, and blended CAC hid it. Non-brand search CAC in the same period spiked to five to eight times the blended low.
Track marginal CAC by channel weekly. When it crosses the 90-day contribution a new customer delivers, about $87 in the example below, the next dollar is losing money no matter what the average says.
Trap 04
Cheap entry products buy cheap customers
In the same month, new-customer order value fell 27%. Nothing changed in pricing. The mix shifted toward the lowest-priced products in the range, and away from the flagship and the bundles.
CAC on its own celebrated it, because cheaper products convert cheaper. CV:CAC caught it, because value fell faster than cost.
- Tag every cohort by the hero product in the first order and read 90-day CV per entry product.
- Point paid creative at the products whose cohorts pay back, even when the first order costs more to win.
- Watch new-customer AOV weekly beside CAC. A falling AOV with a flat CAC is the early warning.
The science
The levers, in order of what they're worth
An illustrative cohort, run on contribution. $100 CAC. An $85 first order and a $72 rebill after 15% subscribe-and-save. 60% of buyers take subscription, 70% survive to rebill one and 55% to rebill two. Each unit costs $17 landed and each order $9 to pick, pack and ship, plus 3% payment fees and 2% returns.
On gross, this cohort reads 1.39x and looks healthy. On contribution it's 0.87x, so every customer is still about $13 underwater at day 90. The rebill also carries a thinner margin than the first order, 59% against 64%, because subscribe-and-save comes off the price and none of it comes off the cost.
| Change | Contribution CV:CAC | Lift |
|---|---|---|
| Baseline | 0.87x | |
| Price up 10% on first order and rebill | 1.00x | +0.13x |
| CAC down 10% | 0.96x | +0.10x |
| Subscription take rate up 10 points | 0.92x | +0.05x |
| Survival up 10 points at both rebills | 0.92x | +0.05x |
On contribution, price is the biggest lever. A price rise drops straight through while unit cost stays where it is, which is also why deep subscribe-and-save discounts cost more than they look. Retention looks small here because only two rebills fit inside 90 days. It compounds after that, so a retention-heavy brand should read a 180-day ratio beside the 90-day one. A subscriber who makes it through rebill two is far more likely to still be there at month twelve.
The art
The subscription mechanics that actually move it
- First-rebill survival as its own cohort view. Subscribers who complete rebill one, divided by subscribers acquired. Split it by entry product, entry offer and channel. It's the largest revenue leak in most subscription businesses and it's rarely on the dashboard.
- Read offer tests through survival. A 20% first-order discount usually wins on signups. Test it against a milestone gift at rebill two and read the result through first-rebill survival and 90-day CV:CAC. Signup volume is the wrong scoreboard for an offer test.
- Watch discount stacking. A first-order discount on top of subscribe-and-save on top of free shipping can put the first order underwater on contribution before CAC is even counted.
- Make skip and pause easier than cancel. A paused subscriber can be reactivated. A cancelled one has to be reacquired at full CAC.
- Ship on the real usage rhythm. Customers who fall behind on product cancel to catch up. Match cadence to how the product is actually used, and let people change it in one text.
- Brief box two like a launch. The second delivery happens thousands of times a month and it decides survival. Treat it as a creative problem.
The brand
Brand has to show up in the cohort table
Brand earns its place in this model when it shows up in the numbers. The clearest example from that brand was a three-week demand ramp into a major sale period that cut CAC by more than half. Demand moments move the denominator hard.
Always-on brand spend is harder to see. Run it as its own budget line with a geo holdout or a matched-market test, and read the result through CAC and first-rebill survival in the test markets. Full-price customers who join for the product survive rebill one at a higher rate than customers who join for the discount. That's where brand pays back inside 90 days.
The window
Ninety days is a choice
Ninety days fits a brand that funds growth from its own cash. It's one quarter of working capital and roughly one inventory turn. A well-funded brand with strong retention can deliberately run a 6 to 12 month payback and win share while others wait for cash. That's a legitimate strategy, as long as the board is choosing it with banked numbers in front of them.
Set the window to two or three replenishment cycles of the core product, and keep a 90-day read as a leading indicator even when the governing window is longer.
| Days of supply | Window |
|---|---|
| 30 | 90 days |
| 45 | 90 to 135 days |
| 60 | 120 to 180 days |
| Non-replenishable | 90 to 180 days, set by the repeat curve |
The whole company
One spend decision every week
Every week ends with one spend decision tied to the ratio, logged with the number that justified it.
| Signal | What we do |
|---|---|
| Month-0 ratio drops more than 20% against the prior cohort | Freeze incremental spend. Diagnose channel mix and AOV |
| CAC rising while spend rises | Spend is past the efficient point. Pull back to the last level that held |
| A banked cohort under 0.5x contribution | Fix the offer and retention before adding spend |
| A projected cohort tracking above 1.0x contribution | Scale the channel and entry product that produced it |
| AOV falling on mix shift | Move creative and offers to the flagship and bundles |
| First-rebill survival falling | Lifecycle and offer fix first, acquisition second |
For channel decisions we keep a separate attributed CAC on 7-day click, no view-through, new customers only, rebills excluded. Platform ROAS includes view-through and returning customers, so it never decides where the next dollar goes.
This only works if the whole company is accountable to it. Paid media owns the denominator. Lifecycle and retention own the rebills. Product owns entry mix and AOV. Operations owns cadence and box two. Finance owns landed cost, which is what makes the contribution number possible. When each team reports its own metric instead, the business can lose money on every customer it buys while every team has a good month.
Building it
Thirty days to stand it up
Any DTC brand with six months of order history and daily spend by platform can run this. Week one connects the order system and every paid platform and loads costs. Week two reconciles one full month of net sales to finance and backfills six to twelve months of cohorts. Week three reads the matured cohorts and sets bands. Week four runs the first weekly read and logs the first decision.
The logic, tool-agnostic:
WITH first_orders AS (
SELECT customer_id, MIN(order_date) AS first_date
FROM orders
WHERE is_test = FALSE AND channel = 'dtc'
GROUP BY customer_id
),
cohorts AS (
SELECT customer_id, first_date,
DATE_TRUNC('week', first_date) AS cohort_week
FROM first_orders
),
cv AS (
SELECT c.cohort_week, c.customer_id,
SUM(o.gross_sales) AS cv_90
FROM cohorts c
JOIN orders o
ON o.customer_id = c.customer_id
AND o.order_date <= c.first_date + INTERVAL '90 days'
GROUP BY 1, 2
),
spend AS (
SELECT DATE_TRUNC('week', spend_date) AS cohort_week,
SUM(spend) AS paid_spend
FROM ad_spend
GROUP BY 1
)
SELECT cv.cohort_week,
COUNT(*) AS new_customers,
s.paid_spend / COUNT(*) AS cohort_cac,
AVG(cv.cv_90) AS cv_90,
AVG(cv.cv_90) / (s.paid_spend / COUNT(*)) AS cv_cac_90,
CASE WHEN CURRENT_DATE >= cv.cohort_week + INTERVAL '97 days'
THEN 'Banked' ELSE 'Projected' END AS status
FROM cv
JOIN spend s USING (cohort_week)
GROUP BY cv.cohort_week, s.paid_spend
ORDER BY cv.cohort_week;
Multiply cv_90 by your contribution rate for the contribution view, and add entry product and first-order channel to the cohort key for the splits.
FAQ
Questions founders ask us
What is a good CAC payback period for a subscription brand?
For a brand funding growth from its own cash, pay back acquisition cost on contribution margin within 90 days. That's one quarter of working capital and two to three replenishment cycles on a 30-day product. Well-funded brands with strong retention can run 6 to 12 month payback on purpose, as long as the board decides with banked cohorts in front of them.
What's the difference between 90-day CV:CAC and LTV:CAC?
LTV:CAC is usually a model built on churn and margin assumptions. 90-day CV:CAC is observed. It's what a cohort of new customers actually spent in their first 90 days, divided by what it cost to win them, and it arrives nine months before a 12-month LTV read.
Should CAC payback be measured on gross revenue or contribution margin?
Contribution margin. 1.0x on gross sales pays back the media and nothing else. At a 60% contribution rate, a 1.0x gross cohort is 0.6x on contribution.
What is marginal CAC and how do you calculate it?
Change in paid spend divided by change in new customers. It tells you what the next dollar buys, which the average never will. Track it weekly by channel.
Why is ROAS misleading for subscription brands?
Platform ROAS counts the first order, includes view-through and returning customers, and is graded by the platform selling you the ads. In subscription, the first order is usually the one that loses money. The value is in the rebills, and ROAS never sees them.
More from Magnetic: How we name brands · Services
Want this running in your business?
Every brand we work with runs on this from the first month. It decides where the next dollar goes, which product leads the ads, and what lands in box two.
Talk to BenBen Acott is the founder of Magnetic, a growth agency with a venture studio inside it. He built Feastables to $380M in under two years alongside MrBeast, ran Onnit as CEO under Unilever, and was early at Manscaped through its run from $3M to $300M.