Skip to main content
My Crypto Server uses Inngest for durable webhook delivery. Each outbound delivery is a separate Inngest step — if your server is down or returns an error, Inngest retries with backoff automatically.

Delivery flow

Retry schedule

Inngest retries with exponential backoff. 6 attempts span approximately 31 hours total.

One function per delivery

Each (event, endpoint) pair is a separate Inngest function invocation. If you have 3 webhook endpoints subscribed to session.paid, a single payment spawns 3 independent webhookDeliver runs. A failure on one endpoint doesn’t affect delivery to the others.

Delivery headers

Every POST includes:
Always verify the signature. See Webhooks → Verifying signatures.

Timeout

Your server must respond within 30 seconds. If it doesn’t, the delivery is counted as failed and retried.

Manual replay

From the dashboard under Webhooks → Deliveries, you can see every delivery attempt and replay any of them — including successful ones. This is useful for:
  • Replaying a delivery your handler accidentally acknowledged without processing.
  • Replaying events after you fix a bug in your webhook handler.
  • Debugging delivery failures.

Viewing delivery history via API

The Events API shows all events and their delivery status. For delivery-level detail (per-endpoint status codes), use the dashboard.

Event deduplication

Your webhook handler may receive the same event more than once (e.g. if your server returned a 200 but Inngest didn’t receive the response). Always make your handler idempotent — use the event.id field to deduplicate:
In production, store processed IDs in a database rather than an in-memory set.