{"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}]]}}}