Open Source Geo Lift Testing Tools Compared on Design, Power and Readout
GeoLift, CausalImpact, matched_markets, trimmed_match and Meridian GeoX compared on method, market selection, power analysis, readout and input layout.
On this page
- How do the five projects compare?
- What GeoLift does before and after the test
- Where do CausalImpact and Matched Markets fit?
- When trimmedmatch is the right call
- Which Python package handles geo experiment design now?
- What input layout does each tool expect?
- One hypothetical dataset through all five
- Which tool fits your team?
- Sources
Open source geo lift testing tools include the five projects compared here, as of 6 November 2026: Meta's GeoLift in R, Google's CausalImpact in R with a Python port, and three Google Python libraries called matched_markets, trimmed_match and Meridian GeoX. Two findings from their repositories change the usual advice. Google archived the matched_markets repository on 26 October 2026, so it is now read-only, and Google's newest geo design code sits in Meridian GeoX, a library whose research paper Google published in 2026. Our pick is GeoLift for an R team that wants market selection, power analysis and readout in one package, and GeoX for a Python team that runs or plans a Meridian model. The broader question all five answer is covered in our guide to what incrementality is.
How do the five projects compare?
Open source geo experiment design and power analysis tools separate quickly on six questions, and every cell below comes from the project's own README or documentation.
| GeoLift (Meta) | CausalImpact (Google) | matched_markets (Google) | trimmed_match (Google) | Meridian GeoX (Google) | |
|---|---|---|---|---|---|
| Language | R 4.0.0 or newer | R, with a Python port | Python | C++ core, Python wrapper | Python 3.10 or newer |
| Method | Augmented synthetic control | Bayesian structural time series | Time Based Regression | Trimmed Match on randomized geo pairs | Time-based regression in the docs |
| Market selection | Simulated ranking of test and control sets | You pick the controls | Greedy search under budget and geo constraints | Pairing with cross validation, labeled preliminary | Random or stratified geo assignment, with geo exclusions |
| Power analysis | Power, MDE and investment per candidate | We found none | Through the design colab | Through the design colab | MDE and R-square per design |
| Readout | Percent lift, incremental Y, ATT, p-value | Average and cumulative effect, posterior probability | TBR post-analysis colab | iROAS with a confidence interval | Incremental effect, usable as Meridian priors |
| Status | MIT license | Apache-2.0 | Apache-2.0, archived | Apache-2.0, research use | Apache-2.0, v1.0.1 |
Two rows deserve a caution. CausalImpact has no design step, so the control markets are your call. The matched_markets and trimmed_match READMEs both carry the line "This is not an officially supported Google product. For research purposes only."
What GeoLift does before and after the test
GeoLift is Meta's open source geo experiment design tool, and its README describes it as "an end-to-end solution to measure Lift at a Geo-level using the latest developments in Synthetic Control Methods." It needs R 4.0.0 or newer, installs from GitHub after the augsynth package, and carries an MIT license.
Power analysis is where it earns its place. The GeoLift walkthrough says "Running a prospective power analysis is fundamental prior to executing a test," and it runs that analysis through GeoLiftMarketSelection(), which simulates tests across the durations, test market counts and effect sizes you pass in. The arguments that shape the answer:
treatment_periodsandN: the test lengths and numbers of test markets to try.effect_size: the lifts to simulate, by default 0 to 25 percent in 5 percent steps.cpic: cost per incremental conversion. At its default of 1, the investment column comes back in incremental units.budgetandholdout: a spend cap, and the smallest and largest share of conversions you will keep away from the campaign.alpha: 0.1 by default, which the walkthrough calls "equivalent to a 90% confidence level."include_marketsandexclude_markets: excluded markets leave the test group and stay in the control pool.
Each candidate returns Power, EffectSize, Average_MDE, Investment and AvgScaledL2Imbalance, a fit score from 0 to 1 where 0 means a perfect pre-period match. The rank column allows ties. In the walkthrough two designs tied, and the author went with Chicago and Portland over 15 days because that selection ran a successful test with a smaller budget. On duration, the walkthrough's rule of thumb is that "the test period can contain at least one full purchase cycle." On history, the GeoLift best practices page recommends stable pre-campaign data of at least 4 to 5 times the test duration, at least 25 pre-treatment periods across 20 or more geos, and a test of at least 15 days on daily data.
GeoLift() then reads out Percent Lift, Incremental Y, the average treatment effect on the treated (ATT) and a p-value. The walkthrough's simulated Chicago and Portland test read 5.4% lift and 4,667 incremental units, and setting the model to Ridge augments the synthetic control to reduce bias. The documentation also carries a multi-cell walkthrough and a page on commuting zones. For spend floors, contamination and cell sizing on a live account, our quarterly geo-holdout guide covers the operating side.
Where do CausalImpact and Matched Markets fit?
Google's Matched Markets and the CausalImpact R package cover opposite ends of a geo experiment: Matched Markets designs it in Python, and CausalImpact estimates the effect in R after the test has run.
The CausalImpact documentation says "This R package implements an approach to estimating the causal effect of a designed intervention on a time series," and it builds a Bayesian structural time-series model from a response series plus controls such as "clicks in non-affected markets." It assumes those controls were untouched by the intervention and that their relationship with the response, as fit in the pre-period, "remains stable throughout the post-period." We found no power analysis or sample size tool in the documentation. Its closest check is a placebo: run CausalImpact() on an imaginary intervention before the real one and expect no significant effect. The summary table gives Average and Cumulative columns for actual, predicted, absolute and relative effect, with a posterior tail-area probability and the posterior probability of a causal effect. Python teams can install tfp-causalimpact, a port built on TensorFlow Probability whose README also says it is "not an officially supported Google product."
Matched Markets is titled "A Time-Based Regression Matched Markets Approach for Designing Geo Experiments." Its README explains that randomization may not produce balanced groups when geos differ, when there are few of them, or when the advertiser fixes certain geos in a group, so a greedy search (Au, 2018) finds the best groups that meet the budget and geo constraints along with the assumptions of Time Based Regression (Kerman, 2017). It ships a design package, a post-analysis package and a colab for each. The repository page now reads "This repository was archived by the owner on Oct 26, 2026. It is now read-only." We would keep it for re-reading past designs and start new ones in GeoX.
When trimmed_match is the right call
Trimmed Match is Google's library for randomized paired geo experiments, and its README states the problem directly: "Unlike the usual A/B tests, in GeoX, the number of geos is usually small," and severe heterogeneity across geos makes traditional regression adjustment less reliable. The estimator (Chen and Au, 2019) reports incremental return on ad spend with a two-sided confidence interval built from paired differences, and a design package marked as a preliminary version pairs geos using Trimmed Match and cross validation (Chen, Longfils and Remy, 2021). Setup asks more of you than the others: a C++ core, the bazel build tool, and a README noting the current version "has been tested with Python 3.7 in Linux." It suits a statistician who can randomize within pairs and has clean spend data for every geo.
Which Python package handles geo experiment design now?
For an open source Python package that handles geo experiment design, power analysis and readout for marketing incrementality, Meridian GeoX is the newest option, and it is also where Google's Meridian geo experiment work lives. The install is pip install --upgrade meridian-geox, and the GeoX README requires Python 3.10 or newer on its own and 3.11 or newer alongside the Meridian MMM, under an Apache-2.0 license. It supports holdback, go-dark and heavy-up designs, plus multi-cell studies that compare several treatment arms with a common control group. The README describes the output as ground-truth experiment data for calibrating MMMs, and says GeoX can suggest new experiments for a Meridian model based on its results.
On power, the GeoX methodology comparison uses geox.compare_designs() to find the configuration with "a higher R-square score or a lower minimum detectable effect (MDE)," and recommends stratified sampling "since it works nicely with TBR and it tends to yield designs with lower variance." The GeoX research paper by Ye, Sinn, Li and Jiao (2026) goes further, naming data-driven stratified sampling, Time-Based Regression, Synthetic Control, Synthetic Difference-in-Differences and a design-aware placebo inference engine. Its abstract claims lower minimum detectable effects and budgets without publishing figures. The documentation pages we read show TBR in their code, so treat the other methods as the paper's description until you see them in the API. Turning a GeoX result into Meridian priors is the workflow in our guide to calibrating an MMM with geo lift results.
What input layout does each tool expect?
The five tools want three different shapes of data, and the documentation is specific about each.
| Tool | Shape | Columns | Rules |
|---|---|---|---|
| GeoLift | Long table, one row per location per date | location, date (yyyy-mm-dd), Y, optional covariates | Read with GeoDataRead(); locations with NAs or missing time stamps are dropped |
| Meridian GeoX | Long pandas DataFrame, each date and location pair once | date, location, conversions, spend (spend_cell_1 and spend_cell_2 for two cells) | Daily only; at least 3×N days of history for an N-day test |
| matched_markets | Long pandas DataFrame | date, geo, plus a response column you name | The README example uses daily dates |
| trimmed_match | One value per geo pair | delta_response and delta_spend, treatment minus control | Computed from the paired geos after the test |
| CausalImpact | Wide matrix or zoo series | Response in the first column, each control series in its own column | Response may contain NAs, covariates may not |
The walkthrough's minimum for GeoLift is that "Every GeoLift experiment should contain at least these three variables that reflect when, where, and how much of the KPI was measured." The GeoX pretest data page is stricter on grain: "GeoX strictly requires daily time-series and weekly data isn't supported." It also tells you to avoid metrics that can go negative, such as net revenue after refunds.
One hypothetical dataset through all five
Hypothetical, for illustration only: an ecommerce brand holds 120 days of daily orders and daily paid social spend for 30 markets and plans a 28-day go-dark test.
- Meridian GeoX needs at least 3 × 28 = 84 days of daily history, so 120 days clears the minimum. If sales swing hard by season, the pretest page asks for a longer history, "such as one year or more."
- GeoLift takes the same long table with the columns renamed to location, date and Y, and 120 days sits inside its best practice of 4 to 5 times a 28-day test (112 to 140 days). If customers reorder every 45 days (our assumption), a 28-day window misses a full purchase cycle, and a 45-day test would call for 180 to 225 days of history.
- matched_markets takes the long table nearly as is, with geo in place of location and orders as the response column.
- trimmed_match needs the 30 markets set into 15 pairs and randomized within each pair, then 15 delta_response and 15 delta_spend values once the test ends.
- CausalImpact needs a pivot, with summed orders of the test markets as the first column and each control market's orders in its own column, with no gaps in the controls.
Keep the long table as the system of record and generate the other shapes from it.
Which tool fits your team?
| Your team | Pick | Why |
|---|---|---|
| R analysts who want design, power and readout in one package | GeoLift | GeoLiftMarketSelection() returns power, MDE and investment for each candidate |
| Python team running or planning Meridian | Meridian GeoX | Results turn into Meridian priors; Python 3.11 or newer covers both libraries |
| Python team with no MMM | Meridian GeoX | Go-dark, heavy-up and multi-cell designs from one daily table |
| A campaign already ran in some regions without a design | CausalImpact or tfp-causalimpact | Its documentation frames it for when "a randomized experiment is not available" |
| Statistician running randomized pairs across uneven geos | trimmed_match | iROAS with a confidence interval from paired differences |
| Existing matched_markets notebooks | Keep for past reads, design new tests in GeoX | The repository is read-only since 26 October 2026 |
A readout earns its keep once it moves a number someone budgets with. Lift results can correct platform-reported conversions through the multiplier method, or sit in an MMM as priors. If you want a second pair of eyes on a design before spend moves, our data analytics team works on measurement like this, and the Attribution Doctor is a further resource on the attribution side of the same question.
Sources
- GeoLift README, Meta
- GeoLift Walkthrough, Meta
- GeoLift Best Practices, Meta
- CausalImpact documentation, Google
- tfp-causalimpact README, Google
- matched_markets README, Google
- trimmed_match README, Google
- Meridian GeoX README, Google
- Compare methodologies, Meridian GeoX, Google
- Prepare your pretest data, Meridian GeoX, Google
- Meridian GeoX research paper, Google Research
