This workflow follows the Gmail → OpenAI 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 →
{
"meta": {
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "69394736-5c78-420e-9f03-ac18501cb377",
"name": "Daily Newsletter Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"notes": "\u23f0 Triggers daily at 8 AM UTC\n\nCustomize:\n- Change triggerAtHour (0-23)\n- Add timezone settings\n- Set weekday-only schedule",
"position": [
624,
1040
],
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 8
}
]
}
},
"typeVersion": 1.2
},
{
"id": "1ee57ce6-d7aa-49d5-bac7-814bde5b0a65",
"name": "Configure RSS Sources",
"type": "n8n-nodes-base.set",
"notes": "\ud83d\udce1 Premium tech news RSS feeds\n\nSources:\n\u2022 TechCrunch AI\n\u2022 The Verge AI\n\u2022 MIT Tech Review\n\u2022 Wired AI\n\u2022 VentureBeat\n\u2022 ZDNet\n\u2022 Towards Data Science\n\u2022 NY Times Tech\n\u2022 Guardian Tech\n\u2022 BBC Tech",
"position": [
864,
1040
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "53097a16-a525-4c89-828e-a36c5e0c3742",
"name": "urls",
"type": "array",
"value": "[\n \"https://techcrunch.com/tag/artificial-intelligence/feed/\",\n \"https://www.theverge.com/artificial-intelligence/rss/index.xml\",\n \"https://www.technologyreview.com/feed/\",\n \"https://www.wired.com/feed/category/science/artificial-intelligence/latest/rss\",\n \"https://venturebeat.com/category/ai/feed/\",\n \"https://www.zdnet.com/topic/artificial-intelligence/rss.xml\",\n \"https://towardsdatascience.com/feed\",\n \"https://rss.nytimes.com/services/xml/rss/nyt/Technology.xml\",\n \"https://www.theguardian.com/uk/technology/rss\",\n \"https://feeds.bbci.co.uk/news/technology/rss.xml\"\n]"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "6477cbf0-790d-41ce-8b45-a273e03c9247",
"name": "Split RSS URLs",
"type": "n8n-nodes-base.splitOut",
"notes": "\ud83d\udd04 Splits URL array for parallel processing\n\nCreates individual execution paths\nfor each RSS feed URL",
"position": [
1088,
1040
],
"parameters": {
"options": {},
"fieldToSplitOut": "urls"
},
"typeVersion": 1
},
{
"id": "37cfed68-0740-4e77-a1ab-827f8f1eec28",
"name": "Fetch RSS Articles",
"type": "n8n-nodes-base.rssFeedRead",
"notes": "\ud83d\udcf0 Fetches articles from RSS feeds\n\nExtracts:\n\u2022 Title\n\u2022 Content snippet\n\u2022 Article URL\n\u2022 Publication date\n\nContinues on errors to prevent\nsingle feed failures",
"onError": "continueErrorOutput",
"position": [
1296,
1040
],
"parameters": {
"url": "={{ $json.urls }}",
"options": {}
},
"retryOnFail": false,
"typeVersion": 1.2
},
{
"id": "d7f56edb-cd31-4a53-b390-e910b7c50ce8",
"name": "Filter Articles",
"type": "n8n-nodes-base.code",
"notes": "\u2696\ufe0f Balances article sources\n\n\u2022 Max 5 articles per domain\n\u2022 Prevents single-source domination\n\u2022 Ensures diverse coverage\n\u2022 Groups by domain, then flattens",
"position": [
1504,
1040
],
"parameters": {
"jsCode": "// Limit articles per domain for balanced coverage\nconst input = $input.all();\nconst grouped = {};\n\nfor (const item of input) {\n const link = item.json.link;\n const domainMatch = link.match(/\\/\\/([^\\/]+)/);\n const domain = domainMatch ? domainMatch[1].replace(/^www\\./, '') : 'unknown';\n\n if (!grouped[domain]) grouped[domain] = [];\n if (grouped[domain].length < 5) {\n grouped[domain].push(item.json);\n }\n}\n\n// Flatten results\nconst result = [];\nfor (const domain in grouped) {\n result.push(...grouped[domain]);\n}\n\nreturn result.map(i => ({ json: i }));"
},
"typeVersion": 2
},
{
"id": "14562212-87cc-4321-8277-bd8519c1adcf",
"name": "Clean Data",
"type": "n8n-nodes-base.set",
"notes": "\ud83e\uddf9 Standardizes article structure\n\nMaps to clean format:\n\u2022 title \u2192 headline\n\u2022 content \u2192 summary\n\u2022 link \u2192 article URL\n\u2022 pubDate \u2192 timestamp",
"position": [
1712,
1040
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "568b89e0-be16-4977-8c2a-882563174c9b",
"name": "title",
"type": "string",
"value": "={{ $json.title }}"
},
{
"id": "dfbf5a07-d66a-434e-8208-5a14946193de",
"name": "content",
"type": "string",
"value": "={{ $json.contentSnippet }}"
},
{
"id": "b3f87e87-2f95-4d84-a03d-f44f3f206db4",
"name": "link",
"type": "string",
"value": "={{ $json.link }}"
},
{
"id": "74e93f7a-908b-486c-bb2f-02e4f5ff204c",
"name": "pubDate",
"type": "string",
"value": "={{ $json.pubDate }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "6769221a-1d99-4c17-9828-46ee92be5926",
"name": "Combine Articles",
"type": "n8n-nodes-base.aggregate",
"notes": "\ud83d\udcca Aggregates all articles\n\nCombines filtered articles from\nall sources into single dataset\nfor AI processing",
"position": [
1920,
1040
],
"parameters": {
"options": {},
"aggregate": "aggregateAllItemData"
},
"typeVersion": 1
},
{
"id": "6c430d53-cbd3-4881-b86b-48707c9e32a5",
"name": "AI Newsletter Creator",
"type": "@n8n/n8n-nodes-langchain.openAi",
"notes": "\ud83e\udd16 AI-powered article curation\n\nAnalyzes all articles and:\n\u2022 Selects top 10 most relevant\n\u2022 Creates HTML newsletter\n\u2022 Provides article summaries\n\u2022 Focuses on trending topics\n\nRequires: OpenAI API key",
"position": [
2176,
1040
],
"parameters": {
"modelId": {
"__rl": true,
"mode": "list",
"value": "gpt-4o-mini"
},
"options": {},
"messages": {
"values": [
{
"content": "You are an AI Tech News Curator. Analyze the provided articles and create an HTML newsletter with the top 10 most relevant AI/tech articles.\n\nFormat as clean HTML starting with <!DOCTYPE html>\nInclude: article title, brief summary, and link for each article.\nFocus on trending AI, machine learning, and technology topics.\n\nArticles data: {{ JSON.stringify($json.data) }}"
}
]
}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "fb8881bc-7831-43f8-97f7-4a604a4a9806",
"name": "Send Newsletter",
"type": "n8n-nodes-base.gmail",
"notes": "\ud83d\udce7 Sends HTML newsletter via Gmail\n\nSetup:\n1. Enable Gmail API\n2. Create OAuth2 credentials\n3. Update recipient email\n\nFeatures:\n\u2022 HTML email format\n\u2022 Dynamic date in subject\n\u2022 Professional newsletter style",
"position": [
2528,
1040
],
"parameters": {
"sendTo": "user@example.com",
"message": "={{ $json.message.content }}",
"options": {
"appendAttribution": false
},
"subject": "=Daily AI Tech Digest - {{ $now.toFormat('EEEE, MMMM d, yyyy') }}"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "b43da764-1c99-4cdd-8b9c-338753c68826",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-208,
384
],
"parameters": {
"color": 5,
"width": 736,
"height": 1136,
"content": "# AI Tech News Aggregator & Newsletter\n\n### \ud83c\udfaf Key Features\n- **Premium Sources** - Curates from 14 top-tier tech publications\n- **AI Quality Control** - Intelligent article selection and summarization\n- **Balanced Coverage** - Prevents source bias with smart filtering\n- **Professional Format** - Clean HTML newsletter design\n- **Scheduled Automation** - Daily delivery at customizable times\n- **Error Resilience** - Continues processing even if some feeds fail\n\n## Setup Steps\n\n### \u2699\ufe0f Workflow Configuration\n1. **Import the workflow** into your n8n instance\n2. **Update node configurations**:\n - **Google Vertex AI Model**: Set your Google Cloud Project ID\n - **Send Newsletter Email**: Update recipient email address\n - **Daily Newsletter Trigger**: Adjust schedule time if needed\n3. **Verify credentials** are properly connected to respective nodes\n\n### \ud83d\udcf0 RSS Sources Customization (Optional)\nThe workflow includes 14 premium tech news sources:\n- TechCrunch (AI & Startups)\n- The Verge (AI section)\n- MIT Technology Review\n- Wired (AI/Science)\n- VentureBeat (AI)\n- ZDNet (AI topics)\n- AI Trends\n- Nature (Machine Learning)\n- Towards Data Science\n- NY Times Technology\n- The Guardian Technology\n- BBC Technology\n- Nikkei Asia Technology\n\n**To customize sources:**\n- Edit the \"Configure RSS Sources\" node\n- Add/remove RSS feed URLs as needed\n- Ensure feeds are active and properly formatted\n\n### \ud83d\ude80 Testing & Deployment\n1. **Manual Test**: Execute the workflow manually to verify setup\n2. **Check Email**: Confirm newsletter arrives with proper formatting\n3. **Verify AI Output**: Ensure articles are relevant and well-summarized\n4. **Schedule Activation**: Enable the daily trigger for automated operation\n"
},
"typeVersion": 1
},
{
"id": "c96013fe-cde1-4ef2-b833-683fb6269d67",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
560,
400
],
"parameters": {
"color": 3,
"width": 2192,
"height": 848,
"content": "## Workflow\n\n### \ud83d\udca1 Customization Options\n\n**Newsletter Timing:**\n- Default: 8:00 AM UTC daily\n- Modify \"triggerAtHour\" in the Schedule Trigger node\n- Add multiple daily sends if desired\n\n**Content Focus:**\n- Adjust the AI prompt in \"AI Tech News Curator\" node\n- Specify different topics (e.g., focus on startups, enterprise AI, etc.)\n- Change output language or format\n\n**Email Recipients:**\n- Update single recipient in Gmail node\n- Or modify to send to multiple addresses\n- Integrate with mailing list services\n\n**Article Limits:**\n- Current: Max 5 articles per source\n- Modify the filtering logic in \"Filter & Balance Articles\" node\n- Adjust total article count in AI prompt\n"
},
"typeVersion": 1
}
],
"connections": {
"Clean Data": {
"main": [
[
{
"node": "Combine Articles",
"type": "main",
"index": 0
}
]
]
},
"Split RSS URLs": {
"main": [
[
{
"node": "Fetch RSS Articles",
"type": "main",
"index": 0
}
]
]
},
"Filter Articles": {
"main": [
[
{
"node": "Clean Data",
"type": "main",
"index": 0
}
]
]
},
"Combine Articles": {
"main": [
[
{
"node": "AI Newsletter Creator",
"type": "main",
"index": 0
}
]
]
},
"Fetch RSS Articles": {
"main": [
[
{
"node": "Filter Articles",
"type": "main",
"index": 0
}
]
]
},
"AI Newsletter Creator": {
"main": [
[
{
"node": "Send Newsletter",
"type": "main",
"index": 0
}
]
]
},
"Configure RSS Sources": {
"main": [
[
{
"node": "Split RSS URLs",
"type": "main",
"index": 0
}
]
]
},
"Daily Newsletter Trigger": {
"main": [
[
{
"node": "Configure RSS Sources",
"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.
gmailOAuth2openAiApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
How this works
Stay effortlessly informed on your favourite topics with this workflow, which curates and delivers a personalised daily newsletter straight to your Gmail inbox. It suits busy professionals or enthusiasts who want AI-generated summaries of the latest news without spending time browsing multiple sources. The key step involves OpenAI analysing fetched RSS articles to craft concise, engaging insights from your selected feeds, ensuring relevant content arrives automatically each morning.
Use this when you rely on 3-5 consistent RSS sources for industry updates and prefer a single, digestible email over fragmented alerts. Avoid it for real-time breaking news, as the scheduled trigger suits daily over hourly cadences; opt instead for manual triggers in those cases. Common variations include swapping Gmail for Slack notifications or expanding to weekly roundups by adjusting the cron schedule.
About this workflow
Awesome N8N Templates. Uses scheduleTrigger, splitOut, rssFeedRead, openAi. Scheduled trigger; 11 nodes.
Source: https://github.com/ScraperNode/awesome-n8n-templates/blob/main/templates/ai-and-llm/7874-daily-tech-news-curation-with-rss-gpt-4o-mini-and-gmail-delivery/workflow.json — 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.
News_Tech_EN. Uses rssFeedRead, stickyNote, sort, gmail. Scheduled trigger; 48 nodes.
Stop finding out you're out of stock after a customer already tried to buy. This workflow monitors your entire product inventory daily, calculates how fast each SKU is selling, and automatically raise
Limit Code. Uses httpRequest, gmail, scheduleTrigger, markdown. Scheduled trigger; 23 nodes.
Limit Code. Uses stickyNote, gmail, httpRequest, markdown. Scheduled trigger; 23 nodes.
The scoreboard shows you what happened. This workflow tells you why it happened. Every time an IPL match ends this automation detects the completed result, fetches the full scorecard, and sends it to