[{"data":1,"prerenderedAt":834},["ShallowReactive",2],{"article-alternates":3,"article-\u002Fen\u002Fmarketing\u002Fmmm-incrementality-attribution-setup-2026":13},{"i18nKey":4,"paths":5},"marketing-004-2026-06",{"de":6,"en":7,"es":8,"fr":9,"it":10,"ru":11,"tr":12},"\u002Fde\u002Fmarketing\u002Fmmm-incrementalitaet-2026-attribution-setup","\u002Fen\u002Fmarketing\u002Fmmm-incrementality-attribution-setup-2026","\u002Fes\u002Fmarketing\u002Fmmm-incrementality-setup-2026","\u002Ffr\u002Fmarketing\u002Fmmm-incrementalite-2026-attribution-setup","\u002Fit\u002Fmarketing\u002Fmmm-incrementality-2026-attribution-setup","\u002Fru\u002Fmarketing\u002Fmmm-incrementalnost-2026-attribution-setup","\u002Ftr\u002Fmarketing\u002Fmmm-incrementality-2026nin-attribution-setupi",{"_path":7,"_dir":14,"_draft":15,"_partial":15,"_locale":16,"title":17,"description":18,"publishedAt":19,"modifiedAt":19,"category":20,"i18nKey":4,"tags":21,"readingTime":27,"author":28,"body":29,"_type":828,"_id":829,"_source":830,"_file":831,"_stem":832,"_extension":833},"marketing",false,"","MMM + Incrementality: Your 2026 Attribution Stack","Robyn, Meta Lift, geo experiments — which method, when? A practical decision tree for post-cookie attribution.","2026-06-04","ppc",[22,23,24,25,26],"mmm","incrementality","attribution","robyn","geo-test",8,"Roibase",{"type":30,"children":31,"toc":814},"root",[32,40,47,52,57,62,68,73,82,127,135,154,162,180,196,202,207,214,226,234,257,267,272,280,298,306,324,330,335,343,366,374,392,397,405,423,430,448,454,459,612,620,663,668,674,684,694,704,714,724,730,735,798,803,809],{"type":33,"tag":34,"props":35,"children":36},"element","p",{},[37],{"type":38,"value":39},"text","80% of cookie tracking is gone. Multi-Touch Attribution (MTA) is no longer reliable. Platform dashboards contradict each other. In 2026, marketers measure contribution using two complementary methods: Marketing Mix Modeling (MMM) and incrementality testing. The problem: few know when to use which. This article shows where to place Robyn (Meta's open-source MMM library), Meta Lift API, and geo-based holdout tests in the same setup.",{"type":33,"tag":41,"props":42,"children":44},"h2",{"id":43},"last-touch-attribution-is-deadbut-what-replaces-it",[45],{"type":38,"value":46},"Last-touch attribution is dead—but what replaces it?",{"type":33,"tag":34,"props":48,"children":49},{},[50],{"type":38,"value":51},"Google Analytics 4 claims \"data-driven attribution.\" Meta says \"modeled conversions.\" TikTok reports its own numbers. All three differ. In 2025, an e-commerce brand spending $100 sees 8 conversions in GA4, 12 in Meta, and 6 in TikTok. Which channel actually works? Last-touch attribution can't answer because users pass through multiple touchpoints and each platform self-credits.",{"type":33,"tag":34,"props":53,"children":54},{},[55],{"type":38,"value":56},"Marketing Mix Modeling solves this differently: it treats channels as independent variables, sales or revenue as the dependent variable, and uses regression to calculate each channel's marginal contribution. Incrementality tests are more direct: expose one group to a channel, withhold it from another, measure the difference. Both break the last-touch illusion, but their use cases don't overlap.",{"type":33,"tag":34,"props":58,"children":59},{},[60],{"type":38,"value":61},"The difference is scale: MMM is macro (long-term, all channels), incrementality is micro (short-term, specific campaign or channel). By 2026, combining both is standard practice.",{"type":33,"tag":41,"props":63,"children":65},{"id":64},"mmm-weekly-regression-setup-with-robyn",[66],{"type":38,"value":67},"MMM: Weekly regression setup with Robyn",{"type":33,"tag":34,"props":69,"children":70},{},[71],{"type":38,"value":72},"Meta's Robyn library is the Facebook Marketing Science team's open-source MMM framework. It runs in R, uses Bayesian ridge regression, and auto-fits adstock (lagged effect) and saturation (diminishing returns) curves. At weekly granularity, it outputs each channel's (TV, display, paid social, SEO, email) percentage contribution to sales.",{"type":33,"tag":34,"props":74,"children":75},{},[76],{"type":33,"tag":77,"props":78,"children":79},"strong",{},[80],{"type":38,"value":81},"Robyn's 4 setup components:",{"type":33,"tag":83,"props":84,"children":85},"ol",{},[86,97,107,117],{"type":33,"tag":87,"props":88,"children":89},"li",{},[90,95],{"type":33,"tag":77,"props":91,"children":92},{},[93],{"type":38,"value":94},"Data gathering:",{"type":38,"value":96}," Minimum 1.5 years of weekly data. One row per week. Columns: spend per channel, impressions or clicks; independent variables (price, inventory, seasonality); dependent variable (revenue, orders, conversions). Missing data breaks the model.",{"type":33,"tag":87,"props":98,"children":99},{},[100,105],{"type":33,"tag":77,"props":101,"children":102},{},[103],{"type":38,"value":104},"Hyperparameter tuning:",{"type":38,"value":106}," Robyn searches adstock decay (α) and saturation shape (γ) for each channel, running 2000+ model combinations and suggesting the best 5–10 from the Pareto frontier. This step takes 10–30 minutes on 64 cores.",{"type":33,"tag":87,"props":108,"children":109},{},[110,115],{"type":33,"tag":77,"props":111,"children":112},{},[113],{"type":38,"value":114},"Model selection:",{"type":38,"value":116}," Pick the model with lowest NRMSE (Normalized Root Mean Squared Error) plus highest decomp.rssd (decomposition stability). Output: each channel's percentage contribution to total sales, estimated ROI, optimal spend allocation.",{"type":33,"tag":87,"props":118,"children":119},{},[120,125],{"type":33,"tag":77,"props":121,"children":122},{},[123],{"type":38,"value":124},"Budget allocation:",{"type":38,"value":126}," Robyn's \"budget allocator\" function redistributes total budget to equalize each channel's marginal ROI. Use this output for next quarter's plan.",{"type":33,"tag":34,"props":128,"children":129},{},[130],{"type":33,"tag":77,"props":131,"children":132},{},[133],{"type":38,"value":134},"When to use Robyn:",{"type":33,"tag":136,"props":137,"children":138},"ul",{},[139,144,149],{"type":33,"tag":87,"props":140,"children":141},{},[142],{"type":38,"value":143},"Cross-channel budget decisions (e.g., Q3 planning)",{"type":33,"tag":87,"props":145,"children":146},{},[147],{"type":38,"value":148},"New channel addition\u002Fremoval simulation",{"type":33,"tag":87,"props":150,"children":151},{},[152],{"type":38,"value":153},"Long-term trend analysis (6+ months)",{"type":33,"tag":34,"props":155,"children":156},{},[157],{"type":33,"tag":77,"props":158,"children":159},{},[160],{"type":38,"value":161},"When NOT to use Robyn:",{"type":33,"tag":136,"props":163,"children":164},{},[165,170,175],{"type":33,"tag":87,"props":166,"children":167},{},[168],{"type":38,"value":169},"In-campaign optimization (periods under 2 weeks)",{"type":33,"tag":87,"props":171,"children":172},{},[173],{"type":38,"value":174},"Platform-specific creative decisions (MMM can't detect creative differences)",{"type":33,"tag":87,"props":176,"children":177},{},[178],{"type":38,"value":179},"Real-time bidding feedback (weekly lag)",{"type":33,"tag":34,"props":181,"children":182},{},[183,185,194],{"type":38,"value":184},"Roibase integrates Robyn in its ",{"type":33,"tag":186,"props":187,"children":191},"a",{"href":188,"rel":189},"https:\u002F\u002Fwww.roibase.com.tr\u002Fen\u002Fdijitalpazarlama",[190],"nofollow",[192],{"type":38,"value":193},"Digital Marketing",{"type":38,"value":195}," service: we connect GA4, server-side GTM, Meta CAPI, and BigQuery, build a weekly ETL pipeline, and visualize model output in Data Studio.",{"type":33,"tag":41,"props":197,"children":199},{"id":198},"incrementality-tests-meta-lift-and-geo-based-holdout",[200],{"type":38,"value":201},"Incrementality tests: Meta Lift and geo-based holdout",{"type":33,"tag":34,"props":203,"children":204},{},[205],{"type":38,"value":206},"MMM answers \"how much?\" Incrementality answers \"does it really work?\" Two different questions. If you spend $100K on Meta and get 120 conversions, is that \"good\"? MMM says \"Meta captures 15% of budget, drives 12% of sales.\" But how many of those conversions would have happened anyway (organic)? That's where incrementality testing comes in.",{"type":33,"tag":208,"props":209,"children":211},"h3",{"id":210},"meta-conversion-lift",[212],{"type":38,"value":213},"Meta Conversion Lift",{"type":33,"tag":34,"props":215,"children":216},{},[217,219,224],{"type":38,"value":218},"Meta Lift API measures the ",{"type":33,"tag":77,"props":220,"children":221},{},[222],{"type":38,"value":223},"true impact",{"type":38,"value":225}," of Facebook and Instagram ads. How? It withholds the campaign from a small holdout group, shows it to others, and measures the difference 7–14 days later. The difference = incremental conversions.",{"type":33,"tag":34,"props":227,"children":228},{},[229],{"type":33,"tag":77,"props":230,"children":231},{},[232],{"type":38,"value":233},"Setup:",{"type":33,"tag":136,"props":235,"children":236},{},[237,242,247,252],{"type":33,"tag":87,"props":238,"children":239},{},[240],{"type":38,"value":241},"Open a Lift study before campaign launch (Ads Manager > Measure & Report > Conversion Lift)",{"type":33,"tag":87,"props":243,"children":244},{},[245],{"type":38,"value":246},"Holdout rate is 5–10% (too small = noise, too large = impression loss)",{"type":33,"tag":87,"props":248,"children":249},{},[250],{"type":38,"value":251},"Test runs at least 7 days (shorter = low statistical power)",{"type":33,"tag":87,"props":253,"children":254},{},[255],{"type":38,"value":256},"Output: incremental conversions, incremental CPA, confidence interval",{"type":33,"tag":34,"props":258,"children":259},{},[260,265],{"type":33,"tag":77,"props":261,"children":262},{},[263],{"type":38,"value":264},"Example result interpretation:",{"type":38,"value":266},"\nControl group: 1,000 people, 40 conversions\nTest group: 9,000 people, 450 conversions\nIncremental conversions = (450\u002F9,000 − 40\u002F1,000) × 9,000 = 90\nLift = 90 \u002F (450 − 90) = 25%",{"type":33,"tag":34,"props":268,"children":269},{},[270],{"type":38,"value":271},"So of the 450 conversions the campaign saw, only 90 were truly from the ad. The rest would have happened anyway. Incremental CPA = spend \u002F 90. This number is 30–60% higher than MTA—because it's real.",{"type":33,"tag":34,"props":273,"children":274},{},[275],{"type":33,"tag":77,"props":276,"children":277},{},[278],{"type":38,"value":279},"When to use Meta Lift:",{"type":33,"tag":136,"props":281,"children":282},{},[283,288,293],{"type":33,"tag":87,"props":284,"children":285},{},[286],{"type":38,"value":287},"A\u002FB testing new campaigns or creatives",{"type":33,"tag":87,"props":289,"children":290},{},[291],{"type":38,"value":292},"Platform decisions (Meta vs. Google vs. TikTok—which is more incremental?)",{"type":33,"tag":87,"props":294,"children":295},{},[296],{"type":38,"value":297},"Measuring retargeting's true contribution (common issue: retargeting always looks cheap but 80% would convert anyway)",{"type":33,"tag":34,"props":299,"children":300},{},[301],{"type":33,"tag":77,"props":302,"children":303},{},[304],{"type":38,"value":305},"Drawback:",{"type":33,"tag":136,"props":307,"children":308},{},[309,314,319],{"type":33,"tag":87,"props":310,"children":311},{},[312],{"type":38,"value":313},"Only works on Meta (Google has Display & Video 360, but limited)",{"type":33,"tag":87,"props":315,"children":316},{},[317],{"type":38,"value":318},"Creating a holdout group causes impression loss (revenue dips short-term)",{"type":33,"tag":87,"props":320,"children":321},{},[322],{"type":38,"value":323},"Minimum 1-week test period—not suitable for daily decisions",{"type":33,"tag":208,"props":325,"children":327},{"id":326},"geo-based-experiments-geographic-holdout",[328],{"type":38,"value":329},"Geo-based experiments (geographic holdout)",{"type":33,"tag":34,"props":331,"children":332},{},[333],{"type":38,"value":334},"For non-Meta channels (Google, TikTok, TV), run geo tests: activate campaigns in some cities, leave others untouched, measure the sales difference. Academically, this is the cleanest incremental measurement because no user-level manipulation.",{"type":33,"tag":34,"props":336,"children":337},{},[338],{"type":33,"tag":77,"props":339,"children":340},{},[341],{"type":38,"value":342},"Example setup:",{"type":33,"tag":136,"props":344,"children":345},{},[346,351,356,361],{"type":33,"tag":87,"props":347,"children":348},{},[349],{"type":38,"value":350},"Select 30 cities (similar population, economic profile)",{"type":33,"tag":87,"props":352,"children":353},{},[354],{"type":38,"value":355},"Launch Google Ads campaign in 15, keep 15 as control (randomize)",{"type":33,"tag":87,"props":357,"children":358},{},[359],{"type":38,"value":360},"Wait 4 weeks",{"type":33,"tag":87,"props":362,"children":363},{},[364],{"type":38,"value":365},"Compare city-level conversions in Google Analytics 4",{"type":33,"tag":34,"props":367,"children":368},{},[369],{"type":33,"tag":77,"props":370,"children":371},{},[372],{"type":38,"value":373},"Analysis:",{"type":33,"tag":136,"props":375,"children":376},{},[377,382,387],{"type":33,"tag":87,"props":378,"children":379},{},[380],{"type":38,"value":381},"Treated cities: average 120 conversions\u002Fcity",{"type":33,"tag":87,"props":383,"children":384},{},[385],{"type":38,"value":386},"Control cities: average 95 conversions\u002Fcity",{"type":33,"tag":87,"props":388,"children":389},{},[390],{"type":38,"value":391},"Incremental lift: (120 − 95) \u002F 95 = 26.3%",{"type":33,"tag":34,"props":393,"children":394},{},[395],{"type":38,"value":396},"Extrapolate this 26.3% lift nationally. If Google Ads spend is $200K, calculate incremental revenue and incremental ROAS.",{"type":33,"tag":34,"props":398,"children":399},{},[400],{"type":33,"tag":77,"props":401,"children":402},{},[403],{"type":38,"value":404},"When to use geo tests:",{"type":33,"tag":136,"props":406,"children":407},{},[408,413,418],{"type":33,"tag":87,"props":409,"children":410},{},[411],{"type":38,"value":412},"Measuring each channel's net contribution in a multi-channel setup",{"type":33,"tag":87,"props":414,"children":415},{},[416],{"type":38,"value":417},"Assessing non-digital channels (TV, OOH, podcasts)",{"type":33,"tag":87,"props":419,"children":420},{},[421],{"type":38,"value":422},"You don't trust platform dashboards",{"type":33,"tag":34,"props":424,"children":425},{},[426],{"type":33,"tag":77,"props":427,"children":428},{},[429],{"type":38,"value":305},{"type":33,"tag":136,"props":431,"children":432},{},[433,438,443],{"type":33,"tag":87,"props":434,"children":435},{},[436],{"type":38,"value":437},"Too few cities = low statistical power (minimum 20 cities)",{"type":33,"tag":87,"props":439,"children":440},{},[441],{"type":38,"value":442},"Geographic heterogeneity skews results (Istanbul ≠ Şanlıurfa)",{"type":33,"tag":87,"props":444,"children":445},{},[446],{"type":38,"value":447},"Slow (4–8 weeks)",{"type":33,"tag":41,"props":449,"children":451},{"id":450},"decision-tree-which-method-when",[452],{"type":38,"value":453},"Decision tree: which method, when?",{"type":33,"tag":34,"props":455,"children":456},{},[457],{"type":38,"value":458},"Organize all three methods in one setup like this:",{"type":33,"tag":460,"props":461,"children":462},"table",{},[463,492],{"type":33,"tag":464,"props":465,"children":466},"thead",{},[467],{"type":33,"tag":468,"props":469,"children":470},"tr",{},[471,477,482,487],{"type":33,"tag":472,"props":473,"children":474},"th",{},[475],{"type":38,"value":476},"Scenario",{"type":33,"tag":472,"props":478,"children":479},{},[480],{"type":38,"value":481},"Method",{"type":33,"tag":472,"props":483,"children":484},{},[485],{"type":38,"value":486},"Frequency",{"type":33,"tag":472,"props":488,"children":489},{},[490],{"type":38,"value":491},"Output",{"type":33,"tag":493,"props":494,"children":495},"tbody",{},[496,520,543,566,589],{"type":33,"tag":468,"props":497,"children":498},{},[499,505,510,515],{"type":33,"tag":500,"props":501,"children":502},"td",{},[503],{"type":38,"value":504},"Quarterly budget allocation",{"type":33,"tag":500,"props":506,"children":507},{},[508],{"type":38,"value":509},"Robyn MMM",{"type":33,"tag":500,"props":511,"children":512},{},[513],{"type":38,"value":514},"Every 3 months",{"type":33,"tag":500,"props":516,"children":517},{},[518],{"type":38,"value":519},"Channel ROI, optimal spend",{"type":33,"tag":468,"props":521,"children":522},{},[523,528,533,538],{"type":33,"tag":500,"props":524,"children":525},{},[526],{"type":38,"value":527},"New campaign test (Meta\u002FInstagram)",{"type":33,"tag":500,"props":529,"children":530},{},[531],{"type":38,"value":532},"Meta Lift",{"type":33,"tag":500,"props":534,"children":535},{},[536],{"type":38,"value":537},"Per major campaign",{"type":33,"tag":500,"props":539,"children":540},{},[541],{"type":38,"value":542},"Incremental CPA",{"type":33,"tag":468,"props":544,"children":545},{},[546,551,556,561],{"type":33,"tag":500,"props":547,"children":548},{},[549],{"type":38,"value":550},"Cross-channel incrementality",{"type":33,"tag":500,"props":552,"children":553},{},[554],{"type":38,"value":555},"Geo-based holdout",{"type":33,"tag":500,"props":557,"children":558},{},[559],{"type":38,"value":560},"Every 6 months",{"type":33,"tag":500,"props":562,"children":563},{},[564],{"type":38,"value":565},"Channel-level true lift",{"type":33,"tag":468,"props":567,"children":568},{},[569,574,579,584],{"type":33,"tag":500,"props":570,"children":571},{},[572],{"type":38,"value":573},"Creative refresh decision",{"type":33,"tag":500,"props":575,"children":576},{},[577],{"type":38,"value":578},"Meta Lift + CRO analysis",{"type":33,"tag":500,"props":580,"children":581},{},[582],{"type":38,"value":583},"Monthly",{"type":33,"tag":500,"props":585,"children":586},{},[587],{"type":38,"value":588},"Which creative is incremental",{"type":33,"tag":468,"props":590,"children":591},{},[592,597,602,607],{"type":33,"tag":500,"props":593,"children":594},{},[595],{"type":38,"value":596},"Real-time bidding",{"type":33,"tag":500,"props":598,"children":599},{},[600],{"type":38,"value":601},"Platform API (ROAS feedback)",{"type":33,"tag":500,"props":603,"children":604},{},[605],{"type":38,"value":606},"Daily",{"type":33,"tag":500,"props":608,"children":609},{},[610],{"type":38,"value":611},"Tactic-level optimization",{"type":33,"tag":34,"props":613,"children":614},{},[615],{"type":33,"tag":77,"props":616,"children":617},{},[618],{"type":38,"value":619},"Practical workflow:",{"type":33,"tag":83,"props":621,"children":622},{},[623,633,643,653],{"type":33,"tag":87,"props":624,"children":625},{},[626,631],{"type":33,"tag":77,"props":627,"children":628},{},[629],{"type":38,"value":630},"Weekly:",{"type":38,"value":632}," Monitor platform dashboards (MTA-like, but don't trust them)",{"type":33,"tag":87,"props":634,"children":635},{},[636,641],{"type":33,"tag":77,"props":637,"children":638},{},[639],{"type":38,"value":640},"Monthly:",{"type":38,"value":642}," Test big campaigns with Meta Lift",{"type":33,"tag":87,"props":644,"children":645},{},[646,651],{"type":33,"tag":77,"props":647,"children":648},{},[649],{"type":38,"value":650},"Quarterly:",{"type":38,"value":652}," Model all channels with Robyn, redistribute budget based on long-term contribution",{"type":33,"tag":87,"props":654,"children":655},{},[656,661],{"type":33,"tag":77,"props":657,"children":658},{},[659],{"type":38,"value":660},"Twice yearly:",{"type":38,"value":662}," Validate each channel's true lift with geo-based tests",{"type":33,"tag":34,"props":664,"children":665},{},[666],{"type":38,"value":667},"This 3-layer setup lets you drive both short-term tactics (which creative works) and long-term strategy (how much budget per channel) with data.",{"type":33,"tag":41,"props":669,"children":671},{"id":670},"common-misconceptions-and-tradeoffs",[672],{"type":38,"value":673},"Common misconceptions and tradeoffs",{"type":33,"tag":34,"props":675,"children":676},{},[677,682],{"type":33,"tag":77,"props":678,"children":679},{},[680],{"type":38,"value":681},"Misconception 1:",{"type":38,"value":683}," \"If I do MMM, incrementality testing is unnecessary\"\nWrong. MMM shows correlation, assumes causation. Incrementality testing measures causation. They complement each other. Example: MMM says \"Instagram contributes 15%,\" but Lift test reveals 40% of that would happen anyway. True contribution: 9%.",{"type":33,"tag":34,"props":685,"children":686},{},[687,692],{"type":33,"tag":77,"props":688,"children":689},{},[690],{"type":38,"value":691},"Misconception 2:",{"type":38,"value":693}," \"Run incrementality tests on every campaign\"\nNo. Holdout groups mean lost impressions. Test only on major decisions (new channel, new creative direction, retargeting strategy shift). Small optimizations use A\u002FB tests instead.",{"type":33,"tag":34,"props":695,"children":696},{},[697,702],{"type":33,"tag":77,"props":698,"children":699},{},[700],{"type":38,"value":701},"Misconception 3:",{"type":38,"value":703}," \"Set up Robyn once, then it runs itself\"\nNo. Retrain the model every quarter. New channels, price changes, or seasonality shifts require model updates. Robyn setup requires ongoing maintenance.",{"type":33,"tag":34,"props":705,"children":706},{},[707,712],{"type":33,"tag":77,"props":708,"children":709},{},[710],{"type":38,"value":711},"Tradeoff 1: Speed vs. precision",{"type":38,"value":713},"\nMMM requires 1.5 years of data, results lag by 1 week. Geo tests take 4–8 weeks. Want fast decisions? Rely on platform dashboards but accept 30–50% error margins.",{"type":33,"tag":34,"props":715,"children":716},{},[717,722],{"type":33,"tag":77,"props":718,"children":719},{},[720],{"type":38,"value":721},"Tradeoff 2: Granularity vs. sample size",{"type":38,"value":723},"\nCity-level geo tests keep sample size tight and confidence intervals wide. District-level increases heterogeneity. Weekly MMM can't answer daily questions. Every method has resolution limits.",{"type":33,"tag":41,"props":725,"children":727},{"id":726},"how-to-build-your-attribution-stack-in-2026",[728],{"type":38,"value":729},"How to build your attribution stack in 2026",{"type":33,"tag":34,"props":731,"children":732},{},[733],{"type":38,"value":734},"The technical setup consists of:",{"type":33,"tag":83,"props":736,"children":737},{},[738,748,758,768,778,788],{"type":33,"tag":87,"props":739,"children":740},{},[741,746],{"type":33,"tag":77,"props":742,"children":743},{},[744],{"type":38,"value":745},"Server-side GTM + first-party cookies:",{"type":38,"value":747}," Send clean signals to GA4 and Meta CAPI (consent-based data enrichment, not iOS ATT bypass)",{"type":33,"tag":87,"props":749,"children":750},{},[751,756],{"type":33,"tag":77,"props":752,"children":753},{},[754],{"type":38,"value":755},"BigQuery data warehouse:",{"type":38,"value":757}," Consolidate all platform data in one place (GA4, Meta Ads API, Google Ads API, TikTok Ads API, CRM)",{"type":33,"tag":87,"props":759,"children":760},{},[761,766],{"type":33,"tag":77,"props":762,"children":763},{},[764],{"type":38,"value":765},"dbt transformations:",{"type":38,"value":767}," Create weekly aggregate tables (one row = one week, each column = one channel spend + one outcome)",{"type":33,"tag":87,"props":769,"children":770},{},[771,776],{"type":33,"tag":77,"props":772,"children":773},{},[774],{"type":38,"value":775},"Robyn pipeline:",{"type":38,"value":777}," Run R script in Cloud Run weekly, write model output to BigQuery",{"type":33,"tag":87,"props":779,"children":780},{},[781,786],{"type":33,"tag":77,"props":782,"children":783},{},[784],{"type":38,"value":785},"Looker Studio dashboard:",{"type":38,"value":787}," MMM output + platform MTA numbers + incrementality test results side-by-side",{"type":33,"tag":87,"props":789,"children":790},{},[791,796],{"type":33,"tag":77,"props":792,"children":793},{},[794],{"type":38,"value":795},"Slack alerts:",{"type":38,"value":797}," Alert on data anomalies if model NRMSE exceeds 10%",{"type":33,"tag":34,"props":799,"children":800},{},[801],{"type":38,"value":802},"Building this stack takes 4–6 weeks. After that, weekly maintenance is 2–3 hours. ROI: budget allocation becomes 15–25% more efficient (Robyn reports 18% improvement in benchmarks).",{"type":33,"tag":41,"props":804,"children":806},{"id":805},"what-to-do-now",[807],{"type":38,"value":808},"What to do now",{"type":33,"tag":34,"props":810,"children":811},{},[812],{"type":38,"value":813},"If you're still making decisions based on last-touch attribution, you won't compete in 2026. First step: stream platform data to BigQuery, build 1.5 years of weekly tables. Second step: set up Robyn, train the first model. Third step: open a Meta Lift study on your next major campaign. Fourth step: in 6 months, run a geo-based test to validate cross-channel lift. These 4 steps move your attribution stack from MTA illusion to incrementality foundation.",{"title":16,"searchDepth":815,"depth":815,"links":816},3,[817,819,820,824,825,826,827],{"id":43,"depth":818,"text":46},2,{"id":64,"depth":818,"text":67},{"id":198,"depth":818,"text":201,"children":821},[822,823],{"id":210,"depth":815,"text":213},{"id":326,"depth":815,"text":329},{"id":450,"depth":818,"text":453},{"id":670,"depth":818,"text":673},{"id":726,"depth":818,"text":729},{"id":805,"depth":818,"text":808},"markdown","content:en:marketing:mmm-incrementality-attribution-setup-2026.md","content","en\u002Fmarketing\u002Fmmm-incrementality-attribution-setup-2026.md","en\u002Fmarketing\u002Fmmm-incrementality-attribution-setup-2026","md",1782079488237]