- Shipped
- September 12, 2026 at 1:27 AM UTC
- Author
- Kamo
- Commit
- 000d02f
While an org's warm-up is on, the dispatcher leaves its campaigns alone and a releaser sends them one message at a time, the earliest due first across the org's campaigns, never past a campaign's own hourly cap and never past the day's warm-up cap. It runs every second under the dispatcher's own lease, so the two can never send the same recipient from different pods. The settings, decided days and safety brake live in the bulk provider's encrypted blob; counters live in Redis and are rebuilt from recipient rows if lost. GET, PUT and reset endpoints under /api/email/bulk-provider/warmup report the state, schedule, queue and health. Both paths now send through one per-recipient method, which claims the row SENDING before the relay sees it. Campaign counters are written without saving the campaign, the interrupted-send sweep included; saving it used to put a campaign paused mid-batch back to SENDING.