AutomationFlowsAI & RAG › Scrape Reddit Posts with Browseract, Summarize with Gemini, and Save to…

Scrape Reddit Posts with Browseract, Summarize with Gemini, and Save to…

Original n8n title: Scrape Reddit Posts with Browseract, Summarize with Gemini, and Save to Google Sheets

Bybrowseract @browseract on n8n.io

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…

Cron / scheduled trigger★★★★☆ complexityAI-powered22 nodesGoogle Gemini ChatGoogle SheetsN8N Nodes BrowseractChain Llm
AI & RAG Trigger: Cron / scheduled Nodes: 22 Complexity: ★★★★☆ AI nodes: yes Added:
Scrape Reddit Posts with Browseract, Summarize with Gemini, and Save to… — n8n workflow card showing Google Gemini Chat, Google Sheets, N8N Nodes Browseract integration

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 →

Download .json
{
  "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.

Pro

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 →

More AI & RAG workflows → · Browse all categories →

Related workflows

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

AI & RAG

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

Google Sheets, Google Gemini Chat, Google Sheets Tool +4
AI & RAG

Categories Content Creation AI Automation Publishing Social Media

Google Docs, HTTP Request, Slack +7
AI & RAG

Effortlessly generate, review, and publish SEO-optimized blog posts to WordPress using AI and automation.

WordPress, Google Gemini Chat, Output Parser Structured +6
AI & RAG

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

Output Parser Structured, Google Gemini Chat, Chain Llm +2
AI & RAG

Transform your festival marketing with this comprehensive automation workflow that creates and posts culturally authentic social media content across multiple platforms daily.

Google Sheets, Output Parser Structured, Chain Llm +5