Free tool · No signup

Subscription A/B Test Sample Size Calculator

Sample size and duration for mobile subscription experiments: the two-stage paywall→trial→paid funnel, revenue per install as a heavy-tailed metric, and the maturation lag a trial length forces on when a test can honestly be read.

Every calculator on the App Store SERP is Evan Miller's 2012 generic binary formula, or a vendor rule of thumb ("500 conversions per variant", "10,000 paywall views") that isn't a function of baseline rate, minimum detectable effect, variance, or the funnel shape at all. This one is. Every formula it uses is written out below, with a source, so you can check it rather than trust it.

What are you testing?
Conversion rate
%
% rel.
Test parameters
%
%
days
days

Settlement buffer covers billing-retry timing on a lapsed trial or failed renewal: a test can't be read before the last-enrolled cohort has had this long to convert.

Fixed-horizon result

3,763 per variant

N per variant3,763
Total N (all variants)7,526
Days to enroll26
Maturation buffer10 days
Earliest readable dateSep 8, 2026
Rate detected30.0%33.0%

With 300 views/day split across 2 variants, this test can detect a move from 30.0% to 33.0% with 80.0% power at α=5.0%. It cannot reliably detect a smaller change than that, and a non-significant result at this sample size means a real effect this size wasn't ruled out, not that the variants are equal.

On peeking

The number above is a fixed-horizon sample size: it assumes you look once, at the end. Checking the dashboard continuously and stopping the first time it looks significant inflates a nominal 5% false-positive rate to roughly 26% (checking every ~500 visitors). Source: Pekelis, L., Statistics for the Internet Age: The Story Behind Optimizely's New Stats Engine, Optimizely, 2015; formalized in Johari, Koomen, Pekelis & Walsh, Peeking at A/B Tests: Why it Matters and What to Do About It, KDD 2017.

This tool does not offer a sequential/alpha-spending correction (e.g. O'Brien-Fleming boundaries) alongside the fixed-horizon number above. Implementing one correctly is a materially harder problem than the calculations above, and shipping an unverified version of it would be worse than not having it. Either commit to reading this test once, at the fixed horizon above, or run it on a platform built for continuous monitoring.

How this is calculated

Four formulas, each with a cited source. The implementation is a small, pure, fully-unit-tested TypeScript module, src/lib/sample-size.ts, checked against three independently-published worked examples, not just against its own output.

01 · Two-proportion sample size

n = [ z_(1-α/2)·√(2·p̄·(1-p̄)) + z_(1-β)·√(p1·(1-p1) + p2·(1-p2)) ]²
    ─────────────────────────────────────────────────────────────
                          (p2 - p1)²

where p̄ = (p1 + p2) / 2

The pooled variance (2p̄(1-p̄)) controls the false-positive term because that's the true variance of the test statistic under the null hypothesis (p1=p2); the unpooled variance (p1(1-p1)+p2(1-p2)) controls the power term because that's the true variance under the alternative. Two-sided, normal approximation, no continuity correction.

Source: Dalgaard, P. (2008). Introductory Statistics with R, 2nd ed., Springer, §9.1.4. This is the same derivation as Fleiss, Levin & Paik, Statistical Methods for Rates and Proportions, 3rd ed., Wiley, 2003, and as R's stats::power.prop.test.

02 · Two-stage funnel dilution

p_overall = p(trial_start) × p(trial_to_paid)

If the experiment changes only one stage, the sample size is computed on the resulting overall rate (formula 01, applied to p_overall), not on the targeted stage's own rate. A relative lift on the targeted stage passes through to the overall rate unchanged, but the absolute effect, the thing the sample-size formula actually depends on, shrinks by the downstream stage's conversion rate. This is the single most common reason a mobile paywall test is underpowered without anyone noticing.

Direct consequence of the definition of a two-stage funnel (P(A and B) = P(A)·P(B|A)). Not a citation-requiring result on its own.

03 · Revenue-per-install (continuous metric) sample size

n = 2 · σ² · (z_(1-α/2) + z_(1-β))²
    ────────────────────────────
              Δ²

σ = CV × mean,   Δ = MDE × mean

Standard two-sample, two-sided, equal-variance normal approximation. Because both σ and Δ scale with the mean here, the mean cancels out of n algebraically when the MDE is relative. The coefficient of variation, not the absolute revenue number, is what drives sample size. Subscription revenue per install is heavy-tailed (a handful of annual or lifetime purchases can dominate the variance), and this normal approximation degrades badly at the sample sizes indie teams actually run. Treat this number as a floor, not a guarantee.

Source: standard two-independent-means result, e.g. Dalgaard (2008) §9.1.3.

04 · Test duration

days = ceil(n_per_variant × n_variants / daily_views) + trial_days + settlement_days

The last cohort enrolled is the one that gates when the test can honestly be read: a 7-day trial plus a settlement buffer for billing retries means that cohort isn't measurable for well over a week after it enrolls, not from the day the test started.

On peeking

The result above is a fixed-horizon sample size: it assumes the test is read once, at the end. Monitoring continuously and stopping at the first apparent win inflates a nominal 5% false-positive rate to roughly 26% (checking every ~500 visitors). This tool deliberately does not offer a sequential/alpha-spending correction (e.g. O'Brien-Fleming boundaries) alongside the fixed-horizon number. That is a materially harder problem to implement correctly, and an unverified version of it would be worse than not shipping one at all.

Source: Pekelis, L., "Statistics for the Internet Age: The Story Behind Optimizely's New Stats Engine", Optimizely, 2015; formalized in Johari, Koomen, Pekelis & Walsh, "Peeking at A/B Tests: Why it Matters and What to Do About It", KDD 2017.

If a test design doesn't fit cleanly into these three shapes, or the numbers this tool gives you look wrong for reasons you can't pin down, book a call. Not a sales pitch: a second pair of eyes on the design before you spend the traffic.