{
  "name": "MMM Dataset",
  "version": "1.0.0",
  "description": "Synthetic DTC subscription dataset for MMM learning modules. The data-generating process is transparent so lessons can compare model estimates against known truth.",
  "seed": 20260520,
  "startDate": "2023-01-02",
  "weekCount": 156,
  "outcome": "observed_subscriptions",
  "cadence": "weekly",
  "scenario": {
    "business": "DTC subscription brand",
    "unit": "new paid subscriptions",
    "currency": "spend columns are in thousands of dollars"
  },
  "formulas": {
    "adstock": "A[c,t] = spend[c,t] + lambda[c] * A[c,t-1]",
    "halfLife": "half_life_weeks = ln(0.5) / ln(lambda)",
    "saturation": "contribution[c,t] = beta[c] * A[c,t]^slope[c] / (half_saturation[c]^slope[c] + A[c,t]^slope[c])",
    "outcome": "observed_subscriptions[t] = round(base_demand[t] + sum(contribution[c,t]) + Normal(0, 38))"
  },
  "channels": {
    "paid_search": {
      "label": "Paid Search",
      "lambda": 0.18,
      "beta": 310,
      "halfSaturation": 135,
      "slope": 1.25,
      "role": "Demand capture with fast decay and visible promo responsiveness.",
      "halfLifeWeeks": 0.4
    },
    "paid_social": {
      "label": "Paid Social",
      "lambda": 0.42,
      "beta": 250,
      "halfSaturation": 165,
      "slope": 1.35,
      "role": "Paced prospecting channel with moderate memory.",
      "halfLifeWeeks": 0.8
    },
    "ctv_video": {
      "label": "CTV / Video",
      "lambda": 0.72,
      "beta": 420,
      "halfSaturation": 360,
      "slope": 1.8,
      "role": "Flighted awareness channel with long memory.",
      "halfLifeWeeks": 2.11
    },
    "podcast_audio": {
      "label": "Podcast / Audio",
      "lambda": 0.62,
      "beta": 210,
      "halfSaturation": 175,
      "slope": 1.55,
      "role": "Flighted audio with delayed-seeming carryover under geometric memory.",
      "halfLifeWeeks": 1.45
    },
    "influencer": {
      "label": "Influencer",
      "lambda": 0.35,
      "beta": 160,
      "halfSaturation": 105,
      "slope": 1.3,
      "role": "Bursty creator drops with some spillover.",
      "halfLifeWeeks": 0.66
    }
  },
  "observedColumns": [
    "week",
    "date",
    "trend",
    "seasonality",
    "holiday_season",
    "promo_flag",
    "price_index",
    "competitor_pressure",
    "paid_search_spend",
    "paid_social_spend",
    "ctv_video_spend",
    "podcast_audio_spend",
    "influencer_spend",
    "observed_subscriptions"
  ],
  "truthColumns": [
    "paid_search_adstock",
    "paid_social_adstock",
    "ctv_video_adstock",
    "podcast_audio_adstock",
    "influencer_adstock",
    "paid_search_contribution",
    "paid_social_contribution",
    "ctv_video_contribution",
    "podcast_audio_contribution",
    "influencer_contribution",
    "base_demand",
    "total_media_contribution",
    "expected_subscriptions"
  ]
}
