{
  "description": "First month after creation in which the share of still-active dynamic QR codes (ever-scanned base) falls below 50% of the month-1 share. url_only_half_life repeats the calculation for Website URL codes only (content-mix sensitivity check). Blank half-life means the cohort never fell below the threshold within its horizon (censored).",
  "metadata": {
    "data_window_end": "2025-12-31",
    "sampling_rate": 1.0,
    "suppression": "all cohort bases >= 5,000 ever-scanned codes; no cells suppressed"
  },
  "rows": [
    {
      "cohort_year": 2019,
      "ever_scanned_base": 8072,
      "half_life_months": 5,
      "horizon_months": 82,
      "url_only_half_life": 5
    },
    {
      "cohort_year": 2020,
      "ever_scanned_base": 9107,
      "half_life_months": 2,
      "horizon_months": 70,
      "url_only_half_life": 3
    },
    {
      "cohort_year": 2021,
      "ever_scanned_base": 17167,
      "half_life_months": 5,
      "horizon_months": 58,
      "url_only_half_life": 6
    },
    {
      "cohort_year": 2022,
      "ever_scanned_base": 37524,
      "half_life_months": 30,
      "horizon_months": 46,
      "url_only_half_life": 16
    },
    {
      "cohort_year": 2023,
      "ever_scanned_base": 19226,
      "half_life_months": 10,
      "horizon_months": 34,
      "url_only_half_life": 10
    },
    {
      "cohort_year": 2024,
      "ever_scanned_base": 20383,
      "half_life_months": 13,
      "horizon_months": 22,
      "url_only_half_life": 15
    }
  ],
  "source": "Derived from cohort_survival_curves.csv (build signature-20260612).",
  "title": "Dynamic QR code half-life by creation cohort"
}