Map the funnel and find the bottleneck
Stage-by-stage rates, content mapped to the funnel, and where it really gets stuck.

This step has one job: name the stage where extra effort moves revenue the most, and line the rest of the audit up behind it. On an audit I ran for a B2B SaaS, the traffic had good bases and conversion had barely been touched, so that verdict came first and the analysis centered on conversion. State what you did not dig into as well, and hold back recommendations where someone else is better placed to make them.
Throughout this chapter, say a B2B SaaS at 2M ARR sells quoting software to companies of 50 to 500 people. The numbers are invented to show the method.
Write each stage as an event someone can count
A funnel drawn on a slide proves nothing until every stage has an entry event, an exit event and one system that holds the truth. If marketing and sales count “qualified” differently, settle it before computing a single rate.
| Stage | Counted when | Source of truth |
|---|---|---|
| Visit | A session starts on the site | Web analytics |
| Signup | An account is created | Application database |
| Activated | The first quote is sent to a real client | Application database |
| Qualified | The account fits the target and sales accepts it | CRM |
| Won | The first invoice is paid | Billing |
If those events are shaky, go back to making the data reliable. A rate computed on bad attribution gives you a confident wrong answer.
Compute the rates by cohort and by segment
Follow accounts by signup month, so a deal signed in June is credited to the March signup that produced it. Leave recent cohorts out of the win rate until your usual sales cycle has passed, or they will look worse than they are.
SELECT
date_trunc('month', signup_at) AS cohort_month,
company_size_band,
count(*) AS signups,
count(activated_at) AS activated,
count(qualified_at) AS qualified,
count(won_at) AS won
FROM accounts
WHERE signup_at >= now() - interval '12 months'
GROUP BY 1, 2
ORDER BY 1, 2;
Averaged over twelve months, our example gives this:
| Stage | Monthly volume | Rate to next stage |
|---|---|---|
| Visits | 20,000 | 2% |
| Signups | 400 | 40% |
| Activated | 160 | 25% |
| Qualified | 40 | 20% |
| Won | 8 |
Find the bottleneck by testing what a lift is worth
A funnel multiplies, so a 20% lift at any stage gives you the same 20% more customers. The lowest rate therefore tells you very little. What you want is the stage where a lift is the most plausible and the cheapest to get, and the gap between your average and your best segment is the most honest estimate of what is plausible.
| Transition | Current | Best segment | Won per month if the whole stage matched it |
|---|---|---|---|
| Visit to signup | 2% | 2.6% (feature pages) | 10.4 |
| Signup to activated | 40% | 62% (accounts with a teammate invited) | 12.4 |
| Activated to qualified | 25% | 30% (paid search) | 9.6 |
| Qualified to won | 20% | 24% (inbound demos) | 9.6 |
Here the bottleneck is activation, and the work moves to the activation chapter. Two checks before you commit. A best segment can be a different population, so discount it if those accounts would have succeeded anyway. And look for capacity limits: if two salespeople can only work 40 qualified accounts a month, more leads upstream will queue up and go cold. The growth equation gives you the frame for pricing each lever.
Compare the content labels with what the content does
Most teams tag content TOFU, MOFU or BOFU when they plan it and never check again. Export every content URL and fill in this grid.
| Column | How to fill it |
|---|---|
| Declared stage | The label in the editorial plan |
| Observed stage | Your reading of the main queries and of the page itself |
| Sessions, signups, qualified leads | Analytics, joined to the CRM on first landing page |
| CTA target and its stage | Where the main button actually goes |
| CTA position and visibility | Share of readers who scroll down to it |
| CTA tracked | Yes or no |
Use a plain test for the observed stage. TOFU readers are discovering a problem. MOFU readers have the problem and are comparing approaches. BOFU readers are comparing vendors or ready to try one.
This grid tends to produce the same findings. Content labeled MOFU is often TOFU, because a how-to guide attracts people learning the job. CTAs send MOFU readers to another MOFU piece, or back to TOFU, when each click should bring the reader one stage closer. CTAs sit at the bottom of the page, where few people see them and nobody counts them.
BOFU belongs on landing pages. A blog post titled “best quoting tools” carries the wrong layout, the wrong proof and a generic CTA. And if your conversions happen on feature and pricing pages, every article should link to the feature that matches its topic. An article about payment terms in quotes links to the payment terms feature, with a sentence that makes the click obvious.
Fix the tracking at the same time. A link that leaves for the app on another domain can carry UTMs. Links inside a single GA4 property should send an event instead, because a UTM on an internal link starts a new session and overwrites the source.
<a href="https://app.example.com/signup?utm_source=blog&utm_medium=cta&utm_campaign=payment-terms&utm_content=inline-1"
data-cta-stage="mofu" data-cta-position="inline-1">Try it on a real quote</a>
Compare who reads with who buys
A handful of pages can carry a large share of the traffic and attract the wrong company size, usually because the topics are too operational. A template for freelancers will fill your signups with freelancers. Some TOFU posts bring plenty of signups and almost no qualified leads, so judge every page on qualified leads.
SELECT
first_landing_page,
count(*) AS signups,
count(*) FILTER (WHERE employees BETWEEN 50 AND 500) AS icp_signups,
count(qualified_at) AS qualified_leads
FROM accounts
WHERE signup_at >= now() - interval '12 months'
GROUP BY first_landing_page
ORDER BY signups DESC;
Sort by signups, then read the qualified column next to it. The pages at the top with an empty qualified column are the ones flattering your dashboard. The opposite choice is viable too: on the Deux.io project we went after a small number of searches with strong intent, even where a query was rarely typed, and those pages brought 35 to 50 leads per month.
What to deliver
Three things: the funnel table with its definitions, the bottleneck verdict with its calculation, and the content grid with corrected labels. Write every finding the same way, so it can be scored later.
| Field | Example |
|---|---|
| Observation | Half of the articles labeled MOFU answer beginner queries |
| Evidence | Grid, 40 URLs reviewed, main queries attached |
| Consequence | The nurture path looks full while few readers are actually evaluating |
| Action | Relabel, then write 5 comparison landing pages linked from these articles |
Your next step: pull the five stage counts for the last twelve months, split them by company size, and write the bottleneck in one sentence before you open any other report.