Webhook Observability and Replay Infrastructure for SaaS Platforms
Building durable webhook systems requires designing for failure before events disappear.

Webhook observability and replay infrastructure turns a SaaS notification feature into a system customers can trust. The central decision is to design for failures and recovery before events disappear. Reliable delivery needs durable capture, clear guarantees, controlled retries, and tools that let engineers and customers see what happened and recover what did not.
Why webhook delivery is a distributed systems problem, not a simple HTTP call
A webhook feels like a controller action and a few lines of code. Production asks rather more of that HTTP POST. Endpoints go down, responses time out, and a receiver can finish its work without the sender ever hearing about it. These are ordinary network failures. Retrying can resolve temporary problems, but only if the event was durably recorded before delivery began.
Without that record, a dropped notification becomes silent divergence between systems. An order never ships, a payment status stays stale, or an account never gets provisioned. A dropped notification may leave missing data that is noticed days later, without an error message. Teams therefore tend to progress from fire-and-forget to retries, then logging, then a rewrite to untangle the accumulated edge cases. Learning how the whole architecture works early keeps production from becoming an unusually expensive requirements workshop.
The delivery guarantee decision that shapes every other architectural choice
The first architectural choice is the delivery guarantee. It defines the contract between platform and subscriber, including which side handles duplicate processing. Exactly-once delivery across a network boundary cannot be achieved without consumer cooperation because a response can disappear after the receiver completes the work. The sender then sees failure and retries an operation that already succeeded. A timeout is not proof that nothing happened.
The practical contract is at-least-once delivery with tools for exactly-once processing. Every payload needs a globally unique event_id for deduplication, a namespaced event_type such as invoice.paid, a timestamp for ordering checks, and a version field for schema changes. UUIDv7 works well as an event ID because it is time-sortable. Consumer documentation must state the guarantee plainly and explain that repeated IDs should not trigger repeated work. The deduplication cache TTL must outlive the provider’s full retry window, or an old delivery can return wearing a surprisingly convincing fake moustache.
Retry logic, backoff curves, and dead-letter queues as the backbone of reliable delivery
Reliability begins before the first delivery attempt, with the outbox pattern. The business state change and its event are written in the same database transaction, so both succeed or fail together. A process then reads the outbox and hands events to the queue. This closes the gap where a crash after commit but before publish could lose the event.
Workers then need retry logic that takes the response code into account. A 2xx response means delivered, while a 4xx response other than 429 calls for stopping repeated attempts at an invalid request and logging and alerting. Server errors and timeouts need exponential backoff with jitter. Backoff gives temporary faults time to clear, while jitter stops recovering endpoints from facing a synchronized stampede.
Circuit breakers track failures per endpoint and pause attempts when a threshold is crossed, retaining queued events until a probe succeeds. Per-tenant concurrency limits keep slow destinations from holding up consumers and other tenants. Events that exhaust the retry budget move to a dead-letter queue. Together, these mechanisms generate a stream of attempt data that is useless without a way to inspect it.
What genuine webhook observability requires, and what most implementations skip
Engineers need signals that show whether delivery is working well or a backlog is growing. Those include delivery success rate with an alert threshold below a defined target, ingress acknowledgment latency at p99, queue depth and drain time, retry rate by destination, and end-to-end latency at p95 and p99. Detailed delivery logs, event inspection, replay, and OpenTelemetry integration support incident response. A dashboard alone is not enough to diagnose failure. An engineer needs to be able to trace an event through its attempts and recovery.
Customers need a different view of the same system. Their webhook log UI should show every attempt, the response body from their server, and the exact timestamp. Without that view, routine integration diagnosis becomes a support ticket. Dead-letter alerting also lets the platform act before the customer complains. One dead-lettered event may be expected, but dozens accumulating over hours warrant proactive outreach, turning internal visibility into a tangible signal of customer care.
Signing, the Standard Webhooks spec, and secret rotation without downtime
Reliable delivery does not establish who sent the payload. Without cryptographic signing, consumers cannot tell whether events came from the platform or were forged by someone who knows the endpoint URL. NIST FIPS 198-1 documents HMAC, the keyed-hash mechanism underlying HMAC-SHA256 payload signing. A guessable query-string token is no substitute for that. Security has to survive more than someone finding the address.
The Standard Webhooks specification defines webhook-id, webhook-timestamp, and webhook-signature headers, signing id.timestamp.body with HMAC-SHA256 or Ed25519. Using the same rules lets one verifier library work with providers that adopt them. The CNCF CloudEvents specification addresses the envelope instead, defining predictable id, source, specversion, and type fields, with time optional. Knative and Azure Event Grid speak it natively. The specifications solve different problems, but both leave less to guess about how each provider works.
Secret rotation needs a grace period during which signatures using either the old or new secret are accepted. After that configurable window, the old secret is rejected. This avoids making a routine secret change a coordinated delivery outage. The Standard Webhooks guidance also covers SSRF, timeout enforcement, and payload size limits. These are baseline protections.
Inbound versus outbound webhook infrastructure are different problems requiring different tools
Inbound infrastructure takes in events from external providers, each of which has its own rules for subscription and verification. HubSpot configures subscriptions at the app level, while Google Calendar push-notification channels expire after seven days by default and need renewal. Salesforce’s core REST API has no generic record-change webhook, requiring Change Data Capture, Platform Events, or outbound messaging instead. Verification varies too, from different HMAC schemes to challenge-response handshakes or no cryptographic signature.
For multi-tenant SaaS, inbound handling also needs to attribute each event to the right customer connection. Periodic polling complements low-latency webhooks by reconciling missed events. Outbound infrastructure starts its work after the application creates an event. It handles fan-out, signing, retries, circuit breaking, tenant isolation, and subscriber endpoint management and replay. Support for SQS, Pub/Sub, and object stores extends that job beyond HTTP, but does not make it a provider-subscription service.
How the available webhook infrastructure platforms compare on the capabilities that matter in production
The useful comparison covers the queue and the management surface. Hookdeck Event Gateway covers inbound delivery with durable queueing, backpressure management, filtering, and observability. Hookdeck’s Outpost provides open-source outbound infrastructure with multiple destination types and usage-based pricing. Hookdeck Inspect and CLI support the surrounding workflow. These tools fit engineering teams that need both directions to work as critical infrastructure and need more than local-development tunneling.
Svix Dispatch offers an embeddable, themable consumer portal, per-message and bulk replay, granular retry control, and JavaScript payload transformations. It also supports FIFO ordering, per-endpoint throttling, adaptive rate-limit handling, polling endpoints, and OpenTelemetry streaming. SDKs in nine languages and a CLI round out the developer surface. Its fit is teams that want customer and engineer management tools without building those tools themselves.
Nango handles events from external providers by providing an integration-specific webhook URL for each external API and attributing events to customer connections. Its catalog covers over a thousand APIs, with provider-specific subscriptions, verification, and polling fallback. Outbound delivery is not its primary focus. Teams that need both directions would pair it with a tool built for outbound delivery.
Hook0 offers EU-hosted SaaS and an SSPL source-available server, covering subscriptions, retries, signatures, and replay for HTTPS destinations. Its basic management UI suits small EU teams with modest volume, but it lacks FIFO, throttling, transformations, and a broad destination matrix. Webhook Relay serves a different purpose altogether. Its buckets, forwarding rules, and tunnels suit local development and internal routing rather than customer-facing outbound management at scale.
Building in-house remains an architectural choice that includes delivery-worker development. The work includes building and running the consumer portal, replay controls, and operational signals. Buying is useful when the available management tools match what subscribers need. Neither a durable queue nor a long feature list establishes that fit by itself.
GDPR, data residency, and what EU hosting actually means for webhook payload storage
Webhook payloads can contain payment details, user records, and account changes. Keeping them adds another personal data store, with rules for where the data stays and how long it is kept. Ingest, storage, delivery workers, backups, and intermediaries all affect where payload data goes. A European application database does not settle the question if its webhook layer routes data elsewhere.
Webhooker runs ingest, event storage, and delivery workers on Hetzner servers in Germany, keeps backups in the EU, and does not transfer webhook payloads outside the EU. It automatically deletes events after the plan’s retention window of 14, 30, or 90 days. wehook.io hosts in France and supports exponential retries, HMAC signatures, manual replay, and a visible dead-letter queue. Hook0 runs its data plane on Clever Cloud in France and publicly lists subprocessors and transfer mechanisms, including its use of the US company Cloudflare for CDN and DDoS protection. Those distinctions make the storage and processing boundary concrete.
Retention is also part of the product contract. A platform must be able to delete event records when the retention obligation ends and disclose the period to affected subscribers. Cheap storage is no reason to keep replay history forever. Its useful operational life has to fit the obligations attached to the data inside it.
How AI agent pipelines change the timeout and observability requirements for webhook delivery
An AI agent is another webhook consumer, but its timing is less predictable. A typical API expects a response within milliseconds, while an agent may take tens of seconds to process a request. Waiting for that work invites the same timeout-induced duplicates described earlier. The remedy is to acknowledge receipt immediately with a 202 and process asynchronously behind a durable queue. A slow consumer does not need a new theory of delivery.
It does need a way to see what happens beyond the HTTP exchange. Correlation IDs should connect receipt, signature verification, enqueueing, agent processing, and the resulting action, making the full trace searchable from the original payment event ID. Controlled retries, idempotency, and suitable timeouts remain necessary when the agent crashes or encounters a transient downstream error. A log that shows successful delivery cannot, on its own, explain why an account was provisioned twice.
Anthropic’s Claude Code Channels, a research preview, offer another pattern by pushing notifications into an already-running agent through an MCP server spawned as a subprocess. A connected webhook can notify it about a CI failure, payment event, or repository push. MCP and webhooks serve complementary roles here. MCP lets agents discover and interact with capabilities, while webhooks supply real-time events that can trigger that interaction.
What the full architecture looks like assembled, and where teams typically underinvest
Signing establishes authenticity, and correlation IDs connect operational records to the event being delivered. Recovery then depends on the management layer around those mechanisms. That is where teams most often underinvest.
Without replay UI, customers need a support ticket for an integration problem they could recover from, while a failing integration can look healthy from a distance if there are no dead-letter alerts. During a traffic spike, deferring concurrency limits lets slow destinations hold up consumers and other tenants, and omitting rotation grace periods makes a secret change a cutover problem. The build-versus-buy decision therefore needs to include these operational responsibilities alongside the code that sends a POST. Customers register an endpoint expecting events to arrive, and the first silent failure puts that trust at risk.


