Rewind sends events you have already collected to destinations again. Use it to backfill a new tool, recover after a destination outage, or re-run history through a fixed transform. Rewinds are always free and never count towards your event volume.
When to rewind
| Situation | What to rewind |
|---|---|
| You connected a new tool | The history you want it to start with, into that destination only. |
| A destination was down | Usually nothing. Rivora retries for 72 hours. Rewind anything older from the dead-letter view. |
| A transform had a bug | The affected time range, through the fixed transform, into the affected destinations. |
| You changed warehouse tables | Everything since the change, into the warehouse, with idempotent writes. |
1. Start with a dry run
A dry run counts the events that match, shows how transforms would change them and lists each destination they would reach. Nothing is sent.
$ rivora rewind \
--from 2026-10-01 \
--to 2026-10-07 \
--filter 'event = "invoice.paid"' \
--to-destination warehouse \
--dry-run
✓ 184,220 events matched
✓ 3 sources, 0 dropped by transforms
→ Run without --dry-run to send2. Narrow it with filters
Filters use the same syntax as the event search in the console. Combine them with and and or.
event = "invoice.paid"matches one event name.event ~ "checkout.*"matches a prefix.userId in ("usr_2481", "usr_9917")rewinds specific users.properties.amount > 10000filters on any property.
3. Choose which transforms run
By default a rewind runs events through your current transforms, which is what you want after fixing a bug. Pick original to send events exactly as they were delivered the first time.
4. Run the rewind
Confirm the dry run to start sending. Rewinds run at a lower priority than live traffic, so live events are never delayed. You can pause or cancel at any time.
$ rivora rewind rpl_7Q2 --confirm
Rewinding 184,220 events
into warehouse…
████████████████░░░ 83%
12,400 events / secondRewind from code
Everything above is also available through the API, which is useful for scheduled backfills or scripts in CI.
const rewind =
await rivora.rewinds.create({
from: "2026-10-01",
to: "2026-10-07",
destinations: ["warehouse"],
filter:
'event = "invoice.paid"',
// or "original"
transforms: "current",
});
await rivora.rewinds.wait(rewind.id);Common questions
Does rewind change the original events?
No. Stored events are immutable. A rewind creates new delivery attempts and records them next to the originals.
How fast is it?
Typically 10,000 to 20,000 events per second per destination, limited by what the destination accepts.
Can I rewind into a different environment?
Yes, on Growth and Enterprise. Rewinding production events into staging is a good way to test a new pipeline.