A/B test analysis calculator

Get your lift with its confidence interval and p-value. Planning a test? Size it first →

Calculator

Test data
Test settings

Test settings

  • α = 0.05
  • Two-sided

Lift

-⁠-⁠-⁠-

95% confidence interval -⁠-⁠-⁠-

p-value

-⁠-⁠-⁠-

two-sided

Conversion rate

Control
-⁠-⁠-⁠-
Test
-⁠-⁠-⁠-

Planning a geo test? The Bell Experiments MCP server runs the Bell Statistics engine as tools your assistant can call — geo test design and measurement today, A/B testing next.

Get the MCP server

When to use it

Use this calculator when you want to analyze a binary outcome — for example, converted or not, signed up or not, or active on day 7 — and you are comparing two independent groups.

Check for a sample ratio mismatch before you read any further. If the split is significantly different from what you configured, something upstream is broken — and you cannot proceed to this analysis until it's resolved, because no amount of statistics downstream repairs a comparison between groups that were never actually randomised.

Assumptions

The calculation assumes:

  • Random assignment: observations are independently assigned to the two groups.
  • Independent observations: each randomized unit contributes one observation, and observations from different units are assumed to be independent.
  • A sufficiently large sample: the calculation uses a normal approximation. For very small expected counts, use an exact method such as Fisher's test instead.

How the calculation works

The calculator computes the observed conversion rate in each group, then reports two related but independently calculated quantities: the lift, with its confidence interval via the log risk-ratio method, and the absolute difference, with its own confidence interval via the standard normal approximation for two proportions. Let μ_c and μ_t denote the control and test conversion rates, and n_control and n_test the respective sample sizes.

Log risk ratio, and its standard error
log(RR) = log(μt) − log(μc)
SE[log(RR)] = √[Vartntest · μt² + Varcncontrol · μc²]

Var_c and Var_t measure how much each group's conversion rate could vary by chance, and each group uses its own: Var_c = μ_c(1 − μ_c) and Var_t = μ_t(1 − μ_t). Each term then simplifies to (1 − μ)/x, where x is that group's number of conversions, so SE[log(RR)] = √( (1 − μ_c)/x_control + (1 − μ_t)/x_test ) — Katz's standard error for the log risk ratio. The test statistic and the lift interval below both use it, which is why they always agree on a two-sided test.

The test statistic and its p-value
z = log(RR)SE[log(RR)]
Two-sided: p = 2·(1 − Φ(|z|))
One-sided: p = 1 − Φ(z)

z measures how many standard errors the observed lift is from zero (no difference). The p-value converts that into a probability: how likely a difference this large would be if there were really no effect. For a two-sided test, a small p-value and an interval that excludes zero always agree — they are the same calculation. For a one-sided test, that is no longer guaranteed: the p-value can clear your significance level while the interval — always two-sided, see below — still includes zero.

Confidence interval for the lift
[ exp(log(RR) − zcrit·SE[log(RR)]) − 1, exp(log(RR) + zcrit·SE[log(RR)]) − 1 ]
zcrit = z1−α/2

The math is done on a log scale and converted back at the end. That keeps the interval from ever going below −100% (you cannot lose more conversions than you had) and naturally makes it wider on the upside than the downside, which is how lift actually behaves. The reported lift itself is exp(log(RR)) − 1, numerically the same as (μ_t − μ_c) / μ_c. This interval is always two-sided, even for a one-sided test — a one-sided version would have no upper or lower limit at all, which is not useful to show.

Absolute difference and its interval
diff = μt − μc
SE[diff] = √[μc(1−μc)ncontrol + μt(1−μt)ntest]
[ diff ± zcrit · SE[diff] ]

This interval uses each group's own variance, not a shared pooled estimate, and is calculated separately from the lift interval above. So the two numbers will not match up exactly — that is expected, not an error.

Interpreting the output

A p-value below your chosen significance level (α) indicates the observed difference is unlikely to have occurred by chance alone — the difference between the two groups is statistically significant. If the difference is in the desired direction, this supports moving forward with implementation. If the p-value is at or above α, there is insufficient support for a true difference between the two groups, and implementation should not proceed based on this result alone.

The confidence intervals give a range of plausible values for the true lift and the true absolute difference — the narrower the interval, the more precise your estimate. Statistical significance does not necessarily imply practical significance; consider the size of the estimated lift alongside the p-value when deciding whether to implement a change.

