Skip to main system content
TecSynth
← Blog
AI Automations7 min read

How to Connect Google Sheets to Slack with n8n (Step-by-Step + Free Template)

Send a Slack message automatically every time a row is added to Google Sheets using n8n. Full step-by-step tutorial with a copy-paste workflow JSON template and common error fixes.

n8n Google Sheets Slackn8n TutorialGoogle Sheets AutomationSlack Automationn8n WorkflowWorkflow Template

Quick answer: Connect a Google Sheets trigger node to a Slack message node in n8n. The trigger polls your sheet for new rows, and the Slack node posts each row's values to your chosen channel. Setup takes about 10 minutes, and the complete workflow JSON below can be imported directly.

This tutorial walks through the exact setup, including credentials, expressions, and the errors that trip people up on their first workflow.

What You Need Before Starting

ComponentPurposeCost
n8n instanceRuns the workflowFree self-hosted, or n8n Cloud from about $20/mo
Google accountOwns the spreadsheet being watchedFree
Slack workspaceReceives the alert messagesFree plan works
A Google Sheet with headersThe data sourceFree

Your sheet needs a header row. This tutorial assumes columns named Name, Email, and Message, but any headers work as long as your expressions match them.

Step 1: Create the Workflow and Add the Google Sheets Trigger

Create a new workflow in n8n and add the node called Google Sheets Trigger. Set the event to On Row Added.

Connect your Google account when prompted. n8n walks you through the OAuth flow; grant read access to Sheets. Then select your spreadsheet and the specific tab to watch.

Set the polling interval. Every minute is the tightest standard option and is right for alert use cases.

Step 2: Add the Slack Node

Add a Slack node after the trigger and set the operation to Send Message. Connect your Slack account using OAuth, then pick the target channel.

For the message text, switch the field to expression mode and reference the row's columns:

New signup: {{ $json.Name }} ({{ $json.Email }})
Message: {{ $json.Message }}

The column names inside the braces must match your sheet headers exactly. A header called Email Address is referenced as {{ $json['Email Address'] }}.

Step 3: Test It

Click Execute Workflow, then add a row to your sheet. The execution panel shows the trigger picking up the row and the Slack node sending the message. When the test passes, activate the workflow with the toggle in the top right. It now runs on its own.

The Free Workflow Template

Import this JSON directly: in n8n, open the workflow menu and choose Import from File, or paste it into a blank canvas. Then reconnect your own Google and Slack credentials and select your sheet and channel.

{
  "name": "Google Sheets to Slack Alerts",
  "nodes": [
    {
      "parameters": {
        "pollTimes": { "item": [{ "mode": "everyMinute" }] },
        "documentId": { "__rl": true, "mode": "list", "value": "REPLACE_WITH_SHEET_ID" },
        "sheetName": { "__rl": true, "mode": "list", "value": "Sheet1" },
        "event": "rowAdded"
      },
      "id": "trigger-1",
      "name": "Google Sheets Trigger",
      "type": "n8n-nodes-base.googleSheetsTrigger",
      "typeVersion": 1,
      "position": [260, 300]
    },
    {
      "parameters": {
        "select": "channel",
        "channelId": { "__rl": true, "mode": "name", "value": "#alerts" },
        "text": "=New signup: {{ $json.Name }} ({{ $json.Email }})\nMessage: {{ $json.Message }}",
        "otherOptions": {}
      },
      "id": "slack-1",
      "name": "Slack",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2.2,
      "position": [520, 300]
    }
  ],
  "connections": {
    "Google Sheets Trigger": {
      "main": [[{ "node": "Slack", "type": "main", "index": 0 }]]
    }
  },
  "active": false,
  "settings": { "executionOrder": "v1" }
}

How Do You Filter Which Rows Trigger an Alert?

Add an IF node between the trigger and Slack. Set its condition against any column value, for example only alerting when the Status column equals urgent. Rows that fail the condition simply end at the IF node, and matching rows continue to Slack.

This one addition turns a raw feed into a targeted alert system: new leads above a deal size, form responses containing a keyword, inventory rows below a threshold.

What Should You Build Next?

This trigger-to-message pattern is the foundation of most business automation. Before scaling it up, run the workflow audit to pick the processes worth automating first.

If you are still choosing a platform, our n8n vs Make vs Zapier comparison covers when each wins, and our EU pricing breakdown shows exactly what each costs at real volumes.

FAQ

Why is my Google Sheets trigger not firing in n8n?

The most common cause is polling delay. The Google Sheets trigger polls on a schedule rather than firing instantly, so a new row can take up to one polling interval to be detected. Check that the workflow is activated, that the trigger watches the correct sheet tab, and that your Google credentials have not expired.

Why does my Slack message show raw expression text instead of values?

Your expression is not being evaluated. In the Slack node, the message field must be set to expression mode, which n8n marks with an equals sign at the start of the field. Re-open the field, switch from fixed to expression, and confirm the column names match your sheet headers exactly, including capitalization.

Can n8n detect edited rows, not just new ones?

Yes. The Google Sheets trigger supports both rowAdded and rowUpdate events. Select rowUpdate in the trigger's event dropdown to fire on edits. Watching updates on large sheets increases polling load, so keep the watched range as narrow as possible.

Is this workflow free to run?

On self-hosted n8n, yes: there are no per-execution charges, so this workflow costs only your server. On n8n Cloud, each run consumes one execution from your plan quota. Even at hundreds of new rows per day, this workflow fits comfortably inside the entry Cloud tier.