FlowKit

Automating Google Sheets with n8n: reading, writing, and triggering a workflow from a spreadsheet

Published 23 July 2026 · 6 min read

Despite the rise of no-code databases, Google Sheets remains the tool every team already knows how to use without training. That's exactly what makes it a great entry or exit point for an n8n workflow: a salesperson qualifies leads in a shared tab, a compliance lead reviews an audit trail in a familiar spreadsheet, a daily digest lands in a sheet checkable from a phone. n8n's Google Sheets node lets you read, write, and trigger a workflow directly from a spreadsheet — provided you know its operations, its duplicate-row pitfalls, and its quotas.

Connecting Google Sheets: OAuth2 authentication

The Google Sheets node uses an OAuth2 credential (Google Sheets OAuth2 API), not a simple API key. From the Google Cloud Console, you need to create a project, enable the Google Sheets API (and the Google Drive API, required to list accessible files), then generate OAuth client credentials. n8n then offers a standard connection flow: you authenticate with the Google account that owns or can edit the target sheet, and n8n stores the token encrypted. For production use, prefer a dedicated Google service account for automation rather than an individual employee's personal account, who might leave the company — the same principle covered in our API credential security guide.

The Google Sheets node's operations

The node offers a set of operations that covers nearly all common use cases:

  • Append Row: adds a new row at the bottom of the sheet. The simplest operation, suited to a log or digest where each run adds an entry without ever touching previous rows.
  • Update Row: modifies an existing row, identified by its row number — useful when you already know the exact position of the data to correct.
  • Append or Update Row: looks up a row matching a column value you designate (an email, an order ID, a slug); if it exists, it's updated, otherwise a new row is created. This is the operation to favor whenever the same record might be touched more than once by the workflow — the same principle as the deduplication described in our article on webhook idempotence, applied here to a spreadsheet instead of a SQL database.
  • Get Row(s): reads a sheet's rows, with an optional filter on column values — handy for finding a record before deciding whether to update it.
  • Clear and Delete Rows: wipe a range or delete rows, best reserved for scheduled cleanup jobs rather than everyday business logic, since mistakes are harder to undo than an addition.

For volumes of several hundred rows, enable batch processing instead of chaining operations one by one inside a loop: this sharply reduces the number of API calls and avoids hitting the quotas described below.

Use case 1 — Daily digest exported to a spreadsheet the whole team can check

The Inbox AI Pack triages incoming emails and generates a daily digest sent to Slack or Telegram (see our guide on automating emails with AI). Adding an Append Row alongside the Slack send turns this ephemeral digest into a checkable history: each spreadsheet row records the date, the number of emails processed, the number of urgent items detected, and a link to the details. A manager wanting to track inbox load over several weeks no longer needs to reopen every Slack message — a simple column sort in Google Sheets is enough.

Use case 2 — Lead qualification visible to the sales team

