This workflow corresponds to n8n.io template #16162 — we link there as the canonical source.
This workflow follows the Form Trigger → Google Drive 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": "AyVRmEReRsdNMIvi",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Sycorda Blog Generator UP",
"tags": [],
"nodes": [
{
"id": "b30d716d-a43c-4a0a-ac1a-b5115cb6a7d5",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
4400,
2320
],
"parameters": {
"width": 440,
"height": 520,
"content": "## Sycorda Content Generator\n\n### How it works\n1. Submit a blog brief through the form (title, keywords, links, word count).\n2. Claude drafts an outline, then writes each section with full context and stitches the article together.\n3. The outline and article are saved as formatted Google Docs, the article is categorized, published to Contentful, logged back to Sheets, and announced in Slack.\n\n### Setup\n- [ ] Add your Anthropic API key (header auth) to all three Claude HTTP nodes.\n- [ ] Connect the Google Sheets and Google Drive OAuth2 credentials.\n- [ ] Replace the Contentful space ID, Google Sheet ID, and Slack channel ID placeholders.\n- [ ] Connect Contentful and Slack credentials.\n\n### Customize (optional)\n- Adjust tone, keyword density, or per-section formatting in **Build Section Request**.\n- Swap the Claude model or temperature in the request-builder nodes."
},
"typeVersion": 1
},
{
"id": "73362132-d152-4314-ae2a-3af3c39fca16",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
4880,
2512
],
"parameters": {
"color": 7,
"width": 808,
"height": 260,
"content": "## 1. Intake\n\nCollects the blog brief from a form and logs it to Google Sheets."
},
"typeVersion": 1
},
{
"id": "c979e711-b1b1-4c25-98dc-d9297c3a25d6",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
5680,
2512
],
"parameters": {
"color": 7,
"width": 824,
"height": 260,
"content": "## 2. Generate Outline\n\nClaude turns the brief into a markdown outline of section headings."
},
"typeVersion": 1
},
{
"id": "a6f4c186-cd9d-4714-a65e-6f6924977908",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
6496,
2512
],
"parameters": {
"color": 7,
"width": 1352,
"height": 260,
"content": "## 3. Save Outline to Docs\n\nCreates a Drive folder and saves the outline as a formatted Google Doc."
},
"typeVersion": 1
},
{
"id": "ff52d28c-4a19-4db2-ad74-c1db00858f32",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
7840,
2512
],
"parameters": {
"color": 7,
"width": 1368,
"height": 260,
"content": "## 4. Write Sections with AI\n\nSplits the outline and has Claude write each section, then aggregates them."
},
"typeVersion": 1
},
{
"id": "d66116d7-73f9-4a07-9f09-b4ab47d11b44",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
9200,
2512
],
"parameters": {
"color": 7,
"width": 1352,
"height": 260,
"content": "## 5. Assemble & Save Article\n\nStitches the sections into a full article and saves it as a Google Doc."
},
"typeVersion": 1
},
{
"id": "be2435c4-ba31-4604-a466-c6cd133cc50f",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
10544,
2512
],
"parameters": {
"color": 7,
"width": 824,
"height": 260,
"content": "## 6. Categorize\n\nClaude reads the article and returns a single best category."
},
"typeVersion": 1
},
{
"id": "a340c338-0993-4151-a433-dea7d6007b4d",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
11360,
2512
],
"parameters": {
"color": 7,
"width": 1624,
"height": 260,
"content": "## 7. Publish & Notify\n\nConverts to rich text, creates a Contentful entry, writes the links back to Sheets, and posts to Slack."
},
"typeVersion": 1
},
{
"id": "878aab7a-d11a-41e5-afb7-30202b6a4fcc",
"name": "Sticky Note8",
"type": "n8n-nodes-base.stickyNote",
"position": [
5968,
2272
],
"parameters": {
"color": 3,
"width": 320,
"height": 190,
"content": "## Anthropic API key required\n\nAll three Claude calls use header auth. Add your Anthropic API key, **Claude - Categorize** currently has no credential attached and will fail."
},
"typeVersion": 1
},
{
"id": "9467ff99-9dd7-45d5-80c7-61962786c6ad",
"name": "Sticky Note9",
"type": "n8n-nodes-base.stickyNote",
"position": [
11888,
2256
],
"parameters": {
"color": 3,
"width": 340,
"height": 200,
"content": "## Replace placeholders\n\nSet the Contentful space ID, Google Sheet ID, and Slack channel ID, and connect the Contentful + Slack credentials before running."
},
"typeVersion": 1
},
{
"id": "c23ad3fd-402d-4204-bf66-2d683b5e0bb6",
"name": "Form Trigger1",
"type": "n8n-nodes-base.formTrigger",
"position": [
4928,
2608
],
"parameters": {
"options": {},
"formTitle": "Sycorda Content Generator",
"formFields": {
"values": [
{
"fieldLabel": "Article Title",
"requiredField": true
},
{
"fieldType": "number",
"fieldLabel": "Target Word Count",
"placeholder": "e.g. 1500"
},
{
"fieldLabel": "Primary Keyword",
"requiredField": true
},
{
"fieldLabel": "Secondary Keywords",
"placeholder": "comma separated"
},
{
"fieldType": "textarea",
"fieldLabel": "Internal Links",
"placeholder": "comma separated URLs"
},
{
"fieldType": "textarea",
"fieldLabel": "External Links",
"placeholder": "comma separated URLs"
},
{
"fieldType": "textarea",
"fieldLabel": "Additional Instructions"
}
]
},
"formDescription": "Submit a blog brief. The AI builds an outline, writes each section with full context, and saves formatted Google Docs."
},
"typeVersion": 2.2
},
{
"id": "a62ab11b-da48-4d67-bfb0-95f01531b451",
"name": "Build Brief1",
"type": "n8n-nodes-base.set",
"position": [
5200,
2608
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "f1",
"name": "title",
"type": "string",
"value": "={{ $json['Article Title'] }}"
},
{
"id": "f2",
"name": "wordCount",
"type": "string",
"value": "={{ $json['Target Word Count'] }}"
},
{
"id": "f3",
"name": "primaryKeyword",
"type": "string",
"value": "={{ $json['Primary Keyword'] }}"
},
{
"id": "f4",
"name": "secondaryKeywords",
"type": "string",
"value": "={{ $json['Secondary Keywords'] }}"
},
{
"id": "f5",
"name": "internalLinks",
"type": "string",
"value": "={{ $json['Internal Links'] }}"
},
{
"id": "f6",
"name": "externalLinks",
"type": "string",
"value": "={{ $json['External Links'] }}"
},
{
"id": "f7",
"name": "additionalInstructions",
"type": "string",
"value": "={{ $json['Additional Instructions'] }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "f7ef840f-5d1f-4e13-b6d1-f9586f976fe3",
"name": "Log Brief to Sheet1",
"type": "n8n-nodes-base.googleSheets",
"position": [
5456,
2608
],
"parameters": {
"columns": {
"value": {
"Title": "={{ $json.title }}",
"Word Count": "={{ $json.wordCount }}",
"external Links": "={{ $json.externalLinks }}",
"internal Links": "={{ $json.internalLinks }}",
"Primary Keyword": "={{ $json.primaryKeyword }}",
"secondary keywords": "={{ $json.secondaryKeywords }}",
"additional Instructions": "={{ $json.additionalInstructions }}"
},
"schema": [
{
"id": "Title",
"type": "string",
"display": true,
"required": false,
"displayName": "Title",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Word Count",
"type": "string",
"display": true,
"required": false,
"displayName": "Word Count",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Primary Keyword",
"type": "string",
"display": true,
"required": false,
"displayName": "Primary Keyword",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "secondary keywords",
"type": "string",
"display": true,
"required": false,
"displayName": "secondary keywords",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "internal Links",
"type": "string",
"display": true,
"required": false,
"displayName": "internal Links",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "external Links",
"type": "string",
"display": true,
"required": false,
"displayName": "external Links",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "additional Instructions",
"type": "string",
"display": true,
"required": false,
"displayName": "additional Instructions",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1d9PgVtdaCirRwNJqqs96DxRg8_2nQkO873p7YVTSDyk/edit#gid=0",
"cachedResultName": "Main"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1d9PgVtdaCirRwNJqqs96DxRg8_2nQkO873p7YVTSDyk",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1d9PgVtdaCirRwNJqqs96DxRg8_2nQkO873p7YVTSDyk/edit?usp=drivesdk",
"cachedResultName": "SEO Content Genrator"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.5
},
{
"id": "5216abf0-041c-4ffa-8f5b-35a023cc751e",
"name": "Build Outline Request1",
"type": "n8n-nodes-base.code",
"position": [
5728,
2608
],
"parameters": {
"jsCode": "const b = $('Build Brief1').first().json;\nconst brief = JSON.stringify({ title: b.title, word_count: b.wordCount, primary_keyword: b.primaryKeyword, secondary_keywords: b.secondaryKeywords, internal_links: b.internalLinks, external_links: b.externalLinks, additional_instructions: b.additionalInstructions });\nconst user = `Use the following JSON brief to write an engaging, comprehensive article OUTLINE in markdown format (ATX headings). Tone of voice: 50% Spartan and casual.\\n\\nRules:\\n- Start with a written-out introduction: 2 to 4 short sentences, NO heading.\\n- Then list the section headings for the rest of the article, each as a '## ' H2 line.\\n- Do NOT write the body content yet. Only the intro paragraph and the ## headings.\\n- End with a '## Conclusion' heading.\\n- Never use em dashes or en dashes. Use commas or periods.\\n\\nExample brief: {\"title\":\"Cold Email Mastery\",\"primary_keyword\":\"cold email\"}\\nExample outline:\\nCold email still works in 2026. Most people just do it wrong. Here is how to actually get replies.\\n\\n## Why Cold Email Still Beats Paid Ads\\n## The Anatomy Of A Reply-Worthy Email\\n## Subject Lines That Earn The Open\\n## Follow Ups Without Being Annoying\\n## Conclusion\\n\\nNow do the same for this brief:\\n${brief}`;\nreturn [{ json: { body: { model: 'claude-sonnet-4-6', max_tokens: 2048, temperature: 1, system: 'You are a helpful, intelligent writing assistant.', messages: [{ role: 'user', content: user }] } } }];"
},
"typeVersion": 2
},
{
"id": "85de3d8a-01db-474d-b491-7d175bfa9b8d",
"name": "Claude - Outline1",
"type": "n8n-nodes-base.httpRequest",
"position": [
6000,
2608
],
"parameters": {
"url": "https://api.anthropic.com/v1/messages",
"method": "POST",
"options": {},
"jsonBody": "={{ JSON.stringify($json.body) }}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"headerParameters": {
"parameters": [
{
"name": "anthropic-version",
"value": "2023-06-01"
},
{
"name": "content-type",
"value": "application/json"
}
]
}
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "d5c26269-b700-4c51-ab76-2c201cc4a6c0",
"name": "Parse Outline1",
"type": "n8n-nodes-base.code",
"position": [
6272,
2608
],
"parameters": {
"jsCode": "let t = ($json.content[0].text)||'';\nt = t.replace(/\\s*[\u2014\u2013]\\s*/g, ', ').replace(/,\\s*,/g, ',');\nreturn [{ json: { outline: t.trim() } }];"
},
"typeVersion": 2
},
{
"id": "0626eaa0-290b-4a87-883c-8f7eb794d487",
"name": "Create Drive Folder1",
"type": "n8n-nodes-base.googleDrive",
"position": [
6544,
2608
],
"parameters": {
"name": "={{ $('Build Brief1').first().json.title }}",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive",
"cachedResultName": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "list",
"value": "1Vz0HVW6kczz0gw6wP3vAUY_XA1Hmtjgd",
"cachedResultUrl": "https://drive.google.com/drive/folders/1Vz0HVW6kczz0gw6wP3vAUY_XA1Hmtjgd",
"cachedResultName": "SEO Content Generator"
},
"resource": "folder"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "b9667dfc-7495-4a7d-aade-5343e1e9a492",
"name": "Markdown to HTML (Outline)1",
"type": "n8n-nodes-base.markdown",
"position": [
6816,
2608
],
"parameters": {
"mode": "markdownToHtml",
"options": {},
"markdown": "={{ $('Parse Outline1').first().json.outline }}"
},
"typeVersion": 1
},
{
"id": "d7bc91a8-7919-4834-9cfd-d33bdce4fe69",
"name": "Create Outline Doc1",
"type": "n8n-nodes-base.googleDrive",
"position": [
7088,
2608
],
"parameters": {
"name": "=O: {{ $('Build Brief1').first().json.title }}",
"content": "placeholder",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive",
"cachedResultName": "My Drive"
},
"options": {
"convertToGoogleDocument": true
},
"folderId": {
"__rl": true,
"mode": "id",
"value": "={{ $('Create Drive Folder1').first().json.id }}"
},
"operation": "createFromText"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "44d669b2-f815-47db-9c11-7ef1a75b3a76",
"name": "Build Outline HTML1",
"type": "n8n-nodes-base.code",
"position": [
7360,
2608
],
"parameters": {
"jsCode": "const html = $('Markdown to HTML (Outline)1').first().json.data || '';\nconst fullHtml = '<html><body>' + html + '</body></html>';\nconst fileId = $('Create Outline Doc1').first().json.id;\nreturn [{ json: { fileId }, binary: { file: { data: Buffer.from(fullHtml).toString('base64'), mimeType: 'text/html', fileName: 'outline.html' } } }];"
},
"typeVersion": 2
},
{
"id": "25221587-eb9e-4dc7-823a-1b2c827fe25d",
"name": "Update Outline Doc1",
"type": "n8n-nodes-base.googleDrive",
"maxTries": 3,
"position": [
7616,
2608
],
"parameters": {
"fileId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.fileId }}"
},
"options": {
"fields": [
"webViewLink",
"id"
]
},
"operation": "update",
"changeFileContent": true,
"inputDataFieldName": "file"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"retryOnFail": true,
"typeVersion": 3,
"waitBetweenTries": 3000
},
{
"id": "b01102ba-8dc7-49b5-af50-5c56f26a8a59",
"name": "Split Into Sections1",
"type": "n8n-nodes-base.code",
"position": [
7888,
2608
],
"parameters": {
"jsCode": "const outline = $('Parse Outline1').first().json.outline || '';\nconst lines = outline.split('\\n');\nconst items = [];\nlet idx = 0;\nfor (const line of lines) {\n if (line.trim().startsWith('##')) {\n const marked = lines.map(l => l === line ? (l + ' <--') : l).join('\\n');\n items.push({ json: { index: idx, sectionHeading: line.trim(), markedOutline: marked } });\n idx++;\n }\n}\nreturn items;"
},
"typeVersion": 2
},
{
"id": "b5169bde-9617-4dfb-b233-aae55b64f917",
"name": "Build Section Request1",
"type": "n8n-nodes-base.code",
"position": [
8160,
2608
],
"parameters": {
"jsCode": "const b = $('Build Brief1').first().json;\nreturn $input.all().map(it => {\n const s = it.json;\n // ~1 in 4 sections: ask for varied formatting (folded in from the video's 25% reformat router)\n const vary = (Math.floor(Math.random() * 4 + 1) === 3)\n ? '\\n- For variety, break this section up with a few bullet points and a sub-heading (### or ####).'\n : '';\n const user = `The following is an outline for an award winning article. Your task is to write ONE section and one section only: the section whose heading is marked by an arrow '<--'.\\n\\nRules:\\n- Write in ATX markdown. Keep the section's '## ' heading at the top (without the arrow).\\n- Tone of voice: 50% Spartan and casual. Engaging, detailed paragraphs.\\n- Naturally include these keywords where relevant: ${b.primaryKeyword}, ${b.secondaryKeywords}.\\n- Weave in these links as markdown links where they fit: ${b.internalLinks} ${b.externalLinks}.\\n- Write ONLY this one section. Do not write any other section. Never use em dashes or en dashes.${vary}\\n- Extra instructions: ${b.additionalInstructions}\\n\\nOutline:\\n${s.markedOutline}`;\n return { json: { body: { model: 'claude-sonnet-4-6', max_tokens: 4096, temperature: 1, system: 'You are a helpful, intelligent writing assistant.', messages: [{ role: 'user', content: user }] } } };\n});"
},
"typeVersion": 2
},
{
"id": "01f886a7-fdc5-4559-bd19-5bd7c5f90e3b",
"name": "Claude - Write Section1",
"type": "n8n-nodes-base.httpRequest",
"position": [
8432,
2608
],
"parameters": {
"url": "https://api.anthropic.com/v1/messages",
"method": "POST",
"options": {},
"jsonBody": "={{ JSON.stringify($json.body) }}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"headerParameters": {
"parameters": [
{
"name": "anthropic-version",
"value": "2023-06-01"
},
{
"name": "content-type",
"value": "application/json"
}
]
}
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "a7f979ac-525b-473d-9a80-353dedb8f17c",
"name": "Parse Section1",
"type": "n8n-nodes-base.code",
"position": [
8704,
2608
],
"parameters": {
"jsCode": "return $input.all().map(it => {\n let t = (it.json.content && it.json.content[0] ? it.json.content[0].text : '') || '';\n t = t.replace(/```[a-z]*\\n?/gi, '').replace(/```/g, '');\n t = t.replace(/\\s*[\u2014\u2013]\\s*/g, ', ').replace(/,\\s*,/g, ',');\n t = t.trim();\n return { json: { sectionText: t } };\n});"
},
"typeVersion": 2
},
{
"id": "b0f36655-4ac1-4edc-91d1-e3e91ea2112f",
"name": "Aggregate Sections1",
"type": "n8n-nodes-base.aggregate",
"position": [
8976,
2608
],
"parameters": {
"options": {},
"fieldsToAggregate": {
"fieldToAggregate": [
{
"renameField": true,
"outputFieldName": "sections",
"fieldToAggregate": "sectionText"
}
]
}
},
"typeVersion": 1
},
{
"id": "3d312305-e44f-4633-b9af-650ada580ad7",
"name": "Assemble Article1",
"type": "n8n-nodes-base.code",
"position": [
9248,
2608
],
"parameters": {
"jsCode": "const title = $('Build Brief1').first().json.title || 'Untitled';\nconst outline = $('Parse Outline1').first().json.outline || '';\nconst intro = outline.split(/\\n##\\s/)[0].trim();\nconst sections = $('Aggregate Sections1').first().json.sections || [];\nconst body = Array.isArray(sections) ? sections.join('\\n\\n') : String(sections);\nlet t = '# ' + title + '\\n\\n' + intro + '\\n\\n' + body;\nt = t.replace(/\\s*[\u2014\u2013]\\s*/g, ', ').replace(/,\\s*,/g, ',');\nreturn [{ json: { article: t.trim() } }];"
},
"typeVersion": 2
},
{
"id": "564854ff-a931-427b-b957-54dcdfc33c2f",
"name": "Markdown to HTML (Article)1",
"type": "n8n-nodes-base.markdown",
"position": [
9520,
2608
],
"parameters": {
"mode": "markdownToHtml",
"options": {},
"markdown": "={{ $('Assemble Article1').first().json.article }}"
},
"typeVersion": 1
},
{
"id": "5c5649c4-9968-4605-801d-06b25ba0c8a3",
"name": "Create Article Doc1",
"type": "n8n-nodes-base.googleDrive",
"position": [
9776,
2608
],
"parameters": {
"name": "=A: {{ $('Build Brief1').first().json.title }}",
"content": "placeholder",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive",
"cachedResultName": "My Drive"
},
"options": {
"convertToGoogleDocument": true
},
"folderId": {
"__rl": true,
"mode": "id",
"value": "={{ $('Create Drive Folder1').first().json.id }}"
},
"operation": "createFromText"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "4138b8e4-42bb-4ca9-9b35-22b741706091",
"name": "Build Article HTML1",
"type": "n8n-nodes-base.code",
"position": [
10048,
2608
],
"parameters": {
"jsCode": "const html = $('Markdown to HTML (Article)1').first().json.data || '';\nconst fullHtml = '<html><body>' + html + '</body></html>';\nconst fileId = $('Create Article Doc1').first().json.id;\nreturn [{ json: { fileId }, binary: { file: { data: Buffer.from(fullHtml).toString('base64'), mimeType: 'text/html', fileName: 'article.html' } } }];"
},
"typeVersion": 2
},
{
"id": "613f0dcf-08a1-41c7-b54b-57849dec802d",
"name": "Update Article Doc1",
"type": "n8n-nodes-base.googleDrive",
"maxTries": 3,
"position": [
10320,
2608
],
"parameters": {
"fileId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.fileId }}"
},
"options": {
"fields": [
"webViewLink",
"id"
]
},
"operation": "update",
"changeFileContent": true,
"inputDataFieldName": "file"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"retryOnFail": true,
"typeVersion": 3,
"waitBetweenTries": 3000
},
{
"id": "eea7bf07-d544-49c2-85bc-8223b62653d2",
"name": "Build Category Request1",
"type": "n8n-nodes-base.code",
"position": [
10592,
2608
],
"parameters": {
"jsCode": "const article = ($('Assemble Article1').first().json.article || '').slice(0, 3000);\nconst user = `Read this blog article and return the single best category for it, as 1 to 3 words. Return ONLY valid JSON, no markdown, no code fences: {\"category\": \"...\"}\\n\\nArticle:\\n${article}`;\nreturn [{ json: { body: { model: 'claude-sonnet-4-6', max_tokens: 60, temperature: 0, messages: [{ role: 'user', content: user }] } } }];"
},
"typeVersion": 2
},
{
"id": "464f9d0c-7f02-46af-84b1-c4021e1e0abb",
"name": "Claude - Categorize1",
"type": "n8n-nodes-base.httpRequest",
"position": [
10864,
2608
],
"parameters": {
"url": "https://api.anthropic.com/v1/messages",
"method": "POST",
"options": {},
"jsonBody": "={{ JSON.stringify($json.body) }}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"headerParameters": {
"parameters": [
{
"name": "anthropic-version",
"value": "2023-06-01"
},
{
"name": "content-type",
"value": "application/json"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "71f03363-7842-4531-be32-d697e467b236",
"name": "Parse Category1",
"type": "n8n-nodes-base.code",
"position": [
11136,
2608
],
"parameters": {
"jsCode": "let t = ($json.content[0].text || '').trim().replace(/```json/gi,'').replace(/```/g,'').trim();\nlet category = 'General';\ntry { category = JSON.parse(t).category || category; } catch (e) {}\nreturn [{ json: { category } }];"
},
"typeVersion": 2
},
{
"id": "3afa329f-83df-4075-8934-6818c200efb3",
"name": "Markdown to Rich Text (Cloud Fn)1",
"type": "n8n-nodes-base.httpRequest",
"position": [
11408,
2608
],
"parameters": {
"url": "https://us-central1-festive-bazaar-397323.cloudfunctions.net/contentful-markdown-to-rtf",
"method": "POST",
"options": {},
"jsonBody": "={ \"content\": {{ JSON.stringify($('Assemble Article1').first().json.article) }} }",
"sendBody": true,
"specifyBody": "json"
},
"typeVersion": 4.2
},
{
"id": "a30edd62-a252-433c-aadf-0c4a13574851",
"name": "Slugify Title1",
"type": "n8n-nodes-base.code",
"position": [
11696,
2608
],
"parameters": {
"jsCode": "const title = $('Build Brief1').first().json.title || '';\nconst slug = title.toLowerCase().replace(/[^a-z0-9]+/g,'-').replace(/(^-|-$)/g,'');\nreturn [{ json: { slug } }];"
},
"typeVersion": 2
},
{
"id": "a39dbd96-962a-4ff7-80f8-c6c3023b08fa",
"name": "Build Contentful Entry1",
"type": "n8n-nodes-base.code",
"position": [
11952,
2608
],
"parameters": {
"jsCode": "const L = 'en-US';\nreturn [{ json: { fields: {\n title: { [L]: $('Build Brief1').first().json.title },\n slug: { [L]: $('Slugify Title1').first().json.slug },\n content: { [L]: $('Markdown to Rich Text (Cloud Fn)1').first().json },\n category:{ [L]: $('Parse Category1').first().json.category },\n} } }];"
},
"typeVersion": 2
},
{
"id": "ef790c49-d6c5-4892-92fd-46409ac01a4c",
"name": "Contentful - Create Entry1",
"type": "n8n-nodes-base.httpRequest",
"position": [
12224,
2608
],
"parameters": {
"url": "https://api.contentful.com/spaces/CONTENTFUL_SPACE_ID_PLACEHOLDER/environments/master/entries",
"method": "POST",
"options": {},
"jsonBody": "={{ JSON.stringify($json) }}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"headerParameters": {
"parameters": [
{
"name": "X-Contentful-Content-Type",
"value": "blogPost"
},
{
"name": "Content-Type",
"value": "application/vnd.contentful.management.v1+json"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "28259204-d0ac-4ba3-b2ba-05305e45aaf9",
"name": "Write Links Back to Sheet1",
"type": "n8n-nodes-base.googleSheets",
"position": [
12496,
2608
],
"parameters": {
"columns": {
"value": {
"Title": "={{ $('Build Brief1').first().json.title }}",
"Blog URL": "=https://sycorda.com/blog/{{ $('Slugify Title1').first().json.slug }}",
"Article Doc": "={{ $('Update Article Doc1').first().json.webViewLink }}",
"Outline Doc": "={{ $('Update Outline Doc1').first().json.webViewLink }}"
},
"mappingMode": "defineBelow",
"matchingColumns": [
"Title"
]
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "Main",
"cachedResultName": "Main"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "GOOGLE_SHEET_ID_PLACEHOLDER"
}
},
"typeVersion": 4.5
},
{
"id": "937d6a14-89d4-424d-9233-64a4d0e9e388",
"name": "Notify Slack1",
"type": "n8n-nodes-base.slack",
"position": [
12768,
2608
],
"parameters": {
"select": "channel",
"blocksUi": "{\n \"blocks\": [\n { \"type\": \"header\", \"text\": { \"type\": \"plain_text\", \"text\": \"AI generated a new article :tada:\", \"emoji\": true } },\n { \"type\": \"section\", \"fields\": [\n { \"type\": \"mrkdwn\", \"text\": \"*Title*\\n{{ $('Build Brief').first().json.title }}\" },\n { \"type\": \"mrkdwn\", \"text\": \"*Category*\\n{{ $('Parse Category').first().json.category }}\" }\n ] },\n { \"type\": \"section\", \"fields\": [\n { \"type\": \"mrkdwn\", \"text\": \"*Article Doc*\\n<{{ $('Update Article Doc').first().json.webViewLink }}|Open in Google Docs>\" },\n { \"type\": \"mrkdwn\", \"text\": \"*Contentful*\\n<https://app.contentful.com/spaces/CONTENTFUL_SPACE_ID_PLACEHOLDER/entries/{{ $('Contentful - Create Entry').first().json.sys.id }}|Open entry>\" }\n ] }\n ]\n}",
"channelId": {
"__rl": true,
"mode": "id",
"value": "SLACK_CHANNEL_ID_PLACEHOLDER"
},
"messageType": "block",
"otherOptions": {}
},
"typeVersion": 2.2
}
],
"active": false,
"settings": {
"binaryMode": "separate",
"executionOrder": "v1"
},
"versionId": "3cc763c4-fd4f-4117-94c7-9dab7f7e629e",
"connections": {
"Build Brief1": {
"main": [
[
{
"node": "Log Brief to Sheet1",
"type": "main",
"index": 0
}
]
]
},
"Form Trigger1": {
"main": [
[
{
"node": "Build Brief1",
"type": "main",
"index": 0
}
]
]
},
"Parse Outline1": {
"main": [
[
{
"node": "Create Drive Folder1",
"type": "main",
"index": 0
}
]
]
},
"Parse Section1": {
"main": [
[
{
"node": "Aggregate Sections1",
"type": "main",
"index": 0
}
]
]
},
"Slugify Title1": {
"main": [
[
{
"node": "Build Contentful Entry1",
"type": "main",
"index": 0
}
]
]
},
"Parse Category1": {
"main": [
[
{
"node": "Markdown to Rich Text (Cloud Fn)1",
"type": "main",
"index": 0
}
]
]
},
"Assemble Article1": {
"main": [
[
{
"node": "Markdown to HTML (Article)1",
"type": "main",
"index": 0
}
]
]
},
"Claude - Outline1": {
"main": [
[
{
"node": "Parse Outline1",
"type": "main",
"index": 0
}
]
]
},
"Aggregate Sections1": {
"main": [
[
{
"node": "Assemble Article1",
"type": "main",
"index": 0
}
]
]
},
"Build Article HTML1": {
"main": [
[
{
"node": "Update Article Doc1",
"type": "main",
"index": 0
}
]
]
},
"Build Outline HTML1": {
"main": [
[
{
"node": "Update Outline Doc1",
"type": "main",
"index": 0
}
]
]
},
"Create Article Doc1": {
"main": [
[
{
"node": "Build Article HTML1",
"type": "main",
"index": 0
}
]
]
},
"Create Outline Doc1": {
"main": [
[
{
"node": "Build Outline HTML1",
"type": "main",
"index": 0
}
]
]
},
"Log Brief to Sheet1": {
"main": [
[
{
"node": "Build Outline Request1",
"type": "main",
"index": 0
}
]
]
},
"Update Article Doc1": {
"main": [
[
{
"node": "Build Category Request1",
"type": "main",
"index": 0
}
]
]
},
"Update Outline Doc1": {
"main": [
[
{
"node": "Split Into Sections1",
"type": "main",
"index": 0
}
]
]
},
"Claude - Categorize1": {
"main": [
[
{
"node": "Parse Category1",
"type": "main",
"index": 0
}
]
]
},
"Create Drive Folder1": {
"main": [
[
{
"node": "Markdown to HTML (Outline)1",
"type": "main",
"index": 0
}
]
]
},
"Split Into Sections1": {
"main": [
[
{
"node": "Build Section Request1",
"type": "main",
"index": 0
}
]
]
},
"Build Outline Request1": {
"main": [
[
{
"node": "Claude - Outline1",
"type": "main",
"index": 0
}
]
]
},
"Build Section Request1": {
"main": [
[
{
"node": "Claude - Write Section1",
"type": "main",
"index": 0
}
]
]
},
"Build Category Request1": {
"main": [
[
{
"node": "Claude - Categorize1",
"type": "main",
"index": 0
}
]
]
},
"Build Contentful Entry1": {
"main": [
[
{
"node": "Contentful - Create Entry1",
"type": "main",
"index": 0
}
]
]
},
"Claude - Write Section1": {
"main": [
[
{
"node": "Parse Section1",
"type": "main",
"index": 0
}
]
]
},
"Contentful - Create Entry1": {
"main": [
[
{
"node": "Write Links Back to Sheet1",
"type": "main",
"index": 0
}
]
]
},
"Write Links Back to Sheet1": {
"main": [
[
{
"node": "Notify Slack1",
"type": "main",
"index": 0
}
]
]
},
"Markdown to HTML (Article)1": {
"main": [
[
{
"node": "Create Article Doc1",
"type": "main",
"index": 0
}
]
]
},
"Markdown to HTML (Outline)1": {
"main": [
[
{
"node": "Create Outline Doc1",
"type": "main",
"index": 0
}
]
]
},
"Markdown to Rich Text (Cloud Fn)1": {
"main": [
[
{
"node": "Slugify Title1",
"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.
googleDriveOAuth2ApigoogleSheetsOAuth2ApihttpHeaderAuth
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow collects a blog brief via an n8n form, uses Anthropic Claude to generate an outline and write each section, saves both outline and article as formatted Google Docs in Google Drive, then creates a Contentful entry and posts the links to Google Sheets and Slack.…
Source: https://n8n.io/workflows/16162/ — 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.
Expenses Tracker (video). Uses httpRequest, splitInBatches, googleSheets, googleDrive. Event-driven trigger; 21 nodes.
Type in Slack. Walk away. Get a professional PDF report and a structured Excel fix sheet delivered to Google Drive and posted back in your Slack thread — fully automated, zero manual work.
Automatically transform any website URL into a complete portfolio entry with professional screenshots and AI-generated Upwork project descriptions. Freelancers building their Upwork/portfolio from pas
Upload a document (PDF, PNG, JPEG) via a web form and let easybits Extractor classify it into one of your defined categories. Based on the classification result and a confidence score, the document is
Transform your lead list into an AI-powered calling machine. This workflow automates your entire cold calling process using Vapi's conversational AI to initiate calls, qualify leads, capture detailed