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 →
{
"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.
dataForSeoApigoogleSheetsOAuth2ApislackOAuth2Api
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 →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
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
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
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
This workflow contains community nodes that are only compatible with the self-hosted version of n8n.
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