CAC (Customer Acquisition Cost)
CAC, customer acquisition cost, is the average cost of acquiring one new customer — what a company spends on sales and marketing to bring in someone who pays.
\[ \text{CAC} = \frac{\text{total sales and marketing costs}}{\text{new customers acquired}} \]
What belongs in the numerator is the whole question. The usual list is marketing spend (ads, campaigns, events, content), sales team costs (salaries, commissions, software), tools and infrastructure (CRM, email automation, lead generation), and onboarding costs (discounts, referral bonuses, trials). Companies differ on all four, which is why the same quarter produces different numbers.
A worked example first, so the arithmetic is out of the way. Spend \$500,000 on marketing and sales in a quarter, acquire 2,000 new customers, and CAC is \$250. That part is never the difficulty.
Choose the cost scope, then estimate the next customer’s cost
The ledger, customer counts, response curve and LTV-to-CAC ratios in this section are hypothetical and illustrative, computed in the code in this section; they are not data from any company.
One ledger, six CACs
Take one quarter with nine cost lines, from paid media to onboarding discounts, and 3,000 new customers: 1,200 from paid channels and 1,800 from organic.
ledger = {
"paid media": 300_000, "agency and creative": 45_000,
"SEO and content": 60_000, "events and sponsorship": 25_000,
"sales and marketing salaries": 180_000, "sales commissions": 40_000,
"CRM and marketing software": 35_000,
"allocated facilities and management": 55_000,
"onboarding discounts and referral bonuses": 30_000,
}
customers = {"paid": 1_200, "organic": 1_800}
total_customers = sum(customers.values())
print(f"{sum(ledger.values()):,} dollars of spend, {total_customers:,} new customers")
770,000 dollars of spend, 3,000 new customers
Now compute CAC under six scoping decisions, each of which is defensible. Each line below is just the included spend divided by the customers it is spread over.
scopes = (
("media only, over paid customers", ["paid media"], customers["paid"]),
("all paid channels, over paid customers",
["paid media", "agency and creative", "events and sponsorship"],
customers["paid"]),
("organic spend, over organic customers", ["SEO and content"],
customers["organic"]),
("media only, over all customers", ["paid media"], total_customers),
("everything except overhead",
[k for k in ledger if k != "allocated facilities and management"],
total_customers),
("everything", list(ledger), total_customers),
)
for name, lines, n in scopes:
spend = sum(ledger[k] for k in lines)
print(f"{name}: {spend:,} / {n:,} = {spend / n:,.2f}")
media only, over paid customers: 300,000 / 1,200 = 250.00
all paid channels, over paid customers: 370,000 / 1,200 = 308.33
organic spend, over organic customers: 60,000 / 1,800 = 33.33
media only, over all customers: 300,000 / 3,000 = 100.00
everything except overhead: 715,000 / 3,000 = 238.33
everything: 770,000 / 3,000 = 256.67
This is why CAC is not comparable across companies, or across quarters within a company if the definition moved. One ledger and one customer count support six CACs between \$33.33 and \$308.33, and none of them is a mistake. The named variants are not six metrics; they are six scoping decisions about the same ratio. Blended CAC is total spend over all new customers. Paid CAC is paid spend over paid-acquired customers. Organic CAC is content, SEO and referral spend over organic customers. Fully loaded CAC adds salaries, tools and allocated overhead — which, as its own entry notes, often makes it the same number as blended CAC. A CAC quoted without its scope cannot be compared with anything.
The next customer costs more than the average
Every CAC above is an average, and a budget question is about the next dollar. To see the gap, give a channel a diminishing-returns response curve: customers acquired per month are 900 times (spend / \$100,000) raised to the power 0.6. The average CAC at a spend level is spend divided by customers; the marginal CAC is the cost per customer of the next \$1,000, estimated as \$1,000 divided by the extra customers that \$1,000 buys.
def new_customers(spend): # hypothetical response curve
return 900 * (spend / 100_000) ** 0.6
for spend in (100_000, 200_000, 400_000, 800_000, 1_600_000):
n = new_customers(spend)
average = spend / n
marginal = 1_000 / (new_customers(spend + 1_000) - n) # cost of the next $1,000's customers
print(f"spend {spend:>9,}: {n:>5,.0f} customers, average CAC {average:>6.2f},"
f" marginal CAC {marginal:>6.2f} ({marginal / average:.2f}x)")
spend 100,000: 900 customers, average CAC 111.11, marginal CAC 185.55 (1.67x)
spend 200,000: 1,364 customers, average CAC 146.61, marginal CAC 244.60 (1.67x)
spend 400,000: 2,068 customers, average CAC 193.46, marginal CAC 322.59 (1.67x)
spend 800,000: 3,134 customers, average CAC 255.27, marginal CAC 425.55 (1.67x)
spend 1,600,000: 4,750 customers, average CAC 336.83, marginal CAC 561.45 (1.67x)
On a channel with diminishing returns the marginal cost of a customer is well above the average — on this curve, about \(1/0.6 \approx 1.67\) times it at every spend level. For a power curve with exponent 0.6, the derivative-based marginal cost is exactly \(1/0.6\) times the average; the printed marginal figures use a \$1,000 forward difference, so they come out slightly above that, at 1.667 to 1.670 times the average. A channel with an average CAC of \$193 can be buying its next customers at \$323, and the report that says \$193 is not wrong, just not an answer to the question being asked.
From the LTV-to-CAC ratio to payback
The LTV-to-CAC ratio compares the expected lifetime gross profit of a customer with the cost of acquiring one. Assume each customer brings in the same gross profit m every month after the costs of serving them (see gross margin) and that a constant share of customers, the monthly churn rate, leaves each month. Expected lifetime is then 1/churn months, LTV = m × lifetime, and the ratio is LTV/CAC. The months of gross profit needed to cover CAC are CAC/m, which equals lifetime divided by the ratio. To see it with numbers, fix CAC at \$250 and the expected lifetime at 24 months, pick an LTV-to-CAC ratio, and back out the monthly gross profit it implies.
cac, life = 250.0, 24 # dollars, expected lifetime in months
for ratio in (1.0, 2.0, 3.0, 5.0):
per_month = ratio * cac / life # constant gross profit per month
print(f"LTV/CAC {ratio:.1f}: gross profit {per_month:5.2f} a month,"
f" payback {cac / per_month:4.1f} months")
LTV/CAC 1.0: gross profit 10.42 a month, payback 24.0 months
LTV/CAC 2.0: gross profit 20.83 a month, payback 12.0 months
LTV/CAC 3.0: gross profit 31.25 a month, payback 8.0 months
LTV/CAC 5.0: gross profit 52.08 a month, payback 4.8 months
A ratio of 3 pays back in 24 / 3 = 8 months and a ratio of 1 takes the full 24. This is a simple payback shortcut, not the date a churning cohort actually recovers its acquisition cost. That date requires cumulative cohort gross profit, payment timing and relevant costs. Neither the ratio nor this shortcut establishes solvency.
Why it is watched, and how it moves
CAC is one half of unit economics. It has to be sustainable against customer lifetime value, it is the basis for comparing channels when allocating budget, and it is the constraint on growth — if acquiring the marginal customer gets expensive enough, scaling stops paying regardless of how healthy the average looks.
The levers are the ones the formula implies. Better targeting removes wasted spend from the numerator. Funnel optimization raises the conversion rate, which raises the denominator for the same spend. Retention does not appear in the CAC formula, so for a given spend and number of acquired customers it does not change CAC by itself, but it raises LTV, which is what makes a given CAC sustainable. And shifting mix toward cheaper channels lowers blended CAC — though as the blended entry shows, mix changes move that number for reasons that have nothing to do with efficiency.
When the question is whether to spend more, ask for the marginal figure, which means either a response curve or a test — not the average from last quarter.
Discover more from Insightful Data Lab
Subscribe to get the latest posts sent to your email.
