Methodology
How Needlr reaches a verdict
A verdict should hold up when someone asks "how do you know?". This page says exactly what Needlr does. The plain-language part comes first. The technical appendix below it is taken from the code that runs your checks.
In plain words
How a check decides
A split test shows the current version (A) to some visitors and the new one (B) to the others. Who gets which is random, and each visitor keeps their version. Both groups live through the same days, campaigns and news. So when their results differ by more than chance can explain, the change caused it.
Needlr counts a visitor once they actually saw their version. It counts a conversion only if it happened after that. Then it compares the share of visitors who converted in A and in B, and works out a range for the real difference.
The verdict reads that range. If the whole range is above zero, B improved the KPI. If it's all below zero, B made it worse. If the range includes zero, the answer is no clear effect: any real effect is smaller than this check could see.
Why the verdict waits for the planned sample
Before a check starts, Needlr works out how many visitors each version needs. That depends on how often your KPI happens and on the smallest improvement you care about. With that many visitors, a real improvement of that size is found 8 times out of 10.
Results swing a lot early on. If you check every day and stop the first time B looks good, you will "find" winners that aren't there. Lots of them. So Needlr doesn't call anything until the planned sample is in. Until then the page says too early and shows which way the numbers lean. A lean is not a result.
Why it also waits for a full week
A split test never gets a verdict before 7 full days, even on a busy site that reaches its sample in two days. Monday visitors are not Saturday visitors. A verdict from three weekdays would describe those weekdays, not your site. The check page says when the verdict can come at the earliest.
Why a verdict never changes
The verdict is decided once, at the planned sample and after a full week. Then it is frozen. A split test may keep running after its verdict, because stopping it is a change on your site. Later visitors are not used to recompute it.
This matters more than it sounds. If the verdict were recomputed every few minutes on new data, it would sooner or later show "improved" or "worse" for many changes that do nothing. In our simulation that happens to about 16% of do-nothing changes at 95% confidence, not 5%. Frozen, it stays at 5%. See the reliability report.
What the confidence levels mean
You pick how sure a verdict must be when you set up a check. 95% is the default. A lower level gives an answer from less data, but it is wrong more often. In plain numbers, for changes that truly do nothing:
| Confidence | Wrongly called improved or worse | Data needed |
|---|---|---|
| 95% | 1 in 20 | the full plan |
| 90% | 1 in 10 | about 79% of it |
| 80% | 1 in 5 | about 57% of it |
| 70% | about 3 in 10 | about 45% of it |
The level is fixed once the check runs. Every verdict reached below 95% says so next to it.
What Needlr refuses to call
- A winner before the planned sample and a full week. It says too early instead.
- Anything from fewer than 100 visitors per version or 10 conversions in total.
- A result when the split between A and B is off from what was set. Something is broken in how visitors are assigned or counted, so the check goes on hold.
- A result while your KPI has stopped firing. A broken button looks like a big drop. The check goes on hold until it fires again.
- Proof of cause for a change released to everyone at once. Without a split group, other changes in the same weeks can play a part. Those verdicts are labeled likely, not proof.
- An adoption target before its window ends.
- A new verdict on later data. Once decided, it stays.
Technical appendix
What the code does, with its thresholds. The statistics live in one package, used by the results worker and by the reliability simulation, so what we test is what runs.
1. What is counted
A visitor counts from their first exposure: the first time their version was actually shown. Views that Needlr left unchanged, because the element was already on screen, are not exposures. A conversion counts once per visitor, only if it happened at or after the exposure (with 60 seconds allowed for clock differences) and, when the KPI has one, within its conversion window. Your team's own preview traffic is kept apart and never counted.
2. The test and the interval
The KPI is binary per visitor (converted or not). For each version, the conversion rate gets a Wilson score interval at the check's confidence level. The interval of the difference B minus A is the Newcombe hybrid score interval (Newcombe 1998, method 10), built from the two Wilson intervals:
z = Φ⁻¹(1 − α/2), α = 1 − confidence diff = pB − pA low = diff − √((pB − lB)² + (uA − pA)²) high = diff + √((uB − pB)² + (pA − lA)²) (lA, uA), (lB, uB): Wilson intervals of A and B at z
Verdict: improved when low > 0, worse when high < 0, otherwise no clear effect. The relative lift (pB / pA − 1) is shown with an interval from the log ratio (delta method, SE = √((1 − pB)/xB + (1 − pA)/xA)). A two-sided pooled z-test p-value is stored too, but the verdict uses the interval only. Nothing is shown as more than "collecting" before 100 visitors in the smaller version and 10 conversions in total.
3. The sample size
Visitors per version for a two-sided two-proportion z-test, with p1 the expected KPI rate of A (from the KPI's history, or 3% when there is none), the minimum detectable effect (MDE) relative, and 80% power:
p2 = p1 × (1 + MDE), p̄ = (p1 + p2) / 2 n = [ z(1−α/2) × √(2 p̄ (1 − p̄)) + z(power) × √(p1 (1 − p1) + p2 (1 − p2)) ]² / (p2 − p1)²
The plan is reached when the smaller version has n visitors.
4. Fixed horizon and freeze
Results are recomputed every 5 minutes. The first time the state is final (improved, worse or no clear effect), that state is the verdict: its time is stamped on the check and no result is written after it, whether the check keeps running or is stopped. The sample ratio check is not re-run after the verdict either. There is one look that counts, so the false-positive rate is the nominal α. Verdicts given before a rule changed keep the rule they were decided under.
5. The 7-day minimum
A split test (code or no-code) gets no verdict before 7 full days since it started. Its progress is the smaller of the sample progress (smaller version over the plan) and the days progress (days over 7). Until both are complete the state is "too early". A check stopped before 7 days gets no verdict. Before vs after and adoption checks keep their own windows (sections 10 and 11).
6. Replanning from the real rate
The plan starts from an assumed KPI rate. Once version A has at least 2 days, 300 visitors and 10 conversions, and the real rate is at most 0.67x or at least 1.5x the assumed one, the plan is recomputed with the formula above from the real rate (same MDE, α and power). It is recomputed at every update from the data so far. The check page says when this happened.
The real rate is A's, estimated from both versions: the pooled rate of A and B divided by (1 + MDE/2) for a 50/50 split (by 1 + MDE × B's share otherwise). If B really is better by the MDE, the pooled rate runs that much above A's. We don't use A's own rate because it moves with the difference the verdict tests: when A happened to run high, the plan shrank and the check stopped a little early, which cost about 1 to 1.5 points of power. The pooled rate doesn't, so a replanned check keeps its planned 80% power, and the false-positive rate is unaffected. See the reliability report.
7. Sample ratio mismatch (SRM)
A chi-square test (1 degree of freedom) of the observed split against the planned weights. With at least 200 visitors in total and p < 0.001, the check shows a data problem and gives no verdict while it lasts.
8. KPI health
For KPIs Needlr counts itself, the baseline is the average daily count over the 7 days before the last 24 hours. If that baseline is at least 3 a day and the last 24 hours have less than 10% of it, the KPI has a measurement problem. Every check on it goes on hold (no verdict) until it fires again. A KPI with a baseline below 3 a day is never flagged. Google Analytics KPIs are not checked this way.
9. Unusual traffic
Each event is tagged with its source: a keyed hash of the client address that changes every UTC day (the address itself is never stored). A source is unusual when it brings at least 25 visitors and 5% of the check's visitors, or at least 6 conversions and 5% of its conversions. Its visitors are left out of the numbers, and the result says how many. The same rule (one database function) feeds the stored results and the live numbers. Separately, one source can add at most 50 new visitors to a project per UTC day.
Limits: a sender spreading traffic over many addresses or days stays under these thresholds. Google Analytics KPIs carry no source, so nothing can be left out there.
10. Before vs after
For a change released to everyone: the KPI rate is visitors who hit the KPI over visitors with a visit (distinct visitors, one visit a day), or Google Analytics' daily users and converters for a GA4 KPI. Two windows of equal length L, right before and right after the release date (00:00 UTC), where L is the days since the release, up to 28. The comparison is the same interval as section 2. The verdict comes once the after window has 28 days, with at least 100 visitors in each window and 10 conversions, and the check then stops.
Trend guard. A placebo comparison of the two windows before the release (L days each) at 95%, when both have at least 100 visitors. If its interval excludes zero, the KPI was already moving on its own, and the result warns that part of the change may be trend. Releases within two weeks of each other are flagged too.
Limits: the guard only sees a trend that already showed before the release. It warns; it doesn't change the verdict. Seasonality, campaigns and other changes inside the after window are not controlled. That's why these verdicts are "likely, not proof".
11. Daily summaries for older releases
Raw events are deleted after 90 days. Before that, each complete UTC day is summed up per project: for visits and for each KPI, the number of hits, the exact number of distinct visitors that day, and a HyperLogLog sketch (16,384 registers) of those visitors, built from a keyed hash of the random visitor id. The summaries keep no visitor id and are kept 13 months. Internal traffic and the visitors of a source that was unusual that day (section 9, applied per day) are left out.
When any window of a before vs after check starts more than 88 days ago, all of its windows are counted from the summaries, never part from raw events and part from summaries. Merging the daily sketches gives a window's distinct visitors and KPI users within about 0.8% (standard error; in our simulations 95% of 7- and 28-day windows are within 2%). Windows of up to about 3,000 people are counted exactly. That error is added to the interval of section 2, so a verdict from summaries is a little more careful than one from raw events, never bolder. On big sites with small changes it says "no clear change" more often than raw events would. The check says when its numbers come from summaries.
12. Adoption
Of the people active since the release (a visit, or a chosen "active" KPI), the share who used the feature (the KPI) at least once. A signed-in person is one person across devices. The share gets a Wilson interval at the check's confidence. One verdict, at the end of the target window: target reached when the lower bound is at or above the target, below target when the upper bound is below it, otherwise near the target. With fewer than 100 active people at the end, the check stops without a verdict.
Active people can also be the people who did all (or any) of up to 3 things, at any time or in the same visit (one person on one UTC day), in any order or one after another. A person counts as active from the day they first did them, and a use of the feature counts only from that day on.
13. One primary KPI per check
Each check is judged on one primary KPI, chosen before it starts. Because only one KPI decides, there is no multiple-comparison problem in the verdict, and no correction is applied. A coding agent's split test can name up to two guardrail KPIs (section 14): they never make a verdict, they can only stop a test or hold back a "keep".
14. Checks run by coding agents
Agents run many tests, one after another, and nobody watches each one. Their split tests follow everything above, plus four rules. Confidence is 95%, whatever the agent asks for. No peeking: until the verdict, an agent sees progress and the expected date only, never which way the test leans. At most two of an agent's split tests run at once on the same KPI of a project.
Auto-stop on harm. At every snapshot, a one-sided always-valid bound (a Gaussian mixture confidence sequence) is checked on B − A, for the KPI and for each guardrail KPI. When its upper end is below zero, B is worse with 99% confidence however often it was looked at, and the test stops: everyone gets the current version. In our simulation of A/A tests read every day for 30 days, it stopped fewer than 2% of them. It only stops for harm; a win still waits for the planned verdict, and a stopped test shows no effect size (an early stop overstates it).
False wins across many tests. Each project's stream of agents' split tests is controlled with LORD++, an online false-discovery procedure: every new verdict gets its own significance level from the levels spent and the wins found before it, so the expected share of false wins stays at or below 5%. A win whose p-value is above its level is shown as "not confirmed", and the agent is told to try again rather than keep it. The same change that already lost isn't measured again unless it's sent as a follow-up.
Before vs after checks asked for by agents are the same as anyone's ("likely, not proof"); when other releases on the same KPI fall within two weeks, the agent is told the evidence is weak.
What Needlr doesn't do (yet)
- No sequential verdicts. A check can't stop early for a big effect; it waits for its plan and a full week. The one always-valid bound Needlr uses stops coding agents' tests for harm only (section 14).
- No variance reduction. No CUPED or regression on pre-test data. Plans are as large as the plain test needs.
- No multiple-KPI correction. Not needed for the verdict, because one primary KPI decides. If you read other KPIs next to it, treat them as hints.
- Conversion KPIs only. Verdicts are on "did the visitor do it". Revenue per visitor and other averages are not judged.
- Two versions only. No A/B/n tests or multi-armed bandits.
- No segment verdicts. No per-country or per-device results, which would multiply the chances of a false winner.
- No long-term or novelty effects. The full week covers the weekly cycle, not effects that fade or grow over months.
- Before vs after is not causal proof. The trend guard catches some trends, not all.
How often is this right in practice? The reliability report has the simulation tables and a test site with a planted truth. Questions about a specific verdict? Write to us and we'll walk you through it.