The Variables node is the translation layer between your raw CSV and every model. Nothing about your data is assumed — you tell meryn, column by column, what role each one plays.
Connecting it
Drag a Variables node off a Dataset. The modal lists every column from the file and asks you to assign each one a role from a dropdown.

Column roles
| Role | What it means |
|---|---|
| Date | The time column. Exactly one column needs this role. |
| Output (KPI) | What you're modeling — revenue, conversions, whatever the model should explain. Exactly one column. |
| Paid Media (Online) | A channel you spend on, tracked digitally (search, social, display...). |
| Paid Media (Offline) | A channel you spend on that isn't digitally tracked (TV, radio, out-of-home...). |
| Organic | Something that drives outcomes without direct spend — organic search, email to an owned list, PR. |
| Contextual | Anything else that affects the outcome but isn't media at all — price, promotions, weather, seasonality drivers you already have as a column. Robyn and PyMC treat this as a plain covariate; Meridian calls the same idea "non-media." |
| Controls (Meridian only) | A covariate Meridian should adjust for statistically without treating it as a channel to attribute contribution to. |
| Geo / Population (Meridian only) | Geography and population columns for a geo-level dataset. Not supported yet — see the note below. |
| (blank / "— skip —") | Excludes the column entirely. Use this for IDs, notes, or anything not relevant to the model. |
Organic and Contextual both become ordinary covariates for Robyn and PyMC — those two engines don't have a separate concept of "organic media" the way Meridian does. That means a channel-by-channel comparison between Meridian and the other two engines won't line up perfectly for anything mapped as Organic; keep that in mind when you're deciding where a borderline column belongs.
Geo-level data (Geo, Population) isn't used yet. If you map columns
to those roles, meryn accepts the mapping but every engine currently trains
on national-level data and ignores them — you'll see a note about it in the
run log. If your data is geo-level, aggregate it to national totals before
uploading for now.
Date range
meryn reads your Date column and shows the range it found — that becomes the
range Period starts from. If a sample of your date
values doesn't look like YYYY-MM-DD, you'll see a warning right here,
before you've built anything downstream: catching an ambiguous date format
at this step is much cheaper than discovering it after a model finishes
training on the wrong window.
Editing a mapping
Unlike most nodes, Variables is edited in place rather than discard-and-reconfigure — the same mapping can be shared by more than one model on the canvas, so replacing it outright would be heavier-handed than necessary. If any model has already been trained from this mapping, the modal tells you how many before you save, since changing column roles means those models no longer describe the data the same way and effectively need retraining.
What connects here
Upstream: a Dataset. Downstream: a Period node, or directly to EDA / a model node, which uses the mapping's full date range.