This workflow corresponds to n8n.io template #13685 — we link there as the canonical source.
This workflow follows the Chainllm → Google Sheets 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": "NqiKUyx6sTACfJyr",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Reddit Intelligence Monitor: AI-Powered Scraping with BrowserAct",
"tags": [],
"nodes": [
{
"id": "2b0263d5-2b2b-46dc-a4d3-dc0574f672bd",
"name": "Google Gemini Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
752,
144
],
"parameters": {
"options": {}
},
"credentials": {
"googlePalmApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "db0ed312-d201-43d9-a4c4-cc244a9c9c5c",
"name": "Google Gemini Chat Model1",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
704,
432
],
"parameters": {
"options": {}
},
"credentials": {
"googlePalmApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "e4bc6c82-4380-4b12-9e11-0a4f27b8f427",
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-128,
-336
],
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 10
}
]
}
},
"typeVersion": 1.3
},
{
"id": "0d1688a8-d586-4f37-8592-40fbe3326f32",
"name": "GSheets: Read Config",
"type": "n8n-nodes-base.googleSheets",
"position": [
160,
-336
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1nlneOUxetIxbTQBezlFnSO-wpd8jpxPgpACBglJ3Xhk/edit#gid=0",
"cachedResultName": "Config"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1nlneOUxetIxbTQBezlFnSO-wpd8jpxPgpACBglJ3Xhk",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1nlneOUxetIxbTQBezlFnSO-wpd8jpxPgpACBglJ3Xhk/edit?usp=drivesdk",
"cachedResultName": "reddit competitor"
},
"authentication": "serviceAccount"
},
"credentials": {
"googleApi": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "6bd7e52d-2467-446e-b21b-01773a88b40e",
"name": "If: Is Keyword?",
"type": "n8n-nodes-base.if",
"position": [
432,
-336
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "or",
"conditions": [
{
"id": "ab5280db-58a4-4b25-8324-8f481c4566eb",
"operator": {
"type": "string",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{ $json.keywords }}",
"rightValue": ""
},
{
"id": "256ed4ef-9903-4550-89b6-9a7cef14e0b8",
"operator": {
"type": "string",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{ $json.competitor }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.3
},
{
"id": "facf1e54-d089-4705-b4f3-7b5411a914e4",
"name": "Loop: Keyword List",
"type": "n8n-nodes-base.splitInBatches",
"position": [
-160,
-16
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "4658c82c-3e25-4d76-8c02-b33ff51e5f46",
"name": "BrowserAct: Scrape Keywords",
"type": "n8n-nodes-browseract.browserAct",
"position": [
128,
-16
],
"parameters": {
"type": "WORKFLOW",
"workflowId": "77989276444567106",
"workflowConfig": {
"value": {
"input-keywords": "={{ $json.keywords }}"
},
"schema": [
{
"id": "input-target_url",
"type": "string",
"display": true,
"removed": true,
"required": false,
"description": "If left blank, the default value defined in BrowserAct will be used.",
"displayName": "target_url",
"defaultMatch": true
},
{
"id": "input-keywords",
"type": "string",
"display": true,
"removed": false,
"required": true,
"description": "keywords is required",
"displayName": "* keywords",
"defaultMatch": true
},
{
"id": "input-dropdown-menu",
"type": "string",
"display": true,
"removed": true,
"required": false,
"description": "If left blank, the default value defined in BrowserAct will be used.",
"displayName": "dropdown-menu",
"defaultMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"input-target_url",
"input-keywords",
"input-dropdown-menu"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
}
},
"credentials": {
"browserActApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "073fa66f-e581-44cb-8b8b-a75e35a05cf5",
"name": "Clean Keyword Data",
"type": "n8n-nodes-base.code",
"position": [
336,
0
],
"parameters": {
"jsCode": "\n\nlet posts = [];\nconst item = $input.first();\n\n\ntry {\n const rawString = item.json.output.string || item.json.output || \"[]\";\n if (typeof rawString === 'string') {\n posts = JSON.parse(rawString);\n } else if (Array.isArray(rawString)) {\n posts = rawString;\n }\n} catch (e) { posts = []; }\n\nconst results = [];\nconst topPosts = posts.slice(0, 3); \n\n\nfor (const post of topPosts) {\n \n \n const title = post[\"Title\"] || post[\"title\"] || \"\u65e0\u6807\u9898\";\n\n \n let content = post[\"content\"] || post[\"Content\"] || post[\"Post Content\"] || post[\"selftext\"] || \"\u65e0\u6b63\u6587\";\n \n\n let url = \"\";\n for (const key in post) {\n const val = post[key];\n if (typeof val === 'string' && val.startsWith(\"http\") && !val.match(/\\.(jpg|png|gif)$/i)) {\n if (key.toLowerCase().includes(\"url\") || key.toLowerCase().includes(\"link\")) { \n url = val; \n break; \n }\n if (!url) url = val;\n }\n }\n\n if (!url) url = post[\"Post URL\"] || post[\"post_url\"] || post[\"reddit_url\"] || \"\";\n\n \n results.push({\n json: {\n title: title,\n content: content, \n url: url,\n competitor: post[\"competitor\"] || post[\"Competitor\"] || \"\u672a\u77e5\u7ade\u54c1\"\n }\n });\n}\n\n\nif (results.length === 0) return [{json: {title: \"\u65e0\u6570\u636e\", content: \"\", url: \"\"}}];\n\nreturn results;"
},
"typeVersion": 2
},
{
"id": "080f16b5-183b-4ad3-881b-ee2e7450a702",
"name": "Format Keyword Digest",
"type": "n8n-nodes-base.code",
"position": [
512,
0
],
"parameters": {
"jsCode": "\nconst items = $input.all();\n\nlet mergedText = \"\";\nconst competitorName = items[0]?.json?.competitor || \"\u672a\u77e5\u7ade\u54c1\";\n\n\nfor (let i = 0; i < items.length; i++) {\n const item = items[i].json;\n \n \n mergedText += `\\n========== \u7b2c ${i + 1} \u7bc7\u52a8\u6001 ==========\\n`;\n mergedText += `\u3010\u6807\u9898\u3011\uff1a${item.title}\\n`;\n mergedText += `\u3010\u94fe\u63a5\u3011\uff1a${item.url}\\n`;\n mergedText += `\u3010\u5185\u5bb9\u3011\uff1a${item.content}\\n`; \n}\n\n\nreturn {\n json: {\n batch_content: mergedText, \n competitor: competitorName\n }\n};"
},
"typeVersion": 2
},
{
"id": "5f375240-e381-4ca2-8d2d-c717b07f216e",
"name": "Keyword Analyst",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
704,
0
],
"parameters": {
"text": "=You are an efficient intelligence analyst. I will provide a text block containing **3 separate Reddit posts** regarding the competitor \"{{ $json.competitor }}\".\n\n**Your Task:**\nAnalyze each post individually and write a concise **English summary** (2-3 sentences max) for each.\n\n**Guidelines:**\n1. **Focus on Content:** What is the user actually saying? (Bug report, feature request, or general discussion?)\n2. **Be Direct:** No fluff. Get straight to the point.\n3. **Low Value:** If a post is pure spam, just a greeting, or has no substance, summarize it as \"No significant value.\"\n\n**Required Output Format:**\n\n1. **[Insert Post Title Here]**\n Link: [Insert the specific post URL found in the text]\n Summary: [Your English summary here]\n\n2. **[Insert Post Title Here]**\n Link: [Insert the specific post URL found in the text]\n Summary: [Your English summary here]\n\n3. **[Insert Post Title Here]**\n Link: [Insert the specific post URL found in the text]\n Summary: [Your English summary here]\n\n**Here is the content to analyze:**\n\"\"\"\n{{ $json.batch_content }}\n\"\"\"\n\n",
"batching": {},
"promptType": "define"
},
"typeVersion": 1.7
},
{
"id": "a18c2fe6-c39a-4c58-bece-d2b7c70aa971",
"name": "Archive Keywords",
"type": "n8n-nodes-base.googleSheets",
"position": [
976,
0
],
"parameters": {
"columns": {
"value": {
"Date": "={{ new Date().toLocaleDateString() }}",
"Summary": "={{ $json.text }}",
"Competitor": "={{ $('Format Keyword Digest').item.json.competitor }}"
},
"schema": [
{
"id": "Date",
"type": "string",
"display": true,
"required": false,
"displayName": "Date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Competitor",
"type": "string",
"display": true,
"required": false,
"displayName": "Competitor",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Summary",
"type": "string",
"display": true,
"required": false,
"displayName": "Summary",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": 533462161,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1nlneOUxetIxbTQBezlFnSO-wpd8jpxPgpACBglJ3Xhk/edit#gid=533462161",
"cachedResultName": "Report"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1nlneOUxetIxbTQBezlFnSO-wpd8jpxPgpACBglJ3Xhk",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1nlneOUxetIxbTQBezlFnSO-wpd8jpxPgpACBglJ3Xhk/edit?usp=drivesdk",
"cachedResultName": "reddit competitor"
},
"authentication": "serviceAccount"
},
"credentials": {
"googleApi": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "23248e31-0b61-4dc1-8972-95f6c28d2ae8",
"name": "Is Competitor?",
"type": "n8n-nodes-base.if",
"position": [
880,
-224
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "or",
"conditions": [
{
"id": "954ae4dd-2baf-4242-8c61-b2fc40ad2a17",
"operator": {
"type": "string",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{ $json.keywords }}",
"rightValue": ""
},
{
"id": "a976edb7-f6cf-4ac5-852a-31464ce8ebba",
"operator": {
"type": "string",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{ $json.competitor }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.3
},
{
"id": "782fba02-cee0-4a92-86f8-0cd454687d68",
"name": "Loop: Competitor List",
"type": "n8n-nodes-base.splitInBatches",
"position": [
-176,
272
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "b5c385b4-ec5b-409a-b219-512301f8194f",
"name": "BrowserAct: Scrape Subreddit",
"type": "n8n-nodes-browseract.browserAct",
"position": [
64,
288
],
"parameters": {
"type": "WORKFLOW",
"workflowId": "78319322191107145",
"workflowConfig": {
"value": {
"input-keywords": "={{ $json.competitor }}"
},
"schema": [
{
"id": "input-target_url",
"type": "string",
"display": true,
"removed": true,
"required": false,
"description": "If left blank, the default value defined in BrowserAct will be used.",
"displayName": "target_url",
"defaultMatch": true
},
{
"id": "input-keywords",
"type": "string",
"display": true,
"removed": false,
"required": true,
"description": "keywords is required",
"displayName": "* keywords",
"defaultMatch": true
},
{
"id": "input-dropdown-menu",
"type": "string",
"display": true,
"removed": true,
"required": false,
"description": "If left blank, the default value defined in BrowserAct will be used.",
"displayName": "dropdown-menu",
"defaultMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"input-target_url",
"input-keywords",
"input-dropdown-menu"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
}
},
"credentials": {
"browserActApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "60640869-450b-4dbd-906e-c7722d5bdb3b",
"name": "Clean Competitor Data",
"type": "n8n-nodes-base.code",
"position": [
256,
288
],
"parameters": {
"jsCode": "\n\nlet posts = [];\nconst item = $input.first();\n\n\ntry {\n const rawString = item.json.output.string || item.json.output || \"[]\";\n if (typeof rawString === 'string') {\n posts = JSON.parse(rawString);\n } else if (Array.isArray(rawString)) {\n posts = rawString;\n }\n} catch (e) { posts = []; }\n\nconst results = [];\nconst topPosts = posts.slice(0, 3); \n\n\nfor (const post of topPosts) {\n \n \n const title = post[\"Title\"] || post[\"title\"] || \"\u65e0\u6807\u9898\";\n\n \n let content = post[\"content\"] || post[\"Content\"] || post[\"Post Content\"] || post[\"selftext\"] || \"\u65e0\u6b63\u6587\";\n \n\n let url = \"\";\n for (const key in post) {\n const val = post[key];\n if (typeof val === 'string' && val.startsWith(\"http\") && !val.match(/\\.(jpg|png|gif)$/i)) {\n if (key.toLowerCase().includes(\"url\") || key.toLowerCase().includes(\"link\")) { \n url = val; \n break; \n }\n if (!url) url = val;\n }\n }\n\n if (!url) url = post[\"Post URL\"] || post[\"post_url\"] || post[\"reddit_url\"] || \"\";\n\n \n results.push({\n json: {\n title: title,\n content: content, \n url: url,\n competitor: post[\"competitor\"] || post[\"Competitor\"] || \"\u672a\u77e5\u7ade\u54c1\"\n }\n });\n}\n\n\nif (results.length === 0) return [{json: {title: \"\u65e0\u6570\u636e\", content: \"\", url: \"\"}}];\n\nreturn results;"
},
"typeVersion": 2
},
{
"id": "766657f9-3c48-47bc-9cb0-b71a2bba546e",
"name": "Format Competitor Digest",
"type": "n8n-nodes-base.code",
"position": [
464,
288
],
"parameters": {
"jsCode": "\nconst items = $input.all();\n\nlet mergedText = \"\";\nconst competitorName = items[0]?.json?.competitor || \"\u672a\u77e5\u7ade\u54c1\";\n\n\nfor (let i = 0; i < items.length; i++) {\n const item = items[i].json;\n \n \n mergedText += `\\n========== \u7b2c ${i + 1} \u7bc7\u52a8\u6001 ==========\\n`;\n mergedText += `\u3010\u6807\u9898\u3011\uff1a${item.title}\\n`;\n mergedText += `\u3010\u94fe\u63a5\u3011\uff1a${item.url}\\n`;\n mergedText += `\u3010\u5185\u5bb9\u3011\uff1a${item.content}\\n`; \n}\n\n\nreturn {\n json: {\n batch_content: mergedText, \n competitor: competitorName\n }\n};"
},
"typeVersion": 2
},
{
"id": "9ee816e9-5b50-44fc-a5d1-bdd4cc0ee7c2",
"name": "Competitor Analyst",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
640,
288
],
"parameters": {
"text": "=You are an efficient intelligence analyst. I will provide a text block containing **3 separate Reddit posts** regarding the competitor \"{{ $json.competitor }}\".\n\n**Your Task:**\nAnalyze each post individually and write a concise **English summary** (2-3 sentences max) for each.\n\n**Guidelines:**\n1. **Focus on Content:** What is the user actually saying? (Bug report, feature request, or general discussion?)\n2. **Be Direct:** No fluff. Get straight to the point.\n3. **Low Value:** If a post is pure spam, just a greeting, or has no substance, summarize it as \"No significant value.\"\n\n**Required Output Format:**\n\n1. **[Insert Post Title Here]**\n Link: [Insert the specific post URL found in the text]\n Summary: [Your English summary here]\n\n2. **[Insert Post Title Here]**\n Link: [Insert the specific post URL found in the text]\n Summary: [Your English summary here]\n\n3. **[Insert Post Title Here]**\n Link: [Insert the specific post URL found in the text]\n Summary: [Your English summary here]\n\n**Here is the content to analyze:**\n\"\"\"\n{{ $json.batch_content }}\n\"\"\"\n\n",
"batching": {},
"promptType": "define"
},
"typeVersion": 1.7
},
{
"id": "ebc716df-18b4-4cd5-a512-7f875773ef3b",
"name": "Archive Competitors",
"type": "n8n-nodes-base.googleSheets",
"position": [
992,
288
],
"parameters": {
"columns": {
"value": {
"Date": "={{ new Date().toLocaleDateString() }}",
"Summary": "={{ $json.text }}",
"keywords": "={{ $('Format Competitor Digest').item.json.competitor }}"
},
"schema": [
{
"id": "Date",
"type": "string",
"display": true,
"required": false,
"displayName": "Date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "keywords",
"type": "string",
"display": true,
"required": false,
"displayName": "keywords",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Summary",
"type": "string",
"display": true,
"required": false,
"displayName": "Summary",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": 1496097554,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1nlneOUxetIxbTQBezlFnSO-wpd8jpxPgpACBglJ3Xhk/edit#gid=1496097554",
"cachedResultName": "Report02"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1nlneOUxetIxbTQBezlFnSO-wpd8jpxPgpACBglJ3Xhk",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1nlneOUxetIxbTQBezlFnSO-wpd8jpxPgpACBglJ3Xhk/edit?usp=drivesdk",
"cachedResultName": "reddit competitor"
},
"authentication": "serviceAccount"
},
"credentials": {
"googleApi": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "e9c8abb0-1237-4d16-8a8a-0b227ce22382",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1024,
-336
],
"parameters": {
"width": 800,
"height": 832,
"content": "# \ud83d\udd75\ufe0f\u200d\u2642\ufe0f Reddit Intelligence Monitor: AI-Powered Scraping with BrowserAct\n\nAutomate your market research and competitor analysis with this powerful \"Set and Forget\" workflow. It monitors Reddit for specific keywords and competitor subreddits, uses **BrowserAct** for stealth scraping, analyzes the sentiment with AI, and delivers a daily intelligence digest to your Google Sheets.\n\n## \ud83d\udca1 Key Features\n- **Powered by BrowserAct**: Leverages cloud browser automation to stealthily scrape Reddit data without getting blocked.\n- **Dual-Track Monitoring**: Simultaneously tracks \"Brand Competitors\" (Subreddits) and \"Topic Keywords\" (Search Results).\n- **AI Analysis**: Summarizes the top 3 trending posts into a single concise daily report, filtering out noise.\n- **Structured Archive**: Automatically cleans, formats, and archives intelligence with source links into Google Sheets.\n\n## \ud83d\udee0\ufe0f How it Works\n1. **Config Read**: Reads a list of monitoring targets from a Google Sheet.\n2. **Route**: Splits the task into two paths (Competitor vs. Keyword) based on input type.\n3. **Scrape**: **BrowserAct** navigates to the target Reddit pages and extracts the latest posts.\n4. **Process**: Custom Code nodes clean the data and merge top 3 posts into a single prompt.\n5. **Analyze**: AI Agent generates an executive summary for each topic.\n6. **Archive**: Final reports are appended to your \"Report\" Google Sheet.\n\n## \ud83d\udccb Setup Guide\n1. **Google Sheets**: Create a sheet with two tabs:\n - `Config`: Columns `keywords` (for search terms) and `competitor` (for subreddit names).\n - `Report`: Columns `Date`, `Competitor/Keyword`, `Summary`, `Link`.\n2. **BrowserAct**: Connect your BrowserAct credentials and ensure you have the Reddit scraping task template ready.\n3. **AI Model**: Configure the Google Gemini Chat Model (or swap for OpenAI).\n4. **Schedule**: Enable the Schedule Trigger for daily automated runs."
},
"typeVersion": 1
},
{
"id": "83718d7f-58fc-4222-9867-6a51a20e2ce5",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-192,
-432
],
"parameters": {
"color": 3,
"width": 608,
"height": 240,
"content": "Title: 1. Prep Your Google Sheet\nText: Make a sheet with two tabs. \"Config\" needs columns: keywords, competitor. \"Report\" needs columns: Date, Competitor, Summary, Link to save your results."
},
"typeVersion": 1
},
{
"id": "da30cd01-4126-49b9-a74c-f6251f99ccd1",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-192,
-160
],
"parameters": {
"color": 5,
"width": 448,
"height": 656,
"content": "Title: 2. Link BrowserAct\nText: This node acts as your robot to browse Reddit. Just paste your own \"Task ID\" from your BrowserAct account so it knows what to do."
},
"typeVersion": 1
},
{
"id": "a4a0d519-a285-467c-8b23-419e86da4f01",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
512,
-128
],
"parameters": {
"color": 4,
"width": 438,
"height": 624,
"content": "Title: 3. Smart AI Summary\nText: Instead of reading posts one by one, we pack 3 posts together for the AI. This saves you money on AI tokens and gives one clean summary."
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"timezone": "Asia/Shanghai",
"callerPolicy": "workflowsFromSameOwner",
"timeSavedMode": "fixed",
"availableInMCP": false,
"executionOrder": "v1"
},
"versionId": "5aec712e-9d88-4332-9fff-ca6bc7ea4a38",
"connections": {
"Is Competitor?": {
"main": [
[
{
"node": "Loop: Competitor List",
"type": "main",
"index": 0
}
]
]
},
"If: Is Keyword?": {
"main": [
[
{
"node": "Loop: Keyword List",
"type": "main",
"index": 0
}
]
]
},
"Keyword Analyst": {
"main": [
[
{
"node": "Archive Keywords",
"type": "main",
"index": 0
}
]
]
},
"Archive Keywords": {
"main": [
[
{
"node": "Loop: Keyword List",
"type": "main",
"index": 0
}
]
]
},
"Schedule Trigger": {
"main": [
[
{
"node": "GSheets: Read Config",
"type": "main",
"index": 0
}
]
]
},
"Clean Keyword Data": {
"main": [
[
{
"node": "Format Keyword Digest",
"type": "main",
"index": 0
}
]
]
},
"Competitor Analyst": {
"main": [
[
{
"node": "Archive Competitors",
"type": "main",
"index": 0
}
]
]
},
"Loop: Keyword List": {
"main": [
[],
[
{
"node": "BrowserAct: Scrape Keywords",
"type": "main",
"index": 0
}
]
]
},
"Archive Competitors": {
"main": [
[
{
"node": "Loop: Competitor List",
"type": "main",
"index": 0
}
]
]
},
"GSheets: Read Config": {
"main": [
[
{
"node": "If: Is Keyword?",
"type": "main",
"index": 0
},
{
"node": "Is Competitor?",
"type": "main",
"index": 0
}
]
]
},
"Clean Competitor Data": {
"main": [
[
{
"node": "Format Competitor Digest",
"type": "main",
"index": 0
}
]
]
},
"Format Keyword Digest": {
"main": [
[
{
"node": "Keyword Analyst",
"type": "main",
"index": 0
}
]
]
},
"Loop: Competitor List": {
"main": [
[],
[
{
"node": "BrowserAct: Scrape Subreddit",
"type": "main",
"index": 0
}
]
]
},
"Format Competitor Digest": {
"main": [
[
{
"node": "Competitor Analyst",
"type": "main",
"index": 0
}
]
]
},
"Google Gemini Chat Model": {
"ai_languageModel": [
[
{
"node": "Keyword Analyst",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Google Gemini Chat Model1": {
"ai_languageModel": [
[
{
"node": "Competitor Analyst",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"BrowserAct: Scrape Keywords": {
"main": [
[
{
"node": "Clean Keyword Data",
"type": "main",
"index": 0
}
]
]
},
"BrowserAct: Scrape Subreddit": {
"main": [
[
{
"node": "Clean Competitor Data",
"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.
browserActApigoogleApigooglePalmApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Automate your market research and competitor analysis with this powerful "Set and Forget" workflow. It monitors Reddit for specific keywords and competitor subreddits, uses BrowserAct for stealth scraping, analyzes the sentiment with AI, and delivers a daily intelligence digest…
Source: https://n8n.io/workflows/13685/ — 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 workflow is the AI analysis and alerting engine for a complete social media monitoring system. It's designed to work with data scraped from X (formerly Twitter) using a tool like the Apify Tweet
Categories Content Creation AI Automation Publishing Social Media
Effortlessly generate, review, and publish SEO-optimized blog posts to WordPress using AI and automation.
This n8n workflow automatically monitors YouTube channels, transcribes new videos, and generates AI-powered summaries with relevance scoring. It pulls channel URLs from a Google Sheet, fetches recent
Transform your festival marketing with this comprehensive automation workflow that creates and posts culturally authentic social media content across multiple platforms daily.