What this checker does
The SRM checker is a data-quality gate for your experiments. You tell it the traffic split you configured (50/50, 90/10, three-way — any allocation) and the visitor counts you actually observed, and it runs a chi-square goodness-of-fit test to determine whether the deviation is within the range random assignment produces, or evidence that something is systematically broken. The verdict is plain English: pass, suspicious, or SRM detected.
It is the least glamorous and highest-value 30 seconds in experimentation: an SRM check catches broken tests before you spend credibility shipping decisions based on them.
The formula
With observed counts and expected counts (your configured ratios scaled to the observed total), the test statistic is:
which follows a chi-square distribution with degrees of freedom under the null hypothesis that assignment is working. The p-value is the probability of a deviation at least this large occurring by chance. Following standard practice, the checker alerts at and flags as worth a look.
A worked example
You configured a 50/50 test and observed 50,600 control users vs 49,400 variant users — a difference of just 1.2% between arms, easy to shrug off by eye. The expected count is 50,000 per arm, so , giving p ≈ 0.00015. That is below 0.001: this is a real SRM, not noise. Something is removing (or double-counting) roughly one in every 160 variant users — and whatever it is almost certainly correlates with behavior, biasing every downstream metric.
When to use it
- Before reading the results of any completed test — make it a checklist item.
- Daily during the first days of a new test, when integration bugs surface.
- After any infrastructure change to assignment, redirects, bot filtering, or analytics.
- When auditing a surprising win — a too-good-to-be-true lift with SRM is usually the SRM talking. Pair with the significance calculator only after the split passes.
Common mistakes
- Eyeballing it. A 50.3/49.7 split "looks fine" but is a blatant SRM at 10 million users, while 52/48 is perfectly normal at 1,000 users. Only the test knows; intuition does not scale with n.
- Checking percentages instead of counts. The test needs raw user counts. Rounded percentages destroy the signal.
- Running the check on sessions when assignment is per user (or vice versa). Check the unit you actually randomize on.
- "Fixing" SRM by resampling or reweighting. You cannot reweight away an unknown selection bias. The fix is finding the mechanism, not adjusting the data.
- Skipping the check on wins. Teams scrutinize losses and wave through gains — precisely backwards, since SRM inflates apparent wins as often as losses. Read the full story in our SRM guide.