#webhooks#retries#backoff

“my webhook delivery to a third party keeps failing and I need it to retry automatically with backoff”

Retry a failed webhook automatically, with exponential backoff

Hand the delivery to Fliq instead of retrying inline. It re-sends on any non-2xx, backs off exponentially, and keeps a full attempt log — no retry loop in your code.

You call a partner’s API and it 500s, or times out, or rate-limits you. Retrying inline blocks your request and dies if your process restarts. Instead, schedule the call as a Fliq job: it fires (almost) immediately, and on any non-2xx response Fliq retries with exponential backoff until it succeeds or exhausts max_retries.

The request

Create a job that POSTs to the downstream endpoint. Set scheduled_at to now and max_retries to how many attempts you want.

curl -X POST https://api.fliq.sh/jobs \
  -H "Authorization: Bearer fliq_sk_your_token" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://partner.example.com/webhooks/order-created",
    "http_method": "POST",
    "scheduled_at": "2026-06-12T10:00:00Z",
    "headers": { "Content-Type": "application/json" },
    "body": "{\"order_id\":\"ord_123\",\"total\":4999}",
    "max_retries": 5
  }'
const res = await fetch("https://api.fliq.sh/jobs", {
  method: "POST",
  headers: {
    "Authorization": "Bearer fliq_sk_your_token",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    url: "https://partner.example.com/webhooks/order-created",
    http_method: "POST",
    scheduled_at: new Date().toISOString(), // fire now
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ order_id: "ord_123", total: 4999 }),
    max_retries: 5,
  }),
});

const job = await res.json();
console.log(job.id); // job_01hx...

That’s it — one POST and the delivery is now Fliq’s problem, not yours.

What Fliq handles for you

  • Retries with backoff. Any non-2xx (or a timeout) consumes a retry; Fliq waits, then re-sends, backing off exponentially between attempts. You don’t write a retry loop.
  • Crash recovery. The attempt lives in Postgres. If a worker dies mid-flight, a reaper reschedules it — the retry isn’t lost when a process restarts.
  • Full history. Every attempt is recorded with its status code and duration, queryable per job:
curl https://api.fliq.sh/jobs/job_01hx.../executions \
  -H "Authorization: Bearer fliq_sk_your_token"
  • Alerts on permanent failure. Wire up an alert channel and Fliq notifies you only when a job exhausts its retries — the signal that actually matters.
Start retrying webhooks the reliable way — free tier