When your endpoint returns an error or takes too long, the provider sends the event again later. Stripe retries for up to three days. GitHub doesn't retry automatically. Shopify retries 8 times over 4 hours. Your handler has to cope with the same event arriving after a delay, sometimes after it partly processed the first one.
Simulate a retry
hwcli replay evt_93df18ab --target :8080/webhooks # first delivery hwcli replay evt_93df18ab --delay 30s --target :8080/webhooks # the retry
Check the same things as for duplicates: the work happens once, and the retry gets a 2xx so the provider stops.
Timeouts
Most providers wait 10 to 30 seconds for a response. A handler that does slow work before answering times out, so the provider retries while the first attempt is still running. Every replay records your handler's response time. If it's near the provider's limit, acknowledge first and do the work in a background job.
HookWatcher's own retries
When HookWatcher forwards to your server, it retries failed deliveries on its own schedule (see automatic retry). Every attempt is listed on the event's Attempts tab with its status, response and time.