AutomationFlowsSlack & Telegram › Track New Ranked Keywords in Google Sheets with Dataforseo and Slack Alerts

Track New Ranked Keywords in Google Sheets with Dataforseo and Slack Alerts

ByDataForSEO @dataforseo on n8n.io

Once a week, this workflow automatically scans Google for newly ranked keywords for your domains using the DataForSEO API. It pulls the latest data for every target you track, stores a fresh snapshot in Google Sheets, and compares it to the previous run. Any newly ranked…

Cron / scheduled trigger★★★★☆ complexity23 nodesN8N Nodes DataforseoGoogle SheetsSlack
Slack & Telegram Trigger: Cron / scheduled Nodes: 23 Complexity: ★★★★☆ Added:

This workflow corresponds to n8n.io template #13332 — we link there as the canonical source.

This workflow follows the Google Sheets → Slack recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "id": "Jwep9TtMO6Ddv3M1",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Pull new ranked keywords to Google Sheets with DataForSEO & get a Slack message",
  "tags": [],
  "nodes": [
    {
      "id": "535ba217-b155-489d-95bc-2e6cc1724135",
      "name": "Aggregate",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        448,
        64
      ],
      "parameters": {
        "options": {},
        "aggregate": "aggregateAllItemData"
      },
      "typeVersion": 1
    },
    {
      "id": "7f44f734-82f6-4206-b199-a631e05401cb",
      "name": "Get ranked keywords",
      "type": "n8n-nodes-dataforseo.dataForSeoLabsApi",
      "position": [
        736,
        432
      ],
      "parameters": {
        "limit": 1000,
        "offset": "={{ $runIndex * 1000 }}",
        "operation": "get-ranked-keywords",
        "target_any": "={{ $('Get targets').item.json.Domain }}",
        "language_name": "={{ $('Get targets').item.json.Language }}",
        "location_name": "={{ $('Get targets').item.json.Location }}"
      },
      "credentials": {
        "dataForSeoApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "a5304d6e-eb58-4b30-b721-da585eff27a9",
      "name": "Get previous keywords",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        224,
        64
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1681593026,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1FO9Btg5y5TmE56La4O-QzJbEjGAZLe3zG0phB7eXnqs/edit#gid=1681593026",
          "cachedResultName": "Keywords"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1FO9Btg5y5TmE56La4O-QzJbEjGAZLe3zG0phB7eXnqs",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1FO9Btg5y5TmE56La4O-QzJbEjGAZLe3zG0phB7eXnqs/edit?usp=drivesdk",
          "cachedResultName": "New Ranked Keywords"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7,
      "alwaysOutputData": true
    },
    {
      "id": "135ef117-db2e-459c-897c-da9ef4e51244",
      "name": "Get targets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1040,
        64
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1FO9Btg5y5TmE56La4O-QzJbEjGAZLe3zG0phB7eXnqs/edit#gid=0",
          "cachedResultName": "Targets"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1FO9Btg5y5TmE56La4O-QzJbEjGAZLe3zG0phB7eXnqs",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1FO9Btg5y5TmE56La4O-QzJbEjGAZLe3zG0phB7eXnqs/edit?usp=drivesdk",
          "cachedResultName": "New Ranked Keywords"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "fda98adf-68b2-42a1-92d8-aed63883aa29",
      "name": "Find new keywords",
      "type": "n8n-nodes-base.code",
      "position": [
        816,
        992
      ],
      "parameters": {
        "jsCode": "let oldKeywords = new Set([]);\nif ($('Aggregate').first().json.data) {\n oldKeywords = new Set($('Aggregate').first().json.data\n  .filter(item => item.Target == $('Get targets').first().json.Domain)\n  .map(item => item.Keyword));\n}\n\nlet diff = null;\n\nif (oldKeywords.size) {\n  let newKeywords = [];\n  if ($('Merge \"items\" with last response').first().json.items) {\n   newKeywords = $('Merge \"items\" with last response').first().json.items\n    .map(item => item.keyword_data.keyword);\n  }\n  \n  diff = newKeywords.filter(x => !oldKeywords.has(x));\n}\n\nreturn [\n  {\n    json: {\n      diff\n    }\n  }\n];"
      },
      "typeVersion": 2,
      "alwaysOutputData": true
    },
    {
      "id": "4cd7326f-9f45-40ca-ae35-5ead0b2842b4",
      "name": "Append keyword in sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        368,
        992
      ],
      "parameters": {
        "columns": {
          "value": {
            "Url": "={{ $json.ranked_serp_element.serp_item.url }}",
            "Date": "={{ new Date().toLocaleDateString('en-CA') }}",
            "Rank": "={{ $json.ranked_serp_element.serp_item.rank_absolute }}",
            "Target": "={{ $('Get targets').item.json.Domain }}",
            "Keyword": "={{ $json.keyword_data.keyword }}",
            "Search Volume": "={{ $json.keyword_data.keyword_info.search_volume }}",
            "SERP Item Types": "={{ $json.keyword_data.serp_info.serp_item_types.join(', ') }}"
          },
          "schema": [
            {
              "id": "Target",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Target",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Keyword",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Keyword",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Date",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Rank",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Rank",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Search Volume",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Search Volume",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Url",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Url",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "SERP Item Types",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "SERP Item Types",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1681593026,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1FO9Btg5y5TmE56La4O-QzJbEjGAZLe3zG0phB7eXnqs/edit#gid=1681593026",
          "cachedResultName": "Keywords"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1FO9Btg5y5TmE56La4O-QzJbEjGAZLe3zG0phB7eXnqs",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1FO9Btg5y5TmE56La4O-QzJbEjGAZLe3zG0phB7eXnqs/edit?usp=drivesdk",
          "cachedResultName": "New Ranked Keywords"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "7577ba15-ccf2-440a-a631-035dd0af37d1",
      "name": "Run every Monday",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        0,
        64
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "weeks",
              "triggerAtDay": [
                1
              ],
              "triggerAtHour": 9
            }
          ]
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "53dba256-7ae8-473b-8d87-294d0c55a7ac",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        896,
        -96
      ],
      "parameters": {
        "color": 6,
        "width": 272,
        "height": 320,
        "content": "## Get targets\nSelect a spreadsheet with your target domains. The spreadsheet must have the same columns as in [this Example](https://docs.google.com/spreadsheets/d/1FO9Btg5y5TmE56La4O-QzJbEjGAZLe3zG0phB7eXnqs/edit?pli=1&gid=0#gid=0)."
      },
      "typeVersion": 1
    },
    {
      "id": "1d4d9366-c24a-4677-9c5b-8229f82eb438",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        272,
        320
      ],
      "parameters": {
        "color": 6,
        "width": 1264,
        "height": 352,
        "content": "## Get ranked keywords from DataForSEO\nCreate a DataForSEO connection and set up additional parameters if needed."
      },
      "typeVersion": 1
    },
    {
      "id": "bca064d2-83aa-4b66-ad70-04d2fd4325eb",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        112,
        848
      ],
      "parameters": {
        "color": 6,
        "width": 1264,
        "height": 304,
        "content": "## Save current ranked keywords to the spreadsheet and send new keywords to Slack\nSelect the same spreadsheet with your keywords as in the first Google Sheets node.\n Add additional information to the Slack message if needed."
      },
      "typeVersion": 1
    },
    {
      "id": "bf831615-5b6e-40f1-8666-5a7742eebc51",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -544,
        0
      ],
      "parameters": {
        "width": 400,
        "height": 640,
        "content": "This workflow automatically fetches new keywords your domains started ranking for on Google, saves them into Google Sheets, and sends you a Slack summary so you can quickly see what\u2019s changed.\n\n## How it works\n1. Triggers on your chosen schedule (default: once a week).\n2. Reads your keywords and target domains from Google Sheets.\n3. Extracts fresh ranking data from Google via DataForSEO Labs API.\n4. Compares the results with the previous run.\n5. Adds newly ranked keywords into a dedicated Google Sheet.\n6. Sends a weekly summary message to Slack.\n\n## Setup steps\n1. Indicate your spreadsheets with keywords and target domains.\n2. Create or select your DataForSEO connection (use your API login and password \u2013 see here).\n3. Create a Slack connection and choose who gets the message with the new ranked keywords.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "4f3dfd65-78bf-4a34-b9f5-1ca2f0abca2a",
      "name": "Aggregate1",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        592,
        992
      ],
      "parameters": {
        "options": {},
        "aggregate": "aggregateAllItemData"
      },
      "typeVersion": 1
    },
    {
      "id": "24f0262a-42c6-48f8-b7cd-297941979295",
      "name": "Merge \"items\" with DFS response",
      "type": "n8n-nodes-base.set",
      "position": [
        960,
        432
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "ddd82419-e43e-44d8-919c-2d6602704da5",
              "name": "items",
              "type": "array",
              "value": "={{ [ ...$('Set \"items\" field').item.json.items, ...$json.tasks[0].result[0].items] }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "600cf175-aaad-46e1-95a1-514dc826d27d",
      "name": "Set \"items\" field",
      "type": "n8n-nodes-base.set",
      "position": [
        512,
        512
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "4b3c95a2-4e38-4e37-8e2f-a7e4544808d6",
              "name": "items",
              "type": "array",
              "value": "={{ $json.items }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "6444f643-8d47-4dfb-8d11-25ed0f69243b",
      "name": "Merge \"items\" with last response",
      "type": "n8n-nodes-base.set",
      "position": [
        1392,
        512
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "1e2c8353-5628-4948-abe6-35f8d0f660a5",
              "name": "items",
              "type": "array",
              "value": "={{ [...$('Set \"items\" field').item.json.items, ... $('Get ranked keywords').item.json.tasks[0].result[0].items]}}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "ce95e02f-de55-43fc-820c-bc84e659dae4",
      "name": "Clear sheet (Keywords)",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        672,
        64
      ],
      "parameters": {
        "operation": "clear",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1681593026,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1FO9Btg5y5TmE56La4O-QzJbEjGAZLe3zG0phB7eXnqs/edit#gid=1681593026",
          "cachedResultName": "Keywords"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1FO9Btg5y5TmE56La4O-QzJbEjGAZLe3zG0phB7eXnqs",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1FO9Btg5y5TmE56La4O-QzJbEjGAZLe3zG0phB7eXnqs/edit?usp=drivesdk",
          "cachedResultName": "New Ranked Keywords from Google with DataForSEO"
        },
        "keepFirstRow": true
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "3edd9e7a-7a35-451a-9c8f-2dd540101299",
      "name": "Loop Over Targets",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        48,
        496
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "148c8864-e713-403c-8eb9-b1fc90142ee3",
      "name": "Send a message",
      "type": "n8n-nodes-base.slack",
      "position": [
        1248,
        992
      ],
      "parameters": {
        "text": "=New ranked keywords for target {{ $('Loop Over Targets').item.json.Domain }}: {{ $json.diff.join(', ') }}",
        "otherOptions": {},
        "authentication": "oAuth2"
      },
      "credentials": {
        "slackOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.4
    },
    {
      "id": "9618569c-b39f-49cd-8731-2c4effd92edf",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        160,
        -96
      ],
      "parameters": {
        "color": 6,
        "width": 672,
        "height": 320,
        "content": "## Get previous keywords and clear the sheet\nCreate a Google Sheets connection and select the spreadsheet where keywords should be saved. The sheet must have the same columns as in [this Example](https://docs.google.com/spreadsheets/d/1FO9Btg5y5TmE56La4O-QzJbEjGAZLe3zG0phB7eXnqs/edit?pli=1&gid=1681593026#gid=1681593026)."
      },
      "typeVersion": 1
    },
    {
      "id": "a357acce-d6f4-4acb-bb92-e0adf8fb66c8",
      "name": "Has more pages?",
      "type": "n8n-nodes-base.if",
      "position": [
        1152,
        496
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "cd5943f7-df0b-4329-8436-9a1af3ec7caf",
              "operator": {
                "type": "number",
                "operation": "lt"
              },
              "leftValue": "={{ $runIndex }}",
              "rightValue": "={{ $('Get ranked keywords').item.json.tasks[0].result[0].total_count / 1000 - 1}}"
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "2d838c6d-c566-44dd-b08f-f658b3d70e62",
      "name": "Split out (items)",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        144,
        992
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "items"
      },
      "typeVersion": 1
    },
    {
      "id": "9c34c2cb-91a4-454c-b171-d0fa84c4d77d",
      "name": "Filter (has new keywords)",
      "type": "n8n-nodes-base.filter",
      "position": [
        1024,
        992
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "5eb291aa-96e8-4326-b4c6-63680ac712d1",
              "operator": {
                "type": "array",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $json.diff }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "1f531e89-397e-4b3a-a230-05f3fff3708f",
      "name": "Initialize \"items\" field",
      "type": "n8n-nodes-base.set",
      "position": [
        288,
        512
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "0126c659-03a5-4fc8-bd76-62d2ecea1195",
              "name": "items",
              "type": "array",
              "value": "={{ [] }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "ad33c757-098f-4ea9-93d5-95efd6198e00",
  "connections": {
    "Aggregate": {
      "main": [
        [
          {
            "node": "Clear sheet (Keywords)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Aggregate1": {
      "main": [
        [
          {
            "node": "Find new keywords",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get targets": {
      "main": [
        [
          {
            "node": "Loop Over Targets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send a message": {
      "main": [
        [
          {
            "node": "Loop Over Targets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Has more pages?": {
      "main": [
        [
          {
            "node": "Set \"items\" field",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Merge \"items\" with last response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Run every Monday": {
      "main": [
        [
          {
            "node": "Get previous keywords",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Find new keywords": {
      "main": [
        [
          {
            "node": "Filter (has new keywords)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Targets": {
      "main": [
        [],
        [
          {
            "node": "Initialize \"items\" field",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set \"items\" field": {
      "main": [
        [
          {
            "node": "Get ranked keywords",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split out (items)": {
      "main": [
        [
          {
            "node": "Append keyword in sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get ranked keywords": {
      "main": [
        [
          {
            "node": "Merge \"items\" with DFS response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get previous keywords": {
      "main": [
        [
          {
            "node": "Aggregate",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Clear sheet (Keywords)": {
      "main": [
        [
          {
            "node": "Get targets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Append keyword in sheet": {
      "main": [
        [
          {
            "node": "Aggregate1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Initialize \"items\" field": {
      "main": [
        [
          {
            "node": "Set \"items\" field",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter (has new keywords)": {
      "main": [
        [
          {
            "node": "Send a message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge \"items\" with DFS response": {
      "main": [
        [
          {
            "node": "Has more pages?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge \"items\" with last response": {
      "main": [
        [
          {
            "node": "Split out (items)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Once a week, this workflow automatically scans Google for newly ranked keywords for your domains using the DataForSEO API. It pulls the latest data for every target you track, stores a fresh snapshot in Google Sheets, and compares it to the previous run. Any newly ranked…

Source: https://n8n.io/workflows/13332/ — original creator credit. Request a take-down →

More Slack & Telegram workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Slack & Telegram

This weekly workflow automatically discovers new high-volume, ranked keywords for your domain on Google without manual SERP monitoring. On each run, the workflow fetches the latest ranking and search

N8N Nodes Dataforseo, Google Sheets, Asana +1
Slack & Telegram

This workflow continuously monitors the TikTok Ads Library for new creatives from specific advertisers or keyword searches, scrapes them via Apify, logs them into Google Sheets, and sends concise noti

Google Sheets, Slack, Telegram +1
Slack & Telegram

This weekly workflow automatically identifies new ranked keywords for your domain within Google’s top 10 results without manual SERP monitoring. On each run, the workflow fetches the latest ranking an

N8N Nodes Dataforseo, Airtable, Slack
Slack & Telegram

This workflow contains community nodes that are only compatible with the self-hosted version of n8n.

N8N Nodes Scrapegraphai, HTTP Request, Google Sheets +2
Slack & Telegram

Simplify financial oversight with this automated n8n workflow. Triggered daily, it fetches cash flow and expense data from a Google Sheet, analyzes inflows and outflows, validates records, and generat

HTTP Request, Google Sheets, Email Send +3