1. Why most SEO ROI models fail in board meetings
An SEO agency presents a model: 'we'll get you 50,000 more monthly visits in 6 months, that's $480K of incremental revenue.' The CMO loves it. The CFO asks four questions in 90 seconds, and the entire model collapses.
What CFOs actually ask: (1) What's the confidence interval, not the point estimate? (2) What's the time-to-rank distribution — is half of this in month 6 or month 12? (3) What's the assumed conversion rate, and is that grounded in our actual data? (4) If we don't fund this, what's the counterfactual — does organic decline? (5) How do we true this up against actuals quarterly?
Most agency models can't answer these. Ours can — because we built the model to answer them, not to make a sale.
2. The five inputs that determine the dollar answer
The model is multiplicative: small errors in any input compound into large errors in the output. A 30% error on each input compounds to a 5× range at the output.
Our convention: every input gets a low / mid / high range. The output is therefore a range too — not a point estimate. The range is the model's most honest output.
| Input | Source | Confidence |
|---|---|---|
| Search volume per keyword | Ahrefs / Semrush / GSC actual data | Medium — these tools differ by 40% on the same query |
| CTR by position | Real CrUX + CTR studies (Advanced Web Ranking, 2024) | Medium — varies by SERP feature presence |
| Conversion rate by intent | Client's actual GSC + GA4 data per page type | High when client has data, low when extrapolated |
| LTV / order value | Client's CRM + finance data | High if client knows their unit economics |
| Time-to-rank | Historical data on 60+ similar engagements | Medium — depends on starting domain authority |
3. CTR curves — the most-debated input
CTR by SERP position is empirically observable but varies wildly by SERP feature presence. The Advanced Web Ranking 2024 dataset is our default; we adjust it down 15–30% for SERPs with AI Overviews and 25–40% for SERPs with shopping carousels.
| Position | CTR (no SERP features) | With AI Overview | With shopping/local carousel |
|---|---|---|---|
| 1 | 27.6% | 19.2% | 16.2% |
| 2 | 15.8% | 11.0% | 9.5% |
| 3 | 11.0% | 7.7% | 6.8% |
| 4 | 8.4% | 5.9% | 5.0% |
| 5 | 6.3% | 4.4% | 3.8% |
| 6 | 4.9% | 3.4% | 2.9% |
| 7 | 3.9% | 2.7% | 2.3% |
| 8 | 3.2% | 2.2% | 1.9% |
| 9 | 2.7% | 1.9% | 1.6% |
| 10 | 2.3% | 1.6% | 1.4% |
GSC's per-query CTR data is the strongest input. If the client has GSC verified for >12 months, use their actual CTR for queries you've ranked for as the calibration baseline.
4. Time-to-rank curves (the missing variable in most models)
Cumulative revenue is the integral under this curve, not the month-12 value times 12. Most agency forecasts overstate Q1 revenue by 60–80% by missing this.
| Domain Rating starting | Month 1 | Month 3 | Month 6 | Month 9 | Month 12 |
|---|---|---|---|---|---|
| DR 10–20 (new) | 5% | 12% | 31% | 62% | 100% |
| DR 30–40 (mid) | 8% | 22% | 48% | 78% | 100% |
| DR 50–60 (established) | 12% | 32% | 62% | 85% | 100% |
| DR 70+ (authoritative) | 18% | 44% | 72% | 90% | 100% |
5. Confidence intervals (low / mid / high) — the only output a CFO trusts
Every forecast we hand a CFO is presented as low / mid / high. The point estimate is the mid. The low is 'if every input lands at p25 of its range'. The high is 'if every input lands at p75'.
This is mathematically conservative — the actual distribution is narrower because not every input correlates. But conservative is the right bias for an agency forecast: under-promise so the actuals can over-deliver.
// 10,000 trials. Each trial samples each input from its distribution.
const trials = 10000;
const results = [];
for (let i = 0; i < trials; i++) {
const searchVolume = sample(searchVolumeDistribution); // log-normal
const ctrAtPosition = sample(ctrDistribution[targetPosition]); // beta
const conversionRate = sample(convRateDistribution); // beta
const ltv = sample(ltvDistribution); // log-normal
const timeToRankWeight = sample(timeToRankCurve); // sigmoid
const monthlyVisits = searchVolume * ctrAtPosition * timeToRankWeight;
const monthlyConversions = monthlyVisits * conversionRate;
const monthlyRevenue = monthlyConversions * ltv;
results.push(monthlyRevenue);
}
results.sort((a, b) => a - b);
const low = results[Math.floor(trials * 0.10)]; // p10
const mid = results[Math.floor(trials * 0.50)]; // p50 (median)
const high = results[Math.floor(trials * 0.90)]; // p90
// We present: "Annual incremental revenue: $480K (low) — $1.2M (mid) — $2.1M (high)"When a CFO sees a low/mid/high range, two things happen: (1) they trust the agency more because we acknowledged uncertainty, and (2) they fund the project at the low number, which means we can over-deliver against expectations.
6. The spreadsheet structure (we hand this over to clients)
Every audit ends with a delivered Google Sheet. Five tabs:
- Tab 1: Inputs. Every assumption is a labeled cell. Color-coded by source (blue = client data, green = industry benchmark, yellow = our estimate).
- Tab 2: Keyword opportunity. One row per target keyword. Columns: search volume, current position, target position, target CTR, expected monthly clicks, expected monthly conversions, expected monthly revenue.
- Tab 3: Time-to-rank model. The sigmoid curve as a per-month percentage. Sums the keyword tab into a per-month forecast.
- Tab 4: Sensitivity. What happens to the forecast if conversion rate is 50% lower than assumed? If LTV is 30% higher? Shows which inputs matter most.
- Tab 5: Reconciliation. Monthly tracker. Forecast vs actuals, side by side. Updated quarterly.
Half the founders we audit just take the spreadsheet and execute internally without hiring us. We're fine with that. The audit is genuinely free. About half of the other half become engagements anyway, because the model surfaces work they'd rather outsource than DIY.
7. The 7 CFO questions you must be able to pre-answer
If you can answer all seven cleanly, you'll be the only agency in the bake-off who can. The forecast becomes the work, and the work becomes the forecast.
- 1What's the confidence interval, not the point estimate? Answer with low/mid/high based on Monte Carlo, not optimistic vs pessimistic vibes.
- 2How does this compare to the counterfactual? If we don't fund this, do we hold steady or decline? Answer: with declining DR, traffic decays 4–8% per quarter post-stall.
- 3What's the time-to-payback? Cumulative revenue minus cumulative spend, month by month. We typically show payback at month 7–10 for retainers.
- 4What's our hurdle rate, and does this beat it? IRR of the engagement vs the company's cost of capital. Usually 4–8× hurdle rate is the IRR for organic SEO retainers.
- 5What can go wrong, and how would we know early? Quarterly trueing-up against forecast. The first dashboard milestone is at week 12.
- 6How does this depend on inputs we don't control? Algorithm updates can change the trajectory. We model algorithm-update risk as an annual 10–20% drag and budget for it.
- 7Why you, vs in-house? Senior speed-to-execution + the methodology you don't yet have in-house. Compare hiring + onboarding cost (typical: $180K + 3 months) vs retainer.