SRM Checker
Before you trust any A/B test, check the split. If you configured 50/50 but the traffic came back 52/48 on real volume, that’s almost never chance — it’s a bug that probably biased your result. Enter your counts and get the chi-square SRM verdict instantly.
Sample Ratio Mismatch (SRM) is when an A/B test’s observed traffic split differs significantly from the split you configured — a red flag that a redirect, bot, or tracking bug corrupted the experiment. This checker runs a chi-square goodness-of-fit test on your counts and flags SRM at p < 0.001. A failed check should void the test: find and fix the cause before trusting any result. Runs in your browser.
SRM Checker inputs and result
| Variant | Observed | Expected | Difference |
|---|
How to use this tool
- Enter the actual user counts per variant.Use the real number of users (or sessions — whatever you randomize on) assigned to each arm, from your experiment tool.
- Enter the split you intended.The percentage you configured for the control — 50 for a 50/50 test, 90 for a 90/10 holdout, and so on.
- Read the p-value.A chi-square goodness-of-fit test compares observed to expected assignment. A very small p-value means the split is unlikely to be random chance — a red flag.
- Act on a failed check.If p is below ~0.001 you likely have SRM: investigate redirects, bot filtering, tracking, and assignment bugs — and don’t trust the test’s result until it’s fixed.
- Export the check.Copy a share link, download the CSV, or print a one-page PDF for your QA record.
RGM Expert Says
Sample Ratio Mismatch is the validity check we run before reading any A/B result — because it’s the fastest way to catch a test that’s quietly broken. If you configured a 50/50 split but the data comes back 52/48 on serious traffic, that gap is almost never chance: it means a redirect is dropping users, a bot filter is hitting one arm harder, or assignment/tracking has a bug. And a broken assignment usually means the rest of the result is biased too.
The discipline that matters: a failed SRM check voids the test, full stop — you don’t get to keep the ‘win’ and explain the mismatch away. We treat it like a build failure: red means stop, find the cause, fix it, and re-run. The most common culprits are redirect-based split tests (latency drops users on the redirected arm) and bot/spam traffic landing unevenly.
Use a strict threshold. Because you run this check on every test, a loose p-value (like 0.05) would false-alarm constantly; the field standard is roughly p < 0.001 (often 0.0005). Below that, the mismatch is real enough to act on; above it, the split is consistent with random variation and you can trust the assignment.
How it works
SRM is detected with a chi-square goodness-of-fit test comparing the observed counts to the counts you’d expect under your intended split:
For a two-variant test there is 1 degree of freedom, and the p-value is the probability of a χ² this large under a correct split:
- Observed — the actual users assigned to each variant.
- Expected — total users times your intended split.
- Threshold — flag SRM at roughly p < 0.001, because the check runs on every test.
SRM detection via chi-square is the standard approach in the online-experimentation literature (Fabijan, Kohavi et al.). The calculation runs entirely in your browser. Companion to the statistics module.
The validity check that voids a ‘winning’ test
It’s tempting to skip SRM when a test shows a clean win — but that’s exactly when it matters most. A mismatch in the traffic split is a symptom that the experiment infrastructure misbehaved, and whatever broke the 50/50 (a lossy redirect, uneven bot traffic, a logging gap) almost certainly biased the metric you’re celebrating. A ‘significant’ result on an SRM-failed test is significant nonsense.
This is why mature programs automate SRM on every experiment and treat a failure as a hard stop. It’s a remarkably high-yield check: cheap to compute, unambiguous to act on, and it catches a class of bug that no amount of statistical sophistication at analysis time can repair. The split either matches what you configured or it doesn’t — and if it doesn’t, you have a bug, not a winner.
The fix is investigative, not statistical: trace assignment from randomization through delivery to logging. Redirect tests are the usual suspect (the redirected arm loses users who bounce during the extra hop); bot and crawler traffic landing unevenly is the second; and consent or tracking gates that fire differently across arms are the third. Resolve the cause, then re-run clean.
How to read the result
Run this on every test, with a strict threshold.
| p-value | Verdict | Action |
|---|---|---|
| ≥ 0.01 | No SRM | Split is consistent with chance; trust assignment |
| 0.001 – 0.01 | Suspicious | Watch closely; investigate if it persists |
| < 0.001 | SRM detected | Void the test; find and fix the cause, then re-run |
What operators say
Getting numbers is easy; getting numbers you can trust is hard.
A failed SRM check should void the experiment — the mismatch is a symptom that the same bug likely biased your metric.