AutomationFlowsAI & RAG › Automated SEO Ranking Monitor with Ai, Decodo Scraper & Multi-channel Alerts

Automated SEO Ranking Monitor with Ai, Decodo Scraper & Multi-channel Alerts

ByYaron Been @yaron-nofluff on n8n.io

This workflow contains community nodes that are only compatible with the self-hosted version of n8n.

Cron / scheduled trigger★★★★☆ complexityAI-powered20 nodesAgentOutput Parser Structured@Decodo/N8N Nodes DecodoGoogle SheetsGmailSlackOpenAI Chat
AI & RAG Trigger: Cron / scheduled Nodes: 20 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #10412 — 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": "zYYZQqnwv1YOexdI",
  "name": "SEO Watchlist Monitor using decodo",
  "tags": [
    {
      "id": "uMBvoK3U8QYbRWJ5",
      "name": "done",
      "createdAt": "2025-11-18T13:27:52.572Z",
      "updatedAt": "2025-11-18T13:27:52.572Z"
    }
  ],
  "nodes": [
    {
      "id": "9821d0d1-204d-4250-853e-0c285be2d222",
      "name": "Daily SEO Intelligence Scheduler",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        624,
        368
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "56786561-b18c-45dc-b80b-f51044e53c38",
      "name": "Set SEO Configuration",
      "type": "n8n-nodes-base.set",
      "position": [
        832,
        368
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "46ec0060-8418-4d2e-b2dd-3a6b5a4af803",
              "name": "primary_keywords",
              "type": "string",
              "value": "[\"AI\", \"marketing\"]"
            },
            {
              "id": "b06ca095-5086-4aae-81a4-eb799790fe8e",
              "name": "competitor_domains",
              "type": "string",
              "value": "[\"example-competitor1.com\", \"example-competitor2.com\"]"
            },
            {
              "id": "c15dc095-5086-4aae-81a4-eb799790fe8f",
              "name": "target_geo",
              "type": "string",
              "value": "US"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "2d6704bb-9938-4659-8477-8844f178e102",
      "name": "Validate SEO Configuration",
      "type": "n8n-nodes-base.if",
      "position": [
        1024,
        368
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "a25e8c3a-1d2f-4a8c-9e7a-8c3f4d8a9e1b",
              "operator": {
                "type": "string",
                "operation": "notEmpty"
              },
              "leftValue": "={{ $json.primary_keywords }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "dc7ca6b7-2392-451a-8156-85b9a20e41ac",
      "name": "SEO Strategy Analysis Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        1264,
        368
      ],
      "parameters": {
        "text": "=Analyze the following keywords for SEO competitiveness and create a strategic ranking plan:\n\nPrimary Keywords: {{ $json.primary_keywords }}\nCompetitor Domains: {{ $json.competitor_domains }}\nTarget Geography: {{ $json.target_geo }}\n\nProvide:\n1. Keyword difficulty assessment\n2. Competitor analysis insights\n3. Ranking priority recommendations\n4. Content gap analysis\n\nFocus on actionable SEO strategies.",
        "options": {
          "systemMessage": "=You are an expert SEO strategist with 10+ years experience. Provide data-driven, actionable insights for keyword ranking improvement. Focus on competitive analysis, content opportunities, and technical SEO factors."
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 2.2
    },
    {
      "id": "d05ae29b-fb29-4a24-a475-5fd28f6440de",
      "name": "SEO Analysis Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        1520,
        624
      ],
      "parameters": {
        "jsonSchemaExample": "{\n  \"seo_analysis_summary\": {\n    \"analysis_date\": \"2024-01-15\",\n    \"overview\": \"Comprehensive SEO analysis of target keywords\",\n    \"market_difficulty\": \"medium\"\n  },\n  \"keywords_analysis\": [\n    {\n      \"keyword\": \"AI\",\n      \"difficulty_score\": 85,\n      \"search_volume\": 165000,\n      \"competition_level\": \"high\",\n      \"recommended_priority\": 1,\n      \"content_gaps\": [\"beginner guides\", \"case studies\", \"comparison articles\"],\n      \"competitor_insights\": \"Top 3 competitors dominate with comprehensive resource hubs\"\n    }\n  ],\n  \"strategic_recommendations\": [\n    {\n      \"priority\": \"high\",\n      \"action\": \"Create pillar content for AI in marketing\",\n      \"timeline\": \"2-3 months\",\n      \"expected_impact\": \"high\"\n    }\n  ],\n  \"risk_assessment\": {\n    \"algorithm_risks\": \"Medium - topic is competitive but growing\",\n    \"opportunity_score\": 78\n  }\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "61816053-97f9-47e7-b998-0ee6374a58f5",
      "name": "Prepare Ranking Tasks",
      "type": "n8n-nodes-base.function",
      "position": [
        1712,
        368
      ],
      "parameters": {
        "functionCode": "const analysis = $json.output;\nconst keywords = analysis.keywords_analysis.map(k => k.keyword);\n\nconst rankingTasks = keywords.map(keyword => ({\n  keyword,\n  analysis: analysis.keywords_analysis.find(k => k.keyword === keyword) || {}\n}));\n\nreturn rankingTasks;\n"
      },
      "typeVersion": 1
    },
    {
      "id": "6181fbfc-3045-4749-ba21-66c9cef00554",
      "name": "Keyword Ranking Check Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        1984,
        368
      ],
      "parameters": {
        "text": "=Use Google Search via decode scraper to check current ranking for keyword: {{ $json.keyword }}\n\nContext from SEO Analysis:\nDifficulty: {{ $json.analysis.difficulty_score }}/100\nCompetition: {{ $json.analysis.competition_level }}\n\nProvide current ranking position and SERP features observed.",
        "options": {},
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 2.2
    },
    {
      "id": "274d47af-0cb6-433f-9538-ca0991f4b91d",
      "name": "Google Search Scraper",
      "type": "@decodo/n8n-nodes-decodo.decodoTool",
      "position": [
        2048,
        640
      ],
      "parameters": {
        "geo": "=",
        "query": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Query', ``, 'string') }}",
        "locale": "=",
        "operation": "google_search",
        "results_limit": "=2"
      },
      "credentials": {
        "decodoApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "9db7dfd8-763e-4b27-8ad9-875f1e285596",
      "name": "Ranking Results Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        2224,
        640
      ],
      "parameters": {
        "jsonSchemaExample": "{\n  \"Keyword\": \"AI\",\n  \"current_ranking_position\": 15,\n  \"serp_features\": [\"Featured Snippet\", \"People Also Ask\", \"Video Results\"],\n  \"ranking_analysis\": \"Moderately competitive SERP with strong domain authority sites dominating top positions\",\n  \"search_volume\": \"1K-5K monthly\",\n  \"top_competitors\": [\"competitor1.com\", \"competitor2.com\", \"competitor3.com\"]\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "5dfd9797-e47d-47a9-bffa-a91c0dcc8b4e",
      "name": "Check Critical Ranking Drop",
      "type": "n8n-nodes-base.if",
      "position": [
        2752,
        368
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "c25e8c3a-1d2f-4a8c-9e7a-8c3f4d8a9e1b",
              "operator": {
                "type": "number",
                "operation": "lt"
              },
              "leftValue": "={{ $json.output.current_ranking_position }}",
              "rightValue": 10
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "93d590cc-cc79-48af-8d8a-ccd09ca66131",
      "name": "Save SEO Intelligence to Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        3024,
        208
      ],
      "parameters": {
        "columns": {
          "value": {
            "Rank": "={{ $json.output.current_ranking_position }}",
            "Keyword": "={{ $json.output.Keyword }}",
            "description": "={{ $json.output.ranking_analysis }}"
          },
          "schema": [
            {
              "id": "Keyword",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Keyword",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Rank",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Rank",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "description",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "description",
              "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/1ICexWtfEMpN266wZX_Tv-AQOj2IGpLN_RTDQ40Y-_Mg/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1ICexWtfEMpN266wZX_Tv-AQOj2IGpLN_RTDQ40Y-_Mg",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1ICexWtfEMpN266wZX_Tv-AQOj2IGpLN_RTDQ40Y-_Mg/edit?usp=drivesdk",
          "cachedResultName": "SEO Watchlist"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "6c804d8c-e59e-4b8d-a85b-8cde611b65de",
      "name": "Send Critical Alert via Gmail",
      "type": "n8n-nodes-base.gmail",
      "position": [
        3040,
        592
      ],
      "parameters": {
        "sendTo": "user@example.com",
        "message": "=Urgent SEO attention required!\n\nKeyword: {{ $json.keyword }}\nCurrent Ranking: {{ $json.current_ranking }}\nChange: {{ $json.ranking_change }} positions\n\nImmediate actions recommended:\n{{ $json.immediate_actions }}\n\nCompetitors present: {{ $json.competitor_domains_present }}\n\nView full report in Google Sheets.",
        "options": {},
        "subject": "\ud83d\udea8 SEO Alert: Critical Ranking Drop Detected"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "cc7c6102-15e2-4849-82d8-b36e0598f15e",
      "name": "Send Daily Summary to Slack",
      "type": "n8n-nodes-base.slack",
      "position": [
        3296,
        32
      ],
      "parameters": {
        "text": "=\ud83d\udcca Daily SEO Intelligence Report\n\n\u2705 Completed analysis for {{ $json.primary_keywords.length }} keywords\n\ud83d\udcc8 Key insights processed\n\ud83d\udd0d Competitor tracking active\n\nSummary saved to Google Sheets.\n\nNext review: {{ $now.plus(24, 'hours') }}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        },
        "otherOptions": {}
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "6617fb6d-783d-436d-bf65-5003addde9b1",
      "name": "Log Configuration Errors",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1024,
        576
      ],
      "parameters": {
        "columns": {
          "value": {
            "details": "={{ $json }}",
            "timestamp": "={{ $now }}",
            "error_type": "Configuration Validation Failed",
            "recovery_action": "Check keyword configuration and restart workflow"
          },
          "schema": [
            {
              "id": "timestamp",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "timestamp",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "error_type",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "error_type",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "error_log"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1ICexWtfEMpN266wZX_Tv-AQOj2IGpLN_RTDQ40Y-_Mg",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1ICexWtfEMpN266wZX_Tv-AQOj2IGpLN_RTDQ40Y-_Mg/edit?usp=drivesdk",
          "cachedResultName": "SEO Watchlist"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "b86963cc-f1e8-48a3-9b75-89af018215df",
      "name": "OpenAI Model for Strategy Analysis",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        1264,
        624
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1-mini"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "7d775ac7-6951-42f6-9f64-84439a96d382",
      "name": "OpenAI Model for Ranking Check",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        1840,
        640
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1-mini"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "7c26e02c-4a8a-41af-a614-9694182a3365",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        0,
        80
      ],
      "parameters": {
        "width": 368,
        "height": 592,
        "content": "## How it works\nThis workflow checks your keyword search engine rankings every day. It looks at your important keywords, sees where you rank on Google, and sends alerts if your rankings drop. It uses AI to analyze your competition and find ways to improve.\n\n## Setup steps\n\nPut your main keywords and competitor websites in the SEO Configuration\n\nConnect your Google Sheets, Gmail, Slack, and OpenAI accounts\n\nSet up the Decodo scraper for checking Google rankings\n\nTurn on the daily schedule to run automatically\n\n## Use Coupon Code \"YARON\" and get free decodo credits\n\n### https://decodo.com/"
      },
      "typeVersion": 1
    },
    {
      "id": "67d35974-2d6e-4c01-845c-27503ef9e1bc",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        592,
        192
      ],
      "parameters": {
        "color": 7,
        "width": 928,
        "height": 320,
        "content": "## Start & Plan\nThis runs every day to check your SEO. It sets up your keywords and competitors, then uses AI to analyze how hard it will be to rank for each keyword and what opportunities exist."
      },
      "typeVersion": 1
    },
    {
      "id": "9328ef43-8696-4cb0-b4cd-cf9403954403",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1664,
        192
      ],
      "parameters": {
        "color": 7,
        "width": 624,
        "height": 320,
        "content": "## Track Positions\nThis checks where your keywords actually ranks on Google. It uses a web scraper to get real search results and see your current position."
      },
      "typeVersion": 1
    },
    {
      "id": "9549945e-e574-4a0e-9d24-ee3665309499",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2720,
        -96
      ],
      "parameters": {
        "color": 7,
        "width": 688,
        "height": 880,
        "content": "## Save Results & Alert\nThis saves all ranking data to Google Sheets. If your ranking drops below position 10, it sends an urgent email. Every day it sends a summary to Slack."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "ee63c40b-c031-4f3c-8aaa-d93616e0b13d",
  "connections": {
    "SEO Analysis Parser": {
      "ai_outputParser": [
        [
          {
            "node": "SEO Strategy Analysis Agent",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Google Search Scraper": {
      "ai_tool": [
        [
          {
            "node": "Keyword Ranking Check Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Ranking Tasks": {
      "main": [
        [
          {
            "node": "Keyword Ranking Check Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set SEO Configuration": {
      "main": [
        [
          {
            "node": "Validate SEO Configuration",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Ranking Results Parser": {
      "ai_outputParser": [
        [
          {
            "node": "Keyword Ranking Check Agent",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Validate SEO Configuration": {
      "main": [
        [
          {
            "node": "SEO Strategy Analysis Agent",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Log Configuration Errors",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Critical Ranking Drop": {
      "main": [
        [
          {
            "node": "Save SEO Intelligence to Sheets",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Send Critical Alert via Gmail",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Keyword Ranking Check Agent": {
      "main": [
        [
          {
            "node": "Check Critical Ranking Drop",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "SEO Strategy Analysis Agent": {
      "main": [
        [
          {
            "node": "Prepare Ranking Tasks",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Model for Ranking Check": {
      "ai_languageModel": [
        [
          {
            "node": "Keyword Ranking Check Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Save SEO Intelligence to Sheets": {
      "main": [
        [
          {
            "node": "Send Daily Summary to Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Daily SEO Intelligence Scheduler": {
      "main": [
        [
          {
            "node": "Set SEO Configuration",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Model for Strategy Analysis": {
      "ai_languageModel": [
        [
          {
            "node": "SEO Strategy Analysis Agent",
            "type": "ai_languageModel",
            "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

This workflow contains community nodes that are only compatible with the self-hosted version of n8n.

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

Created by: Peyton Leveillee Last updated: October 2025

OpenAI Chat, Google Sheets, HTTP Request +5
AI & RAG

This workflow automates end-to-end ESG (Environmental, Social, and Governance) sustainability reporting for enterprise sustainability teams, compliance officers, and green governance leads. It solves

Agent, OpenAI Chat, Output Parser Structured +12
AI & RAG

This template is designed for B2B sales teams, recruiters, and business development professionals who want to identify sales opportunities by monitoring hiring signals from target companies. It's part

@Apify/N8N Nodes Apify, Google Sheets, Agent +4
AI & RAG

Automates sales data analysis and strategic insight generation for sales managers and strategists needing actionable intelligence. Fetches multi-source data from sales, marketing, and financial system

HTTP Request, Agent, OpenAI Chat +6
AI & RAG

Decodo is a powerful public data access platform offering managed web scraping APIs and proxy infrastructure to collect structured web data at scale. It handles proxies, anti-bot protection, JavaScrip

OpenAI Chat, Agent, Slack +5