n8n Google Sheets Trigger: start a video from each new row

n8n's Google Sheets Trigger polls a sheet and fires on added or updated rows. Key each row's video run on a row id so an edit doesn't bill twice.

5 min readSume
All posts

n8n's Google Sheets Trigger is a polling trigger: n8n checks the sheet on a schedule and starts the workflow when a row was added, updated, or either. To start a video from each new row, map the row's cells into the video request as data and key the request on an id column, so an edit or a repeat poll doesn't start a second paid run.

n8n behavior comes from its Google Sheets Trigger docs, its common issues page, and the node's source code; Sume behavior from Create a run. All read 2026-09-28. Sume has no n8n node, so the video step is a plain HTTPS call from the HTTP Request node.

Which Trigger On option should I pick?

The node offers three events, and the default is not "new row":

From n8n's Google Sheets Trigger docs and node source (trigger, utils), read 2026-09-28.
Trigger OnWhat the source shows
Row AddedCompares the row count with the last check and emits the rows past it. The first automatic check only records the count.
Row UpdatedCompares sheet revisions. Skips rows that were empty in the previous revision, so a brand-new row does not fire it. Takes Columns to Watch and Include in Output (New, Old, or Both Versions). Needs edit access to the document.
Row Added or UpdatedThe default. Same options and edit-access rule as Row Updated. Without Columns to Watch, a new column also fires it.

Why does a new row fire too early or not at all?

Row Added counts rows; it does not remember which rows it has seen. Three things follow:

  • A row still being typed can be caught by a poll before every cell is filled, and later edits will not fire Row Added again. Paste complete rows, or use the status-column pattern below.
  • Deleting rows between two polls can hide a row added in the same window, because the count does not change.
  • Rows that exist when the trigger starts are never emitted automatically. A manual test run, by contrast, returns every data row.

How do I start a video only when a row is ready?

Give the sheet an id column and a status column. Set Trigger On to Row Added or Updated with Columns to Watch set to status (not Row Updated, which skips new rows), add an If node that passes only rows whose status is ready, then an HTTP Request node. n8n nodes usually run once per item, so each ready row sends one request to your Format's runs endpoint with a Bearer credential and an Idempotency-Key of row-{{ $json.id }}:

  • input takes up to 64 top-level keys, so one key per column fits most sheets.
  • Same key, same body: Sume returns the original run, with no second charge.
  • Same key, changed body (someone edited the row and set it back to ready): 409 idempotency_conflict, and nothing runs. Add a version to the key when you want the row made again.
{
  "instruction": "Make a 20-second vertical product video from this row.",
  "input": {
    "product": {{ JSON.stringify($json.product) }},
    "headline": {{ JSON.stringify($json.headline) }}
  },
  "generation_spend_cap_usd": 15,
  "communication": { "webhook_url": "https://n8n.example.com/webhook/sume-done" }
}

What if many rows arrive at once?

One poll can emit several rows. To hand them to Sume as one request, a bulk run takes 1 to 100 items, each the same body as a single run, and keeps 1 to 16 in flight; see Format bulk runs. The queue itself has no webhook; communication.webhook_url is set per item, so each run still reports on its own.

Receive each finished run in a second workflow that starts with a Webhook node, as in the RSS version of this build. Writing the video URL back to the row is covered in n8n Google Sheets AI avatar videos.

Why do dates arrive as numbers?

Google Sheets can send dates as serial numbers: days since December 30, 1899, with the time as a fraction. With Row Added, add the DateTime Render option and set it to Formatted String; the result then follows the spreadsheet's locale. The update events have no such option, and the node's source reads their values as serial numbers, so convert dates in a later node. If a test run seems stuck waiting behind a reverse proxy, n8n's docs point to missing websocket proxying.

Sources

Related posts

More in Integrations

All Integrations posts

Written by Sume