AutomationFlowsAI & RAG › Daily Tech News with OpenAI from RSS Feeds to WordPress

Daily Tech News with OpenAI from RSS Feeds to WordPress

Original n8n title: Write Daily Tech News with Openai Using RSS Feeds and Wordpress

ByTheodoros Mastromanolis @teomastro on n8n.io

Tech bloggers, content creators, and site owners who want a fully automated daily news column without writing a single word. A schedule trigger fires daily at 8 AM and pulls articles from four RSS feeds (BBC Tech, The Verge, Ars Technica, TechCrunch). All feeds are merged,…

Cron / scheduled trigger★★★★☆ complexityAI-powered21 nodesRSS Feed ReadAgentWordPressOpenAI ChatTool Code
AI & RAG Trigger: Cron / scheduled Nodes: 21 Complexity: ★★★★☆ AI nodes: yes Added:

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

This workflow follows the Agent → OpenAI Chat 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": "3eTIcbHUxRxSeWIrf6UCl",
  "name": "Write daily tech news with AI using RSS and WordPress",
  "tags": [],
  "nodes": [
    {
      "id": "85e28a2d-ff91-407c-9785-ec8dc9d53999",
      "name": "Daily 8AM Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        736,
        480
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 8
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "4c318cc4-2f48-4510-81d7-efa58416ab9e",
      "name": "RSS BBC Tech",
      "type": "n8n-nodes-base.rssFeedRead",
      "position": [
        1040,
        320
      ],
      "parameters": {
        "url": "https://feeds.bbci.co.uk/news/technology/rss.xml",
        "options": {}
      },
      "typeVersion": 1.1
    },
    {
      "id": "b0cc8dc1-1867-478e-bc5c-97112d6fdf58",
      "name": "RSS The Verge",
      "type": "n8n-nodes-base.rssFeedRead",
      "position": [
        1040,
        464
      ],
      "parameters": {
        "url": "https://www.theverge.com/rss/index.xml",
        "options": {}
      },
      "typeVersion": 1.1
    },
    {
      "id": "746d6b79-7348-439c-a790-9c10b86d8fa4",
      "name": "RSS Ars Technica",
      "type": "n8n-nodes-base.rssFeedRead",
      "position": [
        1040,
        624
      ],
      "parameters": {
        "url": "https://feeds.arstechnica.com/arstechnica/index",
        "options": {}
      },
      "typeVersion": 1.1
    },
    {
      "id": "148e1032-51de-4251-905b-2dfab02a9872",
      "name": "RSS TechCrunch",
      "type": "n8n-nodes-base.rssFeedRead",
      "position": [
        1040,
        784
      ],
      "parameters": {
        "url": "https://techcrunch.com/feed/",
        "options": {}
      },
      "typeVersion": 1.1
    },
    {
      "id": "5bc6bc47-a0d3-406a-9784-b106a4d41044",
      "name": "Merge All Feeds",
      "type": "n8n-nodes-base.merge",
      "position": [
        1328,
        480
      ],
      "parameters": {
        "numberInputs": 4
      },
      "typeVersion": 3
    },
    {
      "id": "bd7838fb-7542-4789-81d8-948871b46ce1",
      "name": "Normalize Fields",
      "type": "n8n-nodes-base.set",
      "position": [
        1568,
        480
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "field-title",
              "name": "title",
              "type": "string",
              "value": "={{ $json.title }}"
            },
            {
              "id": "field-content",
              "name": "snippet",
              "type": "string",
              "value": "={{ $json.contentSnippet || $json.content || '' }}"
            },
            {
              "id": "field-link",
              "name": "link",
              "type": "string",
              "value": "={{ $json.link }}"
            },
            {
              "id": "field-date",
              "name": "isoDate",
              "type": "number",
              "value": "={{ new Date($json.isoDate || $json.pubDate || 0).getTime() }}"
            },
            {
              "id": "field-source",
              "name": "source",
              "type": "string",
              "value": "={{ $json.creator || $json['dc:creator'] || '' }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "09ac682e-fd46-4e82-91dd-5190bb540c26",
      "name": "Filter Last 24 Hours",
      "type": "n8n-nodes-base.filter",
      "position": [
        1808,
        480
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "filter-24h",
              "operator": {
                "type": "number",
                "operation": "gt"
              },
              "leftValue": "={{ $json.isoDate }}",
              "rightValue": "={{ Date.now() - 24 * 60 * 60 * 1000 }}"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "db0a8216-2d17-41bf-bce9-2942780b9564",
      "name": "Sort by Date",
      "type": "n8n-nodes-base.sort",
      "position": [
        2048,
        480
      ],
      "parameters": {
        "options": {},
        "sortFieldsUi": {
          "sortField": [
            {
              "order": "descending",
              "fieldName": "isoDate"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "9d2ae888-3755-4bdd-a32f-63bc1f3472e2",
      "name": "Limit to 15",
      "type": "n8n-nodes-base.limit",
      "position": [
        2288,
        480
      ],
      "parameters": {
        "maxItems": 10
      },
      "typeVersion": 1
    },
    {
      "id": "f9b8c3fc-dd6c-4246-879e-6c8cd4c1a981",
      "name": "Aggregate Articles",
      "type": "n8n-nodes-base.code",
      "position": [
        2592,
        480
      ],
      "parameters": {
        "jsCode": "// Aggregate all articles into a single text block for the AI agent\nconst articles = $input.all();\n\nlet summaryText = 'TODAY\\'S TOP NEWS ARTICLES (' + articles.length + ' articles from the last 24 hours):\\n\\n';\n\nfor (let i = 0; i < articles.length; i++) {\n  const a = articles[i].json;\n  summaryText += (i + 1) + '. ' + (a.title || 'No title') + '\\n';\n  summaryText += '   URL: ' + (a.link || '') + '\\n';\n  const snippet = (a.snippet || '').substring(0, 250);\n  if (snippet) {\n    summaryText += '   ' + snippet + '\\n';\n  }\n  summaryText += '\\n';\n}\n\nreturn [{ json: { articlesSummary: summaryText, articleCount: articles.length } }];"
      },
      "typeVersion": 2
    },
    {
      "id": "7a4410a3-aac1-4f48-9354-9425e5e5a064",
      "name": "AI Write News Article",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        2880,
        480
      ],
      "parameters": {
        "text": "=You are a professional tech news journalist. Every day you receive a digest of the latest news articles from major tech publications. Your job is to pick the most newsworthy story (or combine 2-3 related stories into one narrative) and write an original, polished news article.\n\n## Today's News Digest\n{{ $json.articlesSummary }}\n\n## Tools Available\n- **Fetch Article**: Pass a full article URL (including https://) to read the complete text. Use this to get the full details of the articles you want to write about.\n\n## Your Task\n1. Review the headlines and snippets above.\n2. Pick the single most important/interesting story, OR pick 2-3 related stories you can weave into one narrative.\n3. Use the Fetch Article tool to read the full text of your chosen 2-3 articles. Do NOT fetch more than 3.\n4. If a fetch fails (paywall, error), skip it and work with what you have.\n5. Write an original news article based on what you've read.\n\n## NEWS ARTICLE STRUCTURE\n\n### Headline\nClear, factual, attention-grabbing.\n\n### Lead Paragraph (1 paragraph)\nThe most important facts: who, what, when, where, why.\n\n### Body (3-5 paragraphs, use <h2> subheadings where appropriate)\n- Key details and context\n- Background and significance\n- Multiple perspectives where available\n- Concrete data, numbers, or specifics\n\n### What's Next (1-2 paragraphs)\nImplications, what to watch for, what happens next.\n\n## WRITING RULES\n- Neutral, professional journalistic tone\n- 600-1000 words\n- All content ORIGINAL \u2014 synthesize and rewrite, never copy\n- Attribute sources naturally (e.g. \"according to Ars Technica\", \"The Verge reports\")\n- Use <h2>, <p>, <strong>, <em> for formatting\n- Do NOT include <html>, <head>, or <body> tags\n\n## OUTPUT FORMAT\nReturn in this EXACT format:\n\nTITLE: [Your headline]\n\n---CONTENT---\n\n[Full article in HTML]",
        "options": {},
        "promptType": "define"
      },
      "typeVersion": 1.7
    },
    {
      "id": "80969c99-293b-4e32-b526-faa8fdf43e45",
      "name": "Parse AI Output",
      "type": "n8n-nodes-base.code",
      "position": [
        3280,
        480
      ],
      "parameters": {
        "jsCode": "const raw = String($input.item.json.output || '');\n\nconst contentMarker = '---CONTENT---';\n\nlet title = 'Untitled';\nlet content = raw;\n\nconst tIdx = raw.indexOf('TITLE:');\nif (tIdx !== -1) {\n  const afterTitle = raw.substring(tIdx + 6);\n  const newline = afterTitle.indexOf('\\n');\n  title = newline !== -1 ? afterTitle.substring(0, newline).trim() : afterTitle.trim();\n}\n\nconst contentIdx = raw.indexOf(contentMarker);\nif (contentIdx !== -1) {\n  content = raw.substring(contentIdx + contentMarker.length).trim();\n}\n\nreturn [{ json: { title, content } }];"
      },
      "typeVersion": 2
    },
    {
      "id": "fd06df2c-2f58-4537-ac02-b558a0ad93ae",
      "name": "Create WordPress Draft",
      "type": "n8n-nodes-base.wordpress",
      "position": [
        3520,
        480
      ],
      "parameters": {
        "title": "={{ $json.title }}",
        "additionalFields": {
          "status": "draft",
          "content": "={{ $json.content }}"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "4d6164f2-58c9-4a0e-a543-ac92679815e3",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        2752,
        768
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-5.1",
          "cachedResultName": "gpt-5.1"
        },
        "options": {},
        "builtInTools": {}
      },
      "typeVersion": 1.3
    },
    {
      "id": "ac9675ef-78f8-4c46-ac6f-760913278ab5",
      "name": "Fetch Article",
      "type": "@n8n/n8n-nodes-langchain.toolCode",
      "position": [
        2960,
        768
      ],
      "parameters": {
        "name": "my_tool",
        "jsCode": "const url = query.trim();\n\nif (!url.startsWith('http://') && !url.startsWith('https://')) {\n  return 'ERROR: Invalid URL. Must start with http:// or https://';\n}\n\ntry {\n  const html = await this.helpers.httpRequest({\n    method: 'GET',\n    url: url,\n    returnFullResponse: false,\n    timeout: 15000,\n  });\n\n  let text = String(html);\n\n  text = text\n    .replace(/<script[\\s\\S]*?<\\/script>/gi, '')\n    .replace(/<style[\\s\\S]*?<\\/style>/gi, '')\n    .replace(/<nav[\\s\\S]*?<\\/nav>/gi, '')\n    .replace(/<footer[\\s\\S]*?<\\/footer>/gi, '')\n    .replace(/<header[\\s\\S]*?<\\/header>/gi, '')\n    .replace(/<aside[\\s\\S]*?<\\/aside>/gi, '')\n    .replace(/<noscript[\\s\\S]*?<\\/noscript>/gi, '')\n    .replace(/<iframe[\\s\\S]*?<\\/iframe>/gi, '')\n    .replace(/<!--[\\s\\S]*?-->/g, '')\n    .replace(/<\\/(p|div|h[1-6]|li|tr|br|hr)[^>]*>/gi, '\\n')\n    .replace(/<br\\s*\\/?>/gi, '\\n')\n    .replace(/<[^>]+>/g, ' ')\n    .replace(/&amp;/g, '&')\n    .replace(/&lt;/g, '<')\n    .replace(/&gt;/g, '>')\n    .replace(/&quot;/g, '\"')\n    .replace(/&#39;/g, \"'\")\n    .replace(/&nbsp;/g, ' ')\n    .replace(/[ \\t]+/g, ' ')\n    .replace(/\\n\\s*\\n/g, '\\n\\n')\n    .replace(/\\n{3,}/g, '\\n\\n')\n    .trim();\n\n  if (text.length > 4000) {\n    text = text.substring(0, 4000) + '\\n\\n[Content truncated]';\n  }\n\n  if (text.length < 100) {\n    return 'ERROR: Page returned no usable content (likely 404 or paywall). Skip this URL.';\n  }\n\n  return text;\n\n} catch (error) {\n  return 'ERROR: Could not fetch (' + error.message + '). Skip this URL.';\n}"
      },
      "typeVersion": 1
    },
    {
      "id": "b569fea7-5255-48f1-90fa-0554a3998777",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        176,
        96
      ],
      "parameters": {
        "width": 460,
        "height": 920,
        "content": "## Try It Out!\n### Automatically write and publish an original tech news article to WordPress every morning \u2014 completely hands-free.\n\nGreat for tech bloggers, content creators, or anyone who wants a daily news column without the daily effort.\n\n### How it works\n* A schedule trigger fires daily at 8 AM and pulls articles from four RSS feeds (BBC Tech, The Verge, Ars Technica, TechCrunch).\n* Articles are merged, normalized, filtered to the last 24 hours, sorted, and capped at 10.\n* An OpenAI-powered AI agent picks the most newsworthy story, fetches full article text, and writes an original 600\u20131000 word article.\n* The output is parsed into a title and HTML body, then posted as a draft to WordPress.\n\n### How to use\n* Add your OpenAI API key under Credentials.\n* Add your WordPress API credentials (site URL + application password).\n* Optionally swap RSS feeds, adjust the article limit, or change the post status.\n* Activate the workflow \u2014 it runs daily at 8 AM.\n\n### Requirements\n* OpenAI account and API key\n* WordPress site with application password enabled\n\n### Need Help?\nJoin the [Discord](https://discord.com/invite/XPKeKXeB7d) or ask in the [Forum](https://community.n8n.io/)!\n\nHappy Hacking!"
      },
      "typeVersion": 1
    },
    {
      "id": "08bcd6ab-0e92-4a0c-ae78-0ee88d2a4883",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        720,
        224
      ],
      "parameters": {
        "color": 7,
        "width": 520,
        "height": 728,
        "content": "## 1. Fetch RSS feeds\nPulls the latest articles from BBC Tech, The Verge, Ars Technica, and TechCrunch in parallel, triggered daily at 8 AM."
      },
      "typeVersion": 1
    },
    {
      "id": "c657d8b8-fcef-4ea9-9c97-e2e7b7d1e691",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1520,
        224
      ],
      "parameters": {
        "color": 7,
        "width": 960,
        "height": 568,
        "content": "## 2. Normalize and filter\nStandardizes fields across feeds, drops articles older than 24 hours, sorts by date, and caps the list at 10 items."
      },
      "typeVersion": 1
    },
    {
      "id": "d89aa490-aed8-4940-a7a4-6fa223ce4374",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2544,
        224
      ],
      "parameters": {
        "color": 7,
        "width": 600,
        "height": 696,
        "content": "## 3. AI writes the article\nCompiles headlines into a digest, then an OpenAI agent picks the top story, fetches full text, and writes an original news article."
      },
      "typeVersion": 1
    },
    {
      "id": "25655991-be19-43c9-aecf-c2cb8b024726",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3232,
        224
      ],
      "parameters": {
        "color": 7,
        "width": 520,
        "height": 552,
        "content": "## 4. Publish to WordPress\nExtracts the headline and HTML body from the AI output and creates a WordPress draft post."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "8e182a70-0434-4464-8661-ee225c0e397f",
  "connections": {
    "Limit to 15": {
      "main": [
        [
          {
            "node": "Aggregate Articles",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "RSS BBC Tech": {
      "main": [
        [
          {
            "node": "Merge All Feeds",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Sort by Date": {
      "main": [
        [
          {
            "node": "Limit to 15",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Article": {
      "ai_tool": [
        [
          {
            "node": "AI Write News Article",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "RSS The Verge": {
      "main": [
        [
          {
            "node": "Merge All Feeds",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "RSS TechCrunch": {
      "main": [
        [
          {
            "node": "Merge All Feeds",
            "type": "main",
            "index": 3
          }
        ]
      ]
    },
    "Merge All Feeds": {
      "main": [
        [
          {
            "node": "Normalize Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse AI Output": {
      "main": [
        [
          {
            "node": "Create WordPress Draft",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Normalize Fields": {
      "main": [
        [
          {
            "node": "Filter Last 24 Hours",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "RSS Ars Technica": {
      "main": [
        [
          {
            "node": "Merge All Feeds",
            "type": "main",
            "index": 2
          }
        ]
      ]
    },
    "Daily 8AM Trigger": {
      "main": [
        [
          {
            "node": "RSS BBC Tech",
            "type": "main",
            "index": 0
          },
          {
            "node": "RSS The Verge",
            "type": "main",
            "index": 0
          },
          {
            "node": "RSS Ars Technica",
            "type": "main",
            "index": 0
          },
          {
            "node": "RSS TechCrunch",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI Write News Article",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Aggregate Articles": {
      "main": [
        [
          {
            "node": "AI Write News Article",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter Last 24 Hours": {
      "main": [
        [
          {
            "node": "Sort by Date",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Write News Article": {
      "main": [
        [
          {
            "node": "Parse AI Output",
            "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

Tech bloggers, content creators, and site owners who want a fully automated daily news column without writing a single word. A schedule trigger fires daily at 8 AM and pulls articles from four RSS feeds (BBC Tech, The Verge, Ars Technica, TechCrunch). All feeds are merged,…

Source: https://n8n.io/workflows/13924/ — 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

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

This workflow automates the process of generating, reviewing, and publishing blog posts across multiple platforms, now enhanced with support for RSS Feeds as a content source. It streamlines the manag

HTTP Request, Html Extract, RSS Feed Read +9
AI & RAG

This n8n workflow automatically fetches RSS articles, extracts featured images, and publishes them across multiple social media platforms. The workflow runs on a schedule, processes news articles from

WordPress, Edit Image, HTTP Request +9
AI & RAG

Complete PostgreSQL-backed system: Keyword scoring → AI research → Multi-part content generation → fal.ai Nano Banana image generation → WordPress publishing

WordPress, OpenAI, Perplexity +8
AI & RAG

This workflow is for beauty salons who want consistent, high‑quality social media content without writing every post manually. It also suits agencies and automation builders who manage multiple beauty

Telegram, Google Sheets Trigger, Agent +26