All posts
Engineering

Measuring What People Didn't Do

A non-action is not an event, it is a claim about the future. Negated funnel steps, the pending count they require, and why the numbers only ever rise.

Jay Patel11 min read
settledsettled earlypendingwindow

Every interesting question about a funnel is eventually a question about an absence. Who read the docs and never booked a demo. Who saw the pricing table and never started a trial. Who came back three times and never talked to sales. The people you most want to find are defined by something that did not happen.

Absence is much harder to measure than presence, and not for engineering reasons. A completed action is an event: it arrives, you record it, you are done. A non-action is not an event. It is a claim about the future, and the future is not finished yet. At the moment you ask, the honest answer for most people is neither yes nor no.

What a negated step is

A funnel step is normally a thing a visitor did: they visited a page, or they fired a goal. A negated step inverts it. It matches visitors who did not do that thing, in the interval between the step before it and the step after it.

That interval clause is the whole idea, and it is why the mechanism works at all. "Did not book a demo" is not a property of a person; it is a property of a person over a span of time. Bounded by the previous step on one side and the next on the other, it becomes a definite question with a definite answer. Unbounded, it is a question about somebody's entire remaining life.

Three step sequences that are only expressible with negation:

  • Visited /docs, did not fire demo_booked, then fired signup: the self-serve path, isolated from the sales-assisted one.
  • Visited /pricing, did not visit /pricing/enterprise, then fired trial_started: people who chose the small plan without ever looking at the big one.
  • Fired scroll_to_pricing, did not fire signup: the segment worth a retargeting budget, and the one every marketing team asks for by name.

Each of these is a real population that no combination of positive steps can express, because the thing that defines them is the thing they skipped.

Why the first step cannot be negated

The first step of a funnel cannot be a negation, and the reason is not a limitation to be worked around. It is that the expression would have no meaning.

A negation is evaluated over the interval between the previous step and the next. The first step has no previous step. So "did not do X" as a first step has no left boundary: the window it is asking about extends backwards forever, over every visitor who has ever existed, including the ones who have never visited your site at all. There is no cohort. There is no denominator. There is nothing to count.

This connects directly to the cohort rule: the first step is what recruits visitors into the funnel. It must be something that happened, because the set of people who did something is finite and observable, and the set of people who did not do something is neither.

The workaround, when you want one

Put a positive step first that defines the population (a page visit that everyone in the segment shares) and negate the second step. "Visited /pricing, did not sign up" is the funnel you actually wanted; "did not sign up" on its own was never a question with an answer.

The settlement problem

Here is where it gets genuinely interesting, and where every product that offers this feature has to make a choice it can then never take back.

A visitor reaches step one on Tuesday. Step two is negated: they must not fire demo_booked. Your window is seven days.

On Wednesday, have they satisfied step two?

The truthful answer is that nobody knows. They have not booked a demo yet. They have six days left in which they might. Any answer given on Wednesday is a prediction, and a report that quietly presents a prediction as a measurement is the worst option on the table.

So a negated step resolves at one of two moments, whichever comes first:

  • The full window has elapsed since the visitor's previous step. They had their time; they did not do it; the negation is satisfied.
  • They hit the next positive step. They got to step three without doing the negated thing along the way, so the negation is settled early and in their favour.

Until one of those happens, the visitor is neither converted nor dropped. They are pending, and the funnel reports that count alongside the visitor count rather than folding it into either.

Three visitors, one negated step

Only the third one is unresolved, and the report says so rather than guessing. The pending count is the number of people in that third state.

01

Booked the demo on day 2

Settled immediately, as a failure of the negated step. No waiting required: the thing happened.

02

Reached step three on day 3 without booking

Settled early, in their favour. The next positive step closed the interval, so the negation resolved without waiting out the window.

03

Still nothing on day 4, window is 7 days

PENDING. Not a conversion, not a drop. Three days of window remain and any classification now would be a guess.

Late and rising, not early and falling

There are two defensible designs here and we picked one on purpose.

Early and falling. Count a pending visitor as having satisfied the negation, then take it back if they later do the thing. Numbers appear immediately and revise downward.

Late and rising. Count a pending visitor as neither, and add them once their window closes. Numbers appear late and revise upward.

We chose late and rising, for a reason that is about trust rather than statistics.

