Skip to content

Rewind guide

Backfill new tools, recover from outages and re-run history through fixed transforms, safely and for free.

8 min readUpdated October 21, 2026

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.

Rewind reads from your stored history. How far back you can go depends on your plan: 7 days on Hobby, 30 days on Growth and up to 365 days on Enterprise. See pricing.

When to rewind

SituationWhat to rewind
You connected a new toolThe history you want it to start with, into that destination only.
A destination was downUsually nothing. Rivora retries for 72 hours. Rewind anything older from the dead-letter view.
A transform had a bugThe affected time range, through the fixed transform, into the affected destinations.
You changed warehouse tablesEverything 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.

terminal
$ 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 send

2. 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 > 10000 filters 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.

Check destination idempotency. Managed destinations de-duplicate by event ID. Custom functions should do the same, or a rewind can create duplicates.

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.

terminal
$ rivora rewind rpl_7Q2 --confirm

Rewinding 184,220 events
into warehouse…
████████████████░░░  83%
12,400 events / second

Rewind from code

Everything above is also available through the API, which is useful for scheduled backfills or scripts in CI.

scripts/backfill.ts
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.