{ "nodes": [ { "id": "1205b121-8aaa-4e41-874b-4e81aad6374e", "name": "Sticky Note", "type": "n8n-nodes-base.stickyNote", "position": [ 120, 600 ], "parameters": { "color": 4, "width": 462.4041757955455, "height": 315.6388466176832, "content": "## SEO seed keywords\n\nSupply a complete ideal customer profile. One model request produces 15–20 keyword ideas, returned as a validated keywords array. Review these ideas with your SEO data; this workflow does not measure search volume or difficulty." }, "typeVersion": 1 }, { "id": "d2654d75-2b64-4ec3-b583-57d2b6b7b195", "name": "Sticky Note13", "type": "n8n-nodes-base.stickyNote", "disabled": true, "position": [ 640, 920 ], "parameters": { "color": 7, "width": 287.0816455493243, "height": 330.47923074942287, "content": "**Generate draft seed KW based on ICP**\n\n" }, "typeVersion": 1 }, { "id": "d248a58e-3705-4b6f-99cb-e9187e56781c", "name": "Anthropic Chat Model", "type": "@n8n/n8n-nodes-langchain.lmChatAnthropic", "position": [ 680, 1120 ], "parameters": { "model": { "__rl": true, "mode": "id", "value": "claude-sonnet-4-6" }, "options": { "maxTokensToSample": 4096 } }, "typeVersion": 1.3 }, { "id": "71517d83-59f5-441a-8a75-c35f4e06a8a2", "name": "Validate Keyword List", "type": "n8n-nodes-base.code", "position": [ 980, 980 ], "parameters": { "mode": "runOnceForAllItems", "jsCode": "const readKeywords = function readKeywords({ text }) {\n let parsed;\n try { parsed = JSON.parse(text); } catch { throw new Error('The model did not return keyword JSON.'); }\n if (!Array.isArray(parsed?.answer) || parsed.answer.length < 15 || parsed.answer.length > 20 || parsed.answer.some((keyword) => typeof keyword !== 'string' || !keyword.trim())) throw new Error('Expected 15–20 nonempty seed keywords in answer.');\n return { keywords: parsed.answer.map((keyword) => keyword.trim().toLowerCase()) };\n}\n\nreturn $input.all().map((item,index)=>({json:readKeywords({text:item.json.text}),pairedItem:{item:index}}));\n" }, "typeVersion": 2 }, { "id": "1c68eff5-6478-4eba-9abe-3ccea2a17a5c", "name": "Sticky Note12", "type": "n8n-nodes-base.stickyNote", "disabled": true, "position": [ 120, 920 ], "parameters": { "color": 7, "width": 492.16246201447336, "height": 213.62075341687063, "content": "## Supply the complete ideal customer profile" }, "typeVersion": 1 }, { "id": "53dcc524-ef3d-40b8-b79d-976517dce4e7", "name": "Sticky Note17", "type": "n8n-nodes-base.stickyNote", "disabled": true, "position": [ 960, 920 ], "parameters": { "color": 7, "width": 348.42891651921957, "height": 213.62075341687063, "content": "## Return keyword ideas" }, "typeVersion": 1 }, { "id": "570495fe-3f1d-44ae-bea0-9fa4b2ce15ef", "name": "Sticky Note11", "type": "n8n-nodes-base.stickyNote", "position": [ 640, 820 ], "parameters": { "color": 6, "width": 393.46745700785266, "height": 80, "content": "## Model account\n\nConnect the Anthropic Chat Model and select a model available to your account. This template selects claude-sonnet-4-6 with a 4096-token generation budget. Cost depends on your selected model and usage." }, "typeVersion": 1 }, { "id": "6e5e84c5-409f-4f37-931a-21a44aff7c5e", "name": "Set Ideal Customer Profile (ICP)", "type": "n8n-nodes-base.set", "position": [ 160, 980 ], "parameters": { "assignments": { "assignments": [ { "id": "profile-product", "name": "product", "type": "string", "value": "Workflow automation software for small service teams" }, { "id": "profile-pain_points", "name": "pain_points", "type": "string", "value": "Manual handoffs and repeated data entry" }, { "id": "profile-goals", "name": "goals", "type": "string", "value": "Reduce admin work and improve response times" }, { "id": "profile-current_solutions", "name": "current_solutions", "type": "string", "value": "Spreadsheets and email" }, { "id": "profile-expertise_level", "name": "expertise_level", "type": "string", "value": "Business users with limited coding experience" } ] }, "options": {} }, "notesInFlow": true, "typeVersion": 3.4 }, { "id": "bd5781f4-6f35-45d3-8182-12ea6712eddf", "name": "Prepare Complete Profile", "type": "n8n-nodes-base.code", "position": [ 380, 980 ], "parameters": { "mode": "runOnceForAllItems", "jsCode": "const prepare = function prepareProfile(inputs) {\n const profile = {};\n for (const name of ['product', 'pain_points', 'goals', 'current_solutions', 'expertise_level']) {\n if (typeof inputs[name] !== 'string' || !inputs[name].trim()) throw new Error('Provide the ideal customer profile field: ' + name);\n profile[name] = inputs[name].trim();\n }\n return { icp: JSON.stringify(profile, null, 2) };\n}\n\nreturn $input.all().map((item,index)=>({json:prepare(item.json),pairedItem:{item:index}}));\n" }, "notesInFlow": true, "typeVersion": 2 }, { "id": "244943bf-e4dd-40fc-9a43-7a5cd0da1c5b", "name": "Sticky Note14", "type": "n8n-nodes-base.stickyNote", "position": [ 640, 1260 ], "parameters": { "color": 3, "width": 284.87764467541297, "height": 80, "content": "**REQUIRED**\nConnect to your own AI API above" }, "typeVersion": 1 }, { "id": "73c8f47a-4fdb-40c8-9062-890ef1265ab0", "name": "Sticky Note16", "type": "n8n-nodes-base.stickyNote", "position": [ 120, 1140 ], "parameters": { "color": 3, "width": 284.87764467541297, "height": 80, "content": "**REQUIRED**\nSet your Ideal Customer Profile before proceeding" }, "typeVersion": 1 }, { "id": "a5b93e6d-44ab-4b6f-b86a-25dc621b52b0", "name": "Generate Seed Keywords", "type": "@n8n/n8n-nodes-langchain.chainLlm", "position": [ 660, 980 ], "parameters": { "promptType": "define", "text": "=Analyze the complete ideal customer profile below. Generate 15–20 relevant seed keywords reflecting customer needs, challenges, goals, and search behavior. Use head terms broad enough for an SEO foundation and specific enough to reach this customer. Include product, problem, solution, industry, technology, and integration topics when relevant. Cover awareness, consideration, and decision stages, with informational, navigational, commercial, and transactional intents. Suggest a mix of competitive and less competitive terms, and consider emerging industry needs when relevant. Avoid overly generic terms. Consider industry terminology and location only when supported by the profile. Use lowercase without punctuation and trim surrounding whitespace.\n\nIdeal customer profile:\n{{ $json.icp }}\n\nReturn only JSON with this structure: {\"answer\":[\"first keyword\",\"second keyword\"]}. Include 15–20 strings and no analysis text.", "messages": { "messageValues": [ { "type": "SystemMessagePromptTemplate", "message": "You are an expert SEO strategist tasked with generating 15–20 head search terms (seed keywords) for a B2B SaaS company. Create keywords relevant to the ideal customer profile." } ] }, "batching": { "batchSize": 1 } }, "typeVersion": 1.7 }, { "id": "ca3c0bd5-7ef0-4e2b-9b5e-071773c32c85", "name": "Keyword result", "type": "n8n-nodes-base.noOp", "position": [ 1140, 980 ], "parameters": {}, "typeVersion": 1 }, { "id": "94639a81-5e46-482a-851a-5443bfe9863c", "name": "Sticky Note15", "type": "n8n-nodes-base.stickyNote", "position": [ 1120, 1140 ], "parameters": { "color": 3, "width": 284.87764467541297, "height": 80, "content": "## Result\n\nKeyword result contains a validated keywords array. This template does not write to an external database. Connect a destination if you need one." }, "typeVersion": 1 }, { "id": "16498e92-c0d5-44f4-b993-c9c8930955bc", "name": "When clicking ‘Test workflow’", "type": "n8n-nodes-base.manualTrigger", "position": [ -60, 980 ], "parameters": {}, "typeVersion": 1 } ], "pinData": {}, "connections": { "Anthropic Chat Model": { "ai_languageModel": [ [ { "node": "Generate Seed Keywords", "type": "ai_languageModel", "index": 0 } ] ] }, "Set Ideal Customer Profile (ICP)": { "main": [ [ { "node": "Prepare Complete Profile", "type": "main", "index": 0 } ] ] }, "When clicking ‘Test workflow’": { "main": [ [ { "node": "Set Ideal Customer Profile (ICP)", "type": "main", "index": 0 } ] ] }, "Prepare Complete Profile": { "main": [ [ { "node": "Generate Seed Keywords", "type": "main", "index": 0 } ] ] }, "Generate Seed Keywords": { "main": [ [ { "node": "Validate Keyword List", "type": "main", "index": 0 } ] ] }, "Validate Keyword List": { "main": [ [ { "node": "Keyword result", "type": "main", "index": 0 } ] ] } }, "active": false }