Skip to main content
This guide follows webhook signature verification. Verify each delivery first.

Idempotency

Xquik retries failed webhook deliveries. Your endpoint may receive the same event multiple times. Each retry sends the first attempt’s exact body. Only the signature headers change. Production monitor deliveries include deliveryId and streamEventId. Use deliveryId as the webhook delivery idempotency key. Use streamEventId when your system should process one monitor event only once. It applies across webhook retries or endpoint changes. Do not hash the raw request body when deliveryId is available. webhook.test deliveries include eventType, data, and timestamp. They omit monitor idempotency fields. Use them to verify signatures and receiver reachability. Skip production event deduplication for the test request.

Production store contract

Use a persistent store before acknowledging production events. Scope nonce, delivery, and event keys by webhook ID. Retries for one endpoint then never block another endpoint. Duplicate deliveryId or streamEventId checks should return 2xx after verification. The receiver has already accepted the work.
Keep raw request bytes only for signature verification. Store the nonce cache marker, delivery key, event key, join route, and processing status. Keep them in the shared table or queue. Return 2xx only after verification and a durable queue write. Move slow enrichment, exports, CRM sync, or alerting to an async worker. The receiver can then finish within the 10-second delivery timeout.
The in-memory examples above work for single-process servers. In production, use a persistent store such as a database or Redis. The store tracks processed delivery IDs and event IDs across restarts and multiple instances.

Next steps