How Do I Know If Marketing Is Working? Read the Stages, Not the Top of the Funnel
By Saroj Jha · August 4, 2026 · 10 min read
Marketing is working when revenue and CAC improve, not traffic or cost per lead. How to find the leaking funnel stage and diagnose why.
- 1Sessions
- 2Leads
- 3MQL
- 4SQL
- 5Customers
read the conversion between stages, not the volume at the top
Where the leak hides
Cost per lead fell 23% while cost per customer rose 63%.
Marketing is working when new revenue and cost per customer (CAC) improve. More traffic, more leads or a cheaper cost per lead don’t prove it. I’d read six numbers together: new revenue and wins, CAC, conversion at each funnel stage with its own trend, end-to-end conversion, revenue-to-spend, and target attainment. If the top of the funnel gets better while revenue gets worse, a stage between lead and customer is leaking. Your next job is to find that stage and work out why it leaks. Is sales short of capacity, or is it being fed worse leads? At Seed, stage rates are too noisy to read, so count and review individual deals instead.
In three numbers
- 15 large US ad experiments at Facebook used to test the usual ways of measuring ad impact, in a 2019 Marketing Science study[1]
- 1.6 billion ad impressions in those experiments, with about 500 million user-experiment observations[1]
- 3× how far off the observational estimates of sales lift were in half of the studies, against the randomized result[1]
The usual answer to this question is a list of signals: traffic up, conversion rate up, cost per lead down, CAC flat, campaigns you can trace to pipeline. Each one is reasonable to look at. None of them tells you on its own whether the business is better off. Below is a quarter where most of those signals looked great and the business got materially worse.
Running case: Example Co. Fictional
A note on the numbers. The company is invented, and so are its inputs. Call it Example Co., a Series A B2B SaaS business. The arithmetic is not invented. Every figure in the engine output blocks comes from AAJ’s open-source marketing-report engine[2], run on the inputs shown at the end of this piece, so you can reproduce it. I computed the prior-quarter stage rates and the confidence intervals by hand from the same inputs. The “AAJ Marketing Report” header is the engine’s own label. These are not AAJ’s numbers.
What does a quarter that looks like a win actually look like?
Here are two consecutive quarters at Example Co.
What the dashboard showed Top of the funnel Fictional
Sessions Better, +56%
Prior 90,000 Q2 140,000Leads Better, +62%
Prior 2,600 Q2 4,200MQLs Better, +67%
Prior 900 Q2 1,500Cost per lead Better, −23%
Prior $46.15 Q2 $35.71What the business got Bottom of the funnel Fictional
New revenue Worse, −23.5%
Prior $510,000 Q2 $390,000Wins Worse, −23.5%
Prior Q2CAC Worse, +63.5%
Prior $3,529 Q2 $5,769Target attainment Worse, −20 points
Prior 85% Q2 65%Prior quarter Q2 2026
Show the numbers as a table| Metric (fictional) | Prior quarter | Q2 2026 | Change |
|---|---|---|---|
| Sessions | 90,000 | 140,000 | Up 56% |
| Leads | 2,600 | 4,200 | Up 62% |
| MQLs | 900 | 1,500 | Up 67% |
| Cost per lead | $46.15 | $35.71 | −23% |
| Spend | $120,000 | $150,000 | Up 25% |
| New revenue | $510,000 | $390,000 | −23.5% |
| Wins | −23.5% | ||
| CAC (spend ÷ wins) | $3,529 | $5,769 | Up 63.5% |
| Target attainment | 85% | 65% | −20 points |
Example Co. and its inputs are fictional; the figures are the marketing-report engine’s output on those inputs, run October 14, 2026. Prior-quarter attainment ($510,000 of a $600,000 target) is computed by hand. Each pair of bars is drawn to scale from zero.
There was more traffic, more leads and more qualified leads, and each one cost less than the quarter before. On the standard signal list, that’s four out of four.
Here’s the same quarter through the engine:
Engine output, first lines
AAJ Marketing Report — Q2 2026
--------------------------------------------------------
Spend $150,000 (+25% vs prior)
New revenue $390,000 (-23.5%)
Wins 26 (-23.5%)
CAC $5,769 (+63.5%)
Cost per lead $36
New revenue : spend 2.6×
Pipeline : spend 10×
Target attainment 65% Revenue fell 23.5%. CAC rose 63.5%, from $3,529 to $5,769. Attainment was 65% of a $600,000 target, down from 85%. CAC here is marketing spend divided by new customers won; David Skok’s standard version divides all sales and marketing costs by new customers[3], so full CAC would be higher still.
In the same quarter, cost per lead fell 23% and cost per customer rose 63.5%. Both numbers are correct. Only one of them is about the business.
Which stage did the quarter leak from?
The engine prints the current stage rates. I’ve added the prior quarter’s rates, computed from the same inputs:
- End to end, sessions to wins
- 0.038% → 0.019%
- Down 50.8%, without saying where
| Stage (fictional) | Prior quarter | Q2 2026 |
|---|---|---|
| Sessions → Leads | 2.9% (90,000 → 2,600) | 3.0% (140,000 → 4,200) |
| Leads → MQLs | 34.6% (2,600 → 900) | 35.7% (4,200 → 1,500) |
| MQLs → SQLs | 35.6% (900 → 320) | 20.0% (1,500 → 300) |
| SQLs → Opportunities | 43.8% (320 → 140) | 36.7% (300 → 110) |
| Opportunities → Wins | 24.3% (140 → 34) | 23.6% (110 → 26) |
| Overall, sessions → wins | 0.038% (90,000 → 34) | 0.019% (140,000 → 26) |
Example Co.’s fictional funnel. Q2 rates as printed by the marketing-report engine; prior-quarter rates computed by hand from the same inputs. Lines drawn to scale on a 0–50% axis, gridlines every 10 points.
The big break is MQL to SQL. Marketing delivered 67% more MQLs, and the share that became SQLs fell by 44%, from 35.6% to 20.0%. In absolute terms, 1,500 MQLs produced 300 SQLs, against 320 SQLs from 900 MQLs the quarter before. There’s a second, smaller drop at SQL to Opportunity. Opportunity to Win barely moved.
With these volumes the MQL-to-SQL drop is real, not noise. A 95% confidence interval (Wilson method) on 300 of 1,500 runs from about 18% to 22%, and on 320 of 900 from about 32% to 39%. The two ranges don’t overlap.
- Rate, with its 95% range
- MQL → SQL, prior quarter 320 of 900 (Example Co.) — 35.6% 32% to 39%
- MQL → SQL, Q2 2026 300 of 1,500 (Example Co.) — 20.0% 18% to 22%
- Opportunity → win, Q2 2026 26 of 110 (Example Co.) — 23.6% 17% to 32%
- A Seed quarter: SQL → win 3 of 12 (Seed example) — 25.0% 9% to 53%
- 0% 10% 20% 30% 40% 50% 60%
Measured rate 95% range (Wilson score interval)
Show the numbers as a table| Rate (fictional) | Count | Rate | 95% range |
|---|---|---|---|
| MQL → SQL, prior quarter | 320 of 900 | 35.6% | 32.5% to 38.7% |
| MQL → SQL, Q2 2026 | 300 of 1,500 | 20.0% | 18.1% to 22.1% |
| Opportunity → win, Q2 2026 | 26 of 110 | 23.6% | 16.7% to 32.4% |
| A Seed quarter: SQL → win | 3 of 12 | 25.0% | 8.9% to 53.2% |
Example Co.’s counts are fictional; the Seed row is the article’s illustration. Ranges computed with the Wilson score method; drawn to scale on a 0–60% axis.
Every metric above the break looked excellent. The standard signal list can’t catch a problem like this, because everything on it sits upstream of the leak.
Was it a sales-capacity ceiling or worse leads?
The one line that matters here is that SQLs went from 320 to 300 while MQLs rose 67%. Two different stories produce that pattern.
- A capacity ceiling. The people who qualify MQLs, whether SDRs or AEs, could only work about 300 a quarter. The extra MQLs weren’t worked, or were worked too late. The leads may have been fine and simply went untouched.
- Lower lead quality. The extra MQLs came from cheaper sources or looser targeting, the same moves that pushed cost per lead down. Sales worked them and disqualified most of them.
The dashboard looks identical in both cases, but the responses are opposite. A capacity problem calls for adding or re-routing sales capacity, or matching lead volume to what sales can actually work. A quality problem calls for tighter targeting and a stricter MQL definition, even if cost per lead goes back up. The data that tells them apart usually already sits in your CRM:
What to check in your CRM
A A capacity ceiling The leads may have been fine and went untouched B Lower lead quality Sales worked the extra MQLs and disqualified most of themFollow-up within your SLA, and time to first touch
Share fell, time to first touch rose
Both held steady
MQLs still open or untouched at quarter end
A backlog built up
Few; MQLs were worked and closed out
MQL → SQL rate on MQLs that were worked
Close to the old ~36%
Low even among worked MQLs
MQL → SQL by source or campaign
Similar drop across every source
Old sources hold; new or cheaper sources convert poorly
Disqualification reasons
“No response”, “not contacted”, aged out
“Not ICP”, “no budget”, “no authority”
SQLs per rep over several quarters
Pinned near the same ceiling regardless of MQL volume
Moves with lead mix
Response Add or re-route sales capacity, or match lead volume to what sales can work Response Tighten targeting and the MQL definition, even if cost per lead goes back upExample Co.’s clue: SQL to opportunity fell from 43.8% to 36.7% while that stage’s workload shrank from 320 SQLs to 300. Capacity can’t easily explain that, so that stage leans toward quality.
Show the numbers as a table| Check | Points to a capacity ceiling | Points to lead quality |
|---|---|---|
| Follow-up within your SLA, and time to first touch | Share fell, time to first touch rose | Both held steady |
| MQLs still open or untouched at quarter end | A backlog built up | Few; MQLs were worked and closed out |
| MQL → SQL rate on MQLs that were worked | Close to the old ~36% | Low even among worked MQLs |
| MQL → SQL by source or campaign | Similar drop across every source | Old sources hold; new or cheaper sources convert poorly |
| Disqualification reasons | “No response”, “not contacted”, aged out | “Not ICP”, “no budget”, “no authority” |
| SQLs per rep over several quarters | Pinned near the same ceiling regardless of MQL volume | Moves with lead mix |
The checks are my working method. Example Co.’s numbers are fictional.
Real quarters are often a mix of both. The split still decides where the money goes.
Do this
Before anyone asks for more budget, pull last quarter’s MQLs from your CRM and run the six checks above, split by source. Write down which story the evidence supports before you choose a response.
Free tool
Check the handoff before you blame the leads
The free Lead Handoff & SLA Checker reads your lead export and shows response time against your SLA, MQLs nobody touched and the share sales accepted: the capacity half of the checks above.
Open the checkerExample Co.’s numbers already hold one clue. SQL to Opportunity fell from 43.8% to 36.7%, even though AEs had fewer SQLs to work (300 against 320). Capacity can’t easily explain a stage that got worse while its workload shrank, so that stage leans toward quality. That doesn’t settle the MQL-to-SQL question, because a different team often handles that stage. It is where I’d look first.
This also changes the verdict on marketing. If it was capacity, marketing generated demand faster than sales could absorb it. That’s a planning failure the two teams share, not a marketing win. David Skok’s SaaS Metrics 2.0 [4] walks through the fix: work backward from the revenue target through each funnel conversion rate to the number of salespeople you need. If it was quality, part of the cheaper cost per lead was the problem, because the leads were cheaper for a reason. Either way, “marketing did its job and sales dropped the ball” is not a conclusion this dashboard supports.
What would fixing that one stage be worth?
Take the same quarter. Change nothing about spend, traffic, leads or MQLs, and restore only the MQL-to-SQL rate to the prior quarter’s 35.6%. Hold every later stage at Q2’s own rates, and that gives about 533 SQLs, about 196 opportunities and about 46 wins, or $690,000 at the same $15,000 average deal. Here’s the engine output. In this run the “prior” period is actual Q2, so every change in brackets compares the counterfactual with what really happened that quarter:
Engine output, first lines
AAJ Marketing Report — Q2 2026 counterfactual (MQL→SQL restored)
--------------------------------------------------------
Spend $150,000 (+0% vs prior)
New revenue $690,000 (+76.9%)
Wins 46 (+76.9%)
CAC $3,261 (-43.5%)
Cost per lead $36
New revenue : spend 4.6×
Pipeline : spend 10×
Target attainment 115% With the same $150,000 and the same 4,200 leads, that’s 76.9% more revenue than Q2 actually delivered, CAC 43.5% lower, and attainment of 115% instead of 65%. Compared with the prior quarter, revenue would be up 35% and CAC down about 8%.
Actual Q2
1,500 MQLs × 20.0% 300 SQLs × 36.7% 110 Opps × 23.6% Wins $390,000CAC $5,769 Attainment 65%
MQL → SQL restored
1,500 MQLs × 35.6% 533 SQLs × 36.7% 196 Opps × 23.6% Wins $690,000CAC $3,261 Attainment 115%
The dashed line is the $600,000 target. Same spend, traffic, leads and MQLs. Only the MQL-to-SQL rate changes; every later stage keeps Q2’s own rate, and each win is worth $15,000.
Show the numbers as a table| Figure (fictional) | Actual Q2 | MQL → SQL restored |
|---|---|---|
| MQLs | 1,500 | 1,500 |
| MQL → SQL rate | 20.0% | 35.6% |
| SQLs | 300 | 533 |
| Opportunities | 110 | 195.6 |
| Wins | ||
| New revenue | $390,000 | $690,000 |
| CAC | $5,769 | $3,261 |
| Target attainment | 65% | 115% |
Example Co.’s fictional inputs; the engine’s output for both runs, October 14, 2026. Revenue bars drawn to scale from zero.
Treat this as the size of the leak, not a free win. Getting it back means sales working roughly 533 SQLs instead of 300. If capacity is the constraint, $690,000 is the prize for adding capacity, and it has to beat the cost of the hires. If quality is the constraint, it’s the prize for fixing targeting, which will probably cost you some of that cheap cost per lead. Asking for more budget to buy more top-of-funnel volume makes the problem worse in both cases.
Why is “is marketing working?” the wrong question?
It assumes a yes or no answer. The better question is which stage loses the most, and what fixing it would be worth. You can answer that one this week.
This is also why signal lists mislead. Each item is true and points in a sensible direction. Put them on a dashboard together and they can all be green while revenue and CAC go the other way. The failure isn’t measuring the wrong things. It’s measuring things upstream of where the problem is. The same pattern shows up in AI visibility work, where a completed checklist sits alongside a failing score: Why doesn’t ChatGPT recommend my company?
What should I track instead?
I’d track six numbers and read them together:
- New revenue and wins, with the change against the prior period. This is the outcome itself, not a proxy for it.
- CAC, not cost per lead. Cost per lead can fall while cost per customer rises, and here it did.
- Conversion at each stage, each with its own trend. The blended rate fell 50.8% without saying where.
- End-to-end conversion, as a single check that the stages add up.
- Efficiency ratios: new revenue to spend and pipeline to spend. Read them as efficiency signals, not returns, because revenue lags the spend that created it.
- Target attainment. It’s the only number on the list that says whether any of this was enough.
Example Co., Q2 2026 Fictional
1 New revenue and wins
$390,000
26 wins; both down 23.5%
Worse2 CAC
$5,769
Up 63.5% from $3,529
Worse3 Conversion at each stage
20.0%
MQL to SQL, down from 35.6%; other stages near flat
Worse4 End-to-end conversion
0.019%
Sessions to wins, down 50.8%
Worse5 Efficiency ratios
2.6×
New revenue to spend, from 4.25×; pipeline to spend 10×, from 10.8×
Worse6 Target attainment
65%
Of a $600,000 target, from 85%
Worse
Left off on purpose: diagnostics for the people running each channel
- Impressions
- Clicks
- Open rates
- Followers
- Share of voice
- Sessions
| Number (fictional) | Q2 2026 | Prior quarter |
|---|---|---|
| New revenue | $390,000 | $510,000 |
| Wins | ||
| CAC | $5,769 | $3,529 |
| MQL → SQL rate | 20.0% | 35.6% |
| End-to-end conversion | 0.019% | 0.038% |
| New revenue : spend | 2.6× | 4.25× |
| Pipeline : spend | 10× | 10.8× |
| Target attainment | 65% | 85% |
Example Co.’s fictional numbers from the engine run; prior-quarter ratios computed by hand ($510,000 ÷ $120,000 and $1,300,000 ÷ $120,000).
Impressions, clicks, open rates, followers, share of voice and sessions are absent on purpose. They’re diagnostics for the people running each channel. They aren’t evidence that marketing is working, and putting them in front of a board invites exactly the misread above.
What changes at Seed, Series A and Series B?
Seed: count deals, don’t compute rates
At Seed volumes, stage conversion rates are noise. Say you had 12 SQLs and 3 wins this quarter. A 95% confidence interval on that 25% runs from about 9% to 53%, and one extra win moves the rate to 33%. A “trend” built on numbers like these tells you nothing. I’d look at these instead:
- Every deal by name: where it came from, what stage it’s in, and why it stalled or died
- How many first conversations you had with people who match your ICP, week by week
- How fast you respond to inbound interest
- The reasons buyers give for saying no, in their own words
- New revenue and cash spent to get it, as absolute numbers rather than ratios
Series A: this post’s scenario
Top- and mid-funnel volumes are large enough to read stage rates. Example Co.’s MQL-to-SQL drop is clearly real. Late stages are still wobbly: 26 wins from 110 opportunities has an interval of roughly 17% to 32%. This is usually when a dedicated SDR function appears, and with it the handoff this post is about.
Do this
Agree a follow-up SLA between marketing and sales, and report MQL-to-SQL by source from day one.
Series B: cut by segment and prove cause
Blended stage rates hide mix shifts, so report them by source, segment and lead-created cohort. Spend is usually large enough by now to run holdout tests on your biggest channels, which answers the question below.
Should I report marketing-sourced and influenced revenue?
Most answers to this question recommend reporting marketing-sourced and marketing-influenced revenue. Both are attribution figures, and attribution is a bookkeeping convention, not a measurement of cause.
Influenced revenue is close to unfalsifiable. It counts any deal that a marketing touch appeared in, so it rises whenever marketing does more of anything. The evidence says to be careful here. In a comparison of 15 large Facebook ad experiments, Gordon and colleagues[1] found that standard observational methods often failed to reproduce the effects measured by randomized experiments, even with rich data on users. In half of the studies, the observational estimate of the sales lift was off by a factor of three.
If the question is whether marketing caused revenue, the instrument is a controlled experiment. Kohavi and colleagues’ practical guide to controlled experiments[5] explains why randomization establishes cause where observational patterns can’t. For paid media, that means a holdout test. Google’s Conversion Lift[6], for example, compares people who saw your ads with a control group who didn’t, split either by user or by geography. Google offers it only to some accounts, through a Google account representative. Attribution tells you where to look. Experiments tell you whether it mattered. I walk through how to run one at startup scale in Incrementality Testing for Startups.
How do I run this on my own numbers?
It takes two commands and needs no configuration or account:
Terminal
npx skills add sarojkjha/aaj-marketing-skills --skill marketing-report
node .agents/skills/marketing-report/resources/marketing-report.js Then supply your own period. Every field is optional, and the engine computes each metric only where the inputs allow. This is Example Co.’s Q2 config, which reproduces the first engine output above:
Terminal
node .agents/skills/marketing-report/resources/marketing-report.js '{
"period":"Q2 2026","spend":150000,
"sessions":140000,"leads":4200,"mqls":1500,"sqls":300,"opps":110,"wins":26,
"newRevenue":390000,"pipelineCreated":1500000,"target":600000,
"prior":{"spend":120000,"sessions":90000,"leads":2600,"mqls":900,
"sqls":320,"opps":140,"wins":34,"newRevenue":510000,
"pipelineCreated":1300000,"target":600000}}' To reproduce the counterfactual, set "period":"Q2 2026 counterfactual (MQL→SQL restored)" and "sqls":533,"opps":195.6,"wins":46,"newRevenue":690000, keep the other Q2 fields, and pass actual Q2’s figures as the prior block.
Supplying the prior period is what makes the report useful. Without it you get a snapshot. With it you get the deltas, and the deltas are where a leak shows up. The output ends with the same figures as a JSON block, for machine-readable use. The engine is part of AAJ’s open skills catalog and is MIT-licensed.
If you want me to look at your own funnel, positioning and channels, my Growth Audit ends with three prioritized fixes and a 30-day action plan.
Related on AAJ
Articles
- Our Pipeline Is Full and Nothing Is Closing. What's Actually Wrong?The next read when the leak sits further down, in deals that are open but not moving.12 min read
- How to Align Sales and Marketing at a StartupAgree the MQL definition and follow-up SLA that the MQL-to-SQL stage depends on.9 min read
- Incrementality Testing for Startups: Prove Your Ads Actually Work (2026 Guide)Run the holdout test that answers whether marketing caused the revenue.13 min read
- Marketing Analytics for Startups: Measure What Changes a DecisionWhat analytics to set up at Seed, before stage rates are readable.8 min read
Playbooks
- Lead Management PlaybookScore, route and hand off leads so the extra MQLs get worked.
- B2B Analytics and Attribution PlaybookSet up the funnel stages and reporting this article reads.
- Pipeline Coverage and Forecasting PlaybookPlan pipeline and sales capacity backwards from the revenue target.
Templates and tools
- Marketing KPI ReportEnter two periods and get stage rates, CAC, efficiency and attainment with their changes.Free tool
- Lead Handoff & SLA CheckerCheck response time, untouched MQLs and sales acceptance from your lead export.Free tool
- Marketing KPI Board ReportPut the six numbers on one page for the board.Free template
- Marketing Report skillRun the same engine on your own numbers, as in the last section.AAJ skill
References
The superscript numbers in the article match this list.
Papers and web pages were checked, and the engine was run on the article’s inputs, on October 14, 2026.
- Gordon, B. R., Zettelmeyer, F., Bhargava, N. and Chapsky, D. (2019). “A Comparison of Approaches to Advertising Measurement: Evidence from Big Field Experiments at Facebook.” Marketing Science 38(2): 193–225. 15 US advertising experiments, about 500 million user-experiment observations and 1.6 billion ad impressions. Linked: the authors’ version of April 2018. kellogg.northwestern.edu
- AAJ Marketing Skills (2026). marketing-report engine source (marketing-report.js), MIT license. Run on the article’s inputs on October 14, 2026. github.com
- Skok, D. (2014). “SaaS Metrics 2.0: Detailed Definitions.” For Entrepreneurs, July 4, 2014, updated December 2020. forentrepreneurs.com
- Skok, D. (2013). “SaaS Metrics 2.0: A Guide to Measuring and Improving What Matters.” For Entrepreneurs, January 16, 2013, since updated. forentrepreneurs.com
- Kohavi, R., Henne, R. M. and Sommerfield, D. (2007). “Practical Guide to Controlled Experiments on the Web: Listen to Your Customers not to the HiPPO.” Proceedings of the 13th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining (KDD 2007), San Jose, August 2007, pp. 959–967. exp-platform.com
- Google. “About Conversion Lift.” Google Ads Help, checked October 14, 2026. support.google.com
More in Analytics, Experiments & Budget
Part of the Analytics, Experiments & Budget hub - see all 35 resources on this topic.
- Free tool: Holdout Test Planner
- AI agent skill: Incrementality & MMM
- Article: Is Your Marketing Budget Working? How to Measure and Improve ROI
- Article: Marketing Analytics for Startups: Measure What Changes a Decision