Skip to main content


3.8.2 (2022-11-23)#

Memory friendly outputs, progress bars for Pareto-front models, bugs and docs#

  • Feat: new status bars for Pareto-Front models per trial to provide information on calculation status
  • Feat: included carryover results into pareto_aggregated.csv output and OutputCollect$xDecompAgg$carryover_pct
  • Feat: new error message shows which hyperparameters inputs are missing #543
  • Fix: substantially reduced the size of robyn_run() and robyn_outputs() results (around -80% compared with 3.8.1 version's size) by removing redundant and unused data from outputs #534
  • Fix: invalid argument type in check_factorvars() and issue recreating calibrated models #520
  • Fix: add_penalty_factor parameter now works correctly with JSON files and robyn_refresh() #543
  • Fix: correct hyper-parameters length for custom data #533
  • Fix: bug in RobynLearn when checking numerical data #532
  • Fix: removed .iData format for legacy demo .RData files
  • Fix: passing custom pareto_fronts input instead of "auto" now works as is expected
  • Docs: updated released version on website, emails, update CRAN link on robyn_update()

Full Changelog:

3.8.0 (2022-10-27)#

Bootstrapped CI, Immediate vs Carryover, Multi-channel calibration#

  • Feat: Added in-cluster bootstrapped confidence intervals (CI) for ROAS and CPA. We treat each cluster of Pareto-optimal model candidates as a sample from a local optimum of the entire population. Default parameters can be customized manually with boot_n and sim_n arguments.
  • Feat: New robyn_calibrate() function that replaces previous un-exported function calibrate_mmm(). The new calibration method is able to separate immediate & carryover effects. When calibrating using experimental results, only the immediate response and its future carryover serve as a calibration target, as opposed to previously the total response. The historical response is excluded from calibration.
  • Feat: Enabled multi-channel calibration so we can use experiments that measured more than one channel with a single experiment to be used for calibration (i.e. incrementality experiment measured all fb but you had fb_brand and fb_perf as two separate media channels/variables).
  • Feat: Added 2 new plots into model one-pager: bootstrapped CI plot and immediate vs carryover response plot.
  • Feat: Changed default Pareto-fronts from 3 to ”auto" to pick the N that contains at least 100 models (threshold can be changed manually with min_candidates parameter).
  • Recode: improved CodeFactor's code quality score from C- to A
  • Feat: Additional CI outputs containing revamped plot and CSV file.
  • Feat: Enabled turning off parallel calculations when cores = 1.
  • Fix: Fixed few minor bugs and doumentations (#496, #506, #507, #515)

Full Changelog:

3.7.2 (2022-09-01)#

CRAN update, partial results, more reproducibility#

  • Feat: wrap robyn_mmm() with a tryCatch() to return partial results if the function crashes after a certain time running and warns the user when this happens
  • Feat: auto-detect categorical variables (no need to set factor_vars parameter in robyn_inputs())
  • Feat: include R and Robyn's versions to JSON files and InputCollect for reproducibility
  • Feat: export/save raw data input for reproducibility (raw_data.csv file)
  • Feat: set Robyn::dt_prophet_holidays as default input on dt_holidays parameters
  • Fix: inverted counters in check_hyperparameters() message #474
  • Fix: force date format before binding rows in robyn_refresh() #480
  • Fix: check_context() was being skipped in some cases
  • Fix: when only 1 categorical value with 2 unique values crashed one-hot-encoding
  • Docs: updated templates for issues and pull requests

Full Changelog:

Full Changelog since last CRAN update:

3.7.1 (2022-08-26)#

JSON import/export, reactivate spend exposure fitting Latest#

  • Feat: new robyn_read() and robyn_write() functions to save and load Robyn models in a transparent, flexible, and cost-efficient way using JSON instead of RDS files (read more); also, new print methods for both objects containing the most relevant information
  • Feat: new robyn_recreate() to rebuild any model's InputCollect and OutputCollect objects based on their JSON files and data
  • Feat: reactivated spend exposure fitting and plotting #463
  • Feat: updated robyn_response() to receive numeric vectors #464
  • Feat: enabled calibration_input on robyn_refresh() to calibrate on the fly and more robust checks on data inputs
  • Feat added Robyn and R versions as the caption in one-pagers to help users debug
  • Feat: trimmed spend response curves on robyn_allocator() and robyn_onepagers() plots outputs
  • Fix: missed intercept calculation in fitted vs residual plot #462
  • Fix: when single categorical value had 2 levels it crashed the one-hot-encoding process
  • Fix: datasets with no categorical data crashed when using one-hot-encoding #419
  • Fix: no need to manually sort the dates before passing the data to robyn_inputs(). Ref: check_datevar() #448
  • Fix: fixed ggplot warnings on some plots (previously hidden with suppressWarnings)
  • Other: added badges with website and Facebook group in README files (see here), updated documentation and website, and more data checks on user inputs

Full Changelog:

3.7.0 (2022-07-27)#

Total recoding, UX feats, and combined errors fix#

  • Recode: got rid of data.table dependency for r2py wrapper and removed all globalVariables associated noise
  • Recode: all code is now clean and formatted under the tidyverse code style for better code reading and standardization
  • Feat: trimmed functionality for response curves on one-pagers outputs to have coherent ranges plotted
  • Feat: enabled channels removal on robyn_allocator() by setting their constraints to 0 #411
  • Feat: when manually selecting refresh models in robyn_refresh(), re-ask user until valid solID is provided, instead of crashing
  • Feat: new plot and improved print methods for robyn_refresh() outputs
  • Feat: include time units used in adstock plots for clarity
  • Feat: enabled organic media variables to be calibrated (no spend)
  • Fix: when best model based on minimum combined errors was tied with other models, inconsistent outputs (one-pagers / clustering). Standardized combined errors methodology with new errors_scores() function, especially normalizing errors before filtering models. The largest the "error_score", the better the model's performance #428
  • Fix: show blue dots on top of grey dots in Pareto plots #420
  • Fix: positive/negative colour palette on waterfall plot when all values are positive
  • Fix: set prophet's print as disabled when prophet_vars input is NULL (off)
  • Docs: added CRAN, site, and FB group badges on README files
  • Docs: several typos and documentation updates

Full Changelog:

3.6.3 (2022-05-06)#

CRAN Version, Site & Documentation Revamp, More Inputs Flexibility#

  • CRAN: First Robyn version available via CRAN. From now on, install CRAN's for stable version, GitHub's for dev version.
  • Docs: Site revamp #372, documentation updates and demo enrichment
  • Feat: Added version_prompt parameter to robyn_refresh() #375
  • Feat: Added new calibration checks to ensure quality experiments usage
  • Feat: New date_min and date_max parameters on robyn_allocator() to pick non-0 means window
  • Feat: New robyn_update() function
  • Feat: More checks and warnings included to push users to follow best practices.
  • Refactor: Changed 1 to 3 Pareto fronts as default to enrich robyn_clusters() results
  • Refactor: Changed default thresholds on robyn_converge() to be more flexible
  • Fix: Several bugs squashed

Full Changelog: (

3.6.2 (2022-03-31)#

Allocation and plot improvements, new warnings, bugs fixed#

  • Viz: removed redundant information on plots and standardized styles and contents on all visualizations.
  • Feat: new date_min and date_max parameters on robyn_allocator() to pick specific date range to consider mean spend values (user request).
  • Feat: new plot methods for robyn_allocator() and robyn_save() outputs, and print method for robyn_inputs() with and without hyperparameters.
  • Feat: provide recommendations on calibration inputs depending on the experiments' confidence, spending, and KPI measured #307.
  • Feat: warn and avoid weekly trend input when data granularity is larger than "week".
  • Fix: issues on several robyn_allocator() specific cases (#349, #344, #345), especially when some coefficients were 0.
  • Fix: bug with Weibull adstock scenario #353.
  • Docs: fixed some typos, updated, and standardized internal documentation.

Full Changelog:

3.6.0 (2022-02-22)#

  • New hyperparameter "lambda" finds MOO-optimal lambda and thus removes the need of manual lambda selection.
  • New optional hyperparameter penalty.factor that further extends hyperparameter spaces and thus potentially better fit.
  • New optimisation convergence rules & plots for each objective function showing if set iterations have converged or not (NRMSE, DECOMP.RSSD, and MAPE if calibrated)
  • Improved response function now also returns the response for exposure metrics (response on imps, GRP, newsletter sendings, etc) and plots. Note that argument names and output class has changed. See updated demo.R for more details.
  • More budget allocation stability by defaulting fitting media variables from paid_media_vars to paid_media_spends. Spend exposure fitting with Michaelis Menten function will only serve robyn_response() function output and plotting. robyn_allocator() now only relies on direct spend - response transformation.
  • Default beta coefficient signs: positive for paid & organic media and unconstrained for the rest. Users can still set signs manually.
  • New print methods for robyn_inputs(), robyn_run(), robyn_outputs(), and robyn_allocator() outputs to enable visibility on each step's results and objects content.

Full Changelog: