Webhook relay · safe storage first

Relay

Every event is accepted and stored here first — then forwarded. If your API is down, webhooks wait in queue instead of vanishing. Nothing is dropped; delivery catches up when you are back online.

Open app
Scroll
1:1Queue per forwarder
60sIngest cache TTL
10×Retry attempts
24hWebhook TTL
3Platforms

Direct to API

No queue — if the API is down, events are gone; nothing replays when it comes back.

Your API

API up — synchronous path

Isolated queues

Configure multiple forwarders so the same stored webhook is delivered to every target URL — like copying one inbound event to several APIs. Each forwarder has its own BullMQ queue; if one target is down, only that lane backs up while the others keep draining. Per target, delivery order matches ingest order: FIFO — first webhook saved is the first POST sent when that forwarder is up.

Both forwarders up — jobs flow Q → POST

Test webhooks and fix APIs without stopping production

Point an extra forwarder at staging, a local tunnel, or a mock while your live lane keeps posting to the real service. You can replay stored payloads, break handlers on purpose, and ship changes on your own schedule — no need to pause ingest or declare downtime for a drill. Each queue stays isolated, so experiments and retries in one lane do not starve the others. Less maintenance mode, fewer “API is down” moments for customers, and the same stored event can feed both safe tests and production delivery.

Features

At a glance

||
Per-forwarder queues

Each forwarder gets its own BullMQ queue and worker — no cross-talk.

fifo
Save once, then enqueue

Deliveries are written on the webhook document before jobs are added — no empty-doc race.

atomic
Ingest cache

Source and forwarder resolution cached in Redis — invalidated on any CRUD.

60s ttl
#
Short webhook URLs

WhatsApp callbacks use /v1/webhooks/whatsapp/src_*

human ids
*
Per-source verify token

Many WhatsApp apps — each source has its own Meta handshake token.

meta
Retries + dashboard

Exponential backoff, TTL expiry, simulate ingest, per-queue pause and inspect.

ops

Seven delivery states

queued
forwarding
delivered
retrying
dead
skipped
expired

Per-forwarder throughput

relay-delivery-* · one queue per forwarder · BullMQ v5 live simulation

Stripe webhooks Coming soon

payment_intent.succeeded  invoice.payment_failed  charge.refunded
These aren't just events. They move money. The old model sends them straight to your API — if it blinks, the signal is gone and your business logic never runs. Relay vaults every payment event first, then delivers when your service is healthy.

$0lost on outage
100%payment events persisted
autodrain on recovery
Your API
API healthy — direct path delivering

Top row: no relay. During outage, gold payment packets hit a dead endpoint and burst — gone. Bottom row: Relay vault buffers every event; gold packets drain automatically when the API recovers.