1. Return 2xx quickly
Treat webhooks like a mailbox: accept, verify, enqueue, return.
2. Make handlers idempotent
Retries and manual replays can produce duplicates. Deduplicate onevent.id.
3. Verify every delivery
Never trustevent.type, X-Zquence-Event, or any payload data before signature verification succeeds.
4. Store one secret per endpoint
Each webhook endpoint has its own signing secret. Store it in your secrets manager and keep environments separated.5. Reject stale timestamps
A 5-minute tolerance window is a strong default for replay protection.6. Expect all non-2xx responses to retry
Current Zquence behavior retries every non-2xx response while attempts remain. Design your receiver and observability with that behavior in mind.
7. Log delivery identifiers
At minimum, log:event.idevent.typetenantId- your internal processing result