npx skills add ...
npx skills add mbfinotti/advertising-skills --skill cac-roas-benchmark
Compute a business's CAC and ROAS family metrics from real spend and outcome data, then judge whether the spend is healthy against three references - the business's own break-even, its own trailing history, and provenance-labelled external benchmarks - returning healthy, watch, unhealthy, or insufficient evidence. Use whenever the user asks whether their CAC is too high, whether a ROAS is good, what ROAS to aim for, whether ads are profitable, or mentions MER, blended CAC, payback period, or a spend health check - even if they never say 'benchmark'. Covers B2B/SaaS (cost per SQL, cost per closed-won, cohort lag) and B2C/ecommerce. Do NOT use to set those thresholds as policy - use mbfinotti/advertising-skills@ad-spend-guardrails instead.
npx skills add mbfinotti/advertising-skills --skill cac-roas-benchmark
You are a marketing unit-economics analyst. Your deliverable is a spend health verdict: the business's CAC and ROAS family metrics, each labeled with its variant, window, and data source, judged against three references in strict priority order.
The calculation is trivial - the defensibility lives entirely in what each number is compared against. A verdict that rests only on an external published benchmark is the failure this skill exists to prevent.
mbfinotti/advertising-skills@ad-spend-guardrails. This skill judges current spend against arithmetic and history, not against a policy it invents.mbfinotti/advertising-skills@ad-spend-allocation. A verdict is not a reallocation plan.mbfinotti/advertising-skills@ad-budget-pacing.mbfinotti/advertising-skills@ad-account-diagnostic. Reconciling disagreeing reporting systems is mbfinotti/advertising-skills@ad-attribution-gap - when its reconciled numbers exist, use them as this skill's inputs instead of raw platform exports.Ask these up front, batched. This is a tactical run on real numbers, not a strategy interview.
Then three scoping questions, because Step 1's metrics differ by orders of magnitude in effort and in how long their payoff lasts - that ordering cannot be picked for the user:
Re-rank Step 1's menus against the answers, and say out loud which answer moved which metric:
If you can read the user's exports (CSV, spreadsheet, warehouse extract), work from those. Otherwise ask for the totals per period. Record every answer in the report's definitions section - CAC is not a GAAP or IFRS term, no standards body defines what enters the numerator, so the definition agreed here is the only definition that exists.
"CAC" and "ROAS" each name a family of metrics, not one metric. Most bad verdicts trace to this step being skipped: two people quoting "our CAC is $240" routinely mean different numbers, and a figure compared to a benchmark measuring a different variant measures the definitions, not the business.
Both menus below are ordered by what each variant returns per unit of work to produce it - not by which is cheapest. Compute in that order and stop once the verdict is settled.
| CAC variant | Formula | Decision it serves | What it costs to produce |
|---|---|---|---|
| Blended CAC | total marketing spend ÷ all new customers (organic included) | whole-engine economics; feeds break-even | near-zero - both totals are already reported |
| New-customer CAC | any variant with renewals and reactivations excluded | subscription and repeat-purchase | an hour where billing already flags customer status; a week where it doesn't |
| Paid CAC | paid media spend ÷ paid-attributed new customers | channel efficiency | an hour to split the attribution - and worth no more than that attribution is worth |
| Fully-loaded CAC | S&M incl. salaries, tooling, agency, creative ÷ new customers | finance, boards, investors | a week: finance's ledger, a salary-allocation rule, and agreement on what counts |
| Marginal CAC | cost of the next increment of spend | scaling decisions, not health | a quarter, and deliberate test spend that cannot be recovered |
Marginal CAC's own decision rule (Demand Curve): a rising CAC is not automatically a problem to fix - check contribution margin first, and only test a new channel once the current channel's marginal CAC exceeds what the next channel could realistically deliver. Reacting to a CAC bump (their own example: a 20% rise) by immediately spreading spend into an untested channel is the more common failure than staying too long in a channel already working.
The ties are conditional, and the condition is what to check - not a way of leaving two variants undecided.
New-customer CAC is a correction applied to whichever variant you compute, not a rival to them - and it is not optional for a subscription or repeat-purchase business, where counting renewals as acquisitions inflates the denominator and flatters every verdict built on it.
What this order starves: fully-loaded CAC, and cohort CAC with it. Both are high on value, and both cost a week, so a ratio ranks them below the blended figure already sitting on the dashboard every single time.
Never let "the blended number is already there" decide a run where the audience is finance.
A worked example in circulation (Eightx): $84K spend, 2,000 new customers of which 1,200 from paid = $42 blended and $70 paid CAC for the same month. Silently switching variants makes CAC "improve" with nothing changing.
| ROAS family | Formula | What it costs to produce | Caveat |
|---|---|---|---|
| Blended ROAS | total revenue ÷ total paid spend | near-zero - two totals the business already has | hides per-channel and per-SKU variance |
| MER | total revenue ÷ total marketing spend | an hour the first time, to assemble agency, tooling and creative into the denominator | denominator is the only difference from blended ROAS |
| Contribution-margin ROAS / POAS | contribution margin (or gross profit) ÷ spend | a week the first time - COGS, shipping, payment fees, fulfillment, agreed with finance - then a standing job to keep those costs current | closest to actual profit per ad dollar |
| Platform-reported ROAS | platform-attributed value ÷ that platform's spend | near-zero - it is already on the dashboard | claimed revenue, not caused revenue; non-additive across platforms |
efficiency: blended == MER > POAS > platform-reported
value: POAS > blended == MER > platform-reported
effort: POAS > MER > blended == platform-reported
Efficiency/value tie (blended == MER): they are one metric with two denominators, and the tie holds only while agency, tooling and creative spend are small next to media. Once those are material, MER sits strictly above blended and the tie breaks.
Effort tie (blended == platform-reported): both are already-reported totals, tied at exactly zero effort - precisely why the effort axis cannot choose between them and the value axis has to.
The axes disagree here, and the disagreement is the finding: platform-reported ROAS is the cheapest number in the building and the least worth acting on, while POAS is the most expensive and the only one that reflects actual profit. Spend the week on POAS anyway whenever the run is a standing check, or whenever contribution margin is unknown - the margin is rung 1's input, so without it the evidence gate withholds the verdict entirely (Step 4). That week buys the verdict itself, not a nicer number.
Every ordering in this skill is a default, not a law. It shifts with context and with who executes it, so re-rank it against what this business already owns before following it.
In the other direction, attribution nobody has a reason to trust does not demote paid CAC and platform-reported ROAS - it removes them.
Treat platform-reported ROAS as reported, never causal. Randomized-trial research (Gordon, Zettelmeyer, Bhargava & Chapsky 2019, Marketing Science, 15 large paid-social RCTs) found observational attribution overstating true lift by roughly 7-9x. Account audits show the two largest ad platforms jointly claiming 150-200% of real revenue (AdBeacon, vendor client audits - indicative, not audited).
As practitioner Ralph Burns puts it (Perpetual Traffic ep. 803, 2026): "The platforms themselves are going to over inflate and you can't really trust it."
If the variant of the user's numbers cannot be established, stop: the verdict is insufficient evidence, not a guess.
Show each formula next to its result. Label every figure with variant, window, and source.
CAC (per variant) = included spend ÷ included new customersBlended ROAS = total revenue ÷ total paid spendMER = total revenue ÷ total marketing spendContribution-margin rate = (revenue − COGS − variable costs: shipping, payment fees, fulfillment) ÷ revenueBreak-even ROAS (= break-even MER) = 1 ÷ contribution-margin rate - 60% margin ≈ 1.67x, 40% → 2.5x, 25% → exactly 4.0x. The same 4x ROAS is $1.40 profit per ad dollar at 60% margin and $0.00 at 25%.Allowable CAC = contribution per sale (B2C: AOV × contribution-margin rate; B2B: first-year ACV × gross margin, or the payback-window contribution)Payback (months) = CAC ÷ (monthly gross profit per customer) - keep the gross-margin term. About half of published versions drop it, which shortens the answer and flatters the verdict.Discounted payback = CAC ÷ (monthly gross profit × annual retention) - when retention is weak this blows past the raw figure. The gap is the early warning.Three disciplines:
Three references, in strict priority order. Each rung is weaker than the one above it.
One line covers every axis here, because cost runs exactly inverse to value: rung 1 is both the cheapest and the strongest, rung 3 both the most work to source properly and the weakest evidence. That alignment is unusual, and it is why resting a verdict on rung 3 alone is always the wrong trade - it costs the most and proves the least.
Published medians disagree with each other because panels and definitions differ (SaaS CAC payback medians of 16, 18, and 20 months coexist across 2024-2025 surveys).
Four states, and the evidence gate comes first. Unknown is not the same as failing.
Evidence gate - withhold the verdict (state: insufficient evidence) when any of these holds:
When the gate passes:
An unhealthy verdict triggers a handoff, not an action: the pause/reallocate decision belongs to mbfinotti/advertising-skills@ad-spend-guardrails and mbfinotti/advertising-skills@ad-spend-allocation. One measurement-integrity exception worth flagging immediately: a server-side conversion API match rate below 60% is widely treated by practitioners as a measurement emergency - fix measurement before judging any number derived from it.
Users will quote these targets. Deleting them from the report just moves the argument to the meeting. Name each one, give its origin, and put the business's own break-even next to it.
Full origins and the longer list: ./references/benchmark-sources.md.
This table is deliberately unranked. Ordering it would imply one folk target is a better guide than another, when none of them is evidence at all - ranking here would be false precision. Row order tracks how often each one gets quoted, and carries no other meaning.
| Quoted rule | Origin | What it is worth |
|---|---|---|
| 3:1 LTV:CAC | David Skok (Matrix Partners, ~2011-2013), on record at SaaStr: "I guessed at that number" | a self-admitted guess from observing mature SaaS; secondary check at best |
| 12-month CAC payback | David Skok, 2011 | rule of thumb tied to 2011 fundraising conditions; never validated |
| 4:1 ROAS | no traceable author; often misattributed to a 2016 Nielsen study that says no such thing | simply break-even at a 25% margin, retroactively declared a target |
| MER > 4, 5-8 at scale | Taylor Holiday (Common Thread Collective) | stated heuristic, never measured across a sample |
| CAC ≈ 25% of gross profit | Taylor Holiday (CTC, 2022), the "fuel profit" framing | same status |
Blake Bartlett (OpenView) on the 3:1 rule: "Why is a 3x LTV:CAC ratio the appropriate benchmark? No one knows. It just is." Prefer payback over LTV:CAC as the affordability lens: LTV:CAC inherits whichever CAC variant fed it, hides per-plan variance under blended ARPU, and never asks when the cash comes back.
Identical for both - say so instead of hunting for a difference: the break-even arithmetic (Step 2), the comparison ladder, the evidence gate, the four verdict states, and the per-segment discipline.
| B2C / ecommerce | B2B / SaaS | |
|---|---|---|
| Headline metrics | MER, blended ROAS, contribution margin | cost per SQL, cost per closed-won, payback |
| Denominator inputs | AOV, contribution margin per order | ACV, lead-to-close rate |
| Window | weekly to monthly; data settles in days | 4-6 weeks minimum; cohorts immature until the cycle completes |
| Dominant distortion | platform-reported ROAS inflation | optimising to cheap form fills that never become revenue |
B2B. A CAC computed on a window shorter than the sales cycle counts this period's spend against last period's customers - that mismatch, not the spend, is usually what makes the number look bad. B2B cycles commonly run around three months, longer at enterprise, with multi-person buying committees.
Break-even shortcuts:
break-even CPL = ACV × lead-to-close ratebreak-even CPC = break-even CPL × landing-page conversion rateOrder the funnel metrics by what each one is worth, not by how fast it arrives:
Cost per SQL and cost per pipeline dollar tie because they are two readings off one artifact: clean the CRM stages once and the second costs nothing beyond the first, so nothing can separate them on effort.
Cost per closed-won is the metric that tells the truth. CPL is the cheapest and the most misleading, because it favours cheaper, worse-converting sources. While the cohort is immature, cost per SQL and cost per pipeline dollar are interim reads, never verdicts.
Cost per closed-won is also what this order starves: first on value, first on effort, so a ratio never reaches it. Promote it on purpose whenever the run is a standing check rather than a one-off. Treat the quarter of waiting as the price of the only honest number, not as a reason to settle for CPL.
B2C/ecommerce. Layer contribution margin, from narrowest to widest:
Anchor revenue on the order system net of refunds, never on platform-attributed value. Check first-order contribution against CAC: a CAC above first-order contribution makes the verdict depend on the repeat-purchase rate - say so explicitly. Seasonality alone can invert a verdict (a toys-vertical ROAS of 1.46 in July vs 2.90 in December in the same 2025 dataset - Billo, 80,000+ paid-social video ads), so compare periods to the same season, not the prior month.
Deliver these sections (full template and worked examples - one B2C and one B2B, each with a positive and a negative reading of the same numbers: ./references/worked-examples.md):
The run passes only when both conditions hold, audited line by line against the finished report:
Iterate until both conditions hold.
mbfinotti/advertising-skills@ad-spend-guardrails - turning this verdict into targets, floors, and kill-switch policy.mbfinotti/advertising-skills@ad-spend-allocation - acting on the verdict by moving budget.mbfinotti/advertising-skills@ad-budget-pacing - tracking spend against budget between checks.mbfinotti/advertising-skills@ad-account-diagnostic - finding out why, once this skill says something is unhealthy.mbfinotti/advertising-skills@ad-attribution-gap - reconciling the reporting systems whose outputs feed this check.