Bulk Edit & Replay — Fix a Whole Time Window With One Click
You shipped a bad transform. You don't notice for 17 minutes. By the time you revert, hundreds of events have failed against the broken code. The events page bulk action now accepts the same override matrix as per-delivery replay — fix the transform once, apply the fix to every event in the window, optionally save the new code to the route.
"Between 9:14 and 9:31 My Transform Was Broken"
You ship a bad transform. You don't notice for 17 minutes. By the time you revert, hundreds of events have failed against the broken code. You fix the transform — now what about those 17 minutes of failures?
Until today: open the events page, filter to status=failed, select 50 events at a time, click Replay, wait, repeat. The replay was against the original failed inputs and the current transform (good), but there was no way to also try a different fix on top.
Today the events page bulk action grows up.
"Edit & Replay…" on the Events List
Multi-select any number of failed events. Alongside the existing Replay N events button there's now a Edit & Replay… button (wand icon). It opens the same override modal you've seen on per-delivery replay and on clusters, scoped to all the selected events.
Same four overrides:
- Destination override
- One-shot transform (with persist option)
- Header overrides
- (No bulk payload edit — that's intentionally a per-delivery thing, since events are by definition different payloads.)
Click Replay N, and every selected event's failed deliveries get re-queued with your overrides applied.
The Time-Window Use Case
The events page already has fromDate / toDate filters. The bulk Edit & Replay button completes the workflow:
- Filter events to the bad-deploy window (9:14–9:31).
- Add
status=failedto the filter. - Check the select-all box.
- Click Edit & Replay.
- Paste the corrected transform code, tick "Save to route's transform."
- Submit.
If every event in your selection is on a single route (typical for "the route whose transform broke"), persistTransform writes your fix to the route's transform after the bulk replay, invalidates the worker cache, and you're done. If they span multiple routes, we surface PERSIST_TRANSFORM_MULTI_ROUTE so you know to either narrow the selection or skip the persist.
Same Guards as Single-Delivery Replay
All the same validation applies:
- 64KB transform code cap
- 50-entry header cap with the standard forbidden-header list
- Destination override must belong to the same org
- Hard cap of 50 events per bulk call
- Skipped deliveries get an audit log entry with the reason (transient event, no failed deliveries on it, etc.)
You also get an audit log entry per bulk replay call with the override summary, the affected route(s), and the cluster size — so post-incident reviews have a clear trail.
On the API
The same endpoint serves automation: POST /api/organizations/:orgId/deliveries/bulk-replay-events. Add any combination of transformOverride, destinationOverride, headersOverride, persistTransform. Returns a queued/skipped breakdown and the list of new delivery ids.
This pairs neatly with the failure clusters work we shipped this week. Cluster replay is "fix everything matching this fingerprint." Bulk Edit & Replay is "fix everything in this time window, regardless of fingerprint." Different shapes of the same recovery primitive.