×marble
all posts
Jun 10, 2026·13 min read

The Holdout Problem: Why Standard A/B Controls Undercount Personalization Lift

Standard A/B holdouts assume user outcomes are independent — a premise that collaborative filtering directly violates. Here is how to design holdouts that actually measure what you think they measure.

Alex Shrestha·Founder, ×marble

The Holdout Problem: Why Standard A/B Controls Undercount Personalization Lift

TL;DR.

  • Standard A/B holdouts assume user outcomes are independent — a premise that collaborative filtering directly violates.
  • Personalization systems create graph-level spillover: holdout users absorb improved signal from treatment users, contaminating the control baseline.
  • Short-window experiments catch novelty effects, not the compounding lift that makes personalization worth building.
  • In 2026, the state of the art is a two-tier holdout: a per-experiment holdout for iteration speed, plus a permanent global holdout for long-run compounding measurement.
  • If you only remember one thing: your holdout users are already being personalized — just indirectly — and that makes your measured lift a systematic lower bound on the true effect.

Most teams running personalization experiments are measuring something real. They are just not measuring what they think they are measuring. The control group assumption — that holdout users experience "no personalization" — is false the moment your system uses collaborative filtering, session-level embeddings, or a shared knowledge graph. Holdout users get better recommendations over time not because they are being treated, but because their neighbors are. That leakage is silent, pervasive, and understates your lift by a margin that scales with graph density.

This is not an academic concern. Underestimating lift means you cut features before they compound, under-invest in infrastructure that would pay off in month three, and A/B test your way to the wrong answer. Getting holdout design right is prerequisite to knowing whether your personalization stack is working.

What is a holdout group in a personalization experiment?

A holdout group is a set of users permanently excluded from a feature — or from all personalization — for the duration of an experiment, used to measure sustained lift without the novelty effects that contaminate short A/B windows. Unlike a standard A/B control, which receives a different variant, holdout users receive a fixed baseline: no recommendations, a static fallback, or a frozen pre-personalization state.

The distinction matters in practice. In a standard A/B test, you split traffic between variant A and variant B and measure which wins over two to four weeks. Both groups are active participants in the system. In a holdout design, one group is deliberately frozen: they do not generate feedback loops, their signals do not flow into model updates, and their experience represents what the product looks like without the feature being measured.

Done correctly, holdouts answer the question standard A/B tests cannot: what is the sustained, compounded value of this feature after the novelty wears off and the model has had time to learn?

Why short A/B windows misrepresent personalization lift

The standard recommendation in Kohavi et al.'s Trustworthy Online Controlled Experiments is to run experiments until you reach statistical significance plus a minimum detectable effect — typically two to four weeks for most product features. For personalization, that window is usually insufficient, and the error cuts in both directions.

Novelty inflation. Users in the treatment arm interact more when something changes, regardless of whether that change is valuable. Clicks, session depth, and return visits spike for one to two weeks post-launch. If you end your experiment during that window, you are measuring novelty, not value. Holdout users, who see no change, do not get the novelty bump — so your measured lift looks like feature quality when it is partly surprise.

Compounding deflation. Personalization improves as it ingests signal. A knowledge graph initialized with 48 hours of interaction data produces worse recommendations than one trained on 30 days. A two-week experiment catches the model when it is least trained. The delta between a two-week measurement and a three-month measurement is often the difference between a borderline ship and an obvious win.

Preference refinement dip. Users who receive personalized content discover their actual preferences faster and become more selective. Initial engagement metrics may dip as they stop consuming content they would have tolerantly clicked before. A two-week experiment captures the selectivity dip; a holdout running three months captures the plateau where engagement is lower in volume but higher in quality and retention.

The practical consequence: teams that only run short A/B tests chronically under-ship personalization features. The features look weak in the experiment window and get cut before they compound into durable retention lift.

The SUTVA violation: why your control group is being personalized anyway

The most technically serious problem with holdouts in personalization systems is the violation of the Stable Unit Treatment Value Assumption (SUTVA). SUTVA requires that the potential outcome for any one unit does not depend on the treatment assignment of other units. In a drug trial, whether you receive the treatment should not affect whether your neighbor benefits. In a collaborative filtering system, this assumption fails by design.

Here is the mechanism. Your personalization model — whether a matrix factorization, a two-tower retrieval network, or a graph neural network — is trained on the full interaction corpus. When treatment users interact with personalized recommendations, they generate richer, higher-quality signals: more precise implicit feedback, longer consumption sequences, better negative sampling ground truth. Those signals flow into model retraining, which updates embeddings for all users — including holdout users.

The holdout user's collaborative filtering neighborhood improves because their treatment-arm neighbors are generating better signal. The holdout user gets served content pulled from a better-trained model even though they were never directly treated. Their baseline is not static. It is improving in proportion to how much signal their neighborhood generates in the treatment arm.

