n8n logon8n Automation Hub
Debugging notes

Two of My n8n Workflows Skipped a Run Because Google Said 503

Debugging notes · n8n workflow · September 2, 2026 · Updated October 13, 2026

Neither workflow had a bug. Google's Sheets API just had one bad second, on two unrelated days, and both workflows treated that one bad second as a reason to give up for the whole run.

Workflow at a glance
  1. A YouTube Shorts publisher's "Get Ready Rows" node (Google Sheets, read) failed with 503 - The service is currently unavailable — one execution, one day
  2. Days later, a separate news-digest workflow's "Append News Log" node (also Google Sheets) failed with the identical 503 Service unavailable message
  3. Both nodes were configured with n8n's execution defaults — no retryOnFail, so a single transient error ended the whole run instead of trying again
  4. Both workflows self-recovered on their next scheduled run hours later, with nothing broken in the meantime except the one skipped cycle
  5. Fix: turned on retryOnFail (3 attempts, 3-second spacing) on both nodes via the n8n API
  6. Confirmed via a fresh read of both nodes' live configuration after the change, not just the API's 200 response to the update
Diagram of a publisher workflow with the Google Sheets read node that failed on a transient 503 highlighted

Node diagram reconstructed from the live workflow via the n8n API.

Same error, two workflows, no shared cause

Two Google Sheets nodes, in two workflows that share nothing except the same n8n instance and the same underlying Google Sheets API, failed on different days with the exact same message: 503 - {"error":{"code":503,"message":"The service is currently unavailable.","status":"UNAVAILABLE"}}. One was a "Get Ready Rows" read at the top of a scheduled YouTube Shorts publisher, filtering a queue sheet for rows marked status: ready. The other was an "Append News Log" write at the tail end of a news-digest pipeline, logging a posted story's URL after publishing it to Telegram.

Neither node's query was unusual, neither sheet was especially large, and neither workflow had just been edited. A 503 from a Google API means the service itself is temporarily unable to handle the request — it's Google's problem for that one call, not a misconfiguration on the calling end.

The actual damage: a silently skipped cycle, not a broken pipeline

In both cases, the workflow simply didn't run that cycle. The publisher's scheduled run came and went without picking a video to publish; the news-digest run came and went without checking or logging that story. Both workflows' next scheduled run, hours later, executed normally — the underlying Sheets stayed intact, no data was corrupted, and nothing needed manual repair. The only cost was one missed cycle each, which is easy to miss entirely unless something is specifically watching for gaps in a schedule that's supposed to fire multiple times a day.

That's the trap with transient-error skips: they don't look like anything happened. There's no corrupted row, no duplicate, no obviously wrong output to notice later — just a gap in the schedule that only shows up if you go looking at execution history.

Why neither node was equipped to survive it

Neither the Sheets read node nor the Sheets append node had retryOnFail set — checked directly against each node's live configuration, not assumed from the workflow's age or how long it had run without incident. Without it, n8n's default behavior for any node is to treat a single failed attempt as the final answer for that execution: no automatic second try, no backoff, straight to the error state. For a call to an external API that occasionally returns a transient 503 for reasons that have nothing to do with the request itself, that default turns an ordinary, self-resolving blip into a full skipped run.

The fix: retryOnFail on both nodes

Both nodes were updated via the n8n API to set retryOnFail: true, maxTries: 3, waitBetweenTries: 3000 — three attempts, three seconds apart, before the node is allowed to actually fail the execution. Three seconds is enough gap for a momentary Google-side blip to clear without meaningfully delaying either workflow's schedule; a slower-firing downstream node (an actual write with side effects, for instance) might reasonably want a longer wait or fewer tries, but a read at the top of a pipeline and a log-only append at the tail are both cheap to retry and safe to retry repeatedly.

This wasn't a code change or a workflow redesign — both nodes kept their exact same query, filters, and downstream connections. The only thing that changed is what happens in the few seconds after Google's API says no.

What confirmed it was actually fixed

Both nodes' configuration was read back from the n8n API after the update — retryOnFail: true, maxTries: 3, waitBetweenTries: 3000 on both — rather than trusting the API's 200 response on the update call alone. There's no way to force a real 503 on demand to test the retry path directly, so the fix stands on the setting actually being persisted and n8n's own documented retry behavior, not on a reproduced success. Any node in this environment that calls an external API on a schedule — Sheets, YouTube, Telegram, anything outside n8n's own control — is a candidate for the same setting; the two nodes fixed here were just the two that happened to get unlucky first.

Which errors deserve a retry

StatusMeaningRetry?
500, 502, 503, 504The service had a problemYes, a few times with a pause
429Rate or quota limitYes for per-minute limits, with a longer pause; no for daily quotas
400The request itself is wrongNo, it fails the same way every time
401, 403Authentication or permissionNo, fix the credential or the sharing
404Wrong spreadsheet or tabNo

n8n's Retry On Fail retries on any error, so on nodes where a 400 is likely, keep maxTries low. Retrying a bad request three times only delays the real error.

Retries on writes: watch for duplicates

For a read, a retry is always safe. For an append it is not quite: if Google applied the first request but the response got lost, the retry appends the row a second time. For a log tab that is a harmless duplicate line. For a queue that other workflows read, it can mean a duplicate publish. Where that matters, write rows with a unique key and use an update-or-append operation on that key instead of a plain append, so a repeated write changes the same row.

Finding skipped runs after the fact

A skipped cycle leaves no trace except a failed execution in the history. Ways to see them:

The settings used here, 3 tries 3,000 ms apart, are a reasonable default for any node that calls an external API on a schedule. In the n8n editor they are in the node's Settings tab, under Retry On Fail.

Frequently asked questions

Should I enable Retry On Fail for Google Sheets nodes?

Yes for scheduled reads and logs. A 503 from Google is usually gone within seconds, and three tries a few seconds apart turn a skipped run into a short delay.

Which HTTP errors should not be retried?

400, 401, 403 and 404 fail the same way on every attempt. Retrying them only delays the real error.

Can retrying an append create duplicate rows?

Yes, if the first request succeeded but the response was lost. Use a unique key with an update-or-append operation where duplicates matter.

Where are the retry settings in n8n?

In each node's Settings tab: Retry On Fail, Max Tries and Wait Between Tries in milliseconds.

A scheduled n8n workflow that occasionally just... doesn't run, with no error you can find afterward?

I harden n8n workflows against exactly this kind of silent, transient-API skipped cycle.