How should a brand measure organic, paid, and experiential together — to feed the year-end model that decides which channel actually drove sales? This chapter is the answer.
Organic counts views. Paid counts impressions. Experiential counts attendance. Each channel has its own definition of “a person was here,” its own attribution story, and its own time-to-stable-numbers. The framework has to respect those differences — not paper over them with a forced common metric.
A view definition varies by platform — TikTok view ≠ Instagram Reel view ≠ Facebook video impression. There is no individual click to tie a booking back to.
Impressions and clicks land in Meta, TikTok, LinkedIn UIs with ROAS already attributed inside the platform. The numbers shift for ~28 days as platforms back-fill conversions.
Attendance, dwell time, lead capture — recorded by the agency producing the event. Reaches an audience the digital stack cannot see, but produces no clickstream.
Every channel writes to the same three columns: date, geography, campaign. Above that spine, three KPI tiers describe each channel in its own native units. One model, three voices.
Three rows from the same day. Same shape, three channels. The exposure_metric column is the only thing that changes — each channel keeps its native unit.
| date | channel | geo | campaign_id | exposure_metric | exposure_value | spend | loaded_at |
|---|---|---|---|---|---|---|---|
| 2024-08-15 | organic_social | west_dma | summer_24 | tiktok_view | 187,432 | NULL | 2024-08-16 |
| 2024-08-15 | paid_social | west_dma | summer_24 | paid_impression | 458,721 | $1,240 | 2024-08-16 |
| 2024-08-15 | experiential | la_zip | summer_launch | attendance | 820 | $24,000 | 2024-08-16 |
Paid platforms update their numbers for weeks after the fact (late conversions, fraud review, re-aggregation). If we overwrite, the past silently changes. We append instead — so we can rebuild yesterday exactly as it looked yesterday.
A TikTok view, an Instagram Reel view, and a paid display impression are not the same unit. Forcing them into one “normalized impression” smuggles a conversion ratio into the data — and the model can never see that the conversion was an assumption, not a measurement. The right answer is we don't reconcile them. They go in as separate variables. The model learns what each unit is worth.
The MMM estimates a separate coefficient for each — “each unit of organic-TT view drives X dollars,” “each paid-Meta impression drives Y dollars.” The units don't need to match. The model handles the difference.
That ratio is an assumption baked into the input data. The model can never see it. If the real ratio shifts (it always does), the MMM's estimates drift in ways nobody can trace. Bad data going into a model is expensive forever.
Models fail on data quality and lack of variation — not on math. Click any month to see what runs that week.
20% DMA holdout, 6-week window. Target hotel-segment brand-lift readout for Q3.
Stand up daily ingestion. Capture 12 months of history. Document the campaign calendar. Note the outside factors that move sales (weather, holidays, competitor launches).
Every activation logged with start, end, geography, spend, creative, channel. Weekly QA on every source.
Staggered launches, geo-rotated dark periods, intentional spend changes. Geo-holdout incrementality tests quarterly.
Brand-lift studies as priors. Pre-register hypotheses with the vendor. Triangulate output against platform attribution.
// fact_marketing_exposure — one row per channel-day-geo-creative date DATE channel ENUM(organic_social, paid_social, experiential) sub_channel VARCHAR // paid_meta, organic_tiktok, experiential_la_popup ... geo VARCHAR // DMA code or zip campaign_id VARCHAR creative_id VARCHAR exposure_metric ENUM(impressions, views, attendance) exposure_value BIGINT spend DECIMAL clicks BIGINT // nullable conversions BIGINT // nullable attributed_revenue DECIMAL // nullable loaded_at TIMESTAMP // snapshot key restated_from DATE // nullable; set when a row updates a prior load
Six asks. If all six are green, the MMM vendor receives a dataset they can actually fit a model on. If any are red, the model will quietly absorb the gap as bias — and nobody will know until the recommendations stop matching reality.
Each channel kept its native unit through the entire pipeline. The model figures out what each unit is worth — no ratios were guessed in advance.
This is what twelve months of pipeline discipline buys: a vendor-ready dataset, a model whose answers come back in the same units the team uses every day, and a quarterly story that anyone in the room can read without a glossary.