ds@mcpanalytics.aiEmail your data and your question and get an answer about your own data, with the method shown.Email your data and question. Get an answer.

How to Prove Your Marketing Is Working to Your CFO

By MCP Analytics Team | Published , updated

You know your marketing is working. Traffic is up. Leads are growing. The brand feels stronger. But when you walk into a budget meeting and say "impressions increased 40%," the CFO's eyes glaze over. Impressions do not appear on an income statement. Neither do followers, engagement rates, or share of voice.

CFOs think in unit economics: how much does it cost to acquire a customer, how much revenue does that customer generate, and how quickly does the investment pay back. If you can translate your marketing performance into these terms, budget conversations become collaborative instead of adversarial.

This guide covers the four metrics that matter to finance, how to calculate them, and how to build a monthly report that speaks their language.

Worked Example: Spend, Customer Value and Payback

Question: How do spend, customer value and payback fit together?

Inputs and method: Simulated data, seed 41. The numbers are made up. The script draws spend ($11,800 to $12,200), new customers (95 to 105), monthly revenue per customer ($48 to $52), gross margin (75%, 80% or 85%) and customer life (11 to 13 months). It then finds CAC (spend per new customer), LTV (monthly revenue times gross margin times customer life), the LTV:CAC ratio, and payback on revenue and on gross profit.

import numpy as np

seed = 41
rng = np.random.default_rng(seed)
marketing_spend = int(rng.integers(11800, 12201))
new_customers = int(rng.integers(95, 106))
monthly_revenue = int(rng.integers(48, 53))
gross_margin = float(rng.choice([0.75, 0.80, 0.85]))
customer_life_months = int(rng.integers(11, 14))

cac = marketing_spend / new_customers
ltv = monthly_revenue * gross_margin * customer_life_months
ltv_cac = ltv / cac
revenue_payback = cac / monthly_revenue
gross_profit_per_month = monthly_revenue * gross_margin
gross_profit_payback = cac / gross_profit_per_month
contribution_after_cac = ltv - cac

print(f"Simulated data, seed {seed}")
print(
    f"Inputs: marketing spend=${marketing_spend:,}; "
    f"new customers={new_customers}; "
    f"monthly revenue/customer=${monthly_revenue}; "
    f"gross margin={gross_margin:.0%}; "
    f"assumed customer life={customer_life_months} months"
)
print(f"Marketing CAC=${cac:.2f}")
print(f"Estimated gross-profit LTV=${ltv:.2f}")
print(f"LTV:CAC={ltv_cac:.2f}:1")
print(f"Revenue payback={revenue_payback:.2f} months")
print(f"Gross-profit payback={gross_profit_payback:.2f} months")
print(
    f"Estimated LTV less CAC=${contribution_after_cac:.2f} "
    "per customer, before other costs"
)

Output of python3 -I:

Simulated data, seed 41
Inputs: marketing spend=$12,066; new customers=105; monthly revenue/customer=$52; gross margin=85%; assumed customer life=13 months
Marketing CAC=$114.91
Estimated gross-profit LTV=$574.60
LTV:CAC=5.00:1
Revenue payback=2.21 months
Gross-profit payback=2.60 months
Estimated LTV less CAC=$459.69 per customer, before other costs

Result: In this run CAC is $114.91 and gross-profit LTV is $574.60, so LTV:CAC is 5.00:1. Revenue payback is 2.21 months and gross-profit payback is 2.60 months. LTV less CAC leaves $459.69 per customer, before other costs. That is value left after CAC, not full profit.

Limit: This is one made-up case. The 5.00:1 ratio follows from the inputs the draw set, mainly the 13-month customer life and 85% gross margin. LTV here is a product of those inputs, not something observed in retention data. It leaves out costs beyond gross margin and CAC.

Second Example: A Matched-Market Test

Question: Did a campaign add sales beyond the change seen without it?

Inputs and method: Simulated data, seed 42. The script makes 12 matched market pairs. In each pair one market is the control and one gets the campaign. It sets the same organic change inside each pair, adds random noise, and builds in a campaign lift of $600 per treated market. For each pair it subtracts the control market's change from the campaign market's change, then takes the mean of those pair results and a 95% t interval on the 12 differences. Revenue is in dollars.

import numpy as np
from scipy import stats

# Simulated data, seed 42. Twelve matched market pairs.
seed = 42
rng = np.random.default_rng(seed)
pairs = 12
baseline = rng.normal(10000, 1200, pairs)
organic_change = rng.normal(250, 180, pairs)
noise_t = rng.normal(0, 300, pairs)
noise_c = rng.normal(0, 300, pairs)
true_campaign_lift = 600

treated_change = organic_change + true_campaign_lift + noise_t
control_change = organic_change + noise_c
pair_lift = treated_change - control_change
mean_lift = pair_lift.mean()
se_lift = pair_lift.std(ddof=1) / np.sqrt(pairs)
critical = stats.t.ppf(0.975, pairs - 1)
low = mean_lift - critical * se_lift
high = mean_lift + critical * se_lift
mean_baseline = baseline.mean()
mean_control_after = (baseline + control_change).mean()
mean_treated_after = (baseline + treated_change).mean()

