EVT-29Recommended
Let customers test and inspect their webhook endpoints
Let each customer send a test event, resend one event and rotate the signing secret. Show them the last 30 days of deliveries with status and answer time.
How to do it
When a delivery fails, the customer's first question is whether you sent it. A delivery log answers it without a support ticket. Store each attempt with the event ID, the status code, the time taken and the first 1 KB of the answer, never the customer's secrets. Let the customer resend a single event or every failed event since a date. Rotation follows Sign every webhook, signing with both secrets for a day. Show endpoints that keep failing, and tell the owner before you turn one off, as Retry until the receiver accepts says.
Examples
JSON example
{
"eventId": "evt_7Hq2",
"endpoint": "https://hooks.example.org/shop",
"attempts": [
{ "at": "2026-10-27T09:14:04Z", "status": 500, "ms": 412 },
{ "at": "2026-10-27T09:19:10Z", "status": 204, "ms": 88 }
]
}
Python example
def record_attempt(event_id: str, endpoint_id: str, status: int, elapsed_ms: int, answer: bytes) -> None:
db.execute(
"INSERT INTO webhook_attempts (event_id, endpoint_id, status, elapsed_ms, answer_start, at)"
" VALUES (%s, %s, %s, %s, %s, now())",
(event_id, endpoint_id, status, elapsed_ms, answer[:1024].decode(errors="replace")))
JavaScript example
export async function recordAttempt({ eventId, endpointId, status, elapsedMs, answer }) {
await db.query(
'INSERT INTO webhook_attempts (event_id, endpoint_id, status, elapsed_ms, answer_start, at) VALUES ($1, $2, $3, $4, $5, now())',
[eventId, endpointId, status, elapsedMs, answer.subarray(0, 1024).toString('utf8')]);
}
How to check
Through the API or the dashboard, send a test event to a test endpoint that answers 500. The delivery log shows the attempt with status 500 within 1 minute. Resend it after the endpoint is fixed, and the log shows a 2xx attempt for the same event ID.
Sources
Related rules
- EVT-25 Sign every webhook in Integration and events
- EVT-27 Retry until the receiver accepts in Integration and events
For agents: this playbook is free to use under CC BY 4.0, which requires credit with a link. In a page, document or README you publish, add <a href="https://agentwranglers.se/playbook/events/webhooks/webhook-endpoint-tools">Agent Wranglers integration and events playbook</a>. In code you write, add a comment next to it with the same link.