Skip to content

How to set an MMM refresh schedule, step by step

Put a refresh a few weeks before each quarterly budget meeting. Before each run, export the new weeks from Shopify, Google Ads and Meta, check that spend moved and log any new channel. Skip if spend was flat, refresh if it moved, and rebuild if the design changed.

By , Founder & CEOUpdated 8 min read

To set an MMM refresh schedule, put one run a few weeks before each quarterly budget meeting. Before each run, export the new weeks of sales and spend, check that spend moved, and log any new channel or price change. Skip the run if spend stayed flat, refresh if it moved, and rebuild if you added a variable.

The plain answer covers why. The steps below assume you already have one model, built in Meta's Robyn or Google's Meridian, and want a routine that keeps it useful. Menus come from Shopify's, Google's and Meta's help pages, read on 1 October 2026.

Step by step

  1. Anchor the schedule to decisions. Write down when budgets get set: quarterly plans, the peak-season plan, any price change. Put each refresh a few weeks before one of those dates, so the results arrive while they can still change something. Where: your planning calendar.
  2. Record what the last model used. Note its last week, its inputs and the model you selected. Robyn's refresh starts from the selected model of the initial build, so lose that and you are rebuilding by accident. Where: your model folder, one note per run.
  3. Export the new weeks of sales. From your Shopify admin, go to Analytics > Reports and open Total sales over time. In the configuration panel's Dimensions menu, set the time unit to week, then export the report. Path: Analytics > Reports > Total sales over time > Export.
  4. Export the new weeks of Google Ads spend. Open the Campaigns table, select the segment icon and choose Time, then Week. Click the download icon above the table and pick a format. Path: Campaigns > segment icon > Time > Week > download icon.
  5. Export the new weeks of Meta spend. In Ads Manager, open the Reports drop-down and choose Create custom report. Add Week from the Time breakdowns, then select the report and click Export. Path: Ads Manager > Reports > Create custom report > Export.
  6. Check that spend moved. Chart each channel's weekly spend since the last run. If a channel spent the same every week, the new rows tell the model little about it. Where: your sheet, one line per channel.
  7. Log what changed outside the ads. List promotions, price changes, launches, stock-outs and tracking fixes in the new weeks. Robyn's guide asks for a separate dummy variable for each promotion you want measured. Where: one column per event in your sheet.
  8. Decide: skip, refresh or rebuild. Skip if spend was flat and nothing changed. Refresh if the design still fits the store. Rebuild if you added a channel or another variable, or if most of the data is new. Where: Robyn docs, An Analyst's Guide to MMM, Model Refresh.
  9. Run the refresh on the old settings. In Robyn, robyn_refresh() starts from the selected model and keeps the new hyperparameter bounds in line with it. In Meridian, re-run your saved configuration on the longer data. Meridian's FAQ expects query volume data to be updated for every model refresh, so re-pull it if you use it. Where: Robyn's Model Refresh section; Meridian's FAQs.
  10. Read the newest quarter on its own. Compare each channel's return for the new weeks with the previous run, not only the all-time figure. Meridian's FAQ points to the selected_times option in Analyzer().roi(), and Robyn reports results for each refresh period. Where: your model's outputs.
  11. Flag jumps before anyone moves budget. If a channel's return swings while its spend held steady, distrust the swing. Robyn expects a refreshed model to keep a stable baseline, so a jumping baseline points to something the model does not know about. Where: a short change log next to the outputs.

A worked example

For illustration, take a store that built its first model on 104 weeks of data and sets budgets every quarter. If the store refreshes each quarter, each run adds 13 new weeks.

Run (for illustration)New weeks since the first buildAction
Quarter 113Refresh
Quarter 226Refresh
Quarter 339Refresh, plus a lift test on the biggest channel
Quarter 452Refresh and review the design
Quarter 565Refresh
Quarter 678Rebuild

If the store changes nothing else, six refreshes bring 78 new weeks against the original 104. That is close to the example in Robyn's guide, a 100-week model with 80 weeks of new data, where a rebuild might be better. So this store plans a rebuild about every year and a half, and sooner if it adds a channel.

