×marble
all posts
Jun 14, 2026·12 min read

A/B Testing Personalization at Scale: Interaction Effects and MDE Math

A/B testing personalization isn't the same as A/B testing a button color. Interaction effects, segment dilution, MDE math, and the gotchas at scale.

Alex Shrestha·Founder, ×marble

A/B Testing Personalization at Scale: Interaction Effects and MDE Math

TL;DR.

  • A/B testing personalization at scale breaks the textbook. The textbook assumes one homogeneous treatment effect; personalization is heterogeneous by design.
  • Microsoft's ExP team found A/B interaction effects in only 0.002% of test pairs across hundreds of concurrent experiments — interactions are rarer than the literature suggests, but the ones that bite happen between two personalized systems.
  • The minimum detectable effect (MDE) scales roughly as 1/sqrt(n). To detect a 1% lift at 80% power on a 5%-conversion surface, you need roughly 300,000 users per arm. Personalized surfaces fragment that traffic across segments.
  • Always run a permanent holdout — 1-10% of traffic that never sees the personalized layer. It's the only honest way to measure total personalization lift, separate from algorithm churn.
  • Spotify's default MDE is 5%. Booking.com runs more than 1,000 concurrent tests. Both ship features in atomic experiments to make the interaction math tractable.

A/B testing a button color is a solved problem. A/B testing personalization at scale is not — and most of the textbook advice breaks the moment your treatment depends on the user. You can't compute one average treatment effect when the whole point of the treatment is that it differs per user. This post is the math, the gotchas, and what large experimentation teams at Microsoft, Netflix, Spotify and Booking.com actually do about it.

Why A/B testing personalization is different

A traditional A/B test estimates a single average treatment effect (ATE). Variant B beats variant A by 2.3% on conversion; you ship variant B. The implicit model: the effect is roughly homogeneous across users, and the sample mean is a useful number.

Personalization violates that model on purpose. The treatment is a function f(user, context) — a ranking, a model output, a copy variant chosen from a pool. Two users in the same arm get different experiences. The ATE you compute is an average over a distribution of treatments, weighted by how often the personalizer assigns each one. Change the underlying model, and the ATE shifts even if nothing about the surface changed.

This breaks three textbook intuitions at once:

  • Homogeneity is gone. Treatment effects vary by segment, sometimes by 10x or more. A homepage redesign that lifts signups +15% in one country might be flat in another. Netflix calls this "heterogeneous treatment effects" and treats it as a first-class concept; their HTE write-up describes computing conditional average treatment effects (CATE) across new-member, region, and device segments using AIPW estimators.
  • The treatment can drift. Your bandit, your ranker, your retrieval index all learn online. The "B" arm of week 1 is not the "B" arm of week 4. Lock model versions during a measurement window, or include the learning loop in the comparison.
  • Variance is higher. Personalized treatments fan out across long tails of items, contexts, and segments. The variance of the metric inside a single arm goes up, which kills your statistical power before you've even started.

The MDE math: why personalization needs more traffic

The minimum detectable effect (MDE) is the smallest true effect your experiment can reliably catch. The standard formula, for a two-sample proportion test at significance level α and power 1-β:

MDE ≈ (z_α/2 + z_β) · sqrt(2 · σ² / n)

For a 5% baseline conversion rate with default α=0.05, 1-β=0.80:

  • n = 16,000 per arm → MDE ≈ 0.5 percentage points (relative 10%)
  • n = 100,000 per arm → MDE ≈ 0.2 pp (relative 4%)
  • n = 300,000 per arm → MDE ≈ 0.1 pp (relative 2%)

These numbers are the ceiling, not the floor. Real surfaces have higher variance, autocorrelation across sessions, and you usually want to look at multiple metrics with multiple-testing correction. Spotify's experimentation platform sets a default MDE of 5% precisely because anything smaller is hard to detect on most internal surfaces — see Confidence docs.

For MDE personalization specifically, three things make life harder:

  1. Segment dilution. You'll want to read out per-segment effects. With K segments of roughly equal size and a global sample size N, each segment has ~N/K users. Halving the segment cuts your detection power. Most teams find that beyond 5-10 non-overlapping segments, the test becomes too underpowered to act on without big caveats.
  2. Heavy-tail metrics. Revenue per user, watch minutes, and basket size are skewed. The variance term σ² is often 5-20x larger than for a binary conversion metric, so you need that much more traffic. CUPED-style variance reduction using pre-experiment behavior typically recovers 30-50% of that, depending on how predictive the covariates are.
  3. Treatment heterogeneity. When the treatment varies within arm, the variance of the per-user effect adds to your sampling variance. The bigger your personalization spread, the larger the MDE you need to chase.

