AutomationFlowsAI & RAG › Generate Competitor SEO Topical Maps with Gemini 2.5 Flash, Olostep and…

Generate Competitor SEO Topical Maps with Gemini 2.5 Flash, Olostep and…

Original n8n title: Generate Competitor SEO Topical Maps with Gemini 2.5 Flash, Olostep and Google Sheets

ByYasser Sami @yassersami on n8n.io

Crush your competition's SEO strategy by visualizing their entire content architecture in seconds. The AI SEO Content Strategy: Competitor Topical Map Generator workflow automates the "topical mapping" process—a task that usually takes SEO specialists hours of manual scraping…

Event trigger★★★★☆ complexityAI-powered23 nodesForm TriggerN8N Nodes OlostepGoogle GeminiGoogle Sheets
AI & RAG Trigger: Event Nodes: 23 Complexity: ★★★★☆ AI nodes: yes Added:
Generate Competitor SEO Topical Maps with Gemini 2.5 Flash, Olostep and… — n8n workflow card showing Form Trigger, N8N Nodes Olostep, Google Gemini integration

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

This workflow follows the Form Trigger → Googlegemini 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": "AOgxQwRQXoSRXkqU",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "AI SEO Content Strategy: Competitor Topical Map Generator",
  "tags": [
    {
      "id": "xRJNyiRIpAsEzL8y",
      "name": "Olostep",
      "createdAt": "2026-01-31T11:17:46.807Z",
      "updatedAt": "2026-01-31T11:17:46.807Z"
    }
  ],
  "nodes": [
    {
      "id": "385e849a-5a7a-418c-b334-ad11fd0bac6b",
      "name": "On form submission",
      "type": "n8n-nodes-base.formTrigger",
      "position": [
        0,
        192
      ],
      "parameters": {
        "options": {},
        "formTitle": "Competitor Topical Map Generator",
        "formFields": {
          "values": [
            {
              "fieldLabel": "blog URL",
              "requiredField": true
            }
          ]
        },
        "formDescription": "Enter the blog URL, please."
      },
      "typeVersion": 2.5
    },
    {
      "id": "513380a3-7bf7-4f38-ba3b-019947abfa0e",
      "name": "Get article titles",
      "type": "n8n-nodes-olostep.olostepScrape",
      "position": [
        224,
        192
      ],
      "parameters": {
        "task": "=Extract all the article titles from this blog: {{ $json['blog URL'] }}",
        "resource": "answer"
      },
      "credentials": {
        "olostepScrapeApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "1ff02257-84d1-42d9-b943-38e66557490c",
      "name": "Strategy director",
      "type": "@n8n/n8n-nodes-langchain.googleGemini",
      "position": [
        800,
        -32
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "models/gemini-2.5-flash",
          "cachedResultName": "models/gemini-2.5-flash"
        },
        "options": {},
        "messages": {
          "values": [
            {
              "role": "model",
              "content": "You are a helpful, intelligent, Content Strategy Director analyzing a competitor's topical map."
            },
            {
              "content": "=I have the following content clusters and their respective article counts.\n\nTask 1: Identify Gaps. Find the two smallest clusters (lowest article count) that are still critical for enterprise audience strategy (i.e., NOT 'Community' or 'Culture').\n\nTask 2: Suggest Action. For those two identified gap clusters, generate a detailed content plan.\n\nYour Output MUST be a single, valid JSON object:\n\n{\n\n\u00a0\u00a0\"content_gaps_identified\": [\n\n\u00a0\u00a0\u00a0\u00a0{\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"pillar_topic\": \"Web Scraping Legal & Compliance\",\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"competitor_count\": 7,\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"gap_summary\": \"Competitor has minimal coverage on compliance and legal topics, which is crucial for enterprise adoption.\",\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"pillar_article_suggestion\": \"The Definitive Guide to GDPR & CCPA Compliant AI Web Scraping\",\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"spoke_articles_suggested\": [\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"How to Implement SOC2 Controls in Your Scraping Pipeline\",\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"Legal vs. Ethical Scraping: A Developer's Checklist\",\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"Avoiding Cease and Desist: Compliance Auditing for Web Scraping\"\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0]\n\n\u00a0\u00a0\u00a0\u00a0}\n\n\u00a0\u00a0\u00a0\u00a0// Include the second identified gap here\n\n\u00a0\u00a0]\n\n}\n\nYour output MUST be only the body, do not output something like \"json\" or anything but the body."
            },
            {
              "content": "=Competitor Map Data: {{ $json.content.parts[0].text }}"
            }
          ]
        },
        "jsonOutput": true,
        "builtInTools": {}
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "00cb8306-ffa4-41b0-80a8-1b2e3eb8f00a",
      "name": "Merge",
      "type": "n8n-nodes-base.merge",
      "position": [
        1600,
        176
      ],
      "parameters": {
        "mode": "combine",
        "options": {
          "includeUnpaired": true
        },
        "combineBy": "combineByPosition",
        "numberInputs": 3
      },
      "typeVersion": 3.2
    },
    {
      "id": "3920f173-b466-419f-88a5-2145eee0b8e8",
      "name": "Append row in sheet",
      "type": "n8n-nodes-base.googleSheets",
      "onError": "continueRegularOutput",
      "position": [
        2048,
        128
      ],
      "parameters": {
        "columns": {
          "value": {
            "count": "={{ $json.competitor_count }}",
            "pillars": "={{ $json.pillars }}",
            "gap_summary": "={{ $json.gap_summary }}",
            "articleTitles": "={{ $json.articles }}",
            "spoke_articles_suggested": "={{ $json.spoke_articles_suggested.join('\\n\\n') }}",
            "pillar_article_suggestion": "={{ $json.pillar_article_suggestion }}",
            "lowest Article Count PIller": "={{ $json.pillar_topic }}"
          },
          "schema": [
            {
              "id": "articleTitles",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "articleTitles",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "pillars",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "pillars",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "lowest Article Count PIller",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "lowest Article Count PIller",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "count",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "count",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "gap_summary",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "gap_summary",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "pillar_article_suggestion",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "pillar_article_suggestion",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "spoke_articles_suggested",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "spoke_articles_suggested",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1CtPqibM2JxGZpq571gpKoSUnq6aZsm0UXSYIEx1b7gE/edit#gid=0",
          "cachedResultName": "\u0627\u0644\u0648\u0631\u0642\u06291"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1CtPqibM2JxGZpq571gpKoSUnq6aZsm0UXSYIEx1b7gE",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1CtPqibM2JxGZpq571gpKoSUnq6aZsm0UXSYIEx1b7gE/edit?usp=drivesdk",
          "cachedResultName": "Blog Analisys"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "retryOnFail": true,
      "typeVersion": 4.7
    },
    {
      "id": "6c01b299-0acb-4840-a07a-d1c1663fe8cb",
      "name": "content gaps",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        1376,
        -32
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "test.content_gaps_identified"
      },
      "typeVersion": 1
    },
    {
      "id": "31276c02-56f5-45fc-bdc4-fdf725c5f899",
      "name": "articles",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        1328,
        496
      ],
      "parameters": {
        "options": {
          "destinationFieldName": "articles"
        },
        "fieldToSplitOut": "result.result"
      },
      "typeVersion": 1
    },
    {
      "id": "2279f911-1b7d-4840-bf60-ec811b9eb98b",
      "name": "parse pillers",
      "type": "n8n-nodes-base.set",
      "position": [
        1152,
        224
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "d64d00f9-3ca5-4f5e-99a6-1e24de8df89f",
              "name": "pillars",
              "type": "array",
              "value": "={{ $json.content.parts[0].text.parseJson().keys() }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "fcac6d61-586f-4e2d-846d-901ca5f61f1f",
      "name": "pillers",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        1376,
        224
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "pillars"
      },
      "typeVersion": 1
    },
    {
      "id": "e6ca1a72-0e86-430f-b2c6-67ff0e26d0ea",
      "name": "Loop Over Items",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        1824,
        192
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "a5ed5221-ccbc-47cd-ac87-b8b5479f1a4e",
      "name": "Wait",
      "type": "n8n-nodes-base.wait",
      "position": [
        2272,
        192
      ],
      "parameters": {
        "amount": 2
      },
      "typeVersion": 1.1
    },
    {
      "id": "0a524055-8451-417a-99cb-f17970741e84",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -832,
        -320
      ],
      "parameters": {
        "width": 704,
        "height": 992,
        "content": "## AI SEO Content Strategy: Competitor Topical Map Generator\n\nCrush your competition's SEO strategy by visualizing their entire content architecture in seconds. The **AI SEO Content Strategy: Competitor Topical Map Generator** workflow automates the \"topical mapping\" process\u2014a task that usually takes SEO specialists hours of manual scraping and categorization. \n\nBy analyzing a competitor's blog URL, it uses **Gemini 2.5 Flash** and **Olostep** to reverse-engineer their content hubs, identify weak points in their coverage, and provide you with a ready-to-execute \"spoke-and-hub\" content plan to overtake them in search rankings.\n\n---\n\n### Who\u2019s it for?\n*   **SEO Specialists:** Perform deep competitive analysis without manual spreadsheet work.\n*   **Content Strategists:** Identify \"Content Gaps\" where competitors are under-investing.\n*   **Niche Site Owners:** Build topical authority quickly by mapping out the most successful hubs in your industry.\n*   **Digital Agencies:** Provide instant, high-value content audits for prospective clients.\n\n### How it works / What it does\n1.  **Trigger:** Provide a competitor's blog URL through an n8n Form.\n2.  **Scrape:** The **Olostep** node extracts all published article titles from the site.\n3.  **Pillar Analysis:** Gemini analyzes the raw titles and clusters them into 8-12 high-level \"Pillar Topics\" (content hubs).\n4.  **Strategic Gap Discovery:** A specialized \"Strategy Director\" node identifies the two thinnest content clusters that are critical for enterprise growth.\n5.  **Execution Plan:** For each identified gap, the AI suggests a definitive pillar guide title and multiple \"spoke\" article ideas to fill the void.\n6.  **Data Logging:** The entire map\u2014including pillars, competitor article counts, and your new suggested content plan\u2014is saved to a **Google Sheet** for easy tracking.\n\n### How to set up\n1.  **Credentials:** Connect your **Google Gemini (PaLM)**, **Olostep**, and **Google Sheets** credentials.\n2.  **Google Sheet Setup:** Prepare a spreadsheet with headers for `pillars`, `articleTitles`, `lowest Article Count Piller`, `count`, `gap_summary`, `pillar_article_suggestion`, and `spoke_articles_suggested`.\n3.  **Form Trigger:** Activate the workflow to get your public submission link.\n\n### Requirements\n*   **Google Gemini API:** For advanced semantic clustering and strategic content ideation.\n*   **Olostep API:** To handle high-volume scraping of blog indices and article lists.\n*   **Google Sheets (OAuth2):** To store the final topical map and strategy report.\n\n### How to customize the workflow\n*   **Scale the Analysis:** Modify the **Strategy Director** prompt to identify more than two gaps if you are planning a long-term content roadmap.\n*   **Target Different Sites:** While optimized for blogs, you can adjust the **Olostep** task to scrape product categories or documentation hubs.\n*   **Project Management Integration:** Replace the Google Sheets node with **ClickUp**, **Notion**, or **Trello** to automatically turn the AI's content suggestions into actionable tasks for your writing team."
      },
      "typeVersion": 1
    },
    {
      "id": "b6866672-3ffb-4112-8efb-3438eee10abd",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -48,
        80
      ],
      "parameters": {
        "color": 7,
        "width": 192,
        "height": 272,
        "content": "## Input form\nEnter the blog URL"
      },
      "typeVersion": 1
    },
    {
      "id": "f36dd015-a06d-46ac-a7e4-32cf5d579992",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        176,
        80
      ],
      "parameters": {
        "color": 7,
        "width": 208,
        "height": 272,
        "content": "## Olostep API\nGets article titles in this blog"
      },
      "typeVersion": 1
    },
    {
      "id": "c335b708-de20-45e6-a738-3372c4eb5e4f",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        400,
        -16
      ],
      "parameters": {
        "color": 7,
        "width": 320,
        "height": 272,
        "content": "## Pillar analyzer\nAnalyzes all article titles and groups them into high-level Pillar Topics"
      },
      "typeVersion": 1
    },
    {
      "id": "569e205b-ead9-4470-9114-510d9db53ea5",
      "name": "Pillar analyzer",
      "type": "@n8n/n8n-nodes-langchain.googleGemini",
      "position": [
        448,
        96
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "models/gemini-2.5-flash",
          "cachedResultName": "models/gemini-2.5-flash"
        },
        "options": {},
        "messages": {
          "values": [
            {
              "role": "model",
              "content": "You are a helpful, intelligent, Content Strategy Director."
            },
            {
              "content": "=I have provided a list of all published article titles from a key competitor.\n\nTask: Analyze the titles and group them into 8-12 distinct, high-level Pillar Topics (content hubs).\n\nYour Output MUST be a single, valid JSON object where the keys are the Pillar Topic Names and the values are the list of article titles that belong to that cluster. Do not output anything like \"json\", spaces, or anything just the body.\n\nExample: {'Pillar Name': ['Article Title 1', 'Article Title 2']}"
            },
            {
              "content": "=Competitor Article Titles: {{ $json.result.result }}"
            }
          ]
        },
        "jsonOutput": true,
        "builtInTools": {}
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "b614242f-83e4-462c-a0e6-8f6fc0789e0f",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        752,
        -112
      ],
      "parameters": {
        "color": 7,
        "width": 304,
        "height": 240,
        "content": "## Strategy director\nIdentifies gaps and suggests actions"
      },
      "typeVersion": 1
    },
    {
      "id": "859938fe-eee5-4136-9248-f6cd0b6e5204",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1056,
        -112
      ],
      "parameters": {
        "color": 7,
        "width": 464,
        "height": 240,
        "content": "## Parse JSON\nParses all content gaps identified and separates each in a single item"
      },
      "typeVersion": 1
    },
    {
      "id": "d786b3d0-f221-41f8-8c59-11b60c5e6e47",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1088,
        144
      ],
      "parameters": {
        "color": 7,
        "width": 432,
        "height": 240,
        "content": "## Parse JSON\nParses all pillars  and separates each in a single item"
      },
      "typeVersion": 1
    },
    {
      "id": "810e89d3-dcd5-427d-96cf-324dc23f1dfb",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1536,
        64
      ],
      "parameters": {
        "color": 7,
        "width": 224,
        "height": 304,
        "content": "## Merge\nMerges all content and make it ready for google sheet insertion"
      },
      "typeVersion": 1
    },
    {
      "id": "d955ee29-e6be-421f-be5e-b92562a6147b",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1232,
        400
      ],
      "parameters": {
        "color": 7,
        "width": 288,
        "height": 256,
        "content": "## Split articles\nSeparates article titles each in a single item"
      },
      "typeVersion": 1
    },
    {
      "id": "0cc5bbbd-12c1-450d-93c9-1a5f1d015da4",
      "name": "Sticky Note9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1808,
        48
      ],
      "parameters": {
        "color": 7,
        "width": 592,
        "height": 304,
        "content": "## Google sheet\nAppends all content into a google sheet"
      },
      "typeVersion": 1
    },
    {
      "id": "c16fa5fd-73d9-4b69-b67d-c145f0793678",
      "name": "Parse content gaps",
      "type": "n8n-nodes-base.set",
      "position": [
        1152,
        -32
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "9b0e76c3-651e-4c35-b627-82b7aad91150",
              "name": "test",
              "type": "object",
              "value": "={{ $json.content.parts[0].text.parseJson() }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "executionOrder": "v1"
  },
  "versionId": "b5635553-19e4-4a12-bdb2-0a3f7b2a2898",
  "connections": {
    "Wait": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "pillers": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "articles": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 2
          }
        ]
      ]
    },
    "content gaps": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "parse pillers": {
      "main": [
        [
          {
            "node": "pillers",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items": {
      "main": [
        [],
        [
          {
            "node": "Append row in sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Pillar analyzer": {
      "main": [
        [
          {
            "node": "Strategy director",
            "type": "main",
            "index": 0
          },
          {
            "node": "parse pillers",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Strategy director": {
      "main": [
        [
          {
            "node": "Parse content gaps",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get article titles": {
      "main": [
        [
          {
            "node": "Pillar analyzer",
            "type": "main",
            "index": 0
          },
          {
            "node": "articles",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "On form submission": {
      "main": [
        [
          {
            "node": "Get article titles",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse content gaps": {
      "main": [
        [
          {
            "node": "content gaps",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Append row in sheet": {
      "main": [
        [
          {
            "node": "Wait",
            "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

Crush your competition's SEO strategy by visualizing their entire content architecture in seconds. The AI SEO Content Strategy: Competitor Topical Map Generator workflow automates the "topical mapping" process—a task that usually takes SEO specialists hours of manual scraping…

Source: https://n8n.io/workflows/15473/ — 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

Understand your customers before you build for them. This workflow, Market Segmentation: Buyer Persona Pain Point Report, automates the grueling process of primary market research. By scraping real-wo

Form Trigger, Google Gemini, N8N Nodes Olostep +3
AI & RAG

Stop spending hours manually repurposing long-form content. The Content Atomizer.json workflow takes a single article URL and automatically "atomizes" it into high-authority LinkedIn posts, Twitter (X

Form Trigger, Google Gemini, N8N Nodes Olostep +2
AI & RAG

Never get blindsided by a competitor's "stealth" update again. The Competitor Feature Monitoring & Strategy Alerting workflow acts as an automated 24/7 surveillance system for your industry. It monito

Google Sheets, N8N Nodes Olostep, Google Gemini +1
AI & RAG

This n8n template automatically generates high-quality sales battle cards for any prospect company using real-time research and AI. It analyzes company news, website content, and your product’s value

N8N Nodes Olostep, Google Gemini, Form Trigger +2
AI & RAG

Establish yourself as a thought leader by answering the questions that everyone else is ignoring. The Content Authority Roadmap workflow automates deep-dive research into Reddit, Quora, and niche foru

Form Trigger, N8N Nodes Olostep, Google Gemini +2