Metric · Marketing

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.

TL;DRspend ÷ 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_daily table with channel, stat_date, and spend across platforms.
  • A customers table with first_purchase_at and an acquisition_channel (from your attribution or MMP data), plus starting MRR for payback math.

SQL patterns

Paid CAC by channel by monthPostgreSQL
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;
Blended CAC trend with payback monthsPostgreSQL
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

Mixing blended and paid CAC in one chart.→ They have different numerators and denominators, so the line jumps whenever the mix shifts. Define both once, label each series, and never let a deck swap definitions between quarters.
Counting leads as customers.→ Spend ÷ leads is cost per lead, a different metric with a different job. CAC's denominator is customers who actually converted — inflating it with signups makes every channel look cheap.
Ignoring the timing mismatch.→ This month's spend often produces next month's customers, especially with long sales cycles. Naive same-month division makes CAC spike when spend ramps and flatter when it's cut. Lag the spend or compute CAC by cohort.
Dropping organic from the blended denominator.→ Blended CAC means all new customers, organic included. Quietly excluding them turns blended CAC into paid CAC with a misleading label — and hides the leverage organic provides.

Where this metric applies

Metrics

Dashboards

FAQ

Blended CAC vs. paid CAC — which should I report?
Both, but never interchangeably. Blended CAC is all acquisition spend ÷ all new customers, so organic and referral volume pulls it down. Paid CAC is paid spend ÷ customers attributed to paid channels — the number that tells you whether the ads themselves work. Define each once, label every chart, and keep them on separate lines. A paid vs. organic mix dashboard shows why they diverge.
What costs belong in CAC?
Pick a definition and hold it constant. Media-only CAC (ad spend alone) is easy to compute and good for channel decisions. Fully loaded CAC adds tools, agency fees, and sales and marketing salaries — the honest number for unit economics and board decks. Both are legitimate; switching silently between them is how CAC "improves" without anything changing. Note the definition in the chart description.
What's a good LTV:CAC ratio?
The common benchmark is 3:1 — a customer's lifetime value should be about three times what they cost to acquire — but it moves with your margin and payback tolerance. Pair the ratio with CAC payback period (CAC ÷ monthly gross profit per customer): a 3:1 ratio that takes 30 months to pay back still strains cash. Watch churn rate too, since churn quietly rewrites the LTV side of the ratio.
How do you calculate CAC?
Divide acquisition spend by new customers acquired in the same period: 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?
Sync spend from Google Ads and Meta Ads into an 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.