Geo lift tools

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

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)
LanguageR 4.0.0 or newerR, with a Python portPythonC++ core, Python wrapperPython 3.10 or newer
MethodAugmented synthetic controlBayesian structural time seriesTime Based RegressionTrimmed Match on randomized geo pairsTime-based regression in the docs
Market selectionSimulated ranking of test and control setsYou pick the controlsGreedy search under budget and geo constraintsPairing with cross validation, labeled preliminaryRandom or stratified geo assignment, with geo exclusions
Power analysisPower, MDE and investment per candidateWe found noneThrough the design colabThrough the design colabMDE and R-square per design
ReadoutPercent lift, incremental Y, ATT, p-valueAverage and cumulative effect, posterior probabilityTBR post-analysis colabiROAS with a confidence intervalIncremental effect, usable as Meridian priors
StatusMIT licenseApache-2.0Apache-2.0, archivedApache-2.0, research useApache-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_periods and N: 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.
  • budget and holdout: 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_markets and exclude_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.

ToolShapeColumnsRules
GeoLiftLong table, one row per location per datelocation, date (yyyy-mm-dd), Y, optional covariatesRead with GeoDataRead(); locations with NAs or missing time stamps are dropped
Meridian GeoXLong pandas DataFrame, each date and location pair oncedate, 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_marketsLong pandas DataFramedate, geo, plus a response column you nameThe README example uses daily dates
trimmed_matchOne value per geo pairdelta_response and delta_spend, treatment minus controlComputed from the paired geos after the test
CausalImpactWide matrix or zoo seriesResponse in the first column, each control series in its own columnResponse 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 teamPickWhy
R analysts who want design, power and readout in one packageGeoLiftGeoLiftMarketSelection() returns power, MDE and investment for each candidate
Python team running or planning MeridianMeridian GeoXResults turn into Meridian priors; Python 3.11 or newer covers both libraries
Python team with no MMMMeridian GeoXGo-dark, heavy-up and multi-cell designs from one daily table
A campaign already ran in some regions without a designCausalImpact or tfp-causalimpactIts documentation frames it for when "a randomized experiment is not available"
Statistician running randomized pairs across uneven geostrimmed_matchiROAS with a confidence interval from paired differences
Existing matched_markets notebooksKeep for past reads, design new tests in GeoXThe 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

Frequently asked questions

Is there a Python version of GeoLift?
We found no Python version in the GeoLift README, which lists R 4.0.0 or newer as the requirement and installs from GitHub with the augsynth package. Python teams have three Google options: Meridian GeoX for design and readout, trimmed_match for randomized paired designs, and tfp-causalimpact for reading out a campaign that ran without a design. The matched_markets repository still exists but is archived and read-only.
Does CausalImpact include power analysis for geo tests?
We found no power analysis or sample size tool in the CausalImpact documentation. The package estimates an effect after the fact from a response series and control series the intervention did not touch. Its documentation suggests running CausalImpact() on an imaginary intervention in the pre-period and checking that no significant effect appears. For power and minimum detectable effect, design the test in GeoLift or Meridian GeoX first.
How much history does a geo lift test need?
Meridian GeoX asks for at least 3×N days of daily data, where N is the test length, and a longer history, such as one year or more, when sales are strongly seasonal, so a 28-day test needs 84 days at minimum. GeoLift's best practices page recommends stable history of at least 4 to 5 times the test duration, at least 25 pre-treatment periods across 20 or more geos, and ideally the last 52 weeks, with a test long enough to contain one full purchase cycle.
Is Google's matched_markets package still maintained?
The matched_markets repository on GitHub was archived by its owner on 26 October 2026 and is now read-only. Its README already described it as research code and not an officially supported Google product. Google's current geo experiment library is Meridian GeoX, which uses time-based regression, the method matched_markets was built on, and adds multi-cell designs.
Can Meridian GeoX results calibrate a Meridian model?
Yes. The GeoX README says the library generates ground-truth experiment data used to calibrate marketing mix models, and that it integrates with Meridian by suggesting new experiments based on MMM results. Meridian takes those results as priors. Running GeoX alongside Meridian requires Python 3.11 or newer, while GeoX on its own needs 3.10 or newer.

Free tools for this topic

FREE TOOLAI Brand Visibility MonitorDoes ChatGPT recommend you — or your competitor?CALCULATORROAS & Break-Even CalculatorKnow the ROAS you actually need before you scale.PLAYBOOKThe AI Search PlaybookGet cited by ChatGPT, Perplexity and Google AI Overviews.

Keep reading

GuidesHow to Run a Quarterly Geo-Holdout Test Your CFO Will Actually TrustRead →DataHow to Calibrate a Marketing Mix Model With Geo Lift Test ResultsRead →DataThe Multiplier Method for Calibrating Platform Attribution With Incrementality TestsRead →
CATALIST NEWSLETTER

Monthly dose of growth marketing.

Get marketing tips, narratives, guides, and playbooks delivered to your inbox.

Protected by reCAPTCHA — Google's Privacy Policy and Terms of Service apply.