What is CAC, and how do you measure it in Metabase?
CAC — customer acquisition cost — is acquisition spend divided by new customers acquired in the period. It's the cost half of unit economics:LTV tells you what a customer is worth, CAC tells you what they cost to get. Measure it in Metabase by joining ad spend from Google Ads and Meta Ads to your customer table.
spend ÷ new customers, with the definition fixed up front: blended (all spend, all customers) or paid (paid spend, paid-attributed customers). Never mix the two in one chart, and count customers — not leads — in the denominator.What CAC measures
It measures the price of growth. A rising CAC with flat spend means channels are saturating or targeting is drifting; a falling CAC during a spend increase means there was headroom. On its own it says nothing about whether the customers are worth having — that's the LTV:CAC ratio — and nothing about cash timing, which is what CAC payback period (CAC ÷ monthly gross profit per customer) exists to answer.
Blended vs. paid CAC
Blended CAC divides all acquisition spend by all new customers, organic included. Paid CAC divides paid spend by customers your attribution assigns to paid channels. Blended is the honest company-level number; paid is the actionable channel-level one. Strong organic growth makes blended CAC look great while paid CAC quietly deteriorates — which is exactly why the two belong on separate, labeled lines rather than blended into one.
What data does it need?
- An
ad_performance_dailytable withchannel,stat_date, andspendacross platforms. - A
customerstable withfirst_purchase_atand anacquisition_channel(from your attribution or MMP data), plus starting MRR for payback math.
SQL patterns
WITH monthly_spend AS (
SELECT
channel,
date_trunc('month', stat_date) AS month,
SUM(spend) AS spend
FROM ad_performance_daily
GROUP BY 1, 2
),
new_customers AS (
SELECT
acquisition_channel AS channel,
date_trunc('month', first_purchase_at) AS month,
COUNT(*) AS customers
FROM customers
GROUP BY 1, 2
)
SELECT
s.month,
s.channel,
s.spend,
COALESCE(c.customers, 0) AS new_customers,
ROUND(s.spend / NULLIF(c.customers, 0), 2) AS paid_cac
FROM monthly_spend s
LEFT JOIN new_customers c
ON c.channel = s.channel AND c.month = s.month
ORDER BY 1, 2;WITH monthly_spend AS (
SELECT
date_trunc('month', stat_date) AS month,
SUM(spend) AS total_spend
FROM ad_performance_daily
GROUP BY 1
),
cohorts AS (
SELECT
date_trunc('month', first_purchase_at) AS month,
COUNT(*) AS new_customers,
AVG(starting_mrr) AS avg_new_mrr
FROM customers
GROUP BY 1
)
SELECT
s.month,
c.new_customers,
ROUND(s.total_spend / NULLIF(c.new_customers, 0), 2) AS blended_cac,
ROUND(
(s.total_spend / NULLIF(c.new_customers, 0))
/ NULLIF(c.avg_new_mrr, 0),
1
) AS cac_payback_months
FROM monthly_spend s
JOIN cohorts c ON c.month = s.month
ORDER BY 1;Pitfalls
Where this metric applies
- Google Ads + Metabase — campaign spend for the CAC numerator
- Meta Ads + Metabase — paid social spend by campaign and day
- AppsFlyer + Metabase — install attribution for the acquisition-channel join
- Amplitude + Metabase — acquisition channel on user profiles for the customer-side join
Related
Metrics
Dashboards
FAQ
Blended CAC vs. paid CAC — which should I report?
What costs belong in CAC?
What's a good LTV:CAC ratio?
How do you calculate CAC?
SUM(spend) / COUNT(new_customers), with NULLIF guarding the zero-customer month. The subtle part is the denominator — customers, not leads or signups, counted by the month they actually became customers. For long sales cycles, lag the spend or compute cohort CAC so this month's spend isn't divided by customers a previous quarter's spend produced.How do you track CAC in Metabase?
ad_performance_daily table, and land customers with an acquisition_channel from AppsFlyer or Amplitude in your warehouse. Join them by channel and month for paid CAC, and join MRR for the payback trend — then pin the result on a paid channel performance dashboard.