Skip to main content
Webhooks are in beta. Event types and payload shapes may still change. We’ll email orgs with active endpoints before any breaking change.
Delivery is at-least-once. If you return a retriable status (or time out / fail to respond), Origami re-delivers on a fixed schedule. Receivers MUST dedupe on the webhook-id header.

Retry schedule

Standard Webhooks spec table. 10 attempts (initial + 9 retries), ~75 hours cumulative, ±15% jitter per slot. After attempt 10, retries stop. The delivery shows up in the dashboard’s deliveries panel as a failed attempt.

What triggers a retry

Auto-disable

If your endpoint fails too many deliveries in a row across roughly 100 failed attempts (no successful delivery between), Origami auto-disables it. Re-enable from the dashboard once the receiver is fixed.

Idempotency: dedupe on webhook-id

Every retry of the same delivery reuses the same webhook-id. Keep a short-retention set (5 minutes is plenty) of recently-seen ids:
Two distinct events for related state (an email send followed by a quick reply) carry different webhook-ids. Idempotency is per-delivery, not per-business-action.

Header webhook-timestamp vs envelope timestamp

  • webhook-timestamp (header) — dispatch time, recomputed every send. Use it for replay protection: reject signatures more than ±5 minutes off your wall clock. See signatures.
  • data.timestamp (envelope) — event time, stable across retries. Use it when you want “when did the business action happen?”

Replay from the dashboard

If you missed events because of an outage on your side, open the deliveries panel and click Redeliver on the affected delivery. The retry comes through with the same webhook-id, so your idempotency layer correctly dedupes if you’ve already processed it.