How Do I Know If Marketing Is Working? Read the Stages, Not the Top of the Funnel

  1. Blog
  2. Discoverability & Content

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.

  1. 1Sessions
  2. 2Leads
  3. 3MQL
  4. 4SQL
  5. 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 health is diagnosed between stages, not at the top: sessions to leads, leads to MQL, MQL to SQL, SQL to customers. Top-of-funnel metrics can improve while the stage that actually converts gets worse.Source: Worked example run through the AAJ marketing-report engine

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.

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.

A note on the numbers. The company is invented, and so are its inputs. Call it Northwind, 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, 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 Northwind.

Metric Prior quarter This quarter (Q2 2026) Change
Sessions 90,000 140,000 +56%
Leads 2,600 4,200 +62%
MQLs 900 1,500 +67%
Cost per lead $46.15 $35.71 −23%

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:

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.

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:

Stage Prior quarter Q2 2026
Sessions → Leads 2.9% 3.0%
Leads → MQLs 34.6% 35.7%
MQLs → SQLs 35.6% 20.0%
SQLs → Opportunities 43.8% 36.7%
Opportunities → Wins 24.3% 23.6%
Overall (sessions → wins) 0.038% 0.019% (−50.8%)

The big break is MQL to SQL. Marketing delivered 67% more MQLs and 44% fewer of each hundred became SQLs. 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 on 300 of 1,500 runs from about 18% to 22%, and on 320 of 900 from about 33% to 39%. The two ranges don't overlap.

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.

  1. 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.
  2. 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:

Check Points to a capacity ceiling Points to lead quality
Share of MQLs touched within your follow-up SLA, and median 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

Real quarters are often a mix of both. The split still decides where the money goes.

Northwind'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 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%. That gives about 533 SQLs, about 196 opportunities and about 46 wins 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:

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%)
New revenue : spend     4.6×
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%.

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:

  1. New revenue and wins, with the change against the prior period. This is the outcome itself, not a proxy for it.
  2. CAC, not cost per lead. Cost per lead can fall while cost per customer rises, and here it did.
  3. Conversion at each stage, each with its own trend. The blended rate fell 50.8% without saying where.
  4. End-to-end conversion, as a single check that the stages add up.
  5. 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.
  6. Target attainment. It's the only number on the list that says whether any of this was enough.

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. Northwind'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. 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 (Marketing Science, 2019) found that standard observational methods often failed to reproduce the effects measured by randomized experiments, even with rich data on users.

If the question is whether marketing caused revenue, the instrument is a controlled experiment. Kohavi and colleagues' practical guide to controlled experiments explains why randomization establishes cause where observational patterns can't. For paid media, that means a holdout test. Google's Conversion Lift, for example, compares people who saw your ads with a control group who didn't, split either by user or by geography. 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:

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 Northwind's Q2 config, which reproduces the first engine output above:

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. Add --json for machine-readable output. The engine is part of AAJ's open skills catalog and is MIT-licensed.

If a stage leak turns out to be a pipeline problem further down, where deals are open but not moving, the next read is Our pipeline is full and nothing is closing.

If you're asking what analytics you should set up at Seed instead, read From Intuition to Intelligence: Why Marketing Analytics is the Essential Lever for Growth.

If you'd like a second pair of eyes on where your own funnel leaks, AAJ's Growth Audit is a seven-day funnel and conversion teardown that ends in your top three fixes.

Sources

  1. Brett R. Gordon, Florian Zettelmeyer, Neha Bhargava and Dan Chapsky, "A Comparison of Approaches to Advertising Measurement: Evidence from Big Field Experiments at Facebook," Marketing Science 38(2), 2019.
  2. Ron Kohavi, Randal M. Henne and Dan Sommerfield, "Practical Guide to Controlled Experiments on the Web: Listen to Your Customers not to the HiPPO," KDD 2007.
  3. Google Ads Help, "About Conversion Lift."
  4. David Skok, "SaaS Metrics 2.0: A Guide to Measuring and Improving What Matters," For Entrepreneurs.
  5. AAJ Marketing Skills, "marketing-report engine source (marketing-report.js)," MIT license.

More in Analytics, Experiments & Budget

Part of the Analytics, Experiments & Budget hub - see all 26 resources on this topic.