When no delivery arrives
Endpoint rejected, inactive after failures, no retry after a 4xx, signature does not match, duplicate deliveries, an event never occurs.
3 minute readWebhooksUpdated: 10/25/2026
On this page
Before you start
- For
- Anyone who runs an endpoint and misses something in the delivery log or at the receiver.
- Prerequisite
- Access to Settings › Organization › Webhooks as Owner or Manager. To change and redeliver, the Owner role.
The most common reasons why a webhook does not arrive or arrives twice, or why an endpoint cannot be created, in the order in which they occur.
| Symptom | Meaning | Solution |
|---|---|---|
| The endpoint is Active, the delivery log stays empty | The subscribed event does not occur in your organization, or the event was added to the list only recently, because a changed list of events takes effect up to an hour later. A misspelled type or one that cannot be subscribed to is not accepted on creation in the first place (422 WebhookEndpoint.EventUnknown) |
Compare the type literally with the tables: Organization, accounts, billing and Content, programs, devices, apps. Trigger the event in the portal and open the log again |
| The endpoint is Inactive with “last failure …” | More than 20 failures in a row have disabled the endpoint. It receives no new deliveries | Fix the cause at the receiver, then Activate (or PATCH with {"active": true}). See Disabling an endpoint |
A delivery is dead although only one attempt was counted |
Your server responded with 4xx (except 408 and 429). This counts as a permanent failure without a retry | For temporary problems, respond with 503 or 429, not with 4xx. Send the affected delivery again through POST /v1/webhooks/{id}/deliveries/{deliveryId}/retry (the portal shows Retry only for Failed). See The expected response |
Deliveries fail without a response code, responseCode is null |
Your server did not respond within 10 seconds, or the connection could not be established | Respond with 2xx right away and process afterward. Check that the address is reachable from outside. See What follows |
| Your receiver rejects deliveries: signature does not match | The body was serialized again before the check, or after Rotate secret the receiver still checks with the old secret | Check the raw bytes and switch to the new secret. See Verify the signature of a delivery |
| The same delivery arrives twice | A retry or a manual redelivery carries the same X-Delivery-Id |
Deduplicate by X-Delivery-Id. See Verify the signature of a delivery |
Creating fails with status 422, WebhookEndpoint.UrlInvalid |
The address is not https or points to localhost, a private network, or a .local name |
Enter a public https address. See Rules for the address and events |
Creating fails with status 403, Billing.FeatureNotEntitled. Create endpoint is locked |
Your package does not include webhooks. Existing endpoints keep running | Change the package. Keep editing, switching off, and deleting existing endpoints. See Create a webhook endpoint |
A call through the API fails with status 403, Permission.Denied |
The call came with an API key or from an account without the Owner role. The webhook permissions apply only to signed-in accounts | Call with the access token of a sign-in as Owner. See Permissions |
Status 404, WebhookEndpoint.NotFound or WebhookDelivery.NotFound |
The identifier (whk_… or whd_…) does not belong to your organization or was deleted |
Take the identifier from GET /v1/webhooks or the delivery log |
If no row fits: the delivery log shows the state, response code, and number of attempts for each delivery. For failed attempts, the response of your server is stored truncated in responseBody of the list through the API.
WebhookEndpoint.Disabled (status 409) is in the error catalog but does not occur today: editing, rotation, and deletion also succeed on an inactive endpoint, and a retry sends nothing there.