The result: your holdout baseline is contaminated upward. The "no personalization" condition is better than true zero-personalization would be, so your measured lift is smaller than the true causal effect. You are not measuring personalization vs. no personalization. You are measuring direct personalization vs. personalization-by-proxy.

The degree of contamination scales with graph density. A music platform where most users share overlapping collaborative filtering neighborhoods will see significant leakage. A product where users have sparse, disjoint preference profiles will see less. For most consumer apps with mature recommendation systems, the spillover is large enough to matter.

Global holdouts vs per-experiment holdouts

There are two structurally different ways to run holdouts, and most teams use only one when they should be running both in parallel.

Per-experiment holdouts are allocated at feature launch. Reserve 5–10% of users as the holdout for experiment X. They experience everything the product normally does except feature X. Run for 6–8 weeks, measure lift, graduate holdout users into treatment. Per-experiment holdouts support iteration speed. They let you ship and roll back quickly. Their weakness: they cannot measure compounding effects across multiple feature launches, and their baseline drifts because holdout users absorb model improvements from other concurrent experiments via spillover.

Global holdouts are a permanent set of users — typically 1–5% of the user base — who receive no personalization indefinitely. They are excluded from all experiments. Their experience represents the pre-personalization baseline. Netflix Engineering has written publicly about permanent holdout cells as the mechanism for measuring the true long-run value of their recommendation stack. A global holdout answers: compared to a product with no ML personalization, what is the compounded value of everything your system does?

Global holdouts are operationally harder to maintain. You must actively suppress feature rollouts for holdout users across every experiment, every release, every model update. You must accept that a small population receives a degraded experience for months or years. And you must resist the organizational pressure to graduate them — because once you graduate them, you lose your baseline forever.

The two-tier approach: use per-experiment holdouts for iteration and feature-level measurement. Maintain a global holdout, locked at 1–3%, for long-run compounding and full-stack value attribution. The global holdout's lift, measured quarterly, justifies infrastructure investment. The per-experiment holdout's lift guides individual feature decisions.

How to size a personalization holdout

Holdout sizing is a tradeoff between measurement power and user experience cost. Standard power calculations apply, with additional constraints specific to personalization systems.

Minimum detectable effect. For most personalization features, a 0.5–2% lift in primary metrics (CTR, D30 retention, engagement depth) is economically meaningful. Power calculations at α=0.05, β=0.20 with effect sizes in that range require roughly 5,000 to 50,000 users per arm depending on metric variance. Low-variance metrics like CTR require less; high-variance metrics like D30 retention require more.

Clustered randomization. Because collaborative filtering creates cross-user spillover, random individual assignment understates your variance and inflates your power estimates. Users who share a dense collaborative filtering neighborhood should be assigned to the same arm. Randomize at the level of graph communities — not individual users. The cost is a larger minimum cluster size; the benefit is cleaner treatment-control separation and less biased lift estimates. Eckles, Karrer, and Ugander (PNAS, 2017) provide the formal framework for estimating peer effects under clustered assignment, including leakage correction methods when perfect clustering is infeasible.

Duration, not just size. A 30-day holdout at 10% is structurally different from a 90-day holdout at 3% even if total user-days are similar. Longer windows let you measure compounding and reduce seasonality confounds. For initial feature measurement, 6–8 weeks at 5–10% is a reasonable starting point. For global holdouts, 1–3% for 90+ days.

Leakage correction. If you cannot cluster cleanly — because your graph is too dense or your user base too small — compute the cross-arm edge density at experiment midpoint: the fraction of holdout users' collaborative filtering neighbors who are in the treatment arm. Use this as a spillover coefficient to adjust your lift estimate upward. A holdout where 40% of each user's neighborhood is in the treatment arm is not measuring zero-personalization; it is measuring approximately 40% indirect personalization, and your lift estimate should reflect that.

Knowledge graph holdouts: the representation drift problem

Standard holdout analysis assumes the model treats holdout and treatment users symmetrically except for the intervention being measured. In a knowledge graph-based personalization system, this symmetry breaks structurally.

When treatment users receive personalized recommendations and act on them — clicking, saving, completing, rating — those interactions write edges and update node attributes in the graph. Their representations update. Their neighborhood density increases. Over 60–90 days, treatment users develop richer graph profiles than holdout users, whose interaction patterns remain closer to the pre-personalization baseline.

Now consider what the holdout user's metrics look like at day 60. They are being served content from a model trained on 60 days of personalization-enriched interactions from the treatment arm. Their own graph node is sparse and stale relative to treatment users at comparable interaction volume. They get the benefit of a better-trained model (spillover) but not the benefit of a better-represented self (direct treatment). The holdout baseline is neither "no personalization" nor "full personalization" — it is a hybrid that is analytically difficult to interpret.