The practical result: on most personalized surfaces, you're hunting for 1-3% relative lifts. You need millions of exposures, not thousands.

A back-of-the-envelope sample size table

For a binary 5%-conversion metric, two-arm 50/50 split, default α/β:

| Target relative lift | Users per arm | Days at 50k DAU per arm | |---|---|---| | 10% | ~30k | ~1 | | 5% | ~120k | ~3 | | 2% | ~750k | ~15 | | 1% | ~3M | ~60 |

This is why "we'll just run an A/B test" doesn't scale when your personalization improvements are individually small. You ship them in bundles and accept that you can't always attribute the gain to a single component.

Interaction effects A/B testing: what the data actually says

Common fear: I have 40 concurrent experiments; they must be interacting in some terrible way. Microsoft's ExP team published an empirical study of every concurrent test pair across four products on a single day, with hundreds of tests on millions of users. Three of the four products showed zero detectable interactions. The fourth showed abnormally small p-values in 0.002% of pairs — about 1 in 50,000 — and none of those flagged pairs had both effects statistically significant and moving in opposite directions.

Interaction effects A/B testing fears are mostly overblown — but not entirely. The cases that bite have a pattern:

  • Visual collision. Test A changes the CTA from black text to red; test B changes the background from grey to red. The combination is illegible. Anyone running CSS-level tests in the same area needs mutual exclusion.
  • Two personalizers competing. A retrieval test and a re-ranking test running concurrently. Each is doing its own learning; they end up shadowing each other's exploration. Holdout groups go ambiguous fast.
  • Funnel-level cascades. Test A on the search page changes what reaches the listing page where test B runs. The treatment effect of B now depends on which arm of A the user was in.

The pragmatic rule from Microsoft's team and Booking.com's experimentation engineers: only enforce mutual exclusion when you have a specific mechanism in mind. Random mutual-exclusion bites traffic for no benefit. When you have a real reason — same UI element, same model output, same downstream metric — split the layers explicitly. Booking.com runs more than 1,000 concurrent experiments most of the time and ships at a rate 2-3x industry average partly because they trust the empirical evidence rather than gating everything by default.

For genuinely interactive cases, run a 2x2 factorial. You don't measure each treatment in isolation; you measure A, B, and AB jointly. Sample size goes up ~2x because you need to detect the cross term, but you get the interaction estimate cleanly.

Heterogeneous treatment effects and segment readouts

If you're going to A/B test personalization, you have to read segment effects honestly. Here's the trap: you run one global test, see a flat +0.2% ATE, slice by 10 segments, find one with +4% and one with -3.5%. Tempting story: "the algorithm helps power users, hurts new users." Less tempting reality: you ran 10 t-tests, the variance per segment is huge, and you're staring at noise.

What works in practice:

  • Pre-register your segments. Decide on the 3-5 segments you care about before the experiment, ideally on the same dimensions you've seen historical heterogeneity. New vs. tenured users, mobile vs. desktop, high-engagement vs. casual, and one geographic split usually covers it.
  • Apply multiple-testing correction. Benjamini-Hochberg false discovery rate control is the standard in industry — Netflix calls out using it explicitly for thousands of device-type tests. Bonferroni works but is too conservative for 10+ segments.
  • Model heterogeneity, don't just slice. Causal-forest, T-learner, S-learner, and X-learner estimators give you a CATE function rather than a per-segment mean. They're more sample-efficient than slicing and integrate cleanly into targeting logic. Microsoft's EconML and Uber's CausalML are the obvious starting points.

A concrete heuristic for segment readouts: anything smaller than 5% of traffic, don't report on it. The per-segment MDE explodes; one or two outliers will dominate. Aggregate into a "long tail" bucket and accept the lower resolution.

Holdout vs full rollout

Once a personalized surface ships, you can't easily turn it off to remeasure. That's why the holdout group is non-negotiable.

The pattern: at the user level, hash a stable ID and reserve a fixed 1-10% slice that never sees the personalization layer. They get the deterministic baseline — popular items, editorially curated rows, last-week's bestsellers, whatever existed before. Everyone else gets the personalized experience.

What this gives you:

  • Total personalization lift, on an ongoing basis. Treatment metric vs. holdout metric, integrated over weeks. This is the only honest answer to "how much does our personalization actually do?"
  • Long-term effect detection. Some personalization wins erode over 3-6 months as users adapt. Others compound. The holdout shows the truth.
  • Algorithm churn isolation. If you swap models monthly, A/B tests measure the new vs. old model — they don't tell you whether either model beats no-personalization. The holdout does.

