GeoLift is Meta's free, open-source R package for running geo experiments properly, and it fixes the weakest part of a DIY geo test: building an honest counterfactual. If geo testing is the accessible incrementality method, GeoLift is the rigorous way to do it.

Here's a walkthrough from market selection to reading the lift, and where it bites.

What GeoLift does differently

A hand-rolled geo test compares test regions to control regions and hopes they're similar. GeoLift uses synthetic control instead: it builds a weighted blend of untreated regions that closely tracks your test regions before the test, then uses that blend as the counterfactual.

That blend is a far better "what would have happened" than any single matched region, which is the whole reason to use the package instead of raw diff-in-diff.

Prepare the data

GeoLift wants a long table: one row per location per time period, with your outcome. You can build exactly that from your GA4 BigQuery export, then read it into R.

install.packages("remotes")
remotes::install_github("facebookincubator/GeoLift")
library(GeoLift)

data <- GeoDataRead(
  data = raw,
  date_id = "date",
  location_id = "region",
  Y_id = "revenue",
  format = "yyyy-mm-dd"
)

Choose markets before you spend

This is the step DIY tests skip and GeoLift makes central. Its power calculator simulates candidate test markets and tells you which ones, and how long, can actually detect a lift worth acting on.

mkt <- GeoLiftMarketSelection(
  data = data,
  treatment_periods = 4,
  N = c(2, 3, 4),
  Y_id = "revenue"
)

You pick a design from its output, then run that exact test in market: turn the channel on in the chosen test regions for the planned number of weeks.

Analyze the result

After the test window, GeoLift estimates the lift against the synthetic control and gives you the incremental effect with a confidence interval and diagnostic plots.

result <- GeoLift(
  Y_id = "revenue",
  data = data,
  locations = c("chicago", "denver"),
  treatment_start_time = 90,
  treatment_end_time = 120
)
summary(result)

Read the interval, not just the point estimate, and look at the plot of test versus synthetic control to sanity-check that the counterfactual actually tracked before the test.

Where it bites

  • Skipping market selection and picking test regions by gut, which throws away GeoLift's biggest advantage.
  • Spillover, where national media or bordering regions leak the treatment into the control pool.
  • Too few or too erratic regions, so no synthetic control tracks well enough to trust.
  • Reading the point estimate while ignoring an interval that comfortably includes zero.

Why the synthetic control matters

The reason to trust GeoLift over eyeballing two similar cities is that no single city is a good twin for another. Denver isn't Chicago, and forcing that comparison bakes in whatever made them differ before you spent a cent.

A synthetic control sidesteps that by blending many untreated regions into one that actually tracked your test regions historically. If the pre-test lines overlap, the counterfactual is credible; if they don't, GeoLift tells you, and you don't run the test.

What you need to run it

  • R, and comfort installing a package from GitHub.
  • Outcome data by region and time, which your GA4 BigQuery export already produces.
  • Enough regions that a synthetic control has raw material to work with, not three or four.
  • A channel you can actually turn on and off geographically.

Cost and honesty

Like any incrementality test, GeoLift costs you the treatment: you spend in the test markets and, in effect, hold the control back. The upside is a causal number with a confidence interval, which no amount of attribution modeling can give you. Run it, read the interval, and let it calibrate the models you lean on the rest of the time.

GeoLift is the rigorous version of the geo test you could hand-roll in BigQuery, and the synthetic control is what makes its counterfactual honest. Use the power calculator to choose markets before you spend, run the test you designed, and read the interval, and you get a causal answer attribution can't give.

Want a stronger data analyst role or a raise? Grab the FREE Product Analyst Playbook and get the exact roadmap to your next offer.