The Customer Acquisition Cost (CAC) is the total average cost to acquire one new, paying customer.
It’s a key marketing and financial metric that tells you how efficient (or expensive) your growth efforts are. The lower the CAC, the better — assuming the customer is profitable over time.
ExampleLet’s say in Q1 your startup spent:
You acquired 1,000 new paying customersCAC = $550,000 ÷ 1,000 = $550 per customerWhy CAC Matters
- $200,000 on ads
- $300,000 on marketing + sales team salaries & commissions
- $50,000 on tools and agencies
You acquired 1,000 new paying customersCAC = $550,000 ÷ 1,000 = $550 per customerWhy CAC Matters
- Profitability check – Compare CAC to Lifetime Value (LTV or CLV). The rule of thumb is LTV should be at least 3× CAC.
- LTV:CAC = 3:1 → Healthy
- <1:1 → Losing money on every customer
- 5:1 → Might be under-investing in growth
- Channel efficiency – You can calculate CAC per channel (e.g., Google Ads CAC = $400, LinkedIn = $1,200) to decide where to double down or cut.
- Fundraising & unit economics – Investors obsess over CAC and the LTV/CAC ratio. A rising CAC with flat or falling LTV is a red flag.
Common Ways Companies Reduce CAC
- Improve conversion rates (better landing pages, targeting)
- Increase organic channels (SEO, word-of-mouth, viral loops)
- Retention (happier customers refer more → lower effective CAC)
- Upselling existing customers (cheaper than acquiring new ones)
References
- Sario, Azhar ul Haque. Digital Marketing Strategy: Frameworks, Analytics, and AI Driven Application (2025 Edition) (p. 169). Kindle Edition.
- Grok
Python Code by Grok
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import pandas as pd
# -------------------------- DATA --------------------------
months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec 2025"]
spend = [120000, 135000, 140000, 160000, 155000, 180000,
195000, 210000, 205000, 220000, 230000, 250000]
new_customers = [240, 285, 320, 380, 410, 450,
520, 580, 610, 680, 750, 820]
# Calculate CAC
cac = [s / c for s, c in zip(spend, new_customers)]
# Channel breakdown (Dec 2025 example)
channels = ["Google Ads", "Meta Ads", "LinkedIn", "SEO/Organic", "Referrals", "Partnerships"]
channel_cac = [420, 580, 920, 180, 90, 650]
# -------------------------- FIXED DASHBOARD --------------------------
fig = make_subplots(
rows=2, cols=2,
subplot_titles=(
"CAC Trend Over Time",
"Spend & New Customers",
"CAC by Channel (Dec 2025)",
"CAC vs Target"
),
specs=[[{"secondary_y": False}, {"secondary_y": True}],
[{"type": "bar"}, {"type": "scatter"}]], # Fixed this line!
vertical_spacing=0.12,
horizontal_spacing=0.10,
row_heights=[0.6, 0.4]
)
# 1. CAC Trend
fig.add_trace(go.Scatter(x=months, y=cac, mode='lines+markers',
name='CAC', line=dict(color='#636EFA', width=4),
marker=dict(size=8)), row=1, col=1)
# 2. Spend (bar) + Customers (line)
fig.add_trace(go.Bar(x=months, y=spend, name="Spend ($)",
marker_color='lightblue'), row=1, col=2)
fig.add_trace(go.Scatter(x=months, y=new_customers, mode='lines+markers',
name="New Customers", line=dict(color='green', width=4)),
row=1, col=2, secondary_y=True)
# 3. Channel CAC
fig.add_trace(go.Bar(y=channels, x=channel_cac, orientation='h',
name="Channel CAC", marker_color='#636EFA',
text=channel_cac, textposition='outside',
texttemplate='$%{text:,.0f}'), row=2, col=1)
# 4. CAC vs Target
target = 350
fig.add_trace(go.Scatter(x=months, y=cac, mode='lines+markers',
name='Actual CAC', line=dict(color='#636EFA')), row=2, col=2)
fig.add_trace(go.Scatter(x=months, y=[target]*len(months),
mode='lines', name=f'Target (${target})',
line=dict(color='red', dash='dash', width=3)), row=2, col=2)
# -------------------------- LAYOUT --------------------------
fig.update_layout(
height=800,
title_text="Customer Acquisition Cost (CAC) Dashboard",
title_x=0.5,
template="plotly_white",
showlegend=False,
font=dict(family="Arial", size=12)
)
# Axis labels
fig.update_yaxes(title_text="CAC ($)", tickprefix="$", row=1, col=1)
fig.update_yaxes(title_text="Marketing Spend ($)", tickprefix="$", row=1, col=2)
fig.update_yaxes(title_text="New Customers", secondary_y=True, row=1, col=2)
fig.update_yaxes(title_text="CAC ($)", tickprefix="$", row=2, col=2)
fig.show()
# Optional: save
fig.write_html("CAC_Dashboard.html")
No comments:
Post a Comment