AutomationFlowsGeneral › AI-Powered SEO Keyword Analysis & Filter

AI-Powered SEO Keyword Analysis & Filter

Original n8n title: SEO Key Word Analysis and Filter

SEO key word analysis and filter. Uses manualTrigger, lmChatOpenAi, googleDrive, extractFromFile. Event-driven trigger; 26 nodes.

Event trigger★★★★☆ complexityAI-powered26 nodesOpenAI ChatGoogle DriveText ClassifierGoogle Sheets
General Trigger: Event Nodes: 26 Complexity: ★★★★☆ AI nodes: yes Added:
AI-Powered SEO Keyword Analysis & Filter — n8n workflow card showing OpenAI Chat, Google Drive, Text Classifier integration

This workflow follows the Google Drive → 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": "1GvJhbtNl7rXsnXe",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "SEO key word analysis and filter",
  "tags": [
    {
      "id": "tKXLKPMBHBBgoCJM",
      "name": "SEO",
      "createdAt": "2025-03-08T12:14:40.598Z",
      "updatedAt": "2025-03-08T12:14:40.598Z"
    }
  ],
  "nodes": [
    {
      "id": "632cc5fb-701e-4c1a-9e94-8261b73b81e4",
      "name": "When clicking \u2018Test workflow\u2019",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -600,
        -280
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "f4bfb60a-b43d-496e-9ac4-4d33dce8d0b7",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        1240,
        -380
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini",
          "cachedResultName": "gpt-4o-mini"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "51ea2c40-2ec5-489e-99c9-c5421e3c11eb",
      "name": "get the rule data",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        -340,
        -540
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "list",
          "value": "1mTF6w3xOy6TSx5__3b0i9ETFWJ1PyT9l",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1mTF6w3xOy6TSx5__3b0i9ETFWJ1PyT9l/edit?usp=drivesdk&ouid=117136+1234567890&rtpof=true&sd=true",
          "cachedResultName": "filter_rules.xlsx"
        },
        "options": {},
        "operation": "download"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "0adead9c-170f-4174-a8de-e76d9dfc2fc8",
      "name": "transform the data",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        -160,
        -540
      ],
      "parameters": {
        "options": {},
        "operation": "rtf"
      },
      "typeVersion": 1
    },
    {
      "id": "18accb1e-c896-4d4b-933e-884302c07abe",
      "name": "data processing",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        60,
        -540
      ],
      "parameters": {
        "options": {},
        "fieldsToAggregate": {
          "fieldToAggregate": [
            {
              "fieldToAggregate": "brand"
            },
            {
              "fieldToAggregate": "fabric"
            },
            {
              "fieldToAggregate": "size"
            },
            {
              "fieldToAggregate": "design"
            },
            {
              "fieldToAggregate": "location"
            },
            {
              "fieldToAggregate": "demographic"
            },
            {
              "renameField": true,
              "outputFieldName": "holiday",
              "fieldToAggregate": "[\"holiday        [Halloween costume ideas]\"]"
            },
            {
              "fieldToAggregate": "scenario"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "287205c8-64d4-4c4e-9af9-31775a6306c0",
      "name": "add a merge field",
      "type": "n8n-nodes-base.set",
      "position": [
        260,
        -540
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "38e2ba87-5e63-45fa-895e-b6b1d2990b71",
              "name": "brand",
              "type": "array",
              "value": "={{ $json.brand }}"
            },
            {
              "id": "35084dd4-68f4-4627-a0f5-b549b85af78c",
              "name": "fabric",
              "type": "array",
              "value": "={{ $json.fabric }}"
            },
            {
              "id": "8bcab448-c3cb-4ad4-a807-3f4d48f091a8",
              "name": "size",
              "type": "array",
              "value": "={{ $json.size }}"
            },
            {
              "id": "7fca3332-bc9d-46d3-985f-2fff8748c1fd",
              "name": "design",
              "type": "array",
              "value": "={{ $json.design }}"
            },
            {
              "id": "ec88e4ad-0f18-4264-8922-f0df9243e2df",
              "name": "scenario",
              "type": "array",
              "value": "={{ $json.scenario }}"
            },
            {
              "id": "6dfc3ea0-fe54-4a92-8410-da0260f6ab93",
              "name": "holiday",
              "type": "array",
              "value": "={{ $json.holiday }}"
            },
            {
              "id": "1b1f6069-6f93-48d3-a813-6b500173185d",
              "name": "demographic",
              "type": "array",
              "value": "={{ $json.demographic }}"
            },
            {
              "id": "c2fdb3bb-0d85-4aab-82c8-dc0c124bf21b",
              "name": "location",
              "type": "array",
              "value": "={{ $json.location }}"
            },
            {
              "id": "aff6273c-5c08-4628-907a-4e5fd663d7a4",
              "name": "merge",
              "type": "string",
              "value": "1"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "276e5820-4ef2-4279-bf6f-44a4fb637393",
      "name": "get the keyword data",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        -360,
        80
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "list",
          "value": "13gyrNpN4SeV_mXI5e7duQ97JCfzNDUIESRRBInBqXL0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/13gyrNpN4SeV_mXI5e7duQ97JCfzNDUIESRRBInBqXL0/edit?usp=drivesdk",
          "cachedResultName": "sleeveless-dress_broad-match_us_2025-03-08"
        },
        "options": {},
        "operation": "download"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "009a11b4-f56c-4e79-8026-824117f2cd12",
      "name": "transform the data1",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        -140,
        80
      ],
      "parameters": {
        "options": {},
        "operation": "rtf"
      },
      "typeVersion": 1
    },
    {
      "id": "2b9630eb-00f2-4775-bde5-b8a80ded2134",
      "name": "filter by volume and kd",
      "type": "n8n-nodes-base.if",
      "position": [
        80,
        80
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "45e9ea99-70d2-4aba-8a90-d57a4140718d",
              "operator": {
                "type": "number",
                "operation": "gt"
              },
              "leftValue": "={{ $json.Volume }}",
              "rightValue": 100
            },
            {
              "id": "ed85b217-6b2d-4f0e-aa77-1f91cab0447f",
              "operator": {
                "type": "number",
                "operation": "lt"
              },
              "leftValue": "={{ $json.Volume }}",
              "rightValue": 10000
            },
            {
              "id": "63e5d8e2-1a32-44f1-8511-41e8fa9e0cb3",
              "operator": {
                "type": "number",
                "operation": "lt"
              },
              "leftValue": "={{ $json[\"Keyword Difficulty\"] }}",
              "rightValue": 30
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "7505be5a-0af9-449f-b6b8-53629619d849",
      "name": "add the merge field",
      "type": "n8n-nodes-base.set",
      "position": [
        340,
        40
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "e3974b8e-bde4-4a00-b3bf-b494b865059e",
              "name": "Keyword",
              "type": "string",
              "value": "={{ $json.Keyword }}"
            },
            {
              "id": "bcb4e3bf-38dc-4d04-b637-b044fbe08ce1",
              "name": "merge",
              "type": "string",
              "value": "1"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "1d254381-de41-4ba8-b9ad-c372cd9e56d9",
      "name": "Merge rule and keyword",
      "type": "n8n-nodes-base.merge",
      "position": [
        540,
        -280
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "fieldsToMatchString": "merge"
      },
      "typeVersion": 3
    },
    {
      "id": "7c2f23b5-97ee-4a37-8c77-5458277fd43e",
      "name": "filter the keyword by normal rule",
      "type": "n8n-nodes-base.code",
      "position": [
        780,
        -280
      ],
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "// Add a new field called 'myNewField' to the JSON of the item\nfunction buildPattern(word) {\n  return word\n    .toLowerCase()\n    .trim()\n    // \u5904\u7406\u8fde\u5b57\u7b26\u548c\u7a7a\u683c\u53d8\u4f53\uff1aoff-the-shoulder -> off[-\\s]?the[-\\s]?shoulder\n    .replace(/[- ]/g, '[\\\\s-]?') \n    // \u8f6c\u4e49\u7279\u6b8a\u5b57\u7b26\n    .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nconst rulesOrder = [\n    'brand',       \n    'demographic',\n    'fabric', \n    'design',\n    'holiday',\n    'scenario',\n    'size',\n    'location'     \n  ];\nconst keyword = $input.item.json.Keyword.toLowerCase();\nlet matchedRule = '';\nfor (const ruleType of rulesOrder) {\n    const words = $input.item.json[ruleType] || [];\n    if (words.length === 0) continue;\n\n    // \u6784\u5efa\u6b63\u5219\u8868\u8fbe\u5f0f\u6a21\u5f0f\n    const patterns = words.map(word => \n      `\\\\b${buildPattern(word)}\\\\b` // \u5355\u8bcd\u8fb9\u754c\u5339\u914d\n    );\n  \n    const regex = new RegExp(patterns.join('|'), 'i');\n    if (regex.test(keyword)) {\n      matchedRule = ruleType;\n      break; // \u53d1\u73b0\u8fdd\u89c4\u7acb\u5373\u7ec8\u6b62\n    }\n  }\n\n  return {\n    Keyword: keyword,\n    filter_rule: matchedRule\n  };"
      },
      "typeVersion": 2
    },
    {
      "id": "458b5eef-b946-4193-8ced-ecf3a8ef5a72",
      "name": "filter the data for deep rule",
      "type": "n8n-nodes-base.if",
      "position": [
        1000,
        -280
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "15febc26-52be-4d49-9344-2d59b1b689cd",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $json.filter_rule }}",
              "rightValue": "\"\""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "1ed66595-f883-45db-87c6-5cb0685fa146",
      "name": "AI Classifier",
      "type": "@n8n/n8n-nodes-langchain.textClassifier",
      "position": [
        1240,
        -640
      ],
      "parameters": {
        "options": {
          "enableAutoFixing": true
        },
        "inputText": "={{ $json.Keyword }}",
        "categories": {
          "categories": [
            {
              "category": "filter_by_colour",
              "description": "This keyword contains color descriptors outside the permitted white/black spectrum (e.g., red, blue)"
            },
            {
              "category": "filter_by_name",
              "description": "this type means that the keyword contain some names of people"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "57f53de9-1d4a-4e6b-b45e-c8da0d2a547c",
      "name": "Code fix the AI analysis",
      "type": "n8n-nodes-base.code",
      "position": [
        1740,
        -660
      ],
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "// Add a new field called 'myNewField' to the JSON of the item\n// $input.item.json.myNewField = 1;\n\nconst keyword = $input.item.json.Keyword.toLowerCase();\n\nconst hasAllowedColor = /\\b(black|white)\\b/.test(keyword);\n\nreturn {\n    \"Keyword\":keyword,\n    \"filter_rule\": hasAllowedColor ? \"normal\" : \"filter_by_colour\"\n  };\n"
      },
      "typeVersion": 2
    },
    {
      "id": "698a8af5-ccb1-4ae6-95b4-3f725946d198",
      "name": "Filter the right data",
      "type": "n8n-nodes-base.filter",
      "position": [
        1860,
        -400
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "0defca0e-1ea9-4c78-9bc9-c77c83097943",
              "operator": {
                "name": "filter.operator.equals",
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.filter_rule }}",
              "rightValue": "filter_by_colour"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "fe9b7a6d-cf8b-4bc0-8d8b-ea697665f8e3",
      "name": "data formatting",
      "type": "n8n-nodes-base.set",
      "position": [
        1540,
        -380
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "29d883b8-c6d1-4a03-80e3-69826c699164",
              "name": "Keyword",
              "type": "string",
              "value": "={{ $json.Keyword }}"
            },
            {
              "id": "88ea0ca1-2541-4cf6-8b62-35f1613a8a21",
              "name": "filter_rule",
              "type": "string",
              "value": "\u201cfilter_by_name\u201d"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "59db7bdd-96c7-4ab6-a868-87dabfa36d8e",
      "name": "Merge the filter catagory",
      "type": "n8n-nodes-base.merge",
      "position": [
        1880,
        -20
      ],
      "parameters": {
        "numberInputs": 4
      },
      "typeVersion": 3
    },
    {
      "id": "fd29ac5c-5d27-4799-9ed4-fc4aa0ae3415",
      "name": "Merge with initial data",
      "type": "n8n-nodes-base.merge",
      "position": [
        1940,
        360
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "joinMode": "enrichInput2",
        "fieldsToMatchString": "Keyword"
      },
      "typeVersion": 3
    },
    {
      "id": "d5b9cb93-9cb3-472d-8648-a380a0f52496",
      "name": "output the results",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2220,
        320
      ],
      "parameters": {
        "columns": {
          "value": {},
          "schema": [
            {
              "id": "Keyword",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Keyword",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Intent",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Intent",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Volume",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Volume",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Trend",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Trend",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Keyword Difficulty",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Keyword Difficulty",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "CPC (USD)",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "CPC (USD)",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Competitive Density",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Competitive Density",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "SERP Features",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "SERP Features",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Number of Results",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Number of Results",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "filter_rule",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "filter_rule",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "autoMapInputData",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1519232161,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/13gyrNpN4SeV_mXI5e7duQ97JCfzNDUIESRRBInBqXL0/edit#gid=1519232161",
          "cachedResultName": "analysis_result"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "13gyrNpN4SeV_mXI5e7duQ97JCfzNDUIESRRBInBqXL0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/13gyrNpN4SeV_mXI5e7duQ97JCfzNDUIESRRBInBqXL0/edit?usp=drivesdk",
          "cachedResultName": "sleeveless-dress_broad-match_us_2025-03-08"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "0ff7f7ff-58e8-4803-8968-c21f016cae56",
      "name": "data processing2",
      "type": "n8n-nodes-base.set",
      "position": [
        1400,
        260
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "29d883b8-c6d1-4a03-80e3-69826c699164",
              "name": "Keyword",
              "type": "string",
              "value": "={{ $json.Keyword }}"
            },
            {
              "id": "88ea0ca1-2541-4cf6-8b62-35f1613a8a21",
              "name": "filter_rule",
              "type": "string",
              "value": "\u201cfilter_by_volume_and_kd\u201d"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "496cf3f5-e13e-4c40-8557-2b78b619c19b",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -480,
        -740
      ],
      "parameters": {
        "color": 4,
        "width": 900,
        "height": 360,
        "content": "# 1.Establishing Core Filtering Criteria\n## in my scenario,this workflow is working for a clothes company\n## we define a couple of rules like brand,fabric,size,design,location\n## this part is easy rules that we could implement by words comparisons\n"
      },
      "typeVersion": 1
    },
    {
      "id": "74fff5a7-0577-44ec-a6d7-22611a8feb6e",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -420,
        -120
      ],
      "parameters": {
        "width": 880,
        "height": 380,
        "content": "# 2.Get the Data Through Semrush\n## semrush is a data provider where you could get some detail data \n## you could replace this part with api if you got a apikey (it's expensive)"
      },
      "typeVersion": 1
    },
    {
      "id": "e823f82b-7d03-4d3e-9d21-d7c58d75003b",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        500,
        -500
      ],
      "parameters": {
        "color": 3,
        "width": 620,
        "height": 440,
        "content": "# 3.Basic Filter Implementation"
      },
      "typeVersion": 1
    },
    {
      "id": "92d4d47f-5d2b-44b1-acd3-003bde0eb414",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1180,
        -880
      ],
      "parameters": {
        "width": 960,
        "height": 660,
        "content": "# 4.Advanced AI Processing Layer\n## use AI to classify the keyword that contain colour and names "
      },
      "typeVersion": 1
    },
    {
      "id": "24fca9c4-4602-4932-81d2-ab91a4c87cd1",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1380,
        -120
      ],
      "parameters": {
        "width": 1040,
        "height": 640,
        "content": "# 5.Data Consolidation & Output"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "25343a99-0d5b-408f-9d0f-81026bd54a81",
  "connections": {
    "AI Classifier": {
      "main": [
        [
          {
            "node": "Code fix the AI analysis",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "data formatting",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "data formatting": {
      "main": [
        [
          {
            "node": "Merge the filter catagory",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "data processing": {
      "main": [
        [
          {
            "node": "add a merge field",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "data processing2": {
      "main": [
        [
          {
            "node": "Merge the filter catagory",
            "type": "main",
            "index": 3
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI Classifier",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "add a merge field": {
      "main": [
        [
          {
            "node": "Merge rule and keyword",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "get the rule data": {
      "main": [
        [
          {
            "node": "transform the data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "transform the data": {
      "main": [
        [
          {
            "node": "data processing",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "add the merge field": {
      "main": [
        [
          {
            "node": "Merge rule and keyword",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "transform the data1": {
      "main": [
        [
          {
            "node": "filter by volume and kd",
            "type": "main",
            "index": 0
          },
          {
            "node": "Merge with initial data",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "get the keyword data": {
      "main": [
        [
          {
            "node": "transform the data1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter the right data": {
      "main": [
        [
          {
            "node": "Merge the filter catagory",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge rule and keyword": {
      "main": [
        [
          {
            "node": "filter the keyword by normal rule",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge with initial data": {
      "main": [
        [
          {
            "node": "output the results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "filter by volume and kd": {
      "main": [
        [
          {
            "node": "add the merge field",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "data processing2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code fix the AI analysis": {
      "main": [
        [
          {
            "node": "Filter the right data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge the filter catagory": {
      "main": [
        [
          {
            "node": "Merge with initial data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "filter the data for deep rule": {
      "main": [
        [
          {
            "node": "Merge the filter catagory",
            "type": "main",
            "index": 2
          }
        ],
        [
          {
            "node": "AI Classifier",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking \u2018Test workflow\u2019": {
      "main": [
        [
          {
            "node": "get the keyword data",
            "type": "main",
            "index": 0
          },
          {
            "node": "get the rule data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "filter the keyword by normal rule": {
      "main": [
        [
          {
            "node": "filter the data for deep rule",
            "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

How this works

This workflow streamlines SEO keyword analysis by automatically evaluating and filtering search terms from your Google Sheets or Drive files, helping you identify high-potential opportunities without manual sifting. It's ideal for digital marketers and content creators who need to refine keyword lists efficiently, saving hours of tedious review. The core step involves feeding keywords into an OpenAI chat model for intelligent scoring and classification, then extracting and processing data from Google Drive to produce a prioritised output ready for action.

Use this workflow when you have a large batch of keywords from ongoing SEO research and want AI-driven insights to focus on the most relevant ones for campaigns. Avoid it for real-time queries or if your data isn't stored in Google Drive, as it relies on file-based inputs. Common variations include integrating additional classifiers for sentiment analysis or exporting results directly to Google Sheets for team collaboration.

About this workflow

SEO key word analysis and filter. Uses manualTrigger, lmChatOpenAi, googleDrive, extractFromFile. Event-driven trigger; 26 nodes.

Source: https://github.com/ScraperNode/awesome-n8n-templates/blob/main/templates/ai-and-llm/3108-seo-keyword-analysis-and-filter/workflow.json — original creator credit. Request a take-down →

More General workflows → · Browse all categories →

Related workflows

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

General

Passive Income with Stock Images. Uses googleDrive, openAi, googleSheets. Event-driven trigger; 15 nodes.

Google Drive, OpenAI, Google Sheets
General

Create and publish Instagram carousels using OpenAI gpt-image-1 and AI caption. Uses chainLlm, outputParserItemList, lmChatOpenAi, splitInBatches. Scheduled trigger; 32 nodes.

Chain Llm, Output Parser Item List, OpenAI Chat +3
General

Converttofile Http. Uses lmChatOpenAi, googleSheets, httpRequest, openAi. Event-driven trigger; 18 nodes.

OpenAI Chat, Google Sheets, HTTP Request +3
General

HR-focused automation pipeline with AI. Uses formTrigger, extractFromFile, informationExtractor, chainSummarization. Event-driven trigger; 18 nodes.

Form Trigger, Information Extractor, Chain Summarization +5
General

Automated Resume Review System Using OpenAI + Google Sheets. Uses formTrigger, outputParserStructured, googleSheets, informationExtractor. Event-driven trigger; 17 nodes.

Form Trigger, Output Parser Structured, Google Sheets +5