Webhook Scheduler
Log inStart free

Troubleshooting

When a webhook fails

Two different things can go wrong. Your endpoint can refuse a delivery (the job ends Failed), or our API can refuse your request to schedule it. The first is below, by status code; the second is in API errors.

On this page

Find the cause

  1. Open Dashboard → Jobs and filter on Status → Failed (or Retrying).
  2. Click the job. The panel at the top names the problem, explains it and gives the next step: the same words as the entries below.
  3. The Delivery timeline lists every attempt with its status code, duration and the first 1,500 characters of your endpoint’s answer.

With alerts on (the default), you also get one email per webhook that cannot be delivered, with the same diagnosis and a fix link. Choose when in Settings → Alerts.

A delivery failed

A delivery succeeds when your endpoint answers with a 2xx status within 10 seconds. Anything else is a failed attempt. Find the status code of the last attempt:

Timed out (no status code)

Retried automatically

Your endpoint did not answer before the delivery timeout. This is usually a slow handler or a temporary outage.

In Make
Rare: a Custom webhook answers as soon as it receives the call.
In your code
Your handler did not answer within the delivery timeout. Answer 200 first, then do the slow work in the background.

Fix: Retries continue automatically. Make the handler respond quickly (acknowledge first, then do the work).

No response (no status code)

Retried automatically

The request never reached a working HTTP server: the host could not be resolved, refused the connection, or dropped it.

In n8n
A self-hosted instance that is down, restarting or not reachable from the internet.
In your code
The domain does not resolve, the server is down, or it does not accept HTTPS connections on port 443.

Fix: Retries continue automatically. Check that the domain resolves publicly and the server accepts HTTPS.

HTTP 3xx Redirect

Retried automatically

Your endpoint answered with a redirect. Webhook Scheduler never follows redirects, so a 3xx counts as a failed attempt and is retried like a 5xx, with the same answer each time.

In your code
Usually http to https, a missing or extra trailing slash, or a domain that moved. Use the final URL, the one the redirect points to.

Fix: Use the final URL, the one the redirect points to.

HTTP 401 Unauthorized or 403 Forbidden

Not retried

Your endpoint refused the request. Webhook Scheduler removes Authorization and Cookie headers before delivery, so it cannot send those credentials. On Make or n8n, the webhook itself may require authentication.

In n8n
The Webhook node has authentication set (Header Auth, Basic Auth...). Send the header it expects under a name other than Authorization, or turn its authentication off and check the signature in the workflow.
In your code
Your auth middleware runs on the webhook route. Exempt it and verify Webhook-Signature instead.

Fix: Send the secret in a custom header your receiver checks (any name except Authorization or Cookie), turn authentication off on that webhook, or verify the Webhook-Signature header instead, then edit and reschedule.

HTTP 404 Not found

Not retried

The request reached your server, but no route exists at this URL. Retrying the same URL would fail the same way, so it was not retried.

In n8n
Workflow 2 is not active, or the URL is the Test URL instead of the Production URL.
In Make
The address is mistyped or belongs to a deleted webhook.
In your code
A typo in the path, or the route is not deployed on that host.

Fix: Check the path for typos and that the route is deployed, then edit and reschedule.

HTTP 410 Gone

Not retried

The endpoint says this URL is gone for good. On Make or n8n, that usually means the scenario or its webhook was deleted or turned off. Retrying the same URL would fail the same way, so it was not retried.

In Make
The Custom webhook of scenario 2 was deleted, or the scenario was turned off for good. Copy the address from scenario 2 again.
In n8n
The webhook was removed from the workflow. Copy the Production URL again.

Fix: Copy the webhook address from your scenario again (or check the route is deployed), then edit and reschedule.

HTTP 400 or 422 Rejected payload

Not retried

Your server received the request but rejected its body or format. The response body below usually says which field is wrong.

In your code
Your validation refused the JSON body. Every delivery is sent with Content-Type: application/json.

Fix: Adjust the JSON payload to what the receiver expects, then edit and reschedule.

HTTP 405 Method not allowed

Not retried

The URL exists, but it does not accept this HTTP method. Many pages only accept GET; webhook receivers usually expect POST.

In Make
A Custom webhook accepts POST: check the method of the scheduled webhook.
In n8n
The Webhook node’s HTTP Method must match the method you schedule (POST by default).

Fix: Use the method your receiver expects, or point to its webhook route, then edit and reschedule.

HTTP 429 Rate limited or 425 Too early

Retried automatically

Your server asked to try again later. The delivery is retried with backoff.

In your code
Many webhooks scheduled for the same second hit your rate limit. Spread runAt by a few seconds, or raise the limit for this route.

Fix: No action needed unless every attempt is rate limited; then raise the receiver limit.

HTTP 5xx Server error

Retried automatically

Your server failed while handling the request. This is often temporary, such as a deploy or a crash.

In your code
Your handler threw an error or your server was restarting. Your logs at the attempt’s time say which.

Fix: Retries continue automatically. Check your server logs for this request.

Blocked target (not sent)

Not retried

The URL resolved to a private, local or otherwise unsafe address, so the request was not sent.

