AutomationFlowsAI & RAG › Automated SEO Serp Analysis with Decodo & Google Gemini

Automated SEO Serp Analysis with Decodo & Google Gemini

ByAbdullah Alshiekh @abdullah01 on n8n.io

SEO professionals and marketers spend hours manually searching keywords to analyze competitor content. Copying and pasting SERP results into spreadsheets is tedious and prone to formatting errors. Analyzing "why" a page ranks requires significant mental effort and time for every…

Event trigger★★★★☆ complexityAI-powered14 nodes@Decodo/N8N Nodes DecodoGoogle Gemini ChatAgentGmail
AI & RAG Trigger: Event Nodes: 14 Complexity: ★★★★☆ AI nodes: yes Added:

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

This workflow follows the Agent → Gmail 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": "ipqRyhJ4zC8H6xUq",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Decodo & Gemini SEO Watchlist (Template)",
  "tags": [],
  "nodes": [
    {
      "id": "3c03c45a-a30b-44dc-a4c5-ef8d414cf58f",
      "name": "When clicking \u2018Execute workflow\u2019",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -1648,
        80
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "0ab8b4ec-68fa-4687-98d0-d1006a8f7afd",
      "name": "Edit Fields",
      "type": "n8n-nodes-base.set",
      "position": [
        -1440,
        80
      ],
      "parameters": {
        "mode": "raw",
        "options": {},
        "jsonOutput": "{\n  \"keywords\": [\n      \"keyword_1\",\n      \"keyword_2\",\n      \"keyword_3\"\n  ]\n}\n"
      },
      "typeVersion": 3.4
    },
    {
      "id": "eddf61a3-9199-47d3-b464-e6bbf8590a71",
      "name": "Code in JavaScript",
      "type": "n8n-nodes-base.code",
      "position": [
        -1232,
        80
      ],
      "parameters": {
        "jsCode": "const { keywords } = $json;\n\nreturn keywords.map(k => ({\n  json: { keyword: k }\n}));\n"
      },
      "typeVersion": 2
    },
    {
      "id": "e743f378-23b8-4de5-9120-789072b26d32",
      "name": "Loop Over Items",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -720,
        -80
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "4d60b699-0f27-45a5-ad5a-ed9d85f45a7c",
      "name": "Decodo",
      "type": "@decodo/n8n-nodes-decodo.decodo",
      "position": [
        -464,
        64
      ],
      "parameters": {
        "query": "={{$json.keyword}}",
        "operation": "google_search"
      },
      "typeVersion": 1
    },
    {
      "id": "64582532-ddfe-4d3a-9442-22d53a07e59d",
      "name": "Code in JavaScript1",
      "type": "n8n-nodes-base.code",
      "position": [
        -752,
        96
      ],
      "parameters": {
        "jsCode": "// ---------------------------\n// SAFE DECODO ORGANIC EXTRACTOR\n// Works no matter how Decodo nests the JSON\n// ---------------------------\n\n// 1) Print input to browser console (not n8n UI)\nconsole.log(\"INPUT:\", JSON.stringify($json, null, 2));\n\n// 2) Recursive search function to find ALL \"organic\" arrays\nfunction findOrganic(node, results = []) {\n  if (!node || typeof node !== \"object\") return results;\n\n  if (Array.isArray(node)) {\n    for (const item of node) findOrganic(item, results);\n  } else {\n    for (const key of Object.keys(node)) {\n      if (key === \"organic\" && Array.isArray(node[key])) {\n        results.push(...node[key]);\n      } else {\n        findOrganic(node[key], results);\n      }\n    }\n  }\n  return results;\n}\n\n// 3) Run the extractor\nconst organicItems = findOrganic($json);\n\n// 4) Normalize output\nconst cleaned = organicItems.map(r => ({\n  keyword: $json.keyword || \"\",\n  title: r.title || \"\",\n  url: r.url || \"\",\n  snippet: r.desc || r.snippet || \"\",\n  position: r.pos || null\n}));\n\n// 5) Return as multiple items (this is correct)\nreturn cleaned.map(item => ({ json: item }));\n"
      },
      "typeVersion": 2
    },
    {
      "id": "19d1407a-b836-4919-8a91-3495653d9c7e",
      "name": "Google Gemini Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        256,
        0
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "df35fb96-6298-49f4-9bd6-8c544b8369fb",
      "name": "Code in JavaScript2",
      "type": "n8n-nodes-base.code",
      "position": [
        -64,
        -160
      ],
      "parameters": {
        "jsCode": "// Combine all incoming items into one object\nconst combined = $input.all().map(item => item.json);\n\nreturn [\n  {\n    json: {\n      chatInput: combined\n    }\n  }\n];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "220647e8-2edd-4a79-9dc1-d3afd9499c67",
      "name": "AI Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        272,
        -160
      ],
      "parameters": {
        "options": {
          "systemMessage": "You are an SEO analyst.  \nYou will receive JSON \u201cdata\u201d containing several Google SERP results.\n\nYour job is to produce a **very short, compact SEO analysis**, max 6 lines per result:\n\n1. Intent (short)\n2. Content Type (short)\n3. Strengths (bullet)\n4. Weaknesses (bullet)\n5. Opportunities (bullet)\n\nNo long paragraphs. No storytelling. Only compressed SEO insights.\n"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "67ae3188-cfed-4131-9c8f-ab6b7f349d76",
      "name": "Send a message",
      "type": "n8n-nodes-base.gmail",
      "position": [
        624,
        -160
      ],
      "parameters": {
        "sendTo": "user@example.com",
        "message": "={{ $json.output }}",
        "options": {},
        "subject": "Weekly SEO Watchlist \u2014 Automated Report",
        "emailType": "text"
      },
      "typeVersion": 2.1
    },
    {
      "id": "7e087f8b-7fdf-44ca-a6d3-512d6c569532",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1712,
        0
      ],
      "parameters": {
        "color": 4,
        "width": 704,
        "height": 272,
        "content": "Group A: \nThis section initializes the workflow and prepares the keyword list for the search loop."
      },
      "typeVersion": 1
    },
    {
      "id": "743b0539-caec-4f3a-962a-28850d42dd68",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -816,
        -144
      ],
      "parameters": {
        "color": 5,
        "width": 496,
        "height": 464,
        "content": "Group B :\nUsing Decodo API it search Google based on data from previous group to extract and normalize the organic search results."
      },
      "typeVersion": 1
    },
    {
      "id": "3da970f1-3687-4201-8583-c264408d17f2",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -112,
        -256
      ],
      "parameters": {
        "color": 3,
        "width": 880,
        "height": 256,
        "content": "Group C: \nAggregate the collected search data and pass it to the Google Gemini AI Agent for analysis. and the AI prepares a report to be emailed."
      },
      "typeVersion": 1
    },
    {
      "id": "68808cc2-3f77-430a-bba9-29931ecaa9ef",
      "name": "Sticky Note15",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2544,
        -192
      ],
      "parameters": {
        "width": 800,
        "height": 528,
        "content": "## How to Set Up **Decodo** Credentials in n8n\n\n### Part 1: Get Your Decodo Authentication Token\n\n* **Activate Your Plan: The Decodo node requires a Web Scraping API Advanced plan. You can begin with a free trial, which is available on the Decodo dashboard.**\n* **Locate Your Token: Once your plan is active, navigate to the Web Scraping API page within your Decodo account.**\n* **Copy Your Token: Find and copy the authentication token generated for you on that page.**\n\n### Part 2: Add the Token to n8n\n\n* **Open n8n Credentials: Inside n8n, open the credentials window.**\n\n* **Create a New Credential: Select the option to create a new credential.**\n\n* **Find the Decodo Type: Search for and select the \"Decodo Credentials API\".**\n\n* **Paste and Save: Enter your authentication token (that you copied from the Decodo dashboard) into the field and save it.**\n\n\n### For detailed instructions : github.com/Decodo/n8n-nodes-decodo/tree/main"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "57b7cf53-4390-4f11-8bee-a5c5c0d5766c",
  "connections": {
    "Decodo": {
      "main": [
        [
          {
            "node": "Code in JavaScript1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent": {
      "main": [
        [
          {
            "node": "Send a message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields": {
      "main": [
        [
          {
            "node": "Code in JavaScript",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items": {
      "main": [
        [
          {
            "node": "Code in JavaScript2",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Decodo",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code in JavaScript": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code in JavaScript1": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code in JavaScript2": {
      "main": [
        [
          {
            "node": "AI Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "When clicking \u2018Execute workflow\u2019": {
      "main": [
        [
          {
            "node": "Edit Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

SEO professionals and marketers spend hours manually searching keywords to analyze competitor content. Copying and pasting SERP results into spreadsheets is tedious and prone to formatting errors. Analyzing "why" a page ranks requires significant mental effort and time for every…

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

Transform your salon/service business with this streamlined WhatsApp automation system featuring Claude integration, zero-setup database management, and intelligent conversation handling. Claude MCP I

WhatsApp Trigger, WhatsApp, Redis +11
AI & RAG

This template and YouTube video goes over 5 different implementations of evaluations within n8n. Categorization Correctness Tools used String similarity Helpfulness

Evaluation, Evaluation Trigger, Google Gemini Chat +8
AI & RAG

🤖🧑‍💻 AI Agent for Top n8n Creators Leaderboard Reporting. Uses httpRequest, lmChatOpenAi, executeWorkflowTrigger, toolWorkflow. Event-driven trigger; 49 nodes.

HTTP Request, OpenAI Chat, Execute Workflow Trigger +8
AI & RAG

🤖🧑‍💻 AI Agent for Top n8n Creators Leaderboard Reporting. Uses httpRequest, lmChatOpenAi, executeWorkflowTrigger, toolWorkflow. Event-driven trigger; 49 nodes.

HTTP Request, OpenAI Chat, Execute Workflow Trigger +8
AI & RAG

This n8n workflow is designed to automate the aggregation, processing, and reporting of community statistics related to n8n creators and workflows. Its primary purpose is to generate insightful report

HTTP Request, OpenAI Chat, Execute Workflow Trigger +8