print(f"Simulated data, seed {seed}")
print(f"Matched market pairs: {pairs}")
print(f"Mean starting revenue per market: ${mean_baseline:,.2f}")
print(f"Mean control revenue after campaign: ${mean_control_after:,.2f}")
print(f"Mean campaign market revenue after campaign: ${mean_treated_after:,.2f}")
print(f"Mean added revenue per treated market: ${mean_lift:,.2f}")
print(f"Built in: a campaign lift of ${true_campaign_lift} "
      "per treated market, plus noise")
print("95% interval for added revenue per treated market: "
      f"${low:,.2f} to ${high:,.2f}")
print(f"Estimated added revenue across treated markets: ${mean_lift * pairs:,.2f}")

Output of python3 -I:

Simulated data, seed 42
Matched market pairs: 12
Mean starting revenue per market: $9,830.15
Mean control revenue after campaign: $10,127.67
Mean campaign market revenue after campaign: $10,776.65
Mean added revenue per treated market: $648.99
Built in: a campaign lift of $600 per treated market, plus noise
95% interval for added revenue per treated market: $444.21 to $853.76
Estimated added revenue across treated markets: $7,787.86

Result: Mean starting revenue was $9,830.15 per market. After the campaign, mean control revenue was $10,127.67 and mean campaign market revenue was $10,776.65. The estimated added revenue is $648.99 per treated market, with an interval of $444.21 to $853.76, or $7,787.86 across the 12 treated markets. The built-in lift is $600 per market, or $7,200 across 12, and the interval contains it. The gap is noise: with noise of $300 in each market and 12 pairs, the mean moves by about $120 from run to run.

Limit: The lift is built in, so the test finding it is expected. Giving each pair the same organic change is also built in, and that is what makes the subtraction work. Real market pairs match less well, and a real test has to earn that match. This shows how a matched test can be read. It does not show what a real campaign will earn.

A holdout test can help estimate marketing's added impact when a test market is compared with a control market and other factors are considered.

The Four Metrics Your CFO Actually Cares About

1. Customer Acquisition Cost (CAC)

What it is: Total marketing (and optionally sales) spend divided by the number of new customers acquired in the same period.

To see how each attribution model splits credit across your own channels, try the free attribution comparison tool.

How to calculate it:

Which costs count changes the number. The cost list below is an example, not real company data. It shows one quarter of marketing costs and 500 new customers.

# An example marketing cost list, per quarter, in dollars.
costs = {
    "Ad spend": 480_000,
    "Affiliate commissions": 72_000,
    "Variable tool costs": 18_000,
    "Team salaries": 360_000,
    "Agency retainer": 45_000,
    "Software subscriptions": 24_000,
}
variable = ["Ad spend", "Affiliate commissions", "Variable tool costs"]
new_customers = 500

variable_total = sum(costs[name] for name in variable)
fixed_total = sum(v for name, v in costs.items() if name not in variable)
all_total = variable_total + fixed_total

for name, value in costs.items():
    print(f"{name}: ${value:,}")
print(f"Variable costs: ${variable_total:,}")
print(f"Team, agency and software: ${fixed_total:,}")
print(f"All listed marketing costs: ${all_total:,}")
print(f"New customers: {new_customers}")
print(f"CAC on variable costs only: ${variable_total / new_customers:,.0f}")
print(f"CAC on all listed costs: ${all_total / new_customers:,.0f}")

Output of python3 -I:

Ad spend: $480,000
Affiliate commissions: $72,000
Variable tool costs: $18,000
Team salaries: $360,000
Agency retainer: $45,000
Software subscriptions: $24,000
Variable costs: $570,000
Team, agency and software: $429,000
All listed marketing costs: $999,000
New customers: 500
CAC on variable costs only: $1,140
CAC on all listed costs: $1,998

On variable spend alone, CAC is $1,140 ($570,000 over 500 new customers). Counting team, agency and software costs too, it is $1,998 ($999,000 over 500). Say which basis you use.

Why the CFO cares: CAC is the cost of growth. If it is rising, growth is getting more expensive: either channels are saturating, competition is increasing, or conversion rates are dropping. If it is falling, marketing efficiency is improving. The trend matters as much as the absolute number.

Pro tip: Report CAC by channel too. Your blended CAC might be $125, but Google Ads CAC might be $85 while LinkedIn Ads CAC is $340. This lets you show the CFO exactly where budget reallocation would improve efficiency.

2. Customer Lifetime Value (LTV)

What it is: The total revenue a customer generates over their entire relationship with your company.

How to calculate it:

Why the CFO cares: LTV puts CAC in context. A $125 CAC looks expensive in isolation. Set beside an LTV of $705.60, the gap is $580.60 per customer. That gap is contribution after acquisition cost. It is not full profit unless other costs are included. Without LTV, the CFO can only see the cost side of the equation.

3. LTV:CAC Ratio

