DashboardAugust 2026
Test Sends, Recipient Results & Resume

- Send a test before committing to the whole list: one rendered copy to one address, using a real contact from the selected audience and the same variable mappings the batch sender resolves, so what arrives is what the broadcast would send. It records nothing — no batch row, no message row, no counters
- A broadcast that reports 50 failed now shows which 50 and why. Address, status, error, and SES bounce type per recipient, defaulting to the failures, paginated, and exportable to CSV with an explicit notice when the export is capped
- Broadcast history paginates against the real total. Rows 21 and beyond were unreachable, the footer showed the loaded-row count instead of your broadcast count, and CSV export serialised whatever happened to be loaded and reported it as the total. Server-side search over name and subject, plus a status filter, both live in the URL
- A stuck or failed send can be resumed from the detail page, gated the same way the API gates itself. The resume endpoint existed and nothing in the dashboard called it, so recovery meant curl and a runbook
- Rates name their denominator and use a consistent one — unsubscribes were rated against sent while opens and clicks used delivered. 0% opened now distinguishes nobody opening from no SES event ever arriving
- Fix: any fetch failure on the detail page rendered a 404, telling an operator watching a live send that their broadcast did not exist
- Fix: auto-refresh latched at mount, so a scheduled broadcast that began sending never started polling
- Fix: the clicked-URL breakdown had no limit, so per-recipient unsubscribe links returned one row per recipient
Platform v0.22.0