The implication: graph-based systems need to track holdout users' node representation quality separately from treatment users. A useful diagnostic is the mean embedding distance between holdout and treatment users at matching percentiles of interaction volume. If treatment users at the P50 interaction percentile have moved significantly further in embedding space than holdout users at the same percentile, the holdout has drifted from its intended baseline.

At ×marble, we track graph coverage ratio — the fraction of a user's modeled preference space populated with graph edges — separately for holdout and treatment cohorts. When that ratio diverges by more than 15% between arms at the same interaction volume, we flag the experiment and apply a representation-discount correction to the lift estimate.

Survivor bias in long-run holdouts

Long holdouts introduce a second structural bias that runs in the opposite direction from spillover: differential churn. Users who would benefit most from personalization are disproportionately likely to churn from the holdout arm. They came for content discovery, found a degraded experience, and left. The holdout population at day 90 is not the same population as day 1. It is the subset that did not need personalization much in the first place.

This creates a survivorship effect where the holdout baseline looks artificially strong over time — not because holdout users are performing well, but because the users who would have underperformed already churned. Your lift estimate shrinks not because personalization is getting less valuable, but because your holdout is increasingly selected for users who are indifferent to it.

The fix is to anchor analysis on the initial assignment cohort, not the surviving active cohort. Track the day-0 holdout assignment and compute metrics on that full cohort including churned users, assigning a metric value of zero for sessions that never happened. This is standard in survival analysis — Kaplan-Meier estimation applied to retention-adjusted lift — but it is rarely implemented in practice because most experiment tooling defaults to active-user analysis and silently drops churned users from the denominator.

The combination of spillover (which pushes measured lift down) and survivor bias (which also pushes measured lift down after the early period) means that uncorrected long-run holdout estimates are systematically pessimistic. Both effects move in the same direction: they make your personalization look less valuable than it is.

Day-zero personalization and new-user holdout design

For products that use synthetic user clones or prior-transfer for day-zero personalization — serving non-trivial recommendations to brand-new users before they generate any signal — holdout design needs to account for new-user cohorts separately from steady-state users.

A standard holdout is designed around users who already have interaction history. A new user in the holdout arm gets a fallback (popularity-ranked items, editorial picks) rather than cloned priors. A new user in the treatment arm gets synthetic clone recommendations bootstrapped from similar users' preference profiles. The lift from day-zero personalization is the delta between first-session metrics for these two groups.

The measurement window here is short — a few sessions, a few days — so novelty and compounding issues matter less. The main risk is that day-one CTR measures cold-start accuracy, but the economically important outcome is D7 and D30 retention. A user who receives great day-zero personalization may not become a retained user if the experience does not sustain that quality as their profile fills in.

Correct holdout design for cold-start: instrument both first-session CTR (cold-start accuracy) and D30 retention (cold-start durability) as separate primary outcomes. Treat them independently in your analysis. A cold-start feature that wins on CTR but loses on D30 is likely a novelty effect from recommendations that are accurate but not building long-term engagement — or worse, a precision-recall tradeoff where the model is serving obvious, unsurprising content that gets clicked but not remembered.

Where to start: a practical holdout framework for 2026

Given the spillover, representation drift, and survivor bias problems described above, here is how to build holdout infrastructure that actually measures causal personalization lift.

Allocate a permanent 2% global holdout at launch. Never graduate these users. Suppress all personalization for them — recommendations, ranking, search personalization, notification targeting. Measure engagement, retention, and revenue monthly. This is your long-run value attribution cell. The number it produces quarterly is the ROI of your entire personalization stack and should drive infra investment decisions.

Run per-experiment holdouts at 5–10% for 6–8 weeks. Use graph community IDs as your randomization unit, not individual user IDs. Graduate users to treatment at experiment end. At experiment midpoint, compute cross-arm neighborhood overlap and record it alongside your lift estimate.

Instrument your graph with arm-level coverage diagnostics. Track embedding drift between arms weekly. If holdout and treatment users at the same interaction volume percentile diverge beyond a 15% coverage ratio threshold, flag the experiment and apply leakage correction before making ship decisions.

Anchor all retention analysis on the day-0 cohort. Compute metrics on the full holdout assignment cohort including churned users. Do not use active-user denominators for any metric that is materially affected by differential churn. Use survival-adjusted estimators for D30 and D90 retention comparisons.

Separate new-user cohorts from steady-state cohorts. Users who enter during a holdout experiment should be analyzed independently and held consistently in their assigned arm for their full first-30-day window.

Set a quarterly calibration cadence. Every quarter, compute cumulative lift across all shipped features against the global holdout. If the number is growing, you are compounding. If it is flat or declining, you are adding noise. Use that signal to decide where to invest next.

Teams that build this infrastructure typically discover that their measured personalization lift is two to four times higher than what their short A/B tests suggested. That gap is not noise. It is the compounding effect — the thing that makes personalization worth building in the first place — and it only becomes visible when your measurement infrastructure is designed to see it.

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