Webhook Architecture Model
Webhook systems fail when ownership is unclear. In Wacht, keep two planes separate:Control plane (customer-managed)
This is everything your customer configures:- Endpoint URLs
- Subscriptions
- Optional headers
- Secret rotation
- Replay and delivery inspection
/webhook/* and consumed by hooks like useWebhookAppSession.
Data plane (platform-emitted)
This is how events are actually emitted and delivered:- Your backend triggers events
- Wacht fan-outs events to subscribed endpoints
- Worker handles retries, status, analytics, and replay
First step most teams miss: create the Webhook app
You must create the webhook app before embedding webhook UI or issuing webhook session tickets.name = wh_<deploymentId>.
Why this split matters
- Product teams can ship customer UX safely.
- Platform teams can evolve delivery reliability independently.
- Incident response is clearer because ownership is explicit.
What to decide before implementation
- Event naming convention (
domain.action). - Payload compatibility rules.
- Who owns catalog changes and approvals.
- Customer-facing retry and failure expectations.
- Operational SLOs for delivery success and latency.
Golden path for rollout
- Define catalog and payload contracts.
- Validate data plane with internal endpoints.
- Expose control plane to pilot customers.
- Add replay tooling and support runbooks.
- Publish customer docs for verification and idempotency.
Related docs
- React Router
useWebhookAppSession - React Router
useWebhookEndpoints - React Router
useWebhookDeliveries - React Router
useWebhookAnalytics - React Router
useWebhookTimeseries - Webhooks Backend API Reference
Go-live checklist
- Event catalog and naming policy are frozen for current release.
- Endpoint test flow is working for pilot customers.
- Replay workflow is documented for support.
- Signature verification docs are published for customers.
- Alerts for endpoint failures and deactivations are active.