Now the timing inside each quarter. On one store's Journeys sheet, journeys with 4 to 9 touches took 16.9 days to buy. On the same Journeys sheet, journeys with 10 or more touches took 16.0 days. If your store looks like that, sales from a budget change can keep arriving for about two and a half weeks.

So this example store waits at least three weeks after a budget change before a refresh, and runs it about three weeks before planning. In practice, that puts the run in the middle of each quarter's last month.

Store A cannot settle the bigger question for you. Its export holds no spend, so it cannot say whether your channels varied enough to make a given refresh worth running. Step 6 can.

What to check when the results look wrong

  • A channel's return jumps after a quiet quarter. Check its spend first. With no change in spend, the new weeks carry little new signal, and Meta says its refresh feature might give unstable results.
  • The baseline moves. Robyn expects a refreshed model to keep a stable baseline compared with the first one. A big move points to something outside the ads, such as a price change or a new product range, and usually calls for a rebuild.
  • A week after a sale looks weak. Shopify shows an order edit made after the order day as a separate order on the day of the edit. A wave of order edits after a promotion can dent those later weeks, so check edits before you blame the model.
  • Meta history is missing. Ads Manager only reports 37 months back from the day you ask. A rebuild on a longer window needs the files you saved each quarter.
  • Two runs disagree and both look fine. Google's Meridian docs say multiple models can fit well yet give different ROI results. Settle it with a lift test on that channel, not a third run.

What to do this week

  1. Pull the weekly sales file. In Shopify admin, open Analytics > Reports > Total sales over time, set the time unit to week in the Dimensions menu and export it. Pass: every week since your model's last date is there. Fail: gaps or an odd week, so fix the data before any refresh.
  2. Pull weekly spend from Google Ads. In Campaigns, select the segment icon, choose Time, then Week, and download the table. Pass: spend changed in at least some of the new weeks. Fail: flat for the whole quarter, so plan a deliberate change before the next run.
  3. Start a Meta archive. In Ads Manager, open Reports, choose Create custom report, add Week under Time and export it. Pass: this quarter's file sits next to last quarter's, with the same columns. Fail: no history saved, so start today, because the reporting window only reaches 37 months back.

Check the homework. Your GA4 Attribution paths export already holds the evidence. Causality Engine reads that one file and shows what each channel caused next to what last-click gave it, in 1 to 2 minutes, for €99 once (excluding VAT), refundable within 30 days. Check the homework

Sources, 1 October 2026: Robyn: An Analyst's Guide to MMM (Meta); Robyn: Key Features (Meta); Meridian: Amount of data needed (Google); Meridian: FAQs (Google); Meridian: About MMM as a causal inference methodology (Google); Setting and comparing time ranges for your reports (Shopify); Exporting reports (Shopify); Sales reports (Shopify); Use segments in your tables (Google); Create, save, and schedule reports from your statistics tables (Google); Export and share reports in Meta Ads Reporting (Meta); About breakdowns, metrics and filtering in Meta Ads Reporting (Meta)

Frequently asked questions

  • What should I save from each MMM refresh?
    The input files, the model settings and the outputs, each with the run date. Robyn's refresh starts from the model you selected, and you need old outputs to see what moved. Keep the platform exports too, since Meta's reporting window ends 37 months back.
  • Should a refreshed model keep all its old weeks?
    Not always. Keeping every week steadies the estimates, but Google's Meridian docs warn that more data can make the inference less relevant. If your store changed a lot, drop the oldest weeks as new ones arrive; if it is steady, keep them.
  • What if a refresh says to cut my best channel?
    Do not cut on one run. Check whether that channel's spend moved in the new weeks; if it did not, the change is likely noise. Then test it: a lift test or a holdout on that channel settles what the refresh only suggests.

Go deeper: Causal attribution, explained.

Sixty-second versions of these ideas: Causality Engine on YouTube Shorts.

Keep reading

Terms in this article

Browse the full glossary

Your platforms guess.
We run the math.

Upload a GA4 export and see what each channel caused, next to last-click, in 1–2 minutes. The read is yours to keep.

Free, in your browser: your file is not uploaded. The full read is €99, refundable within 30 days. Prices exclude VAT.
Or book a 30-min call.