{
  "id": "fGgSgXzCe04YeoIk",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Cluster webpage topics from Google Sheets to Google Sheets for AI discovery",
  "tags": [],
  "nodes": [
    {
      "id": "c11af817-4a74-4954-aa63-67298decbe04",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2560,
        -608
      ],
      "parameters": {
        "width": 436,
        "height": 464,
        "content": "## \ud83e\udde0 Auto-Cluster Topics for AI Discovery\n\n### How it works\nThis workflow scrapes webpage content from a Google Sheet, uses AI to extract entities and keywords, assigns topical clusters and subclusters, then suggests internal linking opportunities. It's built to strengthen topical authority for LLM-based search engines like ChatGPT, Perplexity, and Gemini.\n\n### Setup steps\n1. Connect your Google Sheets OAuth2 credential\n2. Connect your OpenAI API credential (uses GPT-4o-mini)\n3. Add a Google Sheet with a column named **URL**\n4. Replace the document ID and sheet name in \"Fetch URL List\" and \"Update Sheet Row\"\n5. Run manually or let it trigger weekly via the schedule"
      },
      "typeVersion": 1
    },
    {
      "id": "df98df32-2467-4a04-b91c-39d1f107438d",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2560,
        -80
      ],
      "parameters": {
        "color": 2,
        "width": 486,
        "height": 338,
        "content": "## \ud83d\udce5 Input & Batch Processing\nFetches URLs from Google Sheets and splits them into batches for sequential processing to avoid rate limits."
      },
      "typeVersion": 1
    },
    {
      "id": "a54710ac-d5b3-42da-9011-a38e1ad010c6",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1936,
        -160
      ],
      "parameters": {
        "color": 2,
        "width": 522,
        "height": 240,
        "content": "## \ud83c\udf10 HTML Scraping & Extraction\nFetches the raw HTML and extracts all heading tags (H1\u2013H6) to analyze page structure."
      },
      "typeVersion": 1
    },
    {
      "id": "406b7b71-496c-45d9-971f-090099ec6b2b",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1376,
        -208
      ],
      "parameters": {
        "color": 2,
        "width": 610,
        "height": 530,
        "content": "## \ud83e\udd16 AI-Powered Entity & Keyword Extraction\nUses GPT-4o-mini to analyze headings and extract entities, keywords, topics, and a one-paragraph summary for each page."
      },
      "typeVersion": 1
    },
    {
      "id": "4dccbe78-cf31-4ab6-8f0a-825d4323b8b0",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -720,
        -208
      ],
      "parameters": {
        "color": 2,
        "width": 438,
        "height": 536,
        "content": "## \ud83d\udcc2 Cluster & Subcluster Assignment\nGroups pages into high-level clusters and subclusters based on semantic similarity to build topical authority."
      },
      "typeVersion": 1
    },
    {
      "id": "3b120f52-5a9a-42c4-85ce-05347943e877",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -224,
        -208
      ],
      "parameters": {
        "color": 2,
        "width": 646,
        "height": 512,
        "content": "## \ud83d\udd17 Internal Linking Suggestions\nRecommends 3\u20135 related URLs from your dataset to strengthen cross-linking and boost AI discoverability."
      },
      "typeVersion": 1
    },
    {
      "id": "e4eba05e-5db6-42f6-9293-99460d8b651c",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        448,
        -208
      ],
      "parameters": {
        "color": 2,
        "width": 498,
        "height": 408,
        "content": "## \ud83d\udcbe Update Google Sheets\nWrites all extracted data, clusters, and link suggestions back to the sheet for easy review and action."
      },
      "typeVersion": 1
    },
    {
      "id": "54422aac-1b30-42e6-82d2-19b4d19b7bc1",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        560,
        320
      ],
      "parameters": {
        "color": 3,
        "width": 320,
        "height": 156,
        "content": "## \ud83d\udd10 Credentials & Security\nUse OAuth2 for Google Sheets and API keys for OpenAI. Replace sample document IDs and workspace references before deploying."
      },
      "typeVersion": 1
    },
    {
      "id": "b4083bc4-48ff-4ed9-b3a1-30ede6841458",
      "name": "Fetch URL List from Google Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -2240,
        48
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 393476893,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/17rcNd_ZpUQLm0uWEVbD-NY6GyFUkrD4BglvawlyBygM/edit#gid=393476893",
          "cachedResultName": "URL Data"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "17rcNd_ZpUQLm0uWEVbD-NY6GyFUkrD4BglvawlyBygM",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/17rcNd_ZpUQLm0uWEVbD-NY6GyFUkrD4BglvawlyBygM/edit?usp=drivesdk",
          "cachedResultName": "sample_leads_50"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4
    },
    {
      "id": "1041c270-8eed-4d94-8328-7179c3dcdbc9",
      "name": "Split URLs In Batches",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -2016,
        48
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "e7d5d25d-c51f-4ec3-926b-3d073cf30fb9",
      "name": "Fetch HTML from URL",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -1792,
        -80
      ],
      "parameters": {
        "url": "={{$json[\"URL\"]}}",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "97387a78-0418-48d3-9f49-0eee88e26c2e",
      "name": "Extract Headings (H1-H6)",
      "type": "n8n-nodes-base.html",
      "position": [
        -1568,
        -80
      ],
      "parameters": {
        "options": {},
        "operation": "extractHtmlContent",
        "extractionValues": {
          "values": [
            {
              "key": "h1",
              "cssSelector": "h1"
            },
            {
              "key": "h2",
              "cssSelector": "h2"
            },
            {
              "key": "h3",
              "cssSelector": "h3"
            },
            {
              "key": "h4",
              "cssSelector": "h4"
            },
            {
              "key": "h5",
              "cssSelector": "h5"
            },
            {
              "key": "h6",
              "cssSelector": "h6"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "f9b221e7-5d58-49bf-ab37-5bbbd8e5740f",
      "name": "Prepare Sheet Update",
      "type": "n8n-nodes-base.set",
      "position": [
        512,
        -80
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "a1b2c3d4",
              "name": "title",
              "type": "string",
              "value": "={{ $('Format Extracted Data').item.json.title }}"
            },
            {
              "id": "b2c3d4e5",
              "name": "entities",
              "type": "string",
              "value": "={{ $('Format Extracted Data').item.json.entities }}"
            },
            {
              "id": "c3d4e5f6",
              "name": "keywords",
              "type": "string",
              "value": "={{ $('Format Extracted Data').item.json.keywords }}"
            },
            {
              "id": "d4e5f6g7",
              "name": "summary",
              "type": "string",
              "value": "={{ $('Format Extracted Data').item.json.summary }}"
            },
            {
              "id": "e5f6g7h8",
              "name": "cluster",
              "type": "string",
              "value": "={{ $('Format Cluster Data').item.json.cluster }}"
            },
            {
              "id": "f6g7h8i9",
              "name": "subcluster",
              "type": "string",
              "value": "={{ $('Format Cluster Data').item.json.subcluster }}"
            },
            {
              "id": "g7h8i9j0",
              "name": "internal_link_suggestions",
              "type": "string",
              "value": "={{ $json.output.suggestions }}"
            },
            {
              "id": "h8i9j0k1",
              "name": "status",
              "type": "string",
              "value": "processed"
            },
            {
              "id": "50201a25-4573-4940-82f5-2e8144a398f6",
              "name": "URL",
              "type": "string",
              "value": "={{ $('Split URLs In Batches').item.json.URL }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "5838cef3-4266-4ff5-a81b-19464a7fe3fe",
      "name": "Update Sheet Row",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        736,
        32
      ],
      "parameters": {
        "columns": {
          "value": {},
          "schema": [
            {
              "id": "URL",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "title",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "h1",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "h1",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "h2_list",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "h2_list",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "h3_list",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "h3_list",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "entities",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "entities",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "keywords",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "keywords",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "summary",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "summary",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "cluster",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "cluster",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "subcluster",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "subcluster",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "internal_link_suggestions",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "internal_link_suggestions",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "status",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "autoMapInputData",
          "matchingColumns": [
            "URL"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 393476893,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/17rcNd_ZpUQLm0uWEVbD-NY6GyFUkrD4BglvawlyBygM/edit#gid=393476893",
          "cachedResultName": "URL Data"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "17rcNd_ZpUQLm0uWEVbD-NY6GyFUkrD4BglvawlyBygM",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/17rcNd_ZpUQLm0uWEVbD-NY6GyFUkrD4BglvawlyBygM/edit?usp=drivesdk",
          "cachedResultName": "sample_leads_50"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4
    },
    {
      "id": "aeac4ab0-591b-4028-a8d0-80a45a303d04",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        -1344,
        144
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini",
          "cachedResultName": "gpt-4o-mini"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "c95cbb62-6c94-43ec-9cc3-2295f7eca6a2",
      "name": "Memory Buffer",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "position": [
        -1216,
        144
      ],
      "parameters": {
        "sessionKey": "\"GEO Defined\"",
        "sessionIdType": "customKey"
      },
      "typeVersion": 1.3
    },
    {
      "id": "e0c97008-c85e-487b-afd2-86973f59e57f",
      "name": "Structured JSON Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        -1088,
        144
      ],
      "parameters": {
        "jsonSchemaExample": "{\n  \"title\": \"string\",\n  \"entities\": [\"entity1\", \"entity2\"],\n  \"keywords\": [\"keyword1\", \"keyword2\"],\n  \"topics\": [\"topic1\", \"topic2\"],\n  \"summary\": \"one paragraph summary\"\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "419cefdf-c459-4032-95b7-dd5c6e8477b7",
      "name": "AI Agent - Extract Entities & Keywords",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -1280,
        -80
      ],
      "parameters": {
        "text": "=Analyze this webpage:\n\nURL: {{$json[\"URL\"]}}\nH1: {{$json[\"h1\"]}}\nH2: {{$json[\"h2_list\"]}}\nH3: {{$json[\"h3_list\"]}}\n\nExtract:\n- title\n- entities\n- keywords\n- topics\n- summary\n\nReturn STRICT JSON only.\n",
        "options": {
          "systemMessage": "=You are an SEO + LLM-focused content analysis engine.\n\nYour job is to analyze webpage structure and extract semantic signals AI search engines use.\n\nReturn ONLY valid JSON matching this exact format:\n\n{\n  \"title\": \"string\",\n  \"entities\": [\"entity1\", \"entity2\"],\n  \"keywords\": [\"keyword1\", \"keyword2\"],\n  \"topics\": [\"topic1\", \"topic2\"],\n  \"summary\": \"one paragraph summary\"\n}\n"
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 2.1
    },
    {
      "id": "2743a52b-1796-414f-aeaf-858f31b25721",
      "name": "OpenAI Chat Model for Clustering",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        -656,
        144
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini",
          "cachedResultName": "gpt-4o-mini"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "7405ae78-a231-4ddb-955e-d580cd2cd058",
      "name": "Memory Buffer for Clustering",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "position": [
        -528,
        144
      ],
      "parameters": {
        "sessionKey": "\"GEO Defined\"",
        "sessionIdType": "customKey"
      },
      "typeVersion": 1.3
    },
    {
      "id": "05fd1330-6c14-4ddc-9c34-510b119e97df",
      "name": "Cluster JSON Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        -400,
        144
      ],
      "parameters": {
        "jsonSchemaExample": "{\n  \"cluster\": \"string\",\n  \"subcluster\": \"string\"\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "ddfcfe0f-7648-4c40-addf-edd409e4cecd",
      "name": "AI Agent - Assign Topic Clusters",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -592,
        -80
      ],
      "parameters": {
        "text": "=Based on:\nEntities: {{$json[\"entities\"]}}\nKeywords: {{$json[\"keywords\"]}}\nTopics: {{$json[\"topics\"]}}\nURL: {{ $('Split URLs In Batches').item.json.URL }}\n\nReturn cluster and subcluster in JSON.\n",
        "options": {
          "systemMessage": "=You are a topical authority clustering engine.\n\nAssign each page to a high-level cluster and subcluster relevant for LLM search.\n\nReturn JSON ONLY:\n\n{\n  \"cluster\": \"string\",\n  \"subcluster\": \"string\"\n}\n"
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 2.1
    },
    {
      "id": "e0f5f512-a657-4c53-8562-7d48e018566a",
      "name": "Format Extracted Data",
      "type": "n8n-nodes-base.set",
      "position": [
        -880,
        -80
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "c840f40b-b8c5-4385-998a-1428682ff7cf",
              "name": "title",
              "type": "string",
              "value": "={{ $json.output.title }}"
            },
            {
              "id": "d8528cc0-76a0-482a-8036-fafc127f1955",
              "name": "entities",
              "type": "string",
              "value": "={{ $json.output.entities }}"
            },
            {
              "id": "376ed11f-4df7-4ae4-b94b-dc52fe2abe56",
              "name": "keywords",
              "type": "string",
              "value": "={{ $json.output.keywords }}"
            },
            {
              "id": "3e18188e-83e4-4286-be74-a092f7b6f284",
              "name": "topics",
              "type": "string",
              "value": "={{ $json.output.topics }}"
            },
            {
              "id": "e56d81e0-de4c-4353-acc6-34252503e40f",
              "name": "summary",
              "type": "string",
              "value": "={{ $json.output.summary }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "a4478e85-6189-4fca-8db1-b69948121353",
      "name": "Format Cluster Data",
      "type": "n8n-nodes-base.set",
      "position": [
        -192,
        -80
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "cdd9b343-a93b-4d86-8973-3c5be9fe5696",
              "name": "cluster",
              "type": "string",
              "value": "={{ $json.output.cluster }}"
            },
            {
              "id": "86fdb121-4e82-49ab-b459-0f847cf1b454",
              "name": "subcluster",
              "type": "string",
              "value": "={{ $json.output.subcluster }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "906978b1-863d-45d8-8f47-85baaf1a1966",
      "name": "OpenAI Chat Model for Links",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        48,
        144
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini",
          "cachedResultName": "gpt-4o-mini"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "a6c6bcbb-e8c4-48a4-9867-bcfd72eb8a8c",
      "name": "Memory Buffer for Links",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "position": [
        176,
        144
      ],
      "parameters": {
        "sessionKey": "\"GEO Defined\"",
        "sessionIdType": "customKey"
      },
      "typeVersion": 1.3
    },
    {
      "id": "cb21d273-85ac-4ece-81c0-5bf82c48bd2d",
      "name": "Link Suggestions JSON Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        304,
        144
      ],
      "parameters": {
        "jsonSchemaExample": "{\n  \"suggestions\": [\"url1\", \"url2\", \"url3\"]\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "229bd06c-1738-4f5a-82da-f0ef29e27728",
      "name": "Weekly Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -2480,
        48
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "weeks",
              "triggerAtDay": [
                1
              ]
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "19fc3426-1e05-4a5c-8396-ae435acf9da6",
      "name": "AI Agent - Generate Internal Links",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        112,
        -80
      ],
      "parameters": {
        "text": "=Based on this page:\nURL: {{ $('Split URLs In Batches').item.json.URL }}\nCluster: {{$json[\"cluster\"]}}\nSubcluster: {{$json[\"subcluster\"]}} \nentities:{{ $('Format Extracted Data').item.json.entities }}\n\nGiven these available URLs:\n{{$items(\"Fetch URL List from Google Sheets\").map(i => i.json.URL)}}\n\nReturn 3\u20135 related URLs as suggestions.\n",
        "options": {
          "systemMessage": "=You are an internal linking strategy engine.\nRecommend URLs from this dataset that should internally link together to strengthen topical authority.\n\nReturn ONLY JSON:\n\n{\n  \"suggestions\": [\"url1\", \"url2\", \"url3\"]\n}\n"
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 2.1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "fbc0b7f5-9eff-4036-99eb-c6eb7cf0820f",
  "connections": {
    "Memory Buffer": {
      "ai_memory": [
        [
          {
            "node": "AI Agent - Extract Entities & Keywords",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Update Sheet Row": {
      "main": [
        [
          {
            "node": "Split URLs In Batches",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent - Extract Entities & Keywords",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Cluster JSON Parser": {
      "ai_outputParser": [
        [
          {
            "node": "AI Agent - Assign Topic Clusters",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Fetch HTML from URL": {
      "main": [
        [
          {
            "node": "Extract Headings (H1-H6)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format Cluster Data": {
      "main": [
        [
          {
            "node": "AI Agent - Generate Internal Links",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Sheet Update": {
      "main": [
        [
          {
            "node": "Update Sheet Row",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format Extracted Data": {
      "main": [
        [
          {
            "node": "AI Agent - Assign Topic Clusters",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split URLs In Batches": {
      "main": [
        [],
        [
          {
            "node": "Fetch HTML from URL",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Structured JSON Parser": {
      "ai_outputParser": [
        [
          {
            "node": "AI Agent - Extract Entities & Keywords",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Memory Buffer for Links": {
      "ai_memory": [
        [
          {
            "node": "AI Agent - Generate Internal Links",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Weekly Schedule Trigger": {
      "main": [
        [
          {
            "node": "Fetch URL List from Google Sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Headings (H1-H6)": {
      "main": [
        [
          {
            "node": "AI Agent - Extract Entities & Keywords",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model for Links": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent - Generate Internal Links",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Link Suggestions JSON Parser": {
      "ai_outputParser": [
        [
          {
            "node": "AI Agent - Generate Internal Links",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Memory Buffer for Clustering": {
      "ai_memory": [
        [
          {
            "node": "AI Agent - Assign Topic Clusters",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent - Assign Topic Clusters": {
      "main": [
        [
          {
            "node": "Format Cluster Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model for Clustering": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent - Assign Topic Clusters",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Fetch URL List from Google Sheets": {
      "main": [
        [
          {
            "node": "Split URLs In Batches",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent - Generate Internal Links": {
      "main": [
        [
          {
            "node": "Prepare Sheet Update",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent - Extract Entities & Keywords": {
      "main": [
        [
          {
            "node": "Format Extracted Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}