A conversion rate that drops retroactively is indistinguishable, from the outside, from a bug. You saw 340 conversions on Monday. On Thursday the same query over the same range says 290. There is no way for you to tell whether the product corrected itself or broke, and the natural conclusion (the one every user reaches) is that the numbers cannot be relied on. Once someone believes that, they are right to believe it about every other number on the page too, and the whole report is dead.

A count that only rises is never in that position. A number you saw yesterday is still a floor today. It might have been incomplete; it was never wrong.

A number that can fall retroactively teaches people to distrust the ones that cannot.

The design rule behind every pending count in the product

The cost is real and worth naming: you cannot read a negated funnel as a finished measurement until the pending count is small. That is a genuine loss of immediacy. It is a smaller loss than credibility.

The failure that looks like zero

There is one configuration that produces a number so wrong-looking that it is worth calling out explicitly, because it has a completely mundane explanation and no obvious symptom.

If your conversion window is as long as your date range, the entire range sits inside the settlement lag. Nobody's window has closed. Every visitor at the negated step is pending. The final step reads at or near zero, and nothing on the chart tells you why, because zero is a perfectly plausible number for a final step.

Thirty-day window, thirty-day range: the last step is empty and the funnel looks broken.

Two fixes, and either works: widen the range so most visitors' windows closed inside it, or shorten the window so it closes faster. The general shape of the rule is that your range should be comfortably longer than your window (a factor of three or four is a reasonable habit), and this is true of ordinary funnels too. Negation just makes the consequence impossible to ignore rather than merely quietly deflating your final step.

Reading a pending count

Pending is information, not an error state. What it tells you depends on how big it is relative to the step.

What you seeWhat it meansWhat to do
Pending is a small fraction of the stepThe window is closing for most visitors inside your range. The numbers are close to final.Read the funnel normally. Expect small upward revisions.
Pending is most of the stepYour range is too short relative to your window. You are looking at the lag, not the result.Widen the range or shorten the window. Do not interpret the final step.
Pending is large and the range is wideVisitors are entering late in the range. Often a real spike near the end.Check when step one fired. A traffic event at the end of the range explains it.
Pending is zero on a recent rangeEvery visitor settled early by reaching the next positive step.Nothing to fix. The negation was never contested.

Where this pays off with AI traffic

The negated step earns its complexity on exactly the question this product exists for.

AI-referred visitors arrive having already had a comparison conversation. A reasonable hypothesis is that they need less of your middle-funnel content, because an assistant already gave them a version of it. That hypothesis is a negation and cannot be tested any other way: landed on a cited page, did not visit the comparison page, still converted.

Run that funnel and read the per-step source mix. If the AI segment is heavily represented at the end of it, you have direct evidence that assistants are doing part of your consideration work, and that is an argument for investing in what gets cited rather than in another comparison page nobody in that segment reads.

If the AI segment is thin at the end, the opposite: those visitors do want the comparison page, they are just arriving at it from a different direction, and where they drop off tells you which direction.

Never first

A negated step needs a previous step to bound its interval. Put a positive step first to define the population

no left boundary, no meaning

Two ways to settle

The window fully elapses since the previous step, or the visitor reaches the next positive step. Whichever comes first

early settlement is common

Rises only

A step's visitor count revises upward as pending visitors age out, and never downward

a floor, not an estimate

The general principle

Absence is not observable. Only a deadline makes it observable, and a deadline is a decision you have to make and then declare.

That is worth carrying beyond funnels, because the same shape appears everywhere in this kind of measurement. "This page is not cited by any assistant" is not a fact; it is a fact about a prompt set, a set of engines and a date. "This visitor did not come from AI" is not an observation; it is the residue of a detection method with a confidence attached. Every negative claim in analytics is really a claim about a bounded interval, and the ones that do not name their interval are the ones that turn out to be wrong.

A funnel that reports a pending count is doing nothing more than saying that part out loud.

Frequently asked

A step that matches visitors who did NOT do something, measured over the interval between the previous step and the next one. It is the only way to build a funnel segment out of an absence, such as visitors who reached your pricing page and never started a trial. The interval bound is essential: without a previous step and a next step, 'did not do X' has no timeframe and therefore no answer.

Sources & further reading

  1. 01Survival analysis and right-censored data, Wikipedia
  2. 02Cohort analysis, Wikipedia
  3. 03Payment Intents API, Stripe Docs
Share