This workflow corresponds to n8n.io template #13315 — we link there as the canonical source.
This workflow follows the Agent → 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 →
{
"id": "MjAjfa9No8m023Bu",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Optimize SEO metadata for Webflow CMS using MCP and AI",
"tags": [
{
"id": "T3xhK1cIuPex0boX",
"name": "Templates",
"createdAt": "2025-09-03T11:06:03.839Z",
"updatedAt": "2025-09-03T11:06:03.839Z"
}
],
"nodes": [
{
"id": "0156dff3-35ce-4866-9fdd-8079f2fd201e",
"name": "Manual Trigger",
"type": "n8n-nodes-base.manualTrigger",
"position": [
992,
2688
],
"parameters": {},
"typeVersion": 1
},
{
"id": "65a97353-0687-4d5e-af71-1c898e55ef10",
"name": "Track Metrics",
"type": "n8n-nodes-base.code",
"position": [
3184,
2688
],
"parameters": {
"jsCode": "const formatData = $('Format for Update').item.json;\nconst executionStart = new Date(formatData.timestamp);\nconst executionEnd = new Date();\nconst duration = (executionEnd - executionStart) / 1000;\n\nreturn [{\n json: {\n timestamp: new Date().toLocaleString('en-US', { timeZone: 'America/New_York' }),\n collectionId: formatData.collectionId,\n itemsUpdated: formatData.count,\n itemsPublished: formatData.count,\n executionDuration: `${duration}s`,\n postNames: formatData.items.map(i => i.fieldData.name).join('\\n'),\n itemIds: formatData.itemIds.join('\\n')\n }\n}];"
},
"typeVersion": 2
},
{
"id": "8b9af1aa-af12-4f39-b64f-b0788ed5e5f0",
"name": "Set Fields",
"type": "n8n-nodes-base.set",
"position": [
1216,
2688
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "a",
"name": "collectionId",
"type": "string",
"value": "xxxxxxxxxxxxxx"
},
{
"id": "d",
"name": "minTitleLength",
"type": "number",
"value": 50
},
{
"id": "e",
"name": "maxTitleLength",
"type": "number",
"value": 60
},
{
"id": "f",
"name": "minSummaryLength",
"type": "number",
"value": 120
},
{
"id": "g",
"name": "maxSummaryLength",
"type": "number",
"value": 155
}
]
}
},
"typeVersion": 3.4
},
{
"id": "26576080-76ea-438d-ba42-468df5b6b50d",
"name": "Fetch CMS Items",
"type": "@n8n/n8n-nodes-langchain.mcpClient",
"maxTries": 3,
"position": [
1440,
2688
],
"parameters": {
"tool": {
"__rl": true,
"mode": "list",
"value": "data_cms_tool"
},
"options": {},
"parameters": {
"value": {
"actions": "=[{\"list_collection_items\": {\"collection_id\": \"{{ $json.collectionId }}\", \"request\": {\"limit\": 100}}}]",
"context": "Retrieving collection items for SEO analysis"
},
"schema": [
{
"id": "actions",
"type": "array",
"display": true,
"required": true,
"displayName": "actions",
"defaultMatch": false,
"defaultValue": "[\n {\n \"get_collection_list\": {\n \"siteId\": \"string\"\n },\n \"get_collection_details\": {\n \"collection_id\": \"string\"\n },\n \"create_collection\": {\n \"request\": {\n \"displayName\": \"string\",\n \"singularName\": \"string\",\n \"slug\": \"string\"\n }\n },\n \"create_collection_static_field\": {\n \"collection_id\": \"string\",\n \"request\": {\n \"id\": \"string\",\n \"isEditable\": false,\n \"isRequired\": false,\n \"type\": \"Color\",\n \"displayName\": \"string\",\n \"helpText\": \"string\"\n }\n },\n \"create_collection_option_field\": {\n \"collection_id\": \"string\",\n \"request\": {\n \"id\": \"string\",\n \"isEditable\": false,\n \"isRequired\": false,\n \"type\": \"string\",\n \"displayName\": \"string\",\n \"helpText\": \"string\",\n \"metadata\": {\n \"options\": [\n {\n \"name\": \"string\",\n \"id\": \"string\"\n }\n ]\n }\n }\n },\n \"create_collection_reference_field\": {\n \"collection_id\": \"string\",\n \"request\": {\n \"id\": \"string\",\n \"isEditable\": false,\n \"isRequired\": false,\n \"type\": \"MultiReference\",\n \"displayName\": \"string\",\n \"helpText\": \"string\",\n \"metadata\": {\n \"collectionId\": \"string\"\n }\n }\n },\n \"update_collection_field\": {\n \"collection_id\": \"string\",\n \"field_id\": \"string\",\n \"request\": {\n \"isRequired\": false,\n \"displayName\": \"string\",\n \"helpText\": \"string\"\n }\n },\n \"list_collection_items\": {\n \"collection_id\": \"string\",\n \"request\": {\n \"cmsLocaleId\": \"string\",\n \"limit\": 0,\n \"offset\": 0,\n \"name\": \"string\",\n \"slug\": \"string\",\n \"sortBy\": \"lastPublished\",\n \"sortOrder\": \"asc\"\n }\n },\n \"create_collection_items\": {\n \"collection_id\": \"string\",\n \"request\": {\n \"cmsLocaleIds\": [\n \"string\"\n ],\n \"isArchived\": false,\n \"isDraft\": false,\n \"fieldData\": [\n {\n \"name\": \"string\",\n \"slug\": \"string\"\n }\n ]\n }\n },\n \"update_collection_items\": {\n \"collection_id\": \"string\",\n \"request\": {\n \"items\": [\n {\n \"id\": \"string\",\n \"cmsLocaleId\": \"string\",\n \"lastPublished\": \"string\",\n \"lastUpdated\": \"string\",\n \"createdOn\": \"string\",\n \"isArchived\": false,\n \"isDraft\": false,\n \"fieldData\": {\n \"name\": \"string\",\n \"slug\": \"string\"\n }\n }\n ]\n }\n },\n \"publish_collection_items\": {\n \"collection_id\": \"string\",\n \"request\": {\n \"itemIds\": [\n \"string\"\n ]\n }\n },\n \"delete_collection_items\": {\n \"collection_id\": \"string\",\n \"request\": {\n \"items\": [\n {\n \"id\": \"string\",\n \"cmsLocaleIds\": [\n \"string\"\n ]\n }\n ]\n }\n }\n }\n]"
},
{
"id": "context",
"type": "string",
"display": true,
"required": true,
"displayName": "context",
"defaultMatch": false
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"endpointUrl": "https://mcp.webflow.com/mcp"
},
"retryOnFail": true,
"typeVersion": 1,
"waitBetweenTries": 5000
},
{
"id": "67810024-e919-4b42-8721-da432621c4e0",
"name": "Loop Over Items",
"type": "n8n-nodes-base.splitInBatches",
"position": [
1664,
2688
],
"parameters": {
"options": {
"reset": false
},
"batchSize": "=5"
},
"typeVersion": 3
},
{
"id": "d95e34ae-bf07-487e-b3ac-18d08f8034aa",
"name": "SEO Analysis Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"maxTries": 3,
"position": [
1952,
2688
],
"parameters": {
"text": "={{ JSON.stringify($input.all().map(item => item.json)) }}",
"options": {
"systemMessage": "=You are an SEO optimization specialist for Webflow CMS.\n\nYour task: Optimize items to meet these requirements:\n- name (title): {{ $('Set Fields').first().json.minTitleLength }}-{{ $('Set Fields').first().json.maxTitleLength }} characters\n- project-summary: {{ $('Set Fields').first().json.minSummaryLength }}-{{ $('Set Fields').first().json.maxSummaryLength }} characters\n\nFor each item:\n1. Optimize name if outside target range\n2. Optimize project-summary if outside target range\n3. Check services-rendered for H1/H2 structure\n4. Flag missing alt text\n5. Count words in services-rendered\n\nOutput: JSON array ONLY. NO explanations. NO markdown. Start with [ and end with ].\n\nStructure:\n[\n {\n \"id\": \"string\",\n \"needsUpdate\": true,\n \"status\": \"optimized | attention_required\",\n \"updates\": {\n \"name\": \"string or null\",\n \"project-summary\": \"string or null\"\n },\n \"audit\": {\n \"charCount_name\": 0,\n \"charCount_summary\": 0,\n \"wordCount_services\": 0\n },\n \"issues\": [\"MISSING_ALT\", \"THIN_CONTENT\", \"INVALID_H_STRUCTURE\"]\n }\n]\n\n\nConstraints:\n- Never modify: id, slug, _archived, _draft, featured-project, color\n- Keep brand voice professional\n- Include target keywords naturally"
},
"promptType": "define",
"hasOutputParser": true
},
"retryOnFail": true,
"typeVersion": 1.7,
"continueOnFail": true,
"waitBetweenTries": 5000
},
{
"id": "f0419ea1-4483-4e13-9e4c-3220c135e5ec",
"name": "Format for Update",
"type": "n8n-nodes-base.code",
"position": [
2512,
2688
],
"parameters": {
"jsCode": "const data = $input.first().json;\nconst output = data.output || data;\nconst itemsToUpdate = output.filter(i => i.needsUpdate);\n\nif (itemsToUpdate.length === 0) {\n return [];\n}\n\nconst formattedItems = itemsToUpdate.map(item => {\n const fieldData = {};\n if (item.updates.name !== null) fieldData.name = item.updates.name;\n if (item.updates['project-summary'] !== null) fieldData['project-summary'] = item.updates['project-summary'];\n \n return {\n id: item.id,\n fieldData: fieldData\n };\n});\n\nreturn [{\n json: {\n // Make sure to update the correct collection ID \u26a0\ufe0f\n collectionId: \"xxxxxxxxxx\",\n items: formattedItems,\n itemIds: formattedItems.map(i => i.id),\n count: itemsToUpdate.length,\n timestamp: new Date().toISOString()\n }\n}];"
},
"typeVersion": 2
},
{
"id": "fe9d2b7d-a242-4b40-81fa-a175dc57d02e",
"name": "Update Items",
"type": "@n8n/n8n-nodes-langchain.mcpClient",
"maxTries": 3,
"position": [
2736,
2688
],
"parameters": {
"tool": {
"__rl": true,
"mode": "list",
"value": "data_cms_tool"
},
"options": {
"timeout": 60000
},
"inputMode": "json",
"jsonInput": "={\n \"actions\": [{\n \"update_collection_items\": {\n \"collection_id\": \"{{ $json.collectionId }}\",\n \"request\": {\n \"items\": {{ JSON.stringify($json.items) }}\n }\n }\n }]\n}",
"endpointUrl": "https://mcp.webflow.com/mcp"
},
"retryOnFail": true,
"typeVersion": 1,
"continueOnFail": true,
"waitBetweenTries": 5000
},
{
"id": "d0912e99-4dfc-423f-b086-f54462c67ffe",
"name": "Publish Items",
"type": "@n8n/n8n-nodes-langchain.mcpClient",
"maxTries": 3,
"position": [
2960,
2688
],
"parameters": {
"tool": {
"__rl": true,
"mode": "list",
"value": "data_cms_tool"
},
"options": {},
"inputMode": "json",
"jsonInput": "={\n \"actions\": [{\n \"publish_collection_items\": {\n \"collection_id\": \"{{ $('Format for Update').item.json.collectionId }}\",\n \"request\": {\n \"itemIds\": {{ JSON.stringify($('Format for Update').item.json.itemIds) }}\n }\n }\n }]\n}",
"endpointUrl": "https://mcp.webflow.com/mcp"
},
"retryOnFail": true,
"typeVersion": 1,
"continueOnFail": true,
"waitBetweenTries": 5000
},
{
"id": "0b465118-b2e6-4447-bf1b-37960c70cb6f",
"name": "Structured Output Parser",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
2144,
2912
],
"parameters": {
"autoFix": true,
"schemaType": "manual",
"inputSchema": "[\n {\n \"id\": \"string\",\n \"needsUpdate\": true,\n \"status\": \"string\",\n \"updates\": {\n \"name\": \"string\",\n \"project-summary\": \"string\"\n },\n \"audit\": {\n \"charCount_name\": 0,\n \"charCount_summary\": 0,\n \"wordCount_services\": 0\n },\n \"issues\": [\"string\"]\n }\n]"
},
"typeVersion": 1.3
},
{
"id": "169f8777-4974-4964-9c4f-6d718b3c4eb0",
"name": "Parser Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
"position": [
2224,
3120
],
"parameters": {
"model": "openai/gpt-4o-mini",
"options": {}
},
"credentials": {
"openRouterApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "e197a0aa-75c6-4228-8879-8e88c3a4df78",
"name": "Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
"position": [
1888,
2912
],
"parameters": {
"model": "openai/gpt-4o-mini",
"options": {}
},
"credentials": {
"openRouterApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "91504172-c37d-42bf-a6cd-004b273f18c0",
"name": "Simple Memory",
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"position": [
2016,
2912
],
"parameters": {
"sessionKey": "={{ $('Set Fields').item.json.collectionId }}",
"sessionIdType": "customKey"
},
"typeVersion": 1.3
},
{
"id": "820b8fd3-9dad-45e2-b198-4ebd05e2a59a",
"name": "Save Summary",
"type": "n8n-nodes-base.googleSheets",
"position": [
3408,
2688
],
"parameters": {
"columns": {
"value": {
"itemIds": "={{ $json.itemIds }}",
"Timestamp": "={{ $json.timestamp }}",
"postNames": "={{ $json.postNames }}",
"Collection ID": "={{ $json.collectionId }}",
"Items Updated": "={{ $json.itemsUpdated }}",
"itemsPublished": "={{ $json.itemsPublished }}"
},
"schema": [
{
"id": "Timestamp",
"type": "string",
"display": true,
"required": false,
"displayName": "Timestamp",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Collection ID",
"type": "string",
"display": true,
"required": false,
"displayName": "Collection ID",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Items Updated",
"type": "string",
"display": true,
"required": false,
"displayName": "Items Updated",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "itemsPublished",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "itemsPublished",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "postNames",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "postNames",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "itemIds",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "itemIds",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "id",
"value": 2109721884
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "xxxxxxx"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "01aa9a8a-83c8-4fe0-a863-ead528c8b2a4",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
208,
2304
],
"parameters": {
"width": 512,
"height": 1744,
"content": "# \ud83d\ude80 Webflow CMS SEO Bulk Optimizer\nThis workflow optimizes SEO metadata for Webflow CMS collections using AI.\n\n**What it does:**\n- Fetches CMS items from your Webflow collection\n- Analyzes titles and descriptions against SEO best practices\n- Optimizes length (titles: 50-60 chars, summaries: 120-155 chars)\n- Checks for missing alt text and content structure\n- Updates and publishes items back to Webflow\n- Logs all changes to Google Sheets\n\n**Requirements:**\n- Webflow MCP OAuth2 credentials\n- OpenRouter or any other LLM API key \n- Google Sheets or similar\n- Your Webflow collection ID\n\n**Before running:**\nIf your collection has different field names:\n1. **Agent system prompt**: Replace \"name\" and \"project-summary\" with your field names\n2. **Structured Output Parser schema**: Update field names in JSON schema\n3. **Format for Update code**: Change field names \n\n**Common field names (Webflow default collections):**\n- Posts: name, post-summary, post-body\n- Products: name, description, short-description\n- Projects: name, project-summary, services-rendered\n\n## Webflow MCP Config\n\n**Create credentials:**\n- Select MCP OAuth2 API\n- Set **Server URL** to https://mcp.webflow.com/mcp\n- Click Save and authorize access to your Webflow workspaces and sites\n\n**Configure MCP Client nodes:**\n- Set MCP Endpoint URL to https://mcp.webflow.com/mcp\n- Select **data_cms_tool** (for CMS operations). For other operations, select the appropriate tool.\n- **Actions** and **Context** depend on the tool and your use case\u2014see examples in the workflow nodes.\n\n### MCP Webflow node errors i've encountered\n\n**Authentication:**\n- Credential type: MCP OAuth2 API\n- Server URL: https://mcp.webflow.com/mcp\n- Must authorize Webflow workspaces after saving\n\n**Common errors:**\n\n**404 - Resource not found**\n\u2192 Wrong collection ID. Get from Webflow CMS URL.\n\n**400 - Bad Request**\n\u2192 Check JSON structure has \"request\" wrapper\n\u2192 Remove null values from fieldData\n\u2192 Verify parameter names (itemIds not itemIDs)\n\n**400 - Invalid input for 'actions'**\n\u2192 Missing \"request\" object inside action\n\u2192 Wrong JSON structure\n\n**Items not updating:**\n\u2192 Field names don't match collection schema\n\u2192 Use exact field names from Webflow (case-sensitive, with hyphens)\n\n**Nothing publishes:**\n\u2192 Using \"itemIDs\" instead of \"itemIds\"\n\u2192 Collection ID mismatch between Update and Publish\n\n**Verify setup:**\n1. Check collection ID matches in Set Fields AND Format for Update\n2. Test field names: view Fetch CMS Items output\n3. Run with 1 item first before scaling"
},
"typeVersion": 1
},
{
"id": "34c6c61a-b2a8-49d6-9353-dfda7fc12ebf",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
1152,
2256
],
"parameters": {
"color": 7,
"width": 224,
"height": 560,
"content": "#### Start Here: Configure Your Collection\nUpdate these values for your Webflow collection:\n- **collectionId**: Get from Webflow CMS URL (required)\n- **batchSize**: 5-20 items per batch (5 = slower/safer, 20 = faster)\n- **Title limits**: 50-60 chars (SEO standard)\n- **Summary limits**: 120-155 chars (meta description standard)\n\nLater on, you may increase the values to optimise like url slug, post body, alt-text,etc"
},
"typeVersion": 1
},
{
"id": "6b984edd-da56-4374-95f9-43e968ecd278",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
1872,
2288
],
"parameters": {
"color": 7,
"width": 480,
"height": 528,
"content": "#### AI Agent: Customize for Your Fields\n\n**Current setup optimizes:**\n- `name` \u2192 50-60 character titles\n- `project-summary` \u2192 120-155 character descriptions\n\n**If your collection uses different field names:**\n1. Update system prompt (replace \"name\" and \"project-summary\", etc)\n2. Update Structured Output Parser schema\n3. Update Format for Update code (lines 9-10)\n\n**Common Webflow field names:**\n- Blog: name, post-summary, post-body\n- Products: name, description, short-description\n- Portfolio: name, project-summary, project-details"
},
"typeVersion": 1
},
{
"id": "dbee186d-7a77-4d2d-8194-0f50a1fb77fb",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
2464,
2384
],
"parameters": {
"color": 7,
"width": 224,
"height": 464,
"content": "#### Update Collection ID\n\n**Line 23 in this code node MUST match your collection ID.**\n\n**Also update if using different field names:**\n- Line 9: `fieldData.name` \u2192 your title field\n- Line 10: `fieldData['project-summary']` \u2192 your description field"
},
"typeVersion": 1
},
{
"id": "c38935a9-e019-4bfd-9fee-2b9965134cbe",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
3360,
2864
],
"parameters": {
"color": 7,
"width": 208,
"content": "#### Summary\n\nAll optimizations are logged to Google Sheets. This is optional, remove this node if you don't need it."
},
"typeVersion": 1
},
{
"id": "610d1216-388f-4fc2-8999-4ecbecd8c28e",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
1408,
2256
],
"parameters": {
"color": 7,
"width": 224,
"height": 560,
"content": "#### Fetch CMS Items\nRetrieves up to 100 items from your Webflow collection\n\n**Settings:**\n- **Endpoint URL**: https://mcp.webflow.com/mcp\n- **Tool**: data_cms_tool \n- **Action**: list_collection_items\n- **Context**: Brief description of what you're doing (NOT siteId)\n- **Authentication**: Remember to set up your credentials first. Instructions are on the yellow sticky note"
},
"typeVersion": 1
},
{
"id": "0fbeed20-3c26-4684-9df4-233e95bc0fd2",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
2704,
2304
],
"parameters": {
"color": 7,
"width": 224,
"height": 528,
"content": "#### Update Items\n\nUpdates fieldData for CMS items\n\n**settings:**\n- **Input Mode**: JSON (not parameters)\n- **Action**: update_collection_items\n- **Timeout**: 60000ms (1 minute for large batches)\n- **Authentication**: Remember to set up your credentials first. Instructions are on the yellow sticky note"
},
"typeVersion": 1
},
{
"id": "658eafc9-29fc-4159-8c9e-4c6307e9c094",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
2944,
2304
],
"parameters": {
"color": 7,
"width": 224,
"height": 528,
"content": "#### Publish Items\n\nPublishes updated items to live Webflow site\n\n**settings:**\n- **Input Mode**: JSON (not parameters)\n- **Action**: publish_collection_items\n- **Parameter name**: itemIds (case sensitive)\n- **Authentication**: Remember to set up your credentials first. Instructions are on the yellow sticky note\n\n"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"binaryMode": "separate",
"availableInMCP": false,
"executionOrder": "v1"
},
"versionId": "6b682a8f-c7bd-4ab3-807f-ec93299742e3",
"connections": {
"Chat Model": {
"ai_languageModel": [
[
{
"node": "SEO Analysis Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Set Fields": {
"main": [
[
{
"node": "Fetch CMS Items",
"type": "main",
"index": 0
}
]
]
},
"Parser Model": {
"ai_languageModel": [
[
{
"node": "Structured Output Parser",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Update Items": {
"main": [
[
{
"node": "Publish Items",
"type": "main",
"index": 0
}
],
[]
]
},
"Publish Items": {
"main": [
[
{
"node": "Track Metrics",
"type": "main",
"index": 0
}
]
]
},
"Simple Memory": {
"ai_memory": [
[
{
"node": "SEO Analysis Agent",
"type": "ai_memory",
"index": 0
}
]
]
},
"Track Metrics": {
"main": [
[
{
"node": "Save Summary",
"type": "main",
"index": 0
}
]
]
},
"Manual Trigger": {
"main": [
[
{
"node": "Set Fields",
"type": "main",
"index": 0
}
]
]
},
"Fetch CMS Items": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Items": {
"main": [
[],
[
{
"node": "SEO Analysis Agent",
"type": "main",
"index": 0
}
]
]
},
"Format for Update": {
"main": [
[
{
"node": "Update Items",
"type": "main",
"index": 0
}
]
]
},
"SEO Analysis Agent": {
"main": [
[
{
"node": "Format for Update",
"type": "main",
"index": 0
}
]
]
},
"Structured Output Parser": {
"ai_outputParser": [
[
{
"node": "SEO Analysis Agent",
"type": "ai_outputParser",
"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.
googleSheetsOAuth2ApiopenRouterApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Marketing teams, content creators, and agencies managing Webflow CMS sites who need to optimize SEO metadata at scale.
Source: https://n8n.io/workflows/13315/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
This workflow contains community nodes that are only compatible with the self-hosted version of n8n.
The Shopify AI Product Description Factory is a production-grade n8n workflow that converts product images and metadata into refined, SEO-aware descriptions—fully automated and region-agnostic. It ble
This workflow automates the process of recording financial transactions from photos of receipts or shopping receipts. Users simply send an image of the receipt via Telegram. The image is processed usi
The AI-Powered Shopify SEO Content Automation is an enterprise-grade workflow that transforms product content creation for e-commerce stores. This sophisticated multi-agent system integrates GPT-4o, C
Who is this for? Agencies, consultants, and service providers who conduct discovery calls and need to quickly turn conversations into professional proposals.