SEO キーワード監視

上級

これはAI, Marketing分野の自動化ワークフローで、16個のノードを含みます。主にIf, Set, Gmail, HttpRequest, ManualTriggerなどのノードを使用、AI技術を活用したスマート自動化を実現。 YouTubeチャンネルのリード獲得とメールアウトラ/メールトリガー自動化、Apify と ZeroBounce を統合

前提条件
  • Googleアカウント + Gmail API認証情報
  • ターゲットAPIの認証情報が必要な場合あり
ワークフロープレビュー
ノード接続関係を可視化、ズームとパンをサポート
ワークフローをエクスポート
以下のJSON設定をn8nにインポートして、このワークフローを使用できます
{
  "id": "1xrqMJ6EWwURrcKa",
  "meta": {
    "instanceId": "84ad02d6104594179f43f1ce9cfe3a81637b2faedb57dafcb9e649b7542988db",
    "templateCredsSetupCompleted": true
  },
  "name": "SEO Keyword Monitoring",
  "tags": [],
  "nodes": [
    {
      "id": "dd7dfdd7-afc0-4e42-abbb-00a79bad0cd4",
      "name": "Airtableからキーワードを取得",
      "type": "n8n-nodes-base.airtableTrigger",
      "position": [
        0,
        0
      ],
      "parameters": {
        "baseId": {
          "__rl": true,
          "mode": "url",
          "value": "https://airtable.com/appjaqV0O7FkXT2qj/shrst7GnlbzMDz4te"
        },
        "tableId": {
          "__rl": true,
          "mode": "url",
          "value": "https://airtable.com/appjaqV0O7FkXT2qj/tblTAvRqVFOo5AVDF/viwEp0ssaidZOo4nl?blocks=hide"
        },
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        },
        "triggerField": "Keyword",
        "authentication": "airtableTokenApi",
        "additionalFields": {}
      },
      "credentials": {
        "airtableTokenApi": {
          "id": "OQJxQX3N8GKNxEOl",
          "name": "Airtable Personal Access Token account 2"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "0cc36294-63c3-4ffb-9282-8a9d98a3606d",
      "name": "Firecrawlで順位を確認",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        300,
        -220
      ],
      "parameters": {
        "url": "https://api.firecrawl.dev/serp",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "sendHeaders": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "query",
              "value": "={{ $json.fields.Keyword }}"
            },
            {
              "name": "country",
              "value": "us"
            },
            {
              "name": "language",
              "value": "en"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer YOUR_API_KEY"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "3b38da51-67e5-45b5-a481-6b064c143eca",
      "name": "Airtable + Firecrawl結果を結合",
      "type": "n8n-nodes-base.merge",
      "position": [
        580,
        -20
      ],
      "parameters": {},
      "typeVersion": 3.1
    },
    {
      "id": "479ab102-bd2c-4278-b869-4a72fbdaa639",
      "name": "順位を比較",
      "type": "n8n-nodes-base.code",
      "position": [
        900,
        -20
      ],
      "parameters": {
        "jsCode": "// Find the item that contains results\nconst resultItem = items.find(item => Array.isArray(item.json.results));\nconst dataItem = items.find(item => item.json.fields && item.json.fields[\"Target URL\"]);\n\n// Defensive check\nif (!resultItem || !dataItem) {\n  throw new Error(\"Missing result or Airtable data\");\n}\n\nconst results = resultItem.json.results;\nconst fields = dataItem.json.fields;\n\nconst targetUrl = fields[\"Target URL\"];\nconst keyword = fields[\"Keyword\"];\n\nlet rank = null;\n\nfor (let i = 0; i < results.length; i++) {\n  const resultUrl = results[i].url?.toLowerCase() || '';\n  if (resultUrl.includes(targetUrl.toLowerCase())) {\n    rank = i + 1;\n    break;\n  }\n}\n\nreturn [\n  {\n    json: {\n      keyword,\n      target_url: targetUrl,\n      current_rank: fields[\"Current Rank\"],\n      new_rank: rank !== null ? rank : \"Not in Top 10\",\n      rank_changed: rank !== null && rank !== fields[\"Current Rank\"],\n      notes: fields[\"Notes\"] || \"\",\n      airtable_id: dataItem.json.id,\n      raw_results: results // Optional\n    }\n  }\n];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "bf89e7d8-bc10-4e12-9671-3b21976f901d",
      "name": "Airtableレコードを更新",
      "type": "n8n-nodes-base.airtable",
      "position": [
        1120,
        -20
      ],
      "parameters": {
        "base": {
          "__rl": true,
          "mode": "list",
          "value": "appjaqV0O7FkXT2qj",
          "cachedResultUrl": "https://airtable.com/appjaqV0O7FkXT2qj",
          "cachedResultName": "Table no.1"
        },
        "table": {
          "__rl": true,
          "mode": "list",
          "value": "tblTAvRqVFOo5AVDF",
          "cachedResultUrl": "https://airtable.com/appjaqV0O7FkXT2qj/tblTAvRqVFOo5AVDF",
          "cachedResultName": "Table 1"
        },
        "columns": {
          "value": {
            "id": "={{ $json.airtable_id }}",
            "Current Rank": "={{ $json.new_rank }}"
          },
          "schema": [
            {
              "id": "id",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": true,
              "required": false,
              "displayName": "id",
              "defaultMatch": true
            },
            {
              "id": "Keyword",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Keyword",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Target URL",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Target URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Current Rank",
              "type": "number",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Current Rank",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "id"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update"
      },
      "credentials": {
        "airtableTokenApi": {
          "id": "OQJxQX3N8GKNxEOl",
          "name": "Airtable Personal Access Token account 2"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "6cda42ab-19eb-4309-85f3-0d84a195931a",
      "name": "順位変動を確認",
      "type": "n8n-nodes-base.if",
      "position": [
        1460,
        -20
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "e16a90ab-e577-46f8-abf2-9c8de77059fc",
              "operator": {
                "type": "number",
                "operation": "notEquals"
              },
              "leftValue": "={{ $('Compare Ranks').item.json.current_rank }}",
              "rightValue": "={{ $('Compare Ranks').item.json.new_rank }}"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "02ed48b0-4e24-42ea-8856-8a25ca0446cb",
      "name": "Slack通知を送信",
      "type": "n8n-nodes-base.slack",
      "position": [
        1740,
        -200
      ],
      "webhookId": "f0ed69d2-fcd1-457e-b981-614ec29954cc",
      "parameters": {
        "text": "hi",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "C08TTV0CC3E",
          "cachedResultName": "all-nathing"
        },
        "otherOptions": {}
      },
      "credentials": {
        "slackApi": {
          "id": "L2vpqY0w5ba50NlR",
          "name": "Slack account 2"
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "dff0f256-73c3-4cdc-8b1c-db30070a3965",
      "name": "操作なし(何もしない)",
      "type": "n8n-nodes-base.noOp",
      "position": [
        1740,
        180
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "a9171863-7fd9-4cd4-ac67-b6b4fb5b7dc7",
      "name": "付箋",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -40,
        -1320
      ],
      "parameters": {
        "width": 760,
        "height": 1520,
        "content": "## 🔍 **Section 1: Fetch and Merge Data**\n\n### 🎯 Goal: Get keyword data from Airtable, fetch rank info from Firecrawl, and merge both for comparison.\n\n---\n\n### 🧱 **Step 1: Fetch Keywords from Airtable**\n\n**Node Name:** `Fetch Keywords from Airtable`\n**📌 Description:**\nTriggers when a new or updated record is found in Airtable. It fetches the following fields:\n\n* `Keyword`\n* `Target URL`\n* `Current Rank`\n\nThis is the starting point of the workflow.\n\n---\n\n### 🌐 **Step 2: Check Rank via Firecrawl**\n\n**Node Name:** `Check Rank via Firecrawl`\n**📌 Description:**\nSends a POST request to [Firecrawl API](https://api.firecrawl.dev) with the `Keyword` as the main parameter. It returns updated ranking information for that keyword.\n\n---\n\n### 🔗 **Step 3: Combine Airtable + Firecrawl Result**\n\n**Node Name:** `Combine Airtable + Firecrawl Result`\n**📌 Description:**\nA `Merge` node that combines:\n\n* The original data from Airtable\n* The response from Firecrawl\n\nThis prepares a unified object to be used in the next comparison step.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "7c568ca6-16dd-4d16-bea1-7cbdbf5b973b",
      "name": "付箋1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        820,
        -980
      ],
      "parameters": {
        "color": 3,
        "width": 460,
        "height": 1180,
        "content": "## 🧠 **Section 2: Compare & Update Airtable Record**\n\n### 🎯 Goal: Check if the rank has changed. If yes, update Airtable with the new rank.\n\n---\n\n### 🧮 **Step 4: Compare Ranks**\n\n**Node Name:** `Compare Ranks`\n**📌 Description:**\nA `Code` node that compares the `Current Rank` from Airtable and the `New Rank` from Firecrawl.\nIt adds a new field:\n\n```js\nrankChanged: true // or false\n```\n\nThis acts as the decision flag for the next step.\n\n---\n\n### 📝 **Step 5: Update Airtable Record**\n\n**Node Name:** `Update Airtable Record`\n**📌 Description:**\nUses the unique record ID to update the Airtable row with the new rank.\nOptional fields to update:\n\n* `New Rank`\n* `Rank Changed Date`\n* Any notes or audit logs\n\n---\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "60ea4f45-7a33-4cf1-8952-7989df4c6edf",
      "name": "付箋2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1400,
        -900
      ],
      "parameters": {
        "color": 7,
        "width": 500,
        "height": 1220,
        "content": "## ✅ **Section 3: Conditional Alert**\n\n### 🎯 Goal: Notify via Slack if the rank has changed.\n\n---\n\n### 🔀 **Step 6: Check if Rank Changed**\n\n**Node Name:** `Check if Rank Changed`\n**📌 Description:**\nAn `If` node that checks the `rankChanged` flag from the previous step.\n\n* **true:** Proceed to send Slack notification\n* **false:** Do nothing and stop workflow here\n\n---\n\n### 💬 **Step 7: Send Slack Notification**\n\n**Node Name:** `Send Slack Notification`\n**📌 Description:**\nPosts a message in a specified Slack channel with:\n\n* 📈 `Keyword`\n* 🔗 `Target URL`\n* 🆕 `New Rank`\n* 🕓 Timestamp or context\n\nThis ensures the team is alerted about SEO improvements or drops.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "bd9813ca-f877-4a50-8b4a-8284dc5cd2da",
      "name": "付箋9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1720,
        -1320
      ],
      "parameters": {
        "color": 4,
        "width": 1300,
        "height": 320,
        "content": "=======================================\n            WORKFLOW ASSISTANCE\n=======================================\nFor any questions or support, please contact:\n    Yaron@nofluff.online\n\nExplore more tips and tutorials here:\n   - YouTube: https://www.youtube.com/@YaronBeen/videos\n   - LinkedIn: https://www.linkedin.com/in/yaronbeen/\n=======================================\n"
      },
      "typeVersion": 1
    },
    {
      "id": "8c6e6722-1d72-4736-8c69-cf245d6cc06d",
      "name": "付箋4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1720,
        -980
      ],
      "parameters": {
        "color": 4,
        "width": 1289,
        "height": 2178,
        "content": "\n# 🚀 **Automated Rank Tracker Workflow (n8n)**\n\n---\n\n## 📌 **Purpose**\n\nThis workflow is designed to **automatically monitor keyword rankings**, compare them with new data from an SEO API (Firecrawl), and **alert your team on Slack** whenever there’s a change. It helps you stay on top of your SEO game **without manual checking**! ⚡\n\n---\n\n## 🧠 **What It Does — In 3 Simple Steps**\n\n---\n\n### 🔍 **1. Fetch & Merge Data**\n\n📦 **Source:** Airtable\n🌐 **Analyzer:** Firecrawl API\n🔗 **Process:** Merge both for side-by-side comparison\n\n* ✅ Grabs `Keyword`, `Target URL`, and `Current Rank` from Airtable\n* 🌐 Sends the `Keyword` to Firecrawl API to get the **Latest Rank**\n* 🔗 Merges original Airtable data + Firecrawl result\n* 🛠️ Prepares a complete object for decision-making\n\n---\n\n### 🧮 **2. Compare & Update Airtable**\n\n🧠 **Compare:** Current Rank vs Latest Rank\n📝 **Update:** Airtable if there's a difference\n\n* 🔍 Uses a Code node to check:\n\n  ```js\n  if (currentRank !== latestRank) → rankChanged = true\n  ```\n* 📝 If there's a change, updates the original Airtable row with:\n\n  * New Rank\n  * Timestamp\n  * Optional status/comments\n\n---\n\n### ✅ **3. Alert If Rank Changed**\n\n🧪 **Decision:** Did rank change?\n📣 **Notify:** Slack if yes\n\n* 🤖 Uses an `If` node to evaluate the `rankChanged` flag\n* 💬 Posts a message in Slack like:\n\n  > “🎯 Keyword: *‘best running shoes’* rank has changed from *5 ➡ 2*! 🚀”\n\n---\n\n## 🧩 **Visual Flow Overview**\n\n```\nAirtable Trigger\n   ↓\nFirecrawl HTTP Request\n   ↓\nMerge Results\n   ↓\nCompare Ranks (Code Node)\n   ↓\nUpdate Airtable\n   ↓\nCheck If Rank Changed (If Node)\n   ↳ true → Send Slack Notification\n```\n\n---\n\n\n## 💡 Final Thoughts\n\nThis elegant workflow combines **data fetching, comparison, storage, and notification** in a streamlined way. It’s ideal for:\n\n* SEO Teams\n* Content Managers\n* Digital Agencies\n* Growth Hackers\n\n✨ **Set it and forget it — your ranks are now being watched 24/7.**\n\n---\n\nLet me know if you'd like a **shareable Markdown version** or a **Notion-style document**.\n"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "pinData": {
    "Check Rank via Firecrawl": [
      {
        "json": {
          "results": [
            {
              "url": "https://moz.com/blog/seo-automation-tools",
              "title": "Top SEO Automation Tools for 2025",
              "description": "Explore the best SEO automation tools for boosting rankings in 2025."
            },
            {
              "url": "https://your-site.com/seo-guide",
              "title": "Beginner’s Guide to SEO Automation",
              "description": "Learn how to automate your SEO efforts effectively."
            },
            {
              "url": "https://ahrefs.com/blog/automate-keyword-research",
              "title": "How to Automate Keyword Research",
              "description": "Streamline your SEO keyword research using automation."
            }
          ]
        }
      }
    ]
  },
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "aded958b-db96-4a80-b05b-27afdb05f950",
  "connections": {
    "479ab102-bd2c-4278-b869-4a72fbdaa639": {
      "main": [
        [
          {
            "node": "bf89e7d8-bc10-4e12-9671-3b21976f901d",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "6cda42ab-19eb-4309-85f3-0d84a195931a": {
      "main": [
        [
          {
            "node": "02ed48b0-4e24-42ea-8856-8a25ca0446cb",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "dff0f256-73c3-4cdc-8b1c-db30070a3965",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "bf89e7d8-bc10-4e12-9671-3b21976f901d": {
      "main": [
        [
          {
            "node": "6cda42ab-19eb-4309-85f3-0d84a195931a",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "0cc36294-63c3-4ffb-9282-8a9d98a3606d": {
      "main": [
        [
          {
            "node": "3b38da51-67e5-45b5-a481-6b064c143eca",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "dd7dfdd7-afc0-4e42-abbb-00a79bad0cd4": {
      "main": [
        [
          {
            "node": "0cc36294-63c3-4ffb-9282-8a9d98a3606d",
            "type": "main",
            "index": 0
          },
          {
            "node": "3b38da51-67e5-45b5-a481-6b064c143eca",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "3b38da51-67e5-45b5-a481-6b064c143eca": {
      "main": [
        [
          {
            "node": "479ab102-bd2c-4278-b869-4a72fbdaa639",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
よくある質問

このワークフローの使い方は?

上記のJSON設定コードをコピーし、n8nインスタンスで新しいワークフローを作成して「JSONからインポート」を選択、設定を貼り付けて認証情報を必要に応じて変更してください。

このワークフローはどんな場面に適していますか?

上級 - 人工知能, マーケティング

有料ですか?

このワークフローは完全無料です。ただし、ワークフローで使用するサードパーティサービス(OpenAI APIなど)は別途料金が発生する場合があります。

ワークフロー情報
難易度
上級
ノード数16
カテゴリー2
ノードタイプ7
難易度説明

上級者向け、16ノード以上の複雑なワークフロー

作成者
Yaron Been

Yaron Been

@yaron-nofluff

Building AI Agents and Automations | Growth Marketer | Entrepreneur | Book Author & Podcast Host If you need any help with Automations, feel free to reach out via linkedin: https://www.linkedin.com/in/yaronbeen/ And check out my Youtube channel: https://www.youtube.com/@YaronBeen/videos

外部リンク
n8n.ioで表示

このワークフローを共有

カテゴリー

カテゴリー: 34