
When allocation point and exposure point differ
A common issue in A/B testing is when the allocation point does not align with the exposure point. Learn why it matters, how it impacts your a/b tests, and how to address it.

Intent-to-treat analyses everyone by the arm they were assigned to, regardless of what they actually received or whether they engaged. It preserves the randomisation, which is the only thing that makes the comparison causal, at the cost of diluting the measured effect.
ITTIntent-to-treat is a rule about who goes in the analysis: everyone, in the arm they were assigned to, whatever happened next. Users who never opened the app, never reached the changed page, or hit an error that prevented the feature loading all stay in the treatment group. It is the default in clinical trials for good reason and it is the correct default in product experimentation for the same reason.
The reason is that randomisation is the only thing making the two groups comparable, and it applies to assignment rather than to what followed. Once you start removing users on the basis of their behaviour, the groups are no longer the ones randomisation created — they are groups selected on something that may itself depend on the treatment. That is the whole guarantee, and it is discarded the moment an exclusion is made after the fact.
The alternative that tempts everyone is per-protocol analysis: compare only those who actually received the treatment against control. It sounds like it isolates the effect and it reliably inflates it. Users who engaged with a new feature are more engaged in general, and control contains no equivalent self-selected group to compare against — nor can one be constructed after the fact, because the feature does not exist there to select on.
The honest cost of ITT is dilution. If only 15% of assigned users ever reach the changed surface, then 85% of the treatment arm is identical to control and the measured effect is roughly a seventh of the effect on those who encountered it. The estimate is still unbiased for the population effect — it is simply answering "what happens if we deploy this" rather than "what does it do to someone who sees it", and those are different questions with different right answers.
Two legitimate refinements recover sensitivity without breaking the randomisation. Triggered analysis restricts both arms on a pre-treatment event — reaching the page — which is valid provided the trigger cannot be influenced by the treatment; see the exposure point. And the LATE divides the ITT effect by the difference in take-up to recover the effect among those the assignment actually moved. Neither drops users from one arm on the basis of their behaviour, which is the line that must not be crossed.
The estimand, its dilution, and the two valid ways of recovering the effect on those who were actually reached.
ITT = E[ Y | assigned treatment ] − E[ Y | assigned control ]Assigned, not treated. Unbiased because it compares exactly the groups randomisation created.
ITT = effect_on_reached × reach rateA surface reached by 15% of users shows about a seventh of the effect across everyone assigned.
LATE = ITT / ( take-up_treated − take-up_control )Scales the diluted estimate back up to the compliers — see LATE.
restrict both arms on a pre-treatment eventValid only if the trigger cannot respond to the treatment — see the sample size calculator.
A feature is assigned to 120,000 users per arm but lives behind a settings page only some users visit. Three analyses are compared: intent-to-treat, a per-protocol comparison of users who enabled the feature against all control users, and a triggered analysis on settings-page visitors.
ITT and the triggered analysis agree once dilution is accounted for. The per-protocol figure is seven times larger and is not a causal estimate.
The consistency check works: 0.94 × 0.119 = 0.112, which matches the ITT's 0.11 almost exactly, confirming that the triggered analysis is measuring the same effect with less noise rather than a different one. The per-protocol number is the trap. Those 5,940 users chose to enable a retention-relevant feature, which means they were more committed before they clicked anything, and there is no comparable group in control to set against them — control users cannot enable a feature that does not exist for them. The 7.8 points is mostly who those people were. Note also what makes the triggered analysis legitimate here: settings-page visits are near-identical across arms, 14,300 against 14,180, so the treatment is not changing who qualifies. Had the feature's presence drawn more people into settings, even that analysis would have been comparing different populations.

A common issue in A/B testing is when the allocation point does not align with the exposure point. Learn why it matters, how it impacts your a/b tests, and how to address it.


Randomization is one of the cornerstones of AB testing. But why is randomization so important, and how can we achieve it? In this post, we'll address these two key questions. Because without proper randomization, no A/B test can be considered valid.

Applying it to a live measurement problem is the part that goes wrong. If you are designing an experiment, reading a result you do not trust, or trying to work out what your marketing actually caused, that is the work we do.