{
  "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
          }
        ]
      ]
    }
  }
}