What it is: Lifetime value divided by customer acquisition cost. It links the two numbers above.

A ratio of 1:1 means lifetime value only covers the cost of acquiring the customer. Any target above that needs a stated source and scope, and this guide gives none. Show the ratio next to a trend over several periods, and show the inputs behind the LTV, because the ratio moves with the assumed customer life and margin, as the first example shows.

4. Payback Period

What it is: The number of months it takes for a new customer's revenue to cover the cost of acquiring them.

How to calculate it: Revenue payback divides CAC by monthly revenue per customer. Gross-profit payback divides CAC by monthly gross profit per customer. If CAC is $125 and a customer generates $49 a month in revenue, revenue payback is 2.6 months. At an 80% gross margin, monthly gross profit is $39.20 and gross-profit payback is 3.2 months.

Why the CFO cares: Payback period is about cash flow. Even if the LTV:CAC ratio is high, a 24-month payback period means the company needs 24 months of cash runway before each customer becomes profitable. A 3-month payback period means the investment recycles quickly. CFOs managing cash flow care deeply about this distinction.

Building the Monthly Marketing Report for Finance

The examples above show how to report these measures. A one-page monthly report can follow this structure.

Section 1: Summary (3 Lines)

State the headline numbers: total spend, new customers acquired, CAC, and how each compares to last month and budget. Example with made-up numbers: "Marketing spent $14,200 of $15,000 budget (95%), acquired 118 customers (CAC: $120, down from $131 last month). LTV:CAC ratio improved from 3.1 to 3.4."

Section 2: Unit Economics Table

The numbers below are an example.

Metric This Month Last Month 3-Month Trend
Marketing Spend $14,200 $14,800 Flat
New Customers 118 113 Improving
CAC $120 $131 Improving
LTV $408 $405 Stable
LTV:CAC 3.4:1 3.1:1 Improving
Payback Period 2.4 mo 2.7 mo Improving

Section 3: Channel Efficiency (Top 3-4 Channels)

Show CAC and ROAS by channel. Highlight which channels improved, which degraded, and any budget shifts you recommend. This is where you justify moving $2,000 from LinkedIn to Google Ads, with numbers, not opinions.

Section 4: One Insight, One Action

End with one analytical insight and one recommended action. Example: "Email reactivation campaigns reduced churn by 8% this month, improving LTV by $12/customer. Recommending $1,500/month investment in automated email sequences for at-risk customers." This shows marketing thinks in terms of investment and returns, not just activities.

Common Mistakes in Marketing-to-Finance Reporting

What to Do When the Numbers Are Bad

Sometimes your CAC is rising and your LTV:CAC ratio is declining. Hiding this from the CFO is worse than presenting it with a plan. Here is the framework, with example wording for each step:

  1. Acknowledge the trend: "CAC increased 15% quarter-over-quarter, from $110 to $127."
  2. Explain the driver: "This is primarily driven by increased competition in Google Ads, where CPC rose 22% across our target keywords."
  3. Present the plan: "We are shifting 20% of paid search budget to content marketing and email, which we expect to have a lower CAC. We expect blended CAC to return to $115 within two quarters."
  4. Set a checkpoint: "I will report on progress in the next monthly review. If CAC has not improved by month 2, we will discuss further budget reallocation."

CFOs respect marketers who own their numbers, explain variance, and propose data-backed solutions. They do not respect marketers who only show up with good news or who cannot explain what is happening.

Your turn

Bring your own data and the question you actually need answered.

MCP AnalyticsData science by email Send us your data and your question, and we will reply. ds@mcpanalytics.ai

Frequently Asked Questions

What marketing metrics do CFOs care about most?

CFOs may review Customer Acquisition Cost (CAC), Customer Lifetime Value (LTV), the LTV:CAC ratio, and payback period (months until a customer covers their acquisition cost). Secondary metrics include pipeline contribution and marketing-sourced revenue percentage.

How do I calculate Customer Acquisition Cost (CAC)?

CAC = total marketing (and optionally sales) spend divided by the number of new customers acquired in the same period. Say which costs you include: ad spend, tool subscriptions, agency fees, content creation, and proportional marketing team salaries. In the cost-list example in this guide, CAC is $1,140 on variable spend alone ($570,000 over 500 new customers) and $1,998 counting team, agency and software costs too ($999,000 over 500). A fully-loaded CAC also adds sales team costs.

How do I read the LTV:CAC ratio?

LTV:CAC is lifetime value divided by CAC. At 1:1, lifetime value only covers the cost of acquiring the customer. Any target ratio needs a stated source and scope, so this guide gives none. In the simulated example in this guide the ratio is 5.00:1, set by the assumed 13-month customer life and 85% gross margin.

How often should I report marketing performance to finance?

Monthly works for many teams. Include spend vs. budget, CAC trend, new customers, and marketing-sourced revenue. Quarterly, add LTV analysis and channel deep-dives. Weekly figures can be noisy, so show trends over several weeks or months.

← Marketing Analytics · CSV Analysis · All Articles