Holdout size is a trade-off. Smaller holdouts give cleaner business metrics (fewer users on the worse experience) but slower detection. We'd recommend 5% as a default for surfaces where you trust personalization is winning, 10% for less-mature systems where you want the readout to be tight. The opportunity cost of a 5% holdout — for a personalization lift of ~5% — is roughly 5% · 5% = 0.25% of total surface revenue per period. That's a cheap insurance policy on telling the truth.

Booking.com and Netflix both run permanent holdouts for major personalization surfaces. Spotify's risk-aware A/B framework explicitly separates the "experiment" phase from the "rollout" phase, with a permanent holdout living through both. If you skip the holdout, you'll eventually be in a meeting where someone asks "what does our personalization actually contribute?" and you won't have a defensible number.

Practical playbook for A/B testing personalization at scale

A condensed checklist we'd give to a team starting today:

  1. Define one primary metric and 3-5 guardrails. Conversion or revenue is primary; cancellation rate, payment failures, support contacts, latency, and accessibility are guardrails. A winner that breaks a guardrail doesn't ship.
  2. Compute MDE and required sample size before launch. Use Evan Miller's calculator or your platform's built-in. If your required runtime is longer than 2-3 weeks, the test is probably too ambitious — split it or pick a higher-volume surface.
  3. Apply CUPED or similar variance reduction. Pre-experiment behavior covariates typically cut variance 30-50%. The implementation is ~50 lines of code and pays for itself on every subsequent test.
  4. Lock the personalization model during the measurement window. Online learning during an A/B test makes the result un-attributable. Freeze, measure, then unfreeze.
  5. Pre-register segments and corrections. Decide your segments and your FDR threshold before unblinding.
  6. Keep a permanent holdout. 5-10% of traffic on a non-personalized baseline. Read it weekly.
  7. Ship in atomic experiments. Booking.com's atomic-test discipline keeps interactions tractable. Don't bundle four model changes into one test if you can split them.

This isn't novel; it's just disciplined. The teams shipping personalization at the highest volumes are the ones who treat experimentation as a measurement problem first and an optimization problem second.

How ×marble fits in

Personalization is only as honest as the experiment around it. ×marble runs a knowledge-graph-based personalization layer behind Vivo (daily AI video briefings), Video, and Music — and we ship every change behind a holdout, with pre-registered segments and locked model versions during measurement windows. That's part of why our internal lift numbers are believable, and why we can hand customers a CSV of per-segment treatment effects instead of one global "trust us" line. If you're building personalization and you want the experimentation discipline already wired in, see ×marble.

FAQ

How do I A/B test personalization at scale without ruining sample size?

Pre-register 3-5 segments, run the test on a high-traffic surface, and use variance reduction techniques like CUPED. If you cannot reach the required sample size in 2-3 weeks, you are chasing too small a lift on too small a surface. Either pick a larger surface, raise your target MDE, or accept a longer runtime.

What is the minimum detectable effect for personalization experiments?

MDE personalization typically falls in the 1-5% relative range for top-line metrics on large surfaces. Spotify defaults to 5%. For a 5%-conversion-rate metric and 80% power, you need roughly 30,000 users per arm to detect a 10% lift, 120,000 to detect 5%, and 750,000 to detect 2%. Smaller lifts require more users or more sensitive metrics.

Are interaction effects in A/B testing a real problem?

Less than the literature implies, but not zero. Microsoft's ExP team measured detectable interactions in only 0.002% of concurrent test pairs across hundreds of experiments. The cases that bite are usually obvious in advance: two tests modifying the same UI element, two personalization layers competing on the same surface, or funnel cascades where one test's output is another test's input.

Should I run a holdout group for personalization?

Yes, always. Reserve 1-10% of traffic that never sees the personalization layer. The holdout is the only honest way to measure total personalization lift over time, separate from algorithm churn, and to detect long-term effects that A/B tests miss.

What is segment dilution in personalization experiments?

Segment dilution is the loss of statistical power when you split traffic across too many small segments. Each segment has n/K users, so the per-segment MDE grows as sqrt(K). Beyond 5-10 non-overlapping segments, most experiments cannot detect effects smaller than 5-10% per segment without weeks of additional runtime.

Further reading

the product behind these notes

×marble is the personalization graph.

One API. A living knowledge graph per user. Day-zero ready, explainable by construction. We built it so you don't have to.

See ×marble