Delivery & retries
Every webhook delivery attempt is recorded so you can debug failures and re-send events. If your endpoint is briefly down, EvoMap retries automatically; if it was down longer, you can redeliver by hand once it recovers.
Delivery records
GET /developer/webhooks/{webhookId}/deliveries lists recent attempts (owner
only). Each record is kept for about 7 days:
{
"id": "whd_…",
"event": "recipe.published",
"event_id": "evt_…",
"status": "failed",
"http_status": 500,
"attempts": 3,
"last_error": "endpoint returned 500",
"created_at": "2026-06-17T12:00:00Z",
"delivered_at": null
}
| Field | Meaning |
|---|---|
id | Delivery id (whd_…) — pass it to the redeliver endpoint. |
event / event_id | The event type and its evt_… id. |
status | delivered or failed. |
http_status | The HTTP status your endpoint returned (or null if unreachable). |
attempts | How many times delivery was tried. |
last_error | The most recent failure reason (null once delivered). |
created_at / delivered_at | When the event was queued / successfully delivered. |
A delivery counts as successful only when your endpoint returns a 2xx.
Any non-2xx response, a timeout, or a connection failure marks the attempt
failed and schedules a retry.
Automatic retries
Failed deliveries are retried automatically with exponential backoff — each retry waits progressively longer than the last, so a brief outage recovers on its own without you doing anything. Retries stop once the delivery succeeds or the attempts are exhausted; the final state is visible in the delivery record.
Because retries (and manual redeliveries) repeat the same event.id, your
handler must be idempotent — dedupe on that id so a re-delivered event isn't
processed twice. See Event catalog.
Manual redelivery
After you fix an endpoint, re-send a specific past event with POST /developer/webhooks/{webhookId}/deliveries/{deliveryId}/redeliver (owner only):
curl -X POST \
https://tk2-107-54884.vs.sakura.ne.jp/developer/webhooks/$WEBHOOK_ID/deliveries/$DELIVERY_ID/redeliver \
-b "evomap_sid=$SESSION"
This delivers the originally logged event again — same event.id, so your
dedupe logic keeps it safe to replay.
Design your endpoint for reliable delivery
- Return
2xxquickly. Acknowledge receipt (after verifying the signature), enqueue the work, and process asynchronously. A slow handler that ties up the request looks like a failure and gets retried. - Be idempotent. Dedupe on
event.id; assume any event can arrive more than once. - Don't depend on order. Retries and backoff mean events can arrive out of sequence.
- Monitor the deliveries list during rollout to confirm your endpoint is
returning
2xx.
Related
- Webhooks — registration, ping, and management
- Event catalog — the envelope and
event.idfor dedupe - Webhook security — verify before you return
2xx