Concepts · Core concepts
Measured and unmeasured
Why null is never 0, and how that rule shapes every screen.
The rule behind every number on every screen, and worth reading before any table here.
A measurement not taken is not a clean measurement#
When a check could not run, the result is null, meaning unmeasured. The cause might be a blocked API, a refused context, a database that did not answer, or an older SDK that did not know how to measure it.
That value is never false, and it is never 0.
proxy: true // looked up, it is a proxy proxy: false // looked up, it is not proxy: null // could not look it up, unknown
What happens when the two are merged#
Folding unmeasured into measured and clean is the quietest way for a detection system to lie.
Picture a site that has never reported a payment outcome. If its decline count showed 0, you would read "cards at this site are never declined". That is a strong claim and a false one; the truth is that we do not know. Only one of the two is worth deciding on.
A cell saying "Not measured", "Not reported", or standing empty instead of showing a number is the correct answer rather than a rendering bug.
Where it shows up#
In the signal catalogue, a signal is only recorded when it fires. A visit without it may have run the check and passed, or never run it at all. So the screen shows a detected count without an "out of N", because there is no honest denominator.
For IP reputation, proxy, vpn and tor each have three states. For Payments, declines are null until your backend reports its first outcome. For behaviour, "the SDK never collected" and "it collected and nothing had happened yet" are different states, and the second is what every honest visit looks like.
The one exception that can prove a negative#
One check can say "measured, and clean": navigator.webdriver. Every SDK version reads it, so a visit that read it and fired no automation reason was measured and not detected.
Every other check records only when it fires.