On an AI-driven inbound lead qualification workflow, the AI assigns a score and a summary to each prospect. Writing that result to Google Sheets with Append or Update Row (match key: the lead's email) gives the sales team a shared, hand-editable view — a rep can add a note or correct a score without touching the workflow. It's a lightweight intermediate step before a more structured sync to a real CRM: see our HubSpot/Pipedrive CRM sync guide for the next step once volume or reporting needs outgrow what a spreadsheet can reasonably offer.

Use case 3 — A lightweight audit trail for compliance

The Compliance & Audit Pack logs every response in Supabase to guarantee a reliable, queryable audit trail (detailed in our GDPR guide with Supabase). For a small structure that doesn't yet need that level of rigor, a simple Append Row to Google Sheets at each key process step (questionnaire received, reminder sent, response validated) already provides traceability that a non-developer can review. It's a reasonable starting point — provided you're aware of its limits: a spreadsheet anyone can edit by hand offers no row locking, no tamper-proof timestamping, and no integrity constraints. A landmark study by Powell, Baker and Lawson (Impact of Errors in Operational Spreadsheets, Decision Support Systems, 2009 — see on Google Scholar) analyzed 25 production spreadsheets used across five organizations: 117 confirmed errors were found, some with significant financial impact — a useful reminder that the ease of manual editing that makes a spreadsheet convenient is also its main weakness once it serves as an official record rather than a working draft.

Triggering a workflow from a new row: the Google Sheets Trigger

The Google Sheets Trigger node reverses the flow: instead of writing to the sheet from a workflow, it starts a workflow when the sheet changes. It offers two main events, "Row Added" and "Row Updated", with a configurable polling interval (every minute by default, adjustable based on how urgent the use case actually is). This mechanism works well for a simple case — a team adds a "new request" row and a workflow handles the rest — but keep two limits in mind:

  • It's not guaranteed real time. As with the Airtable trigger, this is polling: the workflow fires on the next scheduled check, not at the exact moment of the edit.
  • A sheet edited by several people at once can produce unexpected triggers if two rows are added at once or a row is moved manually — test the behavior on your actual sheet structure before wiring up an irreversible downstream action.

Google Sheets API quotas to know

The Google Sheets API enforces strict limits per Google Cloud project: 300 read requests per minute per project, plus a cap of 60 requests per minute per authenticated user, with equivalent quotas on the write side. These numbers look generous, but a poorly designed n8n workflow — a loop that calls Get Row(s) or Update Row once per item instead of processing a whole batch in one call — can hit them quickly on a sheet with several thousand rows. The symptom is the same as for the AI APIs covered in our guide on 429 errors: add batch processing and, if needed, a small pause between groups of calls rather than firing off individual requests one after another.

When to switch to Data Tables or Supabase

Google Sheets works well as long as a non-technical person needs to view or correct the data directly, at a volume of a few hundred to a few thousand rows, with only one workflow writing at a time. Three signals suggest it's time to migrate to a real database:

  • Several workflows write at the same time to the same rows: the risk of edit conflicts grows, and a spreadsheet offers no transactional guarantees.
  • Volume exceeds a few tens of thousands of rows: API response times degrade, and the quotas described above become limiting.
  • You need relationships between tables, integrity constraints, or complex queries (joins, aggregations): a spreadsheet is fundamentally a grid, not a relational database.

For a first step without leaving the n8n ecosystem, built-in Data Tables offer typed columns with no infrastructure to manage. For more advanced needs — vector RAG, a timestamped audit trail, an API exposed to other services — our Supabase connection guide covers the full setup.

Going further

Google Sheets is neither a toy nor a production database: it's a tabular interface your users already know how to read, best reserved for the volumes and use cases that genuinely benefit from it. The workflows in the FlowKit packs are built to work with Supabase by default, but each integration can be adapted to also — or only — write to Google Sheets when simplicity matters more than scale.

FAQ

Frequently asked questions

Does n8n's Google Sheets Trigger work in real time?

No. The Google Sheets Trigger polls the sheet at a regular interval and compares its state to the last check to detect new or modified rows. Depending on the configured interval (every minute by default), expect a delay of a few tens of seconds to a few minutes between adding a row and the workflow firing — it's not a push webhook like Stripe or Typeform.

How do I avoid creating the same row twice in Google Sheets from n8n?

Use the Append or Update Row operation instead of Append Row alone. It first looks up an existing row based on a key column you designate (an email, an external ID) and updates that row if it exists, or creates a new one otherwise — the same principle as an upsert in a database, applied to a spreadsheet.

What Google Sheets API rate limit should I know about?

Google caps the Sheets API at 300 read requests per minute per Google Cloud project (with an equivalent write quota), plus a 60 requests per minute per authenticated user limit. An n8n workflow that loops over hundreds of rows one at a time can hit this ceiling; batch your operations using the node's batch mode instead of calling the API row by row.

Should I stick with Google Sheets or migrate to Supabase for a professional use case?

Google Sheets remains a good fit as long as a non-technical person needs to view or correct the data by hand, on a volume of a few hundred to a few thousand rows. Beyond that, or as soon as several workflows read and write the same rows at the same time, a real database (n8n's built-in Data Tables, or Supabase for more advanced needs) removes the risk of edit conflicts and the spreadsheet's rate limits.

Bundle FlowKit Complet

€269