How to Run a Geo Holdout Test on One Ad Channel
By Joris van Huët
Enterprise Interim CMO & Marketing Leader · 15+ years · 50+ orgs
Published
2026-10-27
The short answer: a geo holdout costs nothing but the sales you forgo in the regions you switch off. That holds when one channel runs nationally and your regions buy in similar patterns. The hard part is choosing which channel to risk first, so let a causal read choose. Causality Engine puts every channel's caused share next to last-click from your GA4 export. The agents page says a gap of more than 25% between the two is where they disagree. The first finding is free on the start page, and the full read is €99 once. Then pick the channel, match test and control regions and pull a pre-period. Switch the ads off in the test regions, wait, and compare the two groups against their gap before the test.
Disclosure: I founded Causality Engine and own it, and this page recommends it. Every claim about it links to Causality Engine's own pages.
Before anything gets switched off:
- Price the test first. For example, a channel spends €3,000 a week across the country, the test regions hold 20% of revenue, and the pause runs four weeks. The spend withheld is €3,000 x 0.20 x 4 = €2,400. The revenue you risk is whatever the channel caused in those regions. That is the number the test exists to find, so the worst case is bounded by the answer.
- Use the regional data already in hand. GA4 records a region for each visit, derived from the IP address, per the Data API schema. The store holds orders by shipping region.
- Fix the readout before the test starts. The answer is the change in the gap between test and control regions, set against the gap they had before the test. Write that down now, so nobody moves the goalposts in week three.
Causality Engine's incrementality page calls a geo holdout rigorous but slow, expensive and fragile when regions are not comparable. All three are true. All three are manageable, one channel at a time.
What you need, and what you get
- In: one channel you can switch off by region, 90 days or more of daily revenue by region, the ad accounts' location settings, and a spreadsheet or the free GeoLift package in R.
- Out: the channel's incremental revenue in the test regions, its incremental ROAS, and an anchor to check later reads against.
Step 1: Choose the channel
The free way: take the channel with the largest spend whose platform ROAS you trust least. The sharper way: read the GA4 export first. The illustrative read on the pricing page shows Paid Social at 22% of credit under last-click and 14% under the engine, with data health 93. Its next step reads "Cut spend a little in one region. Compare revenue after 14 days." That is a holdout proposal with the channel already chosen. Skip any channel under 1% on both methods, since the read calls those too small to act on.
Step 2: Match test and control regions
Regions should move together before the test, week by week. Meta's open-source GeoLift walkthrough asks for three columns: location, date and the KPI. Then it runs a power analysis that picks the test locations, the test duration and the smallest effect the test can detect. GeoLift is free and in R. Its own introduction adds that Meta recommends people-based experiments where they are possible, because they have more statistical power. Without R, a sheet works: pick regions whose share of weekly revenue held steady over the last quarter.
Step 3: Pull the pre-period, with an agent if you like
You need daily purchase revenue by region for at least the last 90 days. Google's experimental Analytics MCP server lets an AI agent run GA4 reports through the Data API with the read-only scope. So the agent can request date, region and purchase revenue and hand back the table. The check that goes with it: a person opens the same date range in GA4 and confirms the agent's total matches. Then they spot-check two regions before any figure enters the test sheet.
Step 4: Switch the channel off in the test regions
In Google Ads, exclude the test regions under location targeting, as Google's location help describes, and set the location option to Presence for the test. The page warns that 100% accuracy is not guaranteed in every situation. In Meta, ad sets take excluded_geo_locations with up to 200 regions, per the targeting reference. Change nothing else: same creative, same budgets in the control regions, no promotion in one group only.
Step 5: Wait the full window
Run for the duration the power analysis gave, or the days the read named (14 or 21 in the illustrative read). Stopping early because week one looks dramatic is how a test produces the number someone wanted.
Step 6: Work out what the channel caused
For example, before the test the test regions booked 25% of what the control regions booked. In the four test weeks the control regions booked €240,000. So with the channel on, the test regions would have booked about €60,000 (240,000 x 0.25). They booked €54,600 with it off. The channel caused €5,400 there (60,000 minus 54,600), on the €2,400 it would have spent. That is an incremental ROAS of 5,400 / 2,400 = 2.25.
That number is an anchor. Not a forecast for the whole country.
Step 7: Put the anchor back into the read
The agents page frames the relationship plainly: the read is observational, a holdout is the anchor, and the read is what runs between anchors. Run a new read after the test, and set the channel's caused share beside your holdout result. If they point the same way, the next question goes to the read. If they split, the next holdout goes to that channel.
What breaks a geo test
- Leaky targeting. Google's location help does not promise exact borders, so some held-out shoppers still see ads, and the measured effect comes out smaller than the real one.
- Missing days. GeoLift drops locations with missing time stamps, per its walkthrough, so fill the gaps before you read the data in.
- Regions that were never alike. Causality Engine's geo testing guide names this first, and no amount of waiting fixes it.
Google recommends the broader Presence or Interest setting for Search, because it reaches people interested in a place as well as people in it. For growing a campaign, fair enough. For a holdout, that extra reach is the seller's volume and your leak. The default that grows a campaign blurs the test, which is why step 4 switches it.
Free first, then the read
The holdout itself is free, and enough on its own for one channel. What it cannot do is cover every channel every quarter without switching half the marketing off. Causality Engine, which I founded, reads the whole GA4 export in 1 to 2 minutes, per how it works, and tells you which channel deserves the next holdout. The first finding is free on the start page. The full read is €99 once, refundable within 30 days, on the pricing page (checked on 27 October 2026). The product is summarised in the Causality Engine entry, and turning a holdout result into revenue per channel is in measuring incremental revenue per channel.
FAQ
How long should a geo holdout run?
As long as the power analysis says your data needs to detect the effect you care about. GeoLift's walkthrough computes it from your own history. The illustrative read on Causality Engine's pricing page names 14 or 21 days for its one-region tests.
Can a platform's own lift study replace this?
It answers a narrower question. Causality Engine's incrementality page points out that a platform lift study is designed and graded by the platform, on its own inventory, and says nothing about the channels around it.
Does a causal read make the holdout unnecessary?
No, and the agents page says so: the read is observational, and the holdout is the anchor it is checked against.
ABOUT THE AUTHOR
I am Joris van Huët, an enterprise interim CMO. 15+ years, 50+ organizations, including ING, P&G, Nestlé, BNP Paribas, WeTransfer and Vinted. I take on innovation projects (venture building, design sprints), agentic marketing (setting up and running AI agents) and hands-on multi-channel work. See the track record.
I wrote and published this with AI assistance, and I answer for it. Claims about my own experience are limited to the track record above, and a statistic links to its source or is labelled as an example. I sell interim and fractional CMO work, which is why this site exists. How this site is written.
A senior operator doing the work: campaigns, channels, CRM and AI agents, live from day one.