
Generate blog articles from RSS feeds with AI review
Description
Categories
🤖 AI & Machine Learning
Nodes Used
n8n-nodes-base.ifn8n-nodes-base.coden8n-nodes-base.coden8n-nodes-base.noOpn8n-nodes-base.noOpn8n-nodes-base.slackn8n-nodes-base.googleDocsn8n-nodes-base.googleDocsn8n-nodes-base.stickyNoten8n-nodes-base.stickyNote
PriceFree
Views0
Last Updated11/28/2025
workflow.json
{
"id": "HI2iE8VwG75jxXJH",
"meta": {
"instanceId": "062f0e1ec3617ffb26cbc1b3c3518f28f3e57f08ddc210c471f532bb0bd6cf07"
},
"name": "Generate blog articles from RSS feeds with AI review",
"tags": [],
"nodes": [
{
"id": "d11df7cb-6c60-42a6-9a24-de65390adf7a",
"name": "Sticky Note - Overview",
"type": "n8n-nodes-base.stickyNote",
"position": [
-656,
-16
],
"parameters": {
"width": 640,
"height": 792,
"content": "## 📰 RSS to Blog Article Generator with Human Approval\n\n### What This Workflow Does\nAutomatically converts RSS feed articles into detailed blog posts using AI, sends them for human review, and publishes approved articles to Google Docs with Slack notifications.\n\n### How It Works\n1. **Schedule Trigger** - Runs every 6 hours to check for new articles\n2. **RSS Feed** - Fetches latest articles from your RSS source\n3. **Data Processing** - Extracts key information (title, keywords, description)\n4. **AI Generation** - Creates detailed blog post using GPT-4\n5. **Human Review** - Sends article to reviewer via gotoHuman\n6. **Approval Check** - Routes approved/rejected articles\n7. **Google Docs** - Creates document with approved content\n8. **Slack Notification** - Alerts team of published article\n\n### Setup Requirements\n- OpenAI API key (GPT-4 access)\n- Google Docs account\n- gotoHuman account (for human-in-the-loop approval)\n- Slack workspace (for notifications)\n- RSS feed URL\n\n### Customization\n- Change RSS feed URL in \"RSS Read\" node\n- Adjust article length, tone, and keywords in \"Format RSS Data\" node\n- Modify AI prompt in \"Generate Article with AI\" node\n- Configure approval template in gotoHuman node\n- Set schedule frequency in \"Schedule Trigger\" node\n\n### Target Users\nContent teams, bloggers, news sites, marketing agencies who want to automate content creation while maintaining quality control."
},
"typeVersion": 1
},
{
"id": "ef01e50e-5e8b-454b-b77c-1efbea20db43",
"name": "Sticky Note - Step 1",
"type": "n8n-nodes-base.stickyNote",
"position": [
16,
432
],
"parameters": {
"color": 7,
"height": 128,
"content": "### 1️⃣ Scheduled Trigger\nRuns workflow every 6 hours to check for new RSS articles. Adjust the interval based on your content needs."
},
"typeVersion": 1
},
{
"id": "45e8be75-c5d1-46da-b5e0-f66e47e0c4c3",
"name": "Sticky Note - Step 2",
"type": "n8n-nodes-base.stickyNote",
"position": [
208,
160
],
"parameters": {
"color": 7,
"height": 112,
"content": "### 2️⃣ Fetch RSS Feed\nReads articles from your RSS feed. Replace the URL with your own RSS feed source."
},
"typeVersion": 1
},
{
"id": "9c0ed906-df38-4b1d-842f-985bf8b615b1",
"name": "Sticky Note - Step 3",
"type": "n8n-nodes-base.stickyNote",
"position": [
448,
432
],
"parameters": {
"color": 7,
"height": 96,
"content": "### 3️⃣ Process Data\nExtracts title, keywords, and description from RSS feed. Formats data for AI processing."
},
"typeVersion": 1
},
{
"id": "606c9ace-1003-44da-b72e-f6b2f062c5a7",
"name": "Sticky Note - Step 4",
"type": "n8n-nodes-base.stickyNote",
"position": [
736,
160
],
"parameters": {
"color": 7,
"height": 112,
"content": "### 4️⃣ AI Article Generation\nUses OpenAI to generate a detailed, structured blog article based on RSS content."
},
"typeVersion": 1
},
{
"id": "72bd534f-a617-4d5e-bcff-f908b8ca9793",
"name": "Sticky Note - Step 5",
"type": "n8n-nodes-base.stickyNote",
"position": [
976,
464
],
"parameters": {
"color": 7,
"height": 112,
"content": "### 5️⃣ Format Article Data\nStructures the AI-generated content with title, body, metadata, and word count."
},
"typeVersion": 1
},
{
"id": "a1d59531-72b7-44c5-a86f-2f7777a5825d",
"name": "Sticky Note - Step 6",
"type": "n8n-nodes-base.stickyNote",
"position": [
1168,
144
],
"parameters": {
"color": 7,
"height": 128,
"content": "### 6️⃣ Human Review Request\nSends article to designated reviewer via gotoHuman. Waits for approval/rejection."
},
"typeVersion": 1
},
{
"id": "71db4973-03b3-47ca-b7d4-54e3c5e46c82",
"name": "Sticky Note - Step 7",
"type": "n8n-nodes-base.stickyNote",
"position": [
1392,
448
],
"parameters": {
"color": 7,
"height": 112,
"content": "### 7️⃣ Approval Check\nRoutes workflow based on review decision. Approved articles proceed to publishing."
},
"typeVersion": 1
},
{
"id": "5d87deaa-82bb-45f2-b69d-0996eba75eef",
"name": "Sticky Note - Step 8",
"type": "n8n-nodes-base.stickyNote",
"position": [
1744,
112
],
"parameters": {
"color": 7,
"height": 144,
"content": "### 8️⃣ Publish to Google Docs\nCreates new Google Doc with article title and content, including metadata."
},
"typeVersion": 1
},
{
"id": "0101e6ba-48c1-42c7-8ad1-9b6f3fd24a80",
"name": "Sticky Note - Step 9",
"type": "n8n-nodes-base.stickyNote",
"position": [
2064,
144
],
"parameters": {
"color": 7,
"height": 96,
"content": "### 9️⃣ Team Notification\nSends formatted message to Slack with article details and approval information."
},
"typeVersion": 1
},
{
"id": "aa539528-6344-4b14-9845-9b50212bbca9",
"name": "Format RSS Data",
"type": "n8n-nodes-base.code",
"position": [
496,
288
],
"parameters": {
"jsCode": "// Extract and format RSS feed data for article generation\nconst items = $input.all();\n\nif (items.length === 0) {\n throw new Error('No articles found in RSS feed');\n}\n\n// Process latest article (modify to process multiple articles if needed)\nconst rssData = items[0].json;\n\n// Extract topic from RSS title\nconst topic = rssData.title || rssData.headline || 'Untitled';\n\n// Get article description/summary\nconst description = rssData.content || rssData.description || rssData.summary || '';\n\n// Extract keywords from title (simple word extraction)\nconst keywords = topic\n .replace(/[「」『』()()、。!?]/g, ' ')\n .split(/\\s+/)\n .filter(word => word.length > 2)\n .slice(0, 5)\n .join(', ');\n\nreturn [{\n json: {\n topic: topic,\n keywords: keywords || 'Technology, News',\n target_length: '1500-2000 words',\n tone: 'Professional and accessible',\n keywords_array: keywords.split(',').map(k => k.trim()).filter(k => k),\n original_url: rssData.link || rssData.url || '',\n original_title: topic,\n original_description: description.substring(0, 200),\n pub_date: rssData.pubDate || new Date().toISOString()\n }\n}];"
},
"typeVersion": 2
},
{
"id": "fc26315d-54be-4d57-ab71-dbec113a0d3f",
"name": "Generate Article with AI",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
736,
288
],
"parameters": {
"text": "=You are a professional content writer. Based on the following news article, create a detailed and engaging blog post.\n\n【Source Article】\nTitle: {{ $json.original_title }}\nSummary: {{ $json.original_description }}\nSource URL: {{ $json.original_url }}\n\n【Writing Requirements】\n- Topic: {{ $json.topic }}\n- Keywords: {{ $json.keywords }}\n- Target length: {{ $json.target_length }}\n- Tone: {{ $json.tone }}\n\n【Article Structure】\nPlease create the article with the following structure:\n\n# Compelling Title (specific and engaging)\n\n## Introduction (200 words)\n- Background of this news\n- Why it matters\n\n## Detailed Analysis\n### Point 1: Overview\n- What happened\n\n### Point 2: Impact\n- What are the implications\n\n### Point 3: Future Outlook\n- What's next\n\n## Summary (150 words)\n- Key takeaways\n\n---\nMeta Description (120 characters max)",
"options": {
"systemMessage": "You are a professional content writer who creates valuable, detailed articles based on news sources."
},
"promptType": "define"
},
"typeVersion": 2.2
},
{
"id": "a553796b-fbc8-40a5-8183-a464cd7beb6c",
"name": "OpenAI Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
736,
496
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4o",
"cachedResultName": "gpt-4o"
},
"options": {}
},
"typeVersion": 1.2
},
{
"id": "ad35b96a-db22-4ee9-805a-a9934a651060",
"name": "Create Google Doc",
"type": "n8n-nodes-base.googleDocs",
"position": [
1696,
272
],
"parameters": {
"title": "={{ $('Format RSS Data').item.json.original_title }}",
"driveId": "=",
"folderId": "="
},
"typeVersion": 2
},
{
"id": "47080e37-1411-4c11-a2da-1ae9d39cbaac",
"name": "Add Article Content",
"type": "n8n-nodes-base.googleDocs",
"position": [
1920,
272
],
"parameters": {
"actionsUi": {
"actionFields": [
{
"text": "={{ $('Structure Article Data').item.json.article_body }}",
"action": "insert"
},
{
"text": "=\\n\\n---\\n【Article Information】\\nSource: {{ $('Structure Article Data').item.json.original_url }}\\nOriginal Title: {{ $('Structure Article Data').item.json.original_title }}\\nReviewer: {{ $('Request Human Review').item.json.reviewer_name }}\\nApproval Date: {{ $now.toLocaleString('en-US') }}\\nWord Count: {{ $('Structure Article Data').item.json.word_count }} words",
"action": "insert"
}
]
},
"operation": "update",
"documentURL": "={{ $json.id }}"
},
"typeVersion": 2
},
{
"id": "c2010b96-cc13-4347-b2cb-2ca2d9acb4bd",
"name": "Article Published",
"type": "n8n-nodes-base.noOp",
"position": [
2448,
272
],
"parameters": {},
"typeVersion": 1
},
{
"id": "d2995df2-e9aa-499d-accf-63fc84c9757e",
"name": "Article Rejected",
"type": "n8n-nodes-base.noOp",
"position": [
1696,
464
],
"parameters": {},
"typeVersion": 1
},
{
"id": "096749ba-d451-4e52-a32c-db1c15b27e58",
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
64,
288
],
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 6
}
]
}
},
"typeVersion": 1.2
},
{
"id": "1bd48d89-2933-4af7-bdaf-99b7a240ca17",
"name": "RSS Read",
"type": "n8n-nodes-base.rssFeedRead",
"position": [
272,
288
],
"parameters": {
"url": "https://example.com/rss-feed.xml",
"options": {}
},
"typeVersion": 1.2
},
{
"id": "781ba339-0ab9-45f1-891f-613f5102cbbf",
"name": "Structure Article Data",
"type": "n8n-nodes-base.code",
"position": [
1024,
288
],
"parameters": {
"jsCode": "// Structure AI-generated article with metadata\nconst aiOutput = $input.item.json.output || $input.item.json.text || '';\nconst inputData = $input.item.json;\n\n// Extract title (first # line)\nconst titleMatch = aiOutput.match(/^#\\s+(.+)$/m);\nconst title = titleMatch ? titleMatch[1] : inputData.original_title;\n\n// Extract meta description\nconst metaMatch = aiOutput.match(/---\\s*\\n([\\s\\S]+)$/);\nconst metaDescription = metaMatch ? metaMatch[1].trim() : '';\n\n// Article body (excluding meta description)\nconst articleBody = metaDescription ? aiOutput.replace(/---\\s*\\n[\\s\\S]+$/, '').trim() : aiOutput;\n\nreturn {\n json: {\n topic: inputData.topic,\n keywords: inputData.keywords,\n keywords_array: inputData.keywords_array,\n target_length: inputData.target_length,\n tone: inputData.tone,\n title: title,\n article_body: articleBody,\n meta_description: metaDescription,\n word_count: articleBody.replace(/[#\\s]/g, '').length,\n original_url: inputData.original_url,\n original_title: inputData.original_title,\n pub_date: inputData.pub_date,\n created_at: new Date().toISOString()\n }\n};"
},
"typeVersion": 2
},
{
"id": "75f63a4a-250a-4066-a615-16c70a3ca1f4",
"name": "Request Human Review",
"type": "@gotohuman/n8n-nodes-gotohuman.gotoHuman",
"position": [
1232,
288
],
"webhookId": "rss-blog-template",
"parameters": {
"fields": {
"value": {
"topic": "={{ $json.topic }}",
"keywords": "={{ $json.keywords }}",
"word_count": "={{ $json.word_count }}",
"article_body": "={{ $json.article_body }}",
"original_url": "{{ $json.original_url }}",
"article_title": "={{ $json.title }}",
"meta_description": "={{ $json.meta_description }}"
},
"schema": [
{
"id": "topic",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "topic (text)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "keywords",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "keywords (text)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "article_title",
"type": "string",
"display": true,
"removed": false,
"required": true,
"displayName": "article_title (text)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "article_body",
"type": "string",
"display": true,
"removed": false,
"required": true,
"displayName": "article_body (longText)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "meta_description",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "meta_description (text)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "word_count",
"type": "number",
"display": true,
"removed": false,
"required": false,
"displayName": "word_count (number)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "original_url",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "original_url (text)",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"assignments": [
{
"id": "topic",
"value": "={{ $json.topic }}"
},
{
"id": "keywords",
"value": "={{ $json.keywords }}"
},
{
"id": "article_title",
"value": "={{ $json.title }}"
},
{
"id": "article_body",
"value": "={{ $json.article_body }}"
},
{
"id": "meta_description",
"value": "={{ $json.meta_description }}"
},
{
"id": "word_count",
"value": "={{ $json.word_count }}"
},
{
"id": "original_url",
"value": "={{ $json.original_url }}"
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"additionalFields": {},
"reviewTemplateID": {
"__rl": true,
"mode": "list",
"value": "YOUR_GOTOHUMAN_TEMPLATE_ID",
"cachedResultName": "Article Review Template"
}
},
"typeVersion": 1
},
{
"id": "4c680e9e-6405-4505-8db7-73a66480b594",
"name": "Check Approval Status",
"type": "n8n-nodes-base.if",
"position": [
1456,
288
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "or",
"conditions": [
{
"id": "condition-approval-1",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.response }}",
"rightValue": "approved"
}
]
}
},
"typeVersion": 2
},
{
"id": "149e2699-ff1f-40a0-873c-b4f9e26416fc",
"name": "Send Slack Notification",
"type": "n8n-nodes-base.slack",
"position": [
2128,
272
],
"webhookId": "rss-blog-template-slack",
"parameters": {
"text": "=✅ New blog article published from RSS feed!\n📝 Title: {{ $('Structure Article Data').item.json.title }}\n📊 Word Count: {{ $('Structure Article Data').item.json.word_count }} words\n🎯 Keywords: {{ $('Structure Article Data').item.json.keywords || 'Technology, News' }}\n👤 Reviewer: {{ $('Request Human Review').item.json.respondingUser || 'Team' }}\n📅 Approval Date: {{ $now.toLocaleString('en-US') }}\n🌐 *Source URL:* {{ $('Structure Article Data').item.json.original_url || 'https://example.com' }}\n💬 Meta Description:\n{{ $('Structure Article Data').item.json.meta_description }}",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "list",
"value": "YOUR_SLACK_CHANNEL_ID",
"cachedResultName": "Your Slack Channel"
},
"otherOptions": {},
"authentication": "oAuth2"
},
"typeVersion": 2.2
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "c81976c3-4fda-4118-8efb-043d941627f8",
"connections": {
"RSS Read": {
"main": [
[
{
"node": "Format RSS Data",
"type": "main",
"index": 0
}
]
]
},
"Format RSS Data": {
"main": [
[
{
"node": "Generate Article with AI",
"type": "main",
"index": 0
}
]
]
},
"Schedule Trigger": {
"main": [
[
{
"node": "RSS Read",
"type": "main",
"index": 0
}
]
]
},
"Create Google Doc": {
"main": [
[
{
"node": "Add Article Content",
"type": "main",
"index": 0
}
]
]
},
"OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "Generate Article with AI",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Add Article Content": {
"main": [
[
{
"node": "Send Slack Notification",
"type": "main",
"index": 0
}
]
]
},
"Request Human Review": {
"main": [
[
{
"node": "Check Approval Status",
"type": "main",
"index": 0
}
]
]
},
"Check Approval Status": {
"main": [
[
{
"node": "Create Google Doc",
"type": "main",
"index": 0
}
],
[
{
"node": "Article Rejected",
"type": "main",
"index": 0
}
]
]
},
"Structure Article Data": {
"main": [
[
{
"node": "Request Human Review",
"type": "main",
"index": 0
}
]
]
},
"Send Slack Notification": {
"main": [
[
{
"node": "Article Published",
"type": "main",
"index": 0
}
]
]
},
"Generate Article with AI": {
"main": [
[
{
"node": "Structure Article Data",
"type": "main",
"index": 0
}
]
]
}
}
}