Conversion Lift Studies
The question last-click attribution can't answer
Last-click and even multi-touch attribution models measure correlation between exposure and conversion — they can't tell you what would have happened had the ad campaign not run at all. A conversion lift study answers that counterfactual directly: it randomly splits the eligible audience into a treatment group (eligible to see the ads) and a holdout/control group (never shown the ads, or shown a public-service placeholder instead), then compares the actual conversion rate between the two groups. The difference is the campaign's true incremental impact, isolated from the noise of people who would have converted anyway.
Platform-native lift studies (Meta, Google, TikTok)
Major ad platforms offer built-in conversion lift testing — Meta Conversion Lift, Google Ads Conversion Lift, TikTok Lift — which handle the randomization and measurement internally using the platform's own user graph, so advertisers don't need to build custom holdout infrastructure. The tradeoff is that these are single-platform, walled-garden measurements: a Meta lift study tells you Meta's incremental impact, but says nothing about how that interacts with simultaneous Google or TikTok spend, and the methodology (and its biases) is largely opaque to the advertiser.
Statistical power requirements are steep
Geo-based lift testing as an alternative
When individual-level randomization isn't available (e.g. TV, out-of-home, or privacy-constrained channels), geo-lift testing randomizes at the level of a designated market area (DMA) or region instead of a user: some geographies get the campaign, matched control geographies don't, and aggregate conversion or revenue trends are compared between the two groups using synthetic control or difference-in-differences methods. This trades individual-level precision for applicability to channels that can't target individual users at all.
from scipy import stats
def lift_test(treatment_conversions, treatment_n, control_conversions, control_n):
p1 = treatment_conversions / treatment_n
p2 = control_conversions / control_n
lift_pct = (p1 - p2) / p2 * 100
# Two-proportion z-test
p_pool = (treatment_conversions + control_conversions) / (treatment_n + control_n)
se = (p_pool * (1 - p_pool) * (1 / treatment_n + 1 / control_n)) ** 0.5
z = (p1 - p2) / se
p_value = 2 * (1 - stats.norm.cdf(abs(z)))
return {"lift_pct": round(lift_pct, 2), "p_value": round(p_value, 4)}
result = lift_test(
treatment_conversions=1240, treatment_n=98000,
control_conversions=1050, control_n=97500,
)
print(result) # e.g. {'lift_pct': 17.8, 'p_value': 0.0021}Reading a lift study's output correctly
A lift report typically surfaces three numbers: the relative lift (%), the absolute lift (incremental conversions), and cost per incremental conversion (total spend ÷ incremental conversions) — and the third number is usually the most decision-relevant one, since it's directly comparable to your standard CPA and tells you whether the campaign is efficient at buying *incremental* outcomes specifically, not just outcomes in general. A campaign can show a positive lift and still be a poor investment if the cost per incremental conversion far exceeds what the business can profitably pay.
Lift study methods compared
| Method | Randomization unit | Best for |
|---|---|---|
| Platform-native lift (Meta/Google/TikTok) | Individual user | Single-platform digital campaigns with large reach |
| Geo-lift / synthetic control | Geography (DMA/region) | TV, OOH, or privacy-constrained channels |
| Ghost ads / PSA holdout | Individual user, within one platform's auction | Isolating true incrementality within a single auction system |
What's Next?
Lift studies pair naturally with broader incrementality and media-mix work — a single campaign's lift result is a data point that feeds into the larger question of how to allocate budget across channels for maximum incremental return.
I build these systems professionally.
Whether it's a RAG pipeline, analytics migration, or AI workflow — let's talk.