AutomationFlowsAI & RAG › Transform RSS Feeds Into Blog Articles with Gpt-4, Human Review & Google Docs

Transform RSS Feeds Into Blog Articles with Gpt-4, Human Review & Google Docs

ByDaiki Takayama @daiki-ai on n8n.io

[Workflow Overview]

Cron / scheduled trigger★★★★☆ complexityAI-powered23 nodesAgentOpenAI ChatGoogle DocsRSS Feed Read@Gotohuman/N8N Nodes GotohumanSlack
AI & RAG Trigger: Cron / scheduled Nodes: 23 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #10311 — we link there as the canonical source.

This workflow follows the Agent → Google Docs 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 →

Download .json
{
  "id": "HI2iE8VwG75jxXJH",
  "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": "## \ud83d\udcf0 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\ufe0f\u20e3 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\ufe0f\u20e3 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\ufe0f\u20e3 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\ufe0f\u20e3 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\ufe0f\u20e3 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\ufe0f\u20e3 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\ufe0f\u20e3 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\ufe0f\u20e3 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\ufe0f\u20e3 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(/[\u300c\u300d\u300e\u300f\uff08\uff09()\u3001\u3002\uff01\uff1f]/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\u3010Source Article\u3011\nTitle: {{ $json.original_title }}\nSummary: {{ $json.original_description }}\nSource URL: {{ $json.original_url }}\n\n\u3010Writing Requirements\u3011\n- Topic: {{ $json.topic }}\n- Keywords: {{ $json.keywords }}\n- Target length: {{ $json.target_length }}\n- Tone: {{ $json.tone }}\n\n\u3010Article Structure\u3011\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\u3010Article Information\u3011\\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
      ],
      "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
      ],
      "parameters": {
        "text": "=\u2705 New blog article published from RSS feed!\n\ud83d\udcdd Title: {{ $('Structure Article Data').item.json.title }}\n\ud83d\udcca Word Count: {{ $('Structure Article Data').item.json.word_count }} words\n\ud83c\udfaf Keywords: {{ $('Structure Article Data').item.json.keywords || 'Technology, News' }}\n\ud83d\udc64 Reviewer: {{ $('Request Human Review').item.json.respondingUser || 'Team' }}\n\ud83d\udcc5 Approval Date: {{ $now.toLocaleString('en-US') }}\n\ud83c\udf10 *Source URL:* {{ $('Structure Article Data').item.json.original_url || 'https://example.com' }}\n\ud83d\udcac 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,
  "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
          }
        ]
      ]
    }
  }
}
Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

[Workflow Overview]

Source: https://n8n.io/workflows/10311/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

This workflow is designed for Japanese-speaking professionals, and learners who want to efficiently stay up to date with practical productivity, lifehack, and efficiency-related insights from Japanese

RSS Feed Read, Chain Llm, Google Gemini Chat +7
AI & RAG

公認資格ワークフロー. Uses rssFeedRead, chainLlm, lmChatGoogleGemini, outputParserStructured. Scheduled trigger; 25 nodes.

RSS Feed Read, Chain Llm, Google Gemini Chat +5
AI & RAG

We’ve released Version 4 of our AI Powered Blog Automation workflow. We heard your complains and made a complete redesign built for serious content creators.

RSS Feed Read, OpenAI Chat, Text Classifier +6
AI & RAG

Agent Nodes. Uses lmChatOpenAi, slack, stopAndError, errorTrigger. Event-driven trigger; 72 nodes.

OpenAI Chat, Slack, Stop And Error +12
AI & RAG

Generate AI video clips to promote products, services or events on social media. Use gotoHuman as an interface to control and supervise each step of the workflow to create content that's actually wort

Agent, OpenAI Chat, Tool Think +3