In plain English
Any organisation running experimentation at scale runs many tests at once on overlapping users. The instinct that this must contaminate the results is understandable and mostly wrong. Provided each experiment randomises independently, the second test's variants are spread evenly across the first test's arms, so its effect appears as noise in both — which inflates variance slightly and does not bias the estimate.
The word doing the work there is independently. If assignment is computed by hashing the user id alone, without the experiment id, every user lands in the same relative position in every test, and the tests share populations rather than crossing them. Then one experiment's treatment is systematically present in another's treatment arm, and the effects genuinely are confounded. This is a bucketing failure rather than a property of concurrency, and it is the one thing that must be right before overlap is safe.
What concurrency genuinely cannot give you is the combined effect. Each experiment measures its change averaged over whatever the other experiments were doing, so two tests that each report a win tell you nothing about what happens when both ship. If they touch the same surface they may well conflict — an interaction effect — and the roadmap's assumption that gains add up is exactly the assumption concurrency leaves untested.
The practical response is proportionate rather than absolute. Most pairs of experiments are unrelated: a checkout change and an email subject line do not interact, and treating every overlap as a hazard would reduce an experimentation programme to a queue. What deserves attention is overlap on the same surface or the same decision point, which is both where interactions are plausible and where two teams are most likely to be working simultaneously without noticing.
So the useful discipline is a register rather than a serialisation policy: record what is running where, make overlaps on a shared surface visible, and sequence those deliberately or test them together as a factorial. And when a shipped combination underperforms the sum of its parts, treat that as the interaction evidence it is — that gap usually arrives after the fact, and it is the main way an organisation learns which of its surfaces are crowded.
The formula
Two facts: what independent concurrency costs, which is little, and what it leaves unmeasured, which is the interaction.
- Why it does not bias
E[ other treatments | arm A ] = E[ other treatments | arm B ]Independent randomisation spreads every other experiment evenly across your arms, so it cancels in the difference.
- What it costs
variance rises slightly; the estimate does not moveOther experiments add noise. With many concurrent tests the effect on power is real but modest.
- What it cannot measure
effect(A and B together) ≠ effect(A) + effect(B)Neither test observes the combination — see interaction effect.
- The prerequisite
hash( unit_id + experiment_id )Without the experiment id, concurrent tests share populations and genuinely confound — see the chi-square calculator for the checks.
Worked example
A team runs six concurrent experiments across the same user base. Two of them — a trust-badge row and an urgency banner — both change the product page above the fold. The other four touch email, search ranking, the mobile navigation and a billing screen. All six report significant wins and all six ship in the same release.
- Concurrent experiments
- 6
- Assignment
- independent, experiment id in the hash
- Sum of reported conversion gains
- +1.34 pp
- Measured after all six shipped
- +0.91 pp
- Shortfall
- 0.43 pp
- Follow-up 2 × 2 on the two page changes
- interaction −0.39 pp
Five of the six combined as expected. The two competing for the same space above the fold accounted for almost the entire shortfall.
This is concurrency working as designed and being misread at the reporting stage. The individual experiments were all correctly randomised and correctly analysed — none was contaminated, and the four unrelated ones summed cleanly. The shortfall traces almost entirely to the pair sharing a surface, which the follow-up factorial confirms at −0.39 of the 0.43. The lesson is not to stop running tests in parallel; it is that the register should have flagged two experiments on the same region of the same page, and those two should have been sequenced or run as a factorial from the start. Worth noting how cheap the diagnosis was after the fact: knowing which pair to suspect made it a single 2 × 2 rather than an audit of all fifteen possible pairings. That is the practical value of recording what is running where.
Common misconceptions
- דRunning several experiments on the same users contaminates all of them.”
- Not when each is randomised independently, because the other experiments' variants spread evenly across your arms and cancel in the difference. What they add is a little variance. The real limitation is different: no experiment observes the combination, so the results say nothing about shipping them together.
- דConcurrent tests should be serialised to be safe.”
- That trades a small, well-understood variance cost for an enormous reduction in throughput. Most pairs of experiments touch unrelated surfaces and cannot plausibly interact. Serialise the specific overlaps that share a surface or a decision point, and run everything else in parallel.
- דIf all our tests were significant wins, the release will deliver their sum.”
- Only if the changes are additive, which concurrency does not test. Changes competing for the same attention routinely deliver less than either alone. The gap between the predicted sum and the measured aggregate is the main signal available, and it arrives only if someone measures the aggregate.