Worked example

Suppose your control group had 4,000 conversions out of 100,000 users (4.0% conversion rate), and your test group had 4,200 conversions out of 100,000 users (4.2% conversion rate).

Conversions, control
4,000
Observations, control
100,000
Conversions, test
4,200
Observations, test
100,000
Significance level (α)
0.05
Tails
Two-sided

Conversion rates of 4.00% and 4.20% — an absolute difference of +0.20 percentage points and a relative lift of +5.0%. The test yields a p-value of approximately 0.024, which is below α = 0.05. The 95% confidence interval for the lift is approximately [0.64%, 9.55%], and for the absolute difference approximately [0.03, 0.37] percentage points.

Since the p-value is below α, the result is statistically significant: there is sufficient evidence of a difference between the groups that is unlikely to be due to chance alone. Since the observed effect favors the test version, you could consider moving forward with implementation. Note how much less precise the estimate is than the headline: the point estimate is a 5% improvement and the data is consistent with anything from 0.6% to 9.6%.

Frequently asked questions

My result is significant but the interval is huge. What now?
You have established a direction and not a magnitude. That is a legitimate outcome and it is often enough to ship — if the whole interval sits above the threshold that justifies the change, the decision is clear whatever the true value is. When the interval straddles that threshold, significance has not settled the business question, and running longer to narrow it is a real option rather than an admission of failure. What you should not do is quote the point estimate as the expected result: it is the best single guess, but with an interval this wide the true value could sit almost anywhere inside it, so quote the range alongside it.
p is 0.06. Can I call it a trend?
No, and 0.049 is not a discovery either. The threshold is a convention you adopted in advance to control a long-run error rate, not a property of the evidence — 0.049 and 0.051 are the same result and calling one a win and the other a trend is having it both ways. Report the estimate and its interval, say the test did not reach the threshold you set, and let the interval carry the nuance. If the decision genuinely cannot wait, say that it is being made on incomplete evidence and record what the interval was.
One group converted nobody. Why is there no result?
Because the relative effect — and the test, which is run on it — divides by the conversion rate, and the logarithm of a zero rate is undefined rather than merely large. So with no conversions in a group the calculator stops and says so instead of reporting a number. No 0.5 has been added to any cell to force a result, because that would change the estimate to make the display tidier. With counts this small the normal approximation is unreliable anyway: use the Fisher's exact test calculator, which handles a zero cell correctly.
Do I need to check anything before reading this?
Check the split. If assignment was meant to be 50/50 and one group is meaningfully larger, something upstream is dropping or duplicating users, and whatever is doing that is very unlikely to be doing it evenly with respect to the metric. A sample ratio mismatch invalidates the comparison rather than adding noise to it, so it has to be settled before the conversion numbers mean anything. Put the two group sizes and your intended split into the sample ratio mismatch (SRM) calculator — it takes a minute and it is the cheapest bug detector an experiment has.

Related calculators

  • A/B test sample size

    Size an experiment before you launch, for a binary, continuous or ratio KPI — each with its own design and its own assumptions.

  • SRM check

    Check whether your experiment actually split traffic the way you configured it — the first thing to run, before any metric.

  • One-proportion z-test

    Test one observed rate against a fixed target — an SLA, a benchmark, a contractual floor.

  • MDE calculator

    Given a fixed sample size, find the smallest effect your A/B test is powered to detect — for a binary, continuous or ratio KPI.

Design geo tests without leaving Claude

The Bell Experiments MCP server gives your assistant the Bell Statistics engine: ask it to pick test and control markets, estimate the budget or read the lift in plain language, and get the answer with the assumptions behind it. A/B testing is next.

See the MCP server

Talk to the people who build these for a living

We read experiments where the metric, the decision rule and the threshold were agreed before anyone looked at the data. A/B Testing

References

  • Katz, D., Baptista, J., Azen, S. P., & Pike, M. C. (1978). Obtaining confidence intervals for the risk ratio in cohort studies. Biometrics, 34(3), 469-474.
  • Kohavi, R., Tang, D., & Xu, Y. (2020). Trustworthy Online Controlled Experiments: A Practical Guide to A/B Testing. Cambridge University Press.