Send webhooks to your customers — without queues, retries, or webhook services
No queue to run. No retry logic to write. One API call. Centrali handles the rest.
The cost of rolling your own
Every SaaS eventually needs to emit webhooks — when an order lands, a file uploads, a user signs up. Customers ask for them. You add them to the roadmap. Then you see the real shape of the work.
A queue + worker
You can't block a user's API request on an HTTPS call to a customer server. Something has to pull from a queue (Redis, SQS, BullMQ) and dispatch asynchronously.
HMAC signing
Sign the raw body with a per-subscription secret, attach as a header, rotate without losing history. Your customer's code verifies with the same secret.
Retry + circuit breaker
Exponential backoff with jitter. A cap on attempts. A circuit breaker so flaky endpoints stop costing you compute. Most teams get this subtly wrong on the first pass.
Delivery log + replay
Every attempt stored with status, response, and error. A replay endpoint for when the customer deploys a fix and wants the missed events.
Each piece is a day of work. Together they're a sprint. Maintained well, they're an ongoing tax on your platform team.
You don't build any of this
If you're already using Centrali as your backend, outbound webhooks are already there. Subscribe a customer endpoint, and Centrali handles every piece above — no worker, no retry code, no log schema to design.
Queue + dispatch
Built in. Record changes fan out to subscribed endpoints automatically. Nothing to deploy.
HMAC-SHA256 signing
Every request signed with a per-subscription secret. Base64-encoded, delivered in the X-Signature header. Rotate anytime; delivery history stays intact.
5 retries over 40 minutes
30s, 2m, 10m, 30m between attempts. Circuit breaker opens on repeated failure so your flaky customers don't cost you compute.
Full delivery log + one-call replay
Every attempt — payload, HTTP status, error — visible in the console and queryable via API. Replay any failed delivery with a single POST.
The whole setup is one call
Subscribe a customer's endpoint to record events on any collection:
import { CentraliSDK, RecordEvents } from '@centrali-io/centrali-sdk';const sub = await centrali.webhookSubscriptions.create({name: 'Order notifications',url: 'https://api.example.com/hooks/centrali',events: [RecordEvents.CREATED, RecordEvents.UPDATED],recordSlugs: ['orders'], // omit for all collections});// Signing secret is returned on create only — copy it now, reads omit it.console.log('Signing secret:', sub.data.secret!);// Replay a failed deliveryawait centrali.webhookSubscriptions.deliveries.retry(deliveryId);
HMAC signing, retry, circuit breaker, delivery log, replay — all handled. Your app code stays focused on what it's actually doing.
Ship webhooks this afternoon
Create a workspace, subscribe your first endpoint, and stop thinking about queues.
No credit card. 5-minute setup.
Read the 10-min guide →