CAC by Channel
CAC by Channel: Customer acquisition cost broken down by marketing channel.
Also known as: CAC
Formula
Channel CAC = Channel ad spend / Deals won in period via channel Computable definition
The canonical formula in the GASP formula grammar. The MCP server compiles it to SQL over the datasets listed below.
sum(field.ad_spend) / count_distinct(field.opportunity_id where field.opportunity_stage = 'closed_won' and in_period(field.close_date)) Unit: currency
Breakdowns
- Reported with one row per
channelvalue
Notes: Reported per marketing channel. Spend is campaign ad spend, which carries its channel, rather than the cost ledger: cost_event rows have a cost function but no channel, so ledger cost cannot be split by channel. New customers are opportunities won in the period, attributed to their first-touch channel.
Data requirements
Grain: Monthly aggregate · Frequency: Monthly · Aggregation: aggregate (month) · Staged: no · Main source: CRM.
| Field | Dataset | Type |
|---|---|---|
ad_spend | campaign | decimal |
channel | campaign | string |
channel | opportunity | string |
close_date | opportunity | date |
opportunity_id | opportunity | string |
opportunity_stage | opportunity | string |
period_start | campaign | date |
snapshot_date | opportunity | date |
Example SQL (Postgres)
SELECT _d.channel AS channel, (CAST((SELECT COALESCE(SUM(ad_spend), 0) FROM campaign WHERE period_start >= :period_start AND period_start <= :period_end AND channel = _d.channel) AS DOUBLE PRECISION) / NULLIF((SELECT COUNT(DISTINCT opportunity_id) FROM opportunity WHERE snapshot_date = :period_end AND (opportunity_stage = 'closed_won' AND (close_date >= :period_start AND close_date <= :period_end)) AND channel = _d.channel), 0)) AS cac_by_channel
FROM (SELECT 'paid_ads' AS channel UNION ALL SELECT 'organic_search' AS channel UNION ALL SELECT 'email' AS channel UNION ALL SELECT 'events' AS channel UNION ALL SELECT 'content' AS channel UNION ALL SELECT 'referral' AS channel UNION ALL SELECT 'marketplace' AS channel UNION ALL SELECT 'direct' AS channel UNION ALL SELECT 'other' AS channel) _d From an agent: with the GASP MCP server, call
lookup_metric({ "name": "CAC by Channel" }) or generate_query({ "metric": "CAC by Channel", "adapter": "<your adapter JSON>" }).
What It Tells You
Which channels are most efficient.