Robyn

Meta's open-source MMM engine, tuned by evolutionary search.

Robyn is Meta's open-source MMM package. It fits a ridge-regression model and searches for the best adstock and saturation parameters using an evolutionary optimizer — which means a single Robyn run actually produces many candidate models (a "Pareto front"), and you pick one to work with after training finishes. It's the fastest of the three engines to get a first result from.

Connecting it

Drag a Robyn node off Period (or directly off Variables).

The Robyn configuration modal
The Robyn configuration modal
Dragging a Robyn node onto the canvas

Basic fields

Field What it controls
Name Optional label for the model.
Country Used for Robyn's built-in holiday calendar when Holiday is on.
Output type Whether your KPI column is revenue-like or a conversion count — affects how contributions and ROI are scaled.
Adstock The decay shape for how a channel's effect carries over after spend stops. Geometric (default) is a single-parameter exponential decay and the standard starting point.

Model components

These are toggles for whether Robyn should model each effect at all:

Field Default What it does
Intercept On Includes a baseline level of the outcome not explained by any channel. Turning it off forces the model to explain everything through the channels you've mapped — rarely what you want.
Trend On Lets the model account for a long-run upward or downward drift in your outcome that isn't caused by any channel.
Seasonality On Accounts for recurring calendar patterns (day-of-week, month-of-year).
Holiday Off Adds Robyn's built-in holiday calendar for the selected country as another baseline factor.

Validation and search budget

Field Default What it controls
Out-of-sample validation Off Holds out the final stretch of your date range and scores the model on data it didn't train on, instead of only on training-set fit. Turn this on if you want a more honest read on how the model would perform on new data.
Train size 0.8 Only used when validation is on — the fraction of the period used for training; the rest becomes the holdout, taken from the end of the range.
Add penalty factor Off An extra ridge-regression penalty term Robyn can search over. Leave off unless you already know you want it — it widens the search space and can slow convergence for a marginal effect.
Iterations 2000 (range 500–10000) How many parameter combinations the optimizer tries per trial. More iterations narrow in on better solutions but take proportionally longer.
Trials 5 (range 1–20) How many independent optimization runs to do. More trials reduce the chance the search gets stuck in a bad local optimum, at the cost of roughly that much more training time.

There's no time estimate shown anywhere in meryn for a run — it depends directly on iterations × trials × the size of your dataset, so any fixed number would be a guess. The progress drawer shows live trial counts instead; see The canvas for how to read it.

Hyperparameter ranges

By default, Robyn searches sensible ranges for each channel's adstock decay and saturation shape automatically. If you know a channel's real-world decay behavior (a TV campaign that lingers for weeks vs. a search ad that doesn't), turn on Custom hyperparameters to override the search range per channel instead of letting Robyn guess from scratch — the sliders are pre-filled with the defaults so you're narrowing, not starting blind.

Calibration (optional)

If you have real lift-test results for one or more channels — an incrementality test, a geo holdout, anything that gives you an actual measured effect — you can feed them in to anchor the model instead of relying purely on the spend/outcome correlation. Add a row per test: channel, date range, spend during that window, and the measured lift. meryn checks each row live against your actual spend data and shows you the implied ROI and any warnings (e.g. tested spend that doesn't match what the dataset shows for that window) before you save.

Calibration is optional and most models never need it — it matters most when you have a channel whose spend barely varies over your date range, which makes it hard for the model to isolate that channel's effect from correlation alone.

After training

A Robyn run produces several candidate solutions on its Pareto front, not one. meryn picks a default automatically (the same selection logic the framework itself recommends), but you can open the model and choose a different one from the Pareto chart if a different tradeoff between fit and model simplicity suits your case better. Changing the solution discards every allocator connected to this model — an allocator optimizes against one specific solution's response curves, so it stops describing the model correctly the moment you pick a different one.

What connects here

Upstream: Period or Variables. Downstream: Budget allocator or Benchmark.

What you get back

Fit quality, contributions by channel, response curves, ROI, and the Pareto front of candidate solutions — all on the model's results page:

The Robyn results page for a trained model
The Robyn results page for a trained model