One URL per sender. Every webhook verified, filtered and delivered to your services until they take it.
Senders never talk to your servers directly. Ensue answers them in milliseconds, keeps the event, and delivers it on your terms.
Paste it into Stripe or GitHub. Ensue checks the signature, answers handshakes and replies 200 as soon as the event is stored.
Match on event type or any payload field, reshape the body, and send one event to as many destinations as need it.
Each destination gets its own queue. Failures are retried with backoff, and anything that can't be delivered says why.
Verification, retries, failures and history, in one place.
Pick how a sender signs and Ensue checks every request. Unsigned or tampered requests are refused and logged, never delivered.
Senders retry. Point a source at its unique ID and a repeat gets a 200 and creates nothing.
Drop the events a service doesn't care about and send it only the fields it needs. Edit a transform once and every flow using it changes.
{ "customer": data.object.customer,
"amount": data.object.amount_paid,
"currency": data.object.currency }Retry-After is honoured, backoff is spread out, and a 400 isn't retried forever.
A destination that keeps failing is paused and probed instead of hammered, and you're told.
Every event that gave up says why. Fix the consumer and redrive them in one go.
Received, verified, filtered, every attempt with its response. Replay one event or a whole window, to the same destination or another.
Forty status updates for one CI run become one delivery with the latest state and a list of what changed. Final states are always delivered; payments and orders are never combined.
When a partner only accepts traffic from known IPs, a flow can deliver from one region instead of the nearest edge.
Give senders a URL on your domain, so moving off Ensue later never means re-registering a webhook.
Sending webhooks to your own customers? See Dispatch.