Pre-1.0 · one maintainer · Stripe and cards only · no SDKs (client libraries) yet · no production users yet. Docs describe v0.9.1 (29 Oct 2026) · What’s new →
A webhook endpoint keeps failing
Hardcount retries on the schedule in Webhooks,
then marks the delivery failed. Each attempt is a row in
webhook_deliveries. Back to the runbook index.
Symptom
Section titled “Symptom”hardcount_webhook_deliveries_total{status="failed"}rises. It counts deliveries marked failed after their last retry.- The dashboard shows failed deliveries and a falling success rate for one endpoint.
- The endpoint is down, or does not answer with a
2xxwithin 10 seconds. - The endpoint answers with a redirect (
3xx). Hardcount does not follow redirects, so a redirect is a failed delivery. - The HMAC signature does not match: the shared-secret signature on each delivery no longer verifies. The customer checks against an old secret.
-- Failures by endpointSELECT webhook_endpoint_id, error_message, count(*)FROM webhook_deliveriesWHERE status = 'failed' AND error_message IS NOT NULLGROUP BY webhook_endpoint_id, error_messageORDER BY count(*) DESCLIMIT 20;- Contact the customer and confirm the endpoint is up. If it answers with a redirect, register the URL it redirects to.
- If the signature does not match:
- Rotate the signing secret in the dashboard
(
Webhooks → Endpoint → Rotate secret). - The customer updates their side.
- Rotate the signing secret in the dashboard
(
- Replay the failed events, from the dashboard or with
POST /v1/webhook_events/{id}/replay. A replay keeps the event’sid, so a receiver that already handled the event skips it. - Only in a SEV-1, pause deliveries by deactivating the endpoint (see step 1 of Escalation). Events sent while it is inactive are not delivered to it.
Verify
Section titled “Verify”The query shows no new failures for the endpoint, and its success rate in the dashboard recovers.