GTM Efficiency Drivers

Decomposes period-over-period changes in CAC into cost and customer volume drivers.

Purpose

Provide a driver-based view of go-to-market efficiency, attributing changes in customer acquisition cost to underlying sales spend, marketing spend, and customer volume dynamics.

This model is designed as an explanatory analytics layer, enabling:

  • Attribution of CAC inflation or deflation
  • Separation of spend-driven vs growth-driven efficiency changes
  • Clear reconciliation between CAC levels and CAC movements

It shifts the analysis from metric tracking to cause analysis.

Business Logic

  • Start from GTM Efficiency
  • Join with Customer Count View
  • Compute period-over-period deltas using LAG
  • Attribute CAC change into:
    • Sales cost changes
    • Marketing cost changes
    • New customer volume effects
  • Ensure driver components reconcile to total CAC change
  • Exclude the first period where lagged values are unavailable

Output Contract

Definitions

ColumnDescription
dateDate of the snapshot (YYYY-MM-DD)
value_typeIndicator such as actual, budget
sales_costCAC change driven by sales spend variation
mkt_costCAC change driven by marketing spend variation
new_customersCAC change driven by customer volume changes
cac_deltaTotal period-over-period change in blended CAC

Sample & Implementation

Drivers of changes in blended sales & marketing CAC over time.
datevalue_typesales_costmkt_costnew_customerscac_delta
2025-09-01budget0.00000.0000-0.00000.0000
2025-10-01budget0.00000.0000-0.00000.0000
2025-11-01budget0.00000.0000-0.00000.0000
2025-12-01budget0.00000.0000-0.00000.0000
2026-01-01budget98.716677.6500-0.0000176.3666
2026-02-01budget0.00000.0000-0.00000.0000
2026-03-01budget0.00000.0000-0.00000.0000
{{config(materialized='view')}}


with gtm_efficiency as (
    select * from {{ ref('gtm_efficiency') }}
),

customer_count_view as (
    select * from {{ref('customer_count_view')}}
),

calculated_values as (
    select
        gtm.date,
        gtm.value_type,
        (gtm.sales_cost - LAG(gtm.sales_cost) OVER (PARTITION BY gtm.value_type ORDER BY gtm.date)) / ccv.new_customers as sales_cost,
        (gtm.mkt_cost - LAG(gtm.mkt_cost) OVER (PARTITION BY gtm.value_type ORDER BY gtm.date)) / ccv.new_customers as mkt_cost,
        -((gtm.sales_cost + gtm.mkt_cost) / LAG(ccv.new_customers) OVER (PARTITION BY ccv.value_type ORDER BY ccv.date) - (gtm.sales_cost + gtm.mkt_cost) / ccv.new_customers) as new_customers,
        (gtm.sales_mkt_cac - LAG(gtm.sales_mkt_cac) OVER (PARTITION BY gtm.value_type ORDER BY gtm.date) ) as cac_delta
    from gtm_efficiency gtm
    left join customer_count_view ccv on gtm.date = ccv.date and gtm.value_type = ccv.value_type
)

select *
from calculated_values
where sales_cost IS NOT NULL

Dependencies

On this page

Star us on GitHub

If you enjoy this content and find it useful, give us a star on GitHub to show your support and stay updated with our latest improvements.