Skip to main content
A delivery succeeds when your endpoint answers any 2xx within the request timeout. Everything else — non-2xx status, connection failure, timeout — schedules a retry.

The retry schedule

Failed deliveries are retried with increasing backoff after the initial attempt:
AttemptDelay after previous failure
1st retry30 seconds
2nd retry2 minutes
3rd retry10 minutes
4th retry30 minutes
5th retry2 hours
After the final retry fails, the delivery is dead-lettered: Qint stops retrying that event to that endpoint. The delivery (with its error) stays visible in the dashboard log.
A dead-lettered event is not re-sent automatically. If an endpoint was down long enough to dead-letter events, reconcile by fetching current state — GET /api/v1/intents/{id} (or list intents filtered by status) — rather than waiting for webhooks that won’t come.

Answer fast, work later

Retries make slow handlers expensive: a handler that takes longer than the delivery timeout gets retried even though it “worked”, and your processing runs twice. The robust pattern:
  1. Verify the signature.
  2. Record X-Qint-Event-Id (dedupe).
  3. Return 200.
  4. Process the event from a queue/worker.
Because retries redeliver the same event with the same X-Qint-Event-Id, idempotent processing plus event-id dedupe makes the whole pipeline safe under every failure mode.

The delivery log

Each endpoint’s page in the dashboard (Developers → Webhooks) shows its recent deliveries — the last 50 — with:
ColumnMeaning
Event typepayment.status or ping.
AttemptsHow many delivery attempts have been made.
Delivered atSet once your endpoint answered 2xx.
Dead-letteredWhether Qint gave up on this delivery.
Last errorThe most recent failure (HTTP status or connection error).
Next attemptWhen the next retry is scheduled, if any.
Use Send test event after any change to your receiver — it’s the fastest way to confirm the full path (TLS, routing, signature check, 2xx) still works.
Ordering is not guaranteed — an old retry can arrive after a newer event. Never assume the latest webhook you received reflects the latest state; reconcile order-sensitive logic via the API.