{
  "$schema": "https://pinlyx.com/resources/schema/rate-limiter.json",
  "version": 1,
  "description": "Five rate-limiter tiers matching the account-age table in Step 2 of the bulk messaging guide. Import under Settings > Rate limiter.",
  "presets": [
    {
      "id": "fresh",
      "name": "Fresh account (0-14 days)",
      "maxPerHour": 5,
      "maxPerDay": 20,
      "minIntervalSeconds": 30,
      "note": "Anything above this on a new account is how accounts die in week one."
    },
    {
      "id": "warming",
      "name": "Warming (15-30 days)",
      "maxPerHour": 10,
      "maxPerDay": 30,
      "minIntervalSeconds": 20,
      "note": "Only after 14 clean days. Any flood-wait drops you back to fresh."
    },
    {
      "id": "warm",
      "name": "Warm account (30+ days)",
      "maxPerHour": 20,
      "maxPerDay": 50,
      "minIntervalSeconds": 10,
      "note": "The working default. 50/day is a ceiling, not a target."
    },
    {
      "id": "established",
      "name": "Established (90+ days, clean history)",
      "maxPerHour": 25,
      "maxPerDay": 70,
      "minIntervalSeconds": 8,
      "note": "Only with a reply rate above 10% and zero flood-waits in 60 days."
    },
    {
      "id": "conservative",
      "name": "Conservative / post-incident",
      "maxPerHour": 5,
      "maxPerDay": 15,
      "minIntervalSeconds": 45,
      "note": "Run here for 30 days after any warning sign, on any account age."
    }
  ],
  "floodWaitPolicy": {
    "onFloodWait": "pause_account_for_wait_plus_jitter",
    "jitterPercent": 30,
    "exponentialBackoffIfWithinHours": 6,
    "alertOperatorAfterEventsIn24h": 3
  },
  "pilotGate": {
    "description": "Run 50 sends, wait 60 minutes, then check these before scaling.",
    "minReplyRate": 0.08,
    "maxErrorRate": 0.02,
    "maxFloodWaits": 0
  }
}
