Kaplan-Meier survival estimator
For each day, events d = new conversions that day, and n = users still "at risk" (haven't converted yet). Survival probability multiplies down step by step:
S(t) = Π over days i ≤ t of ( 1 − dᵢ / nᵢ ) · S(0) = 1
S(t) reads as "the probability a visitor has not yet converted by day t". The curve only drops on days with conversions, which is why it's a step function. Cumulative inputs are converted to daily events internally (dᵢ = cum(i) − cum(i−1)), and the at-risk pool shrinks as users convert.
Log-rank test
For each day with any conversions, we ask: if both arms converted at the same underlying rate, how many of that day's d events would we expect from arm A given its share of the at-risk pool?
E_A = d · n_A / (n_A + n_B) · V = n_A·n_B·d·(n−d) / (n²·(n−1))
χ² = ( Σ(O_A − E_A) )² / ΣV · df = 1
Summing observed-minus-expected over all days gives a single test of whether the two curves differ, using every day's information rather than just the endpoint. This is the standard test used in clinical trials.
Hazard ratio
HR = (O_B / E_B) / (O_A / E_A) · 95% CI: exp( ln HR ± 1.96·√(1/O_A + 1/O_B) )
HR > 1 means the variant converts faster at any given moment; HR = 1.15 reads as "a not-yet-converted variant visitor is 15% more likely to convert right now than a control visitor". The CI uses the standard log-scale approximation. Interpretation assumes proportional hazards — if the curves cross, the tool warns you and the single HR number becomes unreliable.
Median time-to-convert
The first day where S(t) crosses 0.5 among eventual converters, linearly interpolated between the two surrounding days. If the curve never reaches 0.5 inside the observation window, the median is reported as "> observation window" rather than guessed.