In your code
The URL resolves to a private, local or reserved address. See Target URL rules.

Fix: Use a public HTTPS endpoint, then edit and reschedule.

Payload too large (not sent)

Not retried

The JSON payload is larger than the delivery limit, so the request was not sent.

In your code
The JSON body is over 100 KB. Send an ID and let the receiver look up the rest.

Fix: Send a smaller payload (for example an ID your receiver can look up), then edit and reschedule.

What is retried, and when it stops

Timeouts, no response, 3xx, 408, 425, 429 and 5xx are usually temporary: the job goes to Retrying and is tried again, 30 seconds after the first failure, then 1 minute, 2, 4 and so on (doubling, at most 6 hours apart). Other 4xx answers would fail the same way every time, so the job goes to Failed at once.

Free
Retries:4
Attempts in all:5
Last retry after:~8 min
Pro
Retries:10
Attempts in all:11
Last retry after:~8.5 h
Scale
Retries:14
Attempts in all:15
Last retry after:~33 h

When the last retry fails, the job is Failed and nothing is sent again on its own. A Make scenario or n8n workflow that is down for 10 minutes on Free misses the webhook: fix it, then resend as below.

Fix and resend

A failed job is never changed. Every way to resend creates a new job, with a new ID, and the failed one stays in your history.

Edit and reschedule

On the job page (or in the ··· menu of its row in Jobs), click Edit and reschedule. The schedule form opens with the same URL, method, payload and headers: correct what was wrong, pick a time, and schedule. Use it for every “Not retried” failure above.

Run again

Run again sends the exact same request 30 seconds from now, as a new job. It suits a temporary failure that is fixed now (your server is back up). The job page hides it after a definitive 4xx, since the same request would fail the same way. It works on Delivered and Canceled jobs too, and each run counts toward your monthly quota.

Fix N webhooks: several webhooks share the broken URL

When a webhook fails for a reason tied to its URL (404, 410, a domain that does not resolve, a blocked address; or 5xx, refused connections and timeouts once every retry is used), other webhooks still scheduled to the same URL would likely fail too. The Overview then says so, for example “A webhook to hook.eu1.make.com/…k3f9 couldn’t be delivered (HTTP 410). 2 other scheduled webhooks use the same URL and may be affected.”, with a Fix 3 webhooks button. The alert email has the same link.

Paste the new URL (for example the new Make webhook address). Every scheduled webhook on the old URL switches to it and keeps its ID and time, so a scenario that cancels by ID keeps working. Leave Also resend the failed webhook checked to send the failed one to the new URL in 30 seconds. There is no undo.

Mark handled

Fixed it another way, or it does not matter? Mark handled removes the failure from the Overview’s incidents. It stays in Jobs.

API errors: when our API refuses your request

These are answers from webhookscheduler.com/api/v1/… to your call, not from your endpoint. Nothing was scheduled. Every error is JSON with an error message; most add a code, and validation errors add an issues array naming each field.

400 · Validation failed
What it means:A field is missing or wrong. Common: runAt must be in the future, an invalid url, a reference with a space or #, a lowercase method or criticality, a header value that is not a string, a body over 100 KB.
What to do:Read issues[].path and issues[].message. Field rules: Schedule a webhook.
400 · UNSAFE_TARGET_URL
What it means:The url is not a public HTTPS address our rules accept.
What to do:Target URL rules
400 (cancel)
What it means:Only pending or retrying jobs can be canceled: the job is being sent, or is already delivered, failed or canceled.
What to do:Nothing to cancel. Read the job to see its status.
401
What it means:The API key is missing, mistyped or revoked.
What to do:Send Authorization: Bearer wh_live_…. Check the key in API keys.
403 · QUOTA_EXCEEDED
What it means:Your plan’s monthly webhook limit is reached. Every job created this month (UTC) counts: canceled ones, execute-now calls and Run again included.
What to do:Wait for the 1st of next month (UTC), or upgrade. details has limit and usedThisMonth.
403 · PLAN_LIMIT_EXCEEDED
What it means:runAt is further ahead than your plan allows, or your paid plan has ended.
What to do:Pick an earlier time, or update billing in Settings.
404
What it means:No job with this ID in your workspace: a typo, another workspace’s ID, or a finished job deleted after your history period.
What to do:Check the ID (a UUID).
405
What it means:Wrong HTTP method for this endpoint, for example GET on /schedule.
What to do:Schedule, execute-now and cancel use POST; list and get use GET.
409
What it means:The job changed state while it was being canceled: it started sending.
What to do:Read the job again; it may be delivered.
429 · RATE_LIMIT_EXCEEDED
What it means:Too many calls in one minute with this key.
What to do:Wait the number of seconds in Retry-After. See Rate limits.
503 · QUEUE_UNAVAILABLE
What it means:Our queue was unavailable. Nothing was scheduled and it does not count toward your monthly quota.
What to do:Try again after a few seconds, with the same idempotencyKey if you sent one.
500
What it means:An error on our side.
What to do:Try again later, with backoff.

Still stuck?

Send the job ID (or the request you made, without your API key) via Contact.