Webhook providers retry failed deliveries. Stripe retries with exponential backoff for ~3 days. GitHub retries for 24h. Discord drops after a few minutes. The retry uses the same event-id, and your server should treat it as the same event (idempotently) rather than processing it twice.
Manual replay tools let you re-fire a captured event without waiting for it to recur. Stripe CLI's stripe events resend, GitHub's 'Redeliver' button, lrok's request-inspector replay are all this pattern. Useful for debugging — fix your handler, replay the captured event, verify it now succeeds.
Do NOT rely on the absence of replay for logic. Network blips, your server's brief downtime, the provider's own outages all cause replays you didn't expect. Make handlers idempotent: identify events by event-id, store processed ids, return success for repeats.