Geldstuck retries webhook deliveries until your endpoint returns 2xx or we exhaust the schedule. You’ll never silently lose an event - failures are surfaced in the dashboard and on a webhook.delivery.failed meta-event.

Retry schedule

AttemptDelay before attempt
1Immediate
22 seconds
34 seconds
416 seconds
564 seconds
64 minutes
716 minutes
864 minutes
94 hours
1016 hours
Total retry window: ~24 hours. After the 10th failed attempt, the event is moved to the dead-letter log.

What counts as failure?

  • Any non-2xx response.
  • Connection refused / DNS failure.
  • Handler doesn’t respond within 10 seconds.
  • TLS errors (expired cert, hostname mismatch).

What counts as success?

  • Any 2xx response, with any body.
  • Including 204 No Content.

The dead-letter log

Every tenant has a dead-letter view in the dashboard under Developers → Webhooks → Dead letter. Events here:
  • Stopped retrying after 10 attempts.
  • Stay queryable for 30 days.
  • Can be replayed manually (see below).

Replaying events

From the dashboard, select any event in the delivery log - live or dead-lettered - and click Replay. The same event is re-delivered; your handler should handle it idempotently. Programmatically:
POST /v1/webhook-endpoints/:endpointId/replay
{ "eventId": "evt_01HX3ZJ..." }
Or replay a range (useful after an outage):
POST /v1/webhook-endpoints/:endpointId/replay
{
  "from": "2026-04-22T09:00:00Z",
  "to":   "2026-04-22T11:00:00Z",
  "types": ["kyc.*"]
}
Replayed events are marked with X-Geldstuck-Replayed: true. If your handler needs to behave differently on replays (e.g., skip outbound email), branch on this header.

Idempotency

Because we retry, your endpoint will occasionally see duplicates. Defend with the event ID:
const handled = await redis.set(
  `gs:event:${event.id}`,
  "1",
  { NX: true, EX: 60 * 60 * 24 * 7 },  // 7-day TTL
);
if (handled !== "OK") return;  // already processed
// ... do the work

Monitoring

  • The Deliveries view shows live success/failure counts, p50/p95 latency, and status-code distribution.
  • Subscribe to webhook.delivery.failed (a meta-event) to get alerted in your existing ops pipeline - it fires on the 3rd consecutive failure of an endpoint.
  • Endpoints that fail > 95% of deliveries for 24 hours are auto-paused and flagged in the dashboard; we’ll email the account owner before it happens.