n8n OpenAI 429 "The service is receiving too many requests from you" on Google Sheets: the fix

You point an OpenAI node at a Google Sheet with a few hundred rows, and somewhere in the middle n8n stops with The service is receiving too many requests from you. That is n8n's wording for an HTTP 429. "How to handle OpenAI's API rate limits in n8n?" (6,703 views) and "ChatGPT - Error 429 The service is receiving too many requests from you" (6,225 views) are two of the most-viewed unsolved threads on the n8n forum. Then it gets worse: you rerun, and every row is sent again, including the ones that already worked. This page explains where the 429 comes from, why the usual fixes fall short, and gives you a free workflow that finishes the sheet.

Download the free Google Sheets bulk AI runner

n8n workflow JSON: OpenAI over every row in batches, waits for Retry-After on 429, backs off, caps attempts, resumes where it stopped, one Sheets write per batch. No credentials inside.

Want to see the 429 handling work before you touch a real API key? The Sheets Bulk AI Runner Pro Kit ($19) adds the sheet header CSV and an offline test kit (a local OpenAI, Sheets and Gmail mock with the 15-scenario runner).

How we tested: the free template at the end ran 15 scenarios on a local n8n 2.44.4 against a mock of the OpenAI, Google Sheets and Gmail APIs that returns real-shaped 429s, Retry-After headers, 5xx errors and Sheets quota errors (500 rows included). We have not run it against the live OpenAI or Google APIs yet. Updated Nov 3, 2026.

Which 429 do you have?

What you seeWhat it meansWaiting helps?
Rate limit reached for gpt-… on requests per min (RPM) or tokens per min (TPM)You sent more requests or tokens in a minute than your OpenAI usage tier allows. Most common when n8n fires all rows at once.Yes. OpenAI sends x-ratelimit-reset-requests / x-ratelimit-reset-tokens headers that say how long.
You exceeded your current quota, please check your plan and billing details (insufficient_quota)No credit left, or a monthly limit hit. Also a 429, which confuses people.No. Add credit in the OpenAI dashboard. Retrying just burns time.
429 from the Google Sheets node: Quota exceeded for quota metric 'Write requests'Google's Sheets API limits are per minute, per user and per project. Writing one row per item adds up fast.Yes, about a minute. Better: fewer, bigger writes.

Why the usual fixes don't hold

Two n8n behaviors we found while testing: (1) If your sheet has a column literally named error, a Google Sheets node with Retry On Fail treats every row that has a value there as a failed try and runs the read again, up to 5 times. Name it error_message. (2) A Google Sheets node with On Error: Continue reports a 429 as a per-item error, which Retry On Fail never sees, so it does not retry even with Retry On Fail on. You need your own retry loop for Sheets writes.

The pattern that finishes the sheet

  1. Add a checkpoint column. Add status, attempts, error_message, run_id and updated_at next to your data. Only rows whose status is empty or pending get processed, and done rows are never sent again. That makes reruns safe.
  2. Claim before you call. Mark the rows you're about to process as processing with your run ID, in one write. A second run that starts early skips them. If a run crashes, the claim expires after a lease (30 minutes by default) and the rows get picked up again.
  3. Send a small batch, then pause. 10 rows, then wait a few seconds. Set the batch size and pause to fit your OpenAI tier.
  4. Handle 429 per row, not per node. Turn off Retry On Fail on the HTTP node, set it to return the full response and never error, then look at the status code yourself. On 429 or 5xx, wait for Retry-After (or retry-after-ms, or the x-ratelimit-reset-* header), and if there is none, back off exponentially: 2 s, 4 s, 8 s… up to a cap. After max_attempts, write status = error and the reason, and move on. Stop the whole run on 401 or insufficient_quota, because no amount of waiting fixes those.
  5. Write back once per batch. Use Google Sheets Update Row matched on row_number, with all of the batch's items in one node run. n8n sends that as one batchUpdate call, not one call per row, so you stay far below the Sheets quota. If Sheets still says 429, wait and write the same rows again (we use 5, 15, 30, then 60 seconds) without calling OpenAI again.
  6. Chunk big sheets. Process at most a few hundred rows per execution and let a Schedule Trigger take the next chunk. Large single executions are what run self-hosted n8n out of memory (t/278455).

The core of step 4, in a Code node after an HTTP Request node with Include Response Headers and Status on:

const code = $json.statusCode;
const h = $json.headers || {};
const secs = v => { const m = String(v || '').match(/^([\d.]+)(ms|s|m)?$/); if (!m) return null;
  return Number(m[1]) * ({ ms: 0.001, s: 1, m: 60 }[m[2] || 's']); };
if (code === 429 || code >= 500) {
  let wait = h['retry-after-ms'] ? Number(h['retry-after-ms']) / 1000 : secs(h['retry-after'])
          ?? secs(h['x-ratelimit-reset-tokens']) ?? secs(h['x-ratelimit-reset-requests']);
  if (wait == null) wait = Math.min(60, 2 * 2 ** (attempts - 1));   // exponential backoff
  // retry this row after `wait` seconds, unless attempts >= max_attempts
}

Download the template

Free download: n8n-sheets-bulk-ai-runner.json (import with Workflows → Import from file). It does all six steps: a status checkpoint and lease, batches with a pause, per-row retry that honors Retry-After with exponential backoff and an attempt cap, one Sheets write per batch with a quota retry, a stop with a clear email on a bad key or empty billing, an optional 15-minute schedule, and a summary email. Everything you change is in one Workflow configuration node: sheet URL, tab, prompt with {column} placeholders, model, batch size, pauses and retry limits. Set output_format to json to spread JSON keys into matching columns. No credentials are inside; you connect your own OpenAI, Google Sheets and Gmail.

Tests on n8n 2.44.4 against the mock: a 25-row happy path, 429 with Retry-After / retry-after-ms / x-ratelimit-reset headers, repeated 429s up to the cap, a Sheets 429 during write-back, a process killed mid-run and resumed, a rerun with everything done (no calls), empty cells, 500 rows under a strict rate limit, malformed model output, a bad API key and empty billing. Not tested yet: the real OpenAI and Google APIs.

Troubleshooting

SymptomFix
A Google Sheets Append node inside a loop fails with Quota exceeded for quota metric 'Read requests' and limit 'Read requests per minute per user' after about 20 rounds, even though you only writeBefore n8n 2.21.0, each Append run read the sheet's header row 3 times on top of the write, so a loop burned through Google's 60 reads per minute per user fast. n8n fixed that in PR #29444 (merged May 6, 2026, released in 2.21.0), which cuts it to 1 read per append. Update to 2.21.0 or later, and append all of a batch's rows in one node run instead of one row per loop.
Rows keep ending as error with "Gave up after 5 attempts. Last: HTTP 429"Your batch is too big for your tier. Lower batch_size or raise wait_between_batches_seconds, clear the status of those rows, and run again.
Run stops with "insufficient_quota"Add credit or raise the monthly limit in the OpenAI billing settings. Unfinished rows were put back to pending.
Rows stuck on processingA run crashed. They're picked up again after lease_minutes, or clear the status to retry now.
404 or "Requested entity was not found" from Read all rowssheet_url is still the placeholder, or the Google account in the credential can't open the sheet.
Rows retry with "No response (getaddrinfo EAI_AGAIN …)" or "ENOTFOUND"That's a DNS failure on your n8n server, not OpenAI. Fix the container's DNS or networking: see the n8n getaddrinfo EAI_AGAIN / ENOTFOUND guide.
"Add these column headers"The state columns are missing from row 1. Add them exactly as listed.
Download the free Google Sheets bulk AI runner

n8n workflow JSON: OpenAI over every row in batches, waits for Retry-After on 429, backs off, caps attempts, resumes where it stopped, one Sheets write per batch. No credentials inside.

Want to see the 429 handling work before you touch a real API key? The Sheets Bulk AI Runner Pro Kit ($19) adds the sheet header CSV and an offline test kit (a local OpenAI, Sheets and Gmail mock with the 15-scenario runner).

FAQ

What does "The service is receiving too many requests from you" mean in n8n?
It is n8n's message for an HTTP 429 response. With OpenAI it usually means you hit your requests-per-minute or tokens-per-minute limit; with Google Sheets it means the per-minute Sheets API quota. If the OpenAI error says insufficient_quota, you are out of credit and waiting won't help.

Why doesn't Retry On Fail fix OpenAI 429 errors in n8n?
Retry On Fail allows at most 5 tries with at most 5 seconds between them, ignores the Retry-After time OpenAI sends, and resends every item in the node. Handle the status code per row instead and wait for Retry-After or back off exponentially.

How do I resume a Google Sheets AI run in n8n without re-sending rows?
Add a status column. Process only rows whose status is empty or pending, mark them processing before calling the API, and write done or error with the result. A rerun then skips every finished row.

How do I avoid Google Sheets 429 quota errors in n8n?
Write back once per batch instead of once per row: a Google Sheets Update Row node that receives all of a batch's items sends one batchUpdate call. If Sheets still returns 429, wait up to a minute and write the same rows again.

Is the template free?
Yes. It is a free n8n workflow JSON with no credentials inside. You pay OpenAI for your own API usage.