How do you check whether ads cannibalized organic?
Estimate how many paid installs would have arrived organically, then correct ROAS.
Related resources
Estimate how many paid installs would have arrived organically, then correct ROAS.
Related resources
Some installs attributed to paid ads would have arrived organically anyway. Without measuring and correcting for this, ROAS is overestimated.
Cannibalization is paid advertising eating into organic installs. The two standard ways to measure true incremental installs are (1) Geo Holdout experiments and (2) Causal Impact modeling. Large ad channels need an incrementality measurement once a quarter.
The share of observed paid installs that is truly incremental: iROAS = incremental_revenue / cost. The wider the gap between regular ROAS and iROAS, the higher the cannibalization share.
| Metric | Definition | How measured |
|---|---|---|
| Apparent ROAS | ROAS from network attribution | Regular Adjust reports |
| Incremental ROAS | Only revenue that wouldn't exist without the ad | GeoX or Holdout |
| Carbon Tax | Cannibalization share | 1 - (iROAS / ROAS) |
incremental = treatment - control_baseline{
"experiment_name": "meta_aap_geox_2026_q2",
"duration_days": 28,
"treatment_geo": ["KR-Seoul", "KR-Busan", "KR-Incheon"],
"control_geo": ["KR-Daegu", "KR-Daejeon", "KR-Gwangju"],
"metric_primary": "d7_revenue_per_user",
"metric_secondary": "install_count",
"min_detectable_lift": 0.05,
"alpha": 0.05,
"power": 0.80
}
Where GeoX turns ads off by region, Holdout excludes a share of users from ad exposure. It's the fallback when GeoX is impossible in single-region operations (e.g. Korea only). Meta, Google, and TikTok all offer campaign-level holdouts.
| Network | Feature name | Holdout share | Analysis unit |
|---|---|---|---|
| Meta | Conversion Lift / Brand Lift | 10% / 20% / 30% | User level (FB ID) |
| Conversion Lift Study | 10% / 50% | Google account level | |
| TikTok | Lift Studies | 10%–50% flexible | Advertising ID level |
| AppLovin | Incrementality Test | Campaign-level OFF | Geo + device ID |
A holdout group that's too small can't reach statistical significance. In general:
{
"study_name": "meta_aap_holdout_2026_q2",
"objective": "incremental_purchase",
"test_groups": [
{ "name": "test", "split": 0.70, "exposure": "ads_on" },
{ "name": "control", "split": 0.30, "exposure": "ads_off" }
],
"duration_days": 28,
"primary_metric": "d7_revenue_per_user",
"secondary_metric": "purchase_count",
"minimum_detectable_lift": 0.05,
"alpha": 0.05,
"expected_p_value_threshold": 0.05
}
| Condition | Recommended | Why |
|---|---|---|
| Single country/region operation | Holdout | GeoX can't split regions |
| Multi-country + brand awareness campaigns | GeoX | User-level exposure leaks |
| Large campaigns, 5000+ installs/day | Holdout | User-level power is sufficient |
| Small campaigns under 1000 installs/day | GeoX or Causal Impact | Holdout lacks power |
| Brands with heavy TV/OOH offline media | GeoX | Offline exposure contaminates user level |
| Goal is per-network incremental comparison | Holdout | Simultaneous per-network experiments possible |
{
"as_of": "2026-05-01",
"media_lift_factors": {
"Meta_UA": { "apparent_roas": 1.85, "lift": 0.75, "iroas": 1.39 },
"Google_UAC": { "apparent_roas": 2.10, "lift": 0.68, "iroas": 1.43 },
"TikTok": { "apparent_roas": 1.60, "lift": 0.82, "iroas": 1.31 },
"ASA_Brand": { "apparent_roas": 4.20, "lift": 0.35, "iroas": 1.47 },
"ASA_Generic": { "apparent_roas": 1.95, "lift": 0.78, "iroas": 1.52 }
},
"decision": "Scale ASA_Generic first; hold ASA_Brand at current share"
}
Brand awareness campaigns leak into other regions (TV, out-of-home). GeoX only isolates digital channels. Mass brand campaigns need a separate holdout window (nationwide OFF).
Below roughly 5,000 installs/week or $50,000+/week revenue, significance is hard to reach. For small campaigns use Causal Impact (time-series modeling) instead of GeoX.
Don't misread this — turning ads off doesn't zero out revenue. Organic, returning users, and other networks keep baseline revenue flowing. The true effect is the gap: incremental = test_revenue − control_revenue.
Reallocate budget by iROAS. Never fully kill a low-Lift-Factor network (e.g. ASA Brand at 0.35) — brand keywords also block competitor intrusion, a value beyond ROI. Adjust the share instead.