AutomationFlowsEmail & Gmail › Send a Daily AI News Digest Email with Google News, Openrouter, and Gmail

Send a Daily AI News Digest Email with Google News, Openrouter, and Gmail

ByRavi Patel @ravipatel7210 on n8n.io

This workflow runs daily and pulls the latest AI-related News from three Google News RSS searches, uses an OpenRouter LLM to pick and summarize the top items, then formats the results into a styled HTML digest and sends it via Gmail. Runs every day at 9:00 based on the schedule…

Cron / scheduled trigger★★★★☆ complexityAI-powered18 nodesChain LlmGmailOpenRouter ChatRSS Feed Read
Email & Gmail Trigger: Cron / scheduled Nodes: 18 Complexity: ★★★★☆ AI nodes: yes Added:

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

This workflow follows the Chainllm → Gmail 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": "9ckdgFmwv2LBSjHH",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "100% Free Daily News Digest via Google News RSS",
  "tags": [],
  "nodes": [
    {
      "id": "5acd58ec-aa3f-41cd-b4b3-984766d1ec5f",
      "name": "Merge All RSS Feeds",
      "type": "n8n-nodes-base.merge",
      "position": [
        720,
        160
      ],
      "parameters": {
        "numberInputs": 3
      },
      "typeVersion": 3
    },
    {
      "id": "be4c7828-7cfc-42bf-804f-273620458459",
      "name": "Prepare Articles",
      "type": "n8n-nodes-base.code",
      "position": [
        1088,
        176
      ],
      "parameters": {
        "jsCode": "// Get items from all 3 RSS feeds\nconst allItems = $input.all();\n\n// Collect all articles\nlet articles = [];\nfor (const item of allItems) {\n  const d = item.json;\n  if (d.title && d.link) {\n    articles.push({\n      title: d.title || 'No Title',\n      link: d.link || d.url || '#',\n      pubDate: d.pubDate || d.isoDate || 'Unknown Date',\n      source: d.creator || d['dc:creator'] || 'Unknown Source',\n      summary: (d.contentSnippet || d.content || d.description || '').replace(/<[^>]*>/g, '').substring(0, 300)\n    });\n  }\n}\n\n// Remove duplicates by title and limit to 15 articles\nconst seen = new Set();\nconst unique = articles.filter(a => {\n  if (seen.has(a.title)) return false;\n  seen.add(a.title);\n  return true;\n}).slice(0, 15);\n\nreturn [{ json: { articles: unique, count: unique.length, date: new Date().toLocaleDateString('en-IN', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' }) } }];"
      },
      "typeVersion": 2
    },
    {
      "id": "2350c11c-e84b-4e32-949b-1269b7e2b539",
      "name": "AI Chain - Select & Summarize",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        1424,
        176
      ],
      "parameters": {
        "text": "=You are an AI news curator. Today is {{ $json.date }}.\n\nHere are {{ $json.count }} latest AI news articles:\n\n{{ $json.articles.map((a, i) => `${i+1}. **${a.title}**\\nSource: ${a.source}\\nDate: ${a.pubDate}\\nSummary: ${a.summary}\\nLink: ${a.link}`).join('\\n\\n') }}\n\nPlease:\n1. Select the TOP 8 most important and interesting AI news items\n2. Write a 2-3 sentence summary for each selected article\n3. Add a brief 'Why it matters' point for each\n4. Format your response as a JSON array like this:\n[\n  {\n    \"rank\": 1,\n    \"title\": \"Article title\",\n    \"link\": \"article url\",\n    \"summary\": \"Your 2-3 sentence summary\",\n    \"why_it_matters\": \"Brief explanation\",\n    \"source\": \"source name\"\n  }\n]\n\nRespond with ONLY the JSON array, no other text.",
        "promptType": "define"
      },
      "typeVersion": 1.4,
      "ai_languageModel": {
        "id": "1a2b3c4d-0007-0007-0007-000000000007",
        "name": "Google Gemini - Summarize"
      }
    },
    {
      "id": "fb525ca1-5e77-4ccc-a288-b24c2d163026",
      "name": "Build HTML Email",
      "type": "n8n-nodes-base.code",
      "position": [
        1872,
        176
      ],
      "parameters": {
        "jsCode": "const rawText = $input.first().json.text || '';\n\n// Extract JSON from AI response\nlet newsItems = [];\ntry {\n  const jsonMatch = rawText.match(/\\[\\s*\\{[\\s\\S]*\\}\\s*\\]/);\n  if (jsonMatch) {\n    newsItems = JSON.parse(jsonMatch[0]);\n  }\n} catch(e) {\n  newsItems = [{ rank: 1, title: 'AI News Digest', link: '#', summary: rawText.substring(0, 500), why_it_matters: 'Check full article for details', source: 'AI News' }];\n}\n\nconst date = new Date().toLocaleDateString('en-IN', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' });\n\n// Build HTML Email\nconst articlesHtml = newsItems.map((item, idx) => `\n  <div style=\"background:#ffffff;border-radius:12px;padding:24px;margin-bottom:20px;border:1px solid #e8e8e8;box-shadow:0 2px 8px rgba(0,0,0,0.06);\">\n    <div style=\"display:flex;align-items:center;gap:12px;margin-bottom:12px;\">\n      <span style=\"background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;border-radius:50%;width:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;font-weight:700;font-size:14px;flex-shrink:0;\">${item.rank || idx + 1}</span>\n      <a href=\"${item.link}\" style=\"color:#1a1a2e;font-size:17px;font-weight:700;text-decoration:none;line-height:1.3;\">${item.title}</a>\n    </div>\n    <p style=\"color:#555;font-size:15px;line-height:1.7;margin:0 0 12px 0;\">${item.summary}</p>\n    <div style=\"background:#f0f7ff;border-left:4px solid #667eea;padding:12px 16px;border-radius:0 8px 8px 0;margin-bottom:12px;\">\n      <span style=\"color:#667eea;font-weight:600;font-size:13px;\">\ud83d\udca1 Why It Matters: </span>\n      <span style=\"color:#444;font-size:13px;\">${item.why_it_matters}</span>\n    </div>\n    <div style=\"display:flex;justify-content:space-between;align-items:center;\">\n      <span style=\"color:#888;font-size:12px;\">\ud83d\udcf0 ${item.source}</span>\n      <a href=\"${item.link}\" style=\"background:#667eea;color:#fff;padding:8px 16px;border-radius:20px;text-decoration:none;font-size:13px;font-weight:600;\">Read Full Article \u2192</a>\n    </div>\n  </div>\n`).join('');\n\nconst emailHtml = `\n<!DOCTYPE html>\n<html>\n<head><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"></head>\n<body style=\"margin:0;padding:0;background:#f5f5f5;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;\">\n  <div style=\"max-width:680px;margin:0 auto;padding:20px;\">\n    \n    <!-- Header -->\n    <div style=\"background:linear-gradient(135deg,#667eea 0%,#764ba2 100%);border-radius:16px;padding:32px;text-align:center;margin-bottom:24px;\">\n      <div style=\"font-size:40px;margin-bottom:8px;\">\ud83e\udd16</div>\n      <h1 style=\"color:#fff;margin:0 0 8px 0;font-size:26px;font-weight:800;\">Daily AI News Digest</h1>\n      <p style=\"color:rgba(255,255,255,0.85);margin:0;font-size:15px;\">${date}</p>\n      <div style=\"background:rgba(255,255,255,0.2);border-radius:20px;padding:6px 16px;display:inline-block;margin-top:12px;\">\n        <span style=\"color:#fff;font-size:13px;font-weight:600;\">Top ${newsItems.length} Stories of the Day</span>\n      </div>\n    </div>\n\n    <!-- Articles -->\n    ${articlesHtml}\n\n    <!-- Footer -->\n    <div style=\"text-align:center;padding:24px;color:#999;font-size:12px;\">\n      <p style=\"margin:0 0 4px 0;\">\ud83d\ude80 Powered by <strong>AI Automation</strong></p>\n      <p style=\"margin:0;\">Google RSS Feed \u2022 AI News</p>\n    </div>\n  </div>\n</body>\n</html>\n`;\n\nreturn [{ json: { emailHtml, subject: `\ud83e\udd16 Daily AI News Digest - ${date} (${newsItems.length} Stories)`, articleCount: newsItems.length } }];"
      },
      "typeVersion": 2
    },
    {
      "id": "4650b2ec-f30e-4e99-8522-36c112b16a1c",
      "name": "Send Email via Gmail",
      "type": "n8n-nodes-base.gmail",
      "position": [
        2208,
        176
      ],
      "parameters": {
        "sendTo": "user@example.com",
        "message": "={{ $json.emailHtml }}",
        "options": {
          "appendAttribution": false
        },
        "subject": "={{ $json.subject }}"
      },
      "typeVersion": 2.1
    },
    {
      "id": "a7cbabbb-1e61-4f9d-8ea8-96c3acb0e364",
      "name": "OpenRouter Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "position": [
        1424,
        368
      ],
      "parameters": {
        "model": "nvidia/nemotron-3-super-120b-a12b:free",
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "536bd1a1-10cd-455f-ad89-d9e2888b30a9",
      "name": "Gen AI + LLM",
      "type": "n8n-nodes-base.rssFeedRead",
      "position": [
        368,
        176
      ],
      "parameters": {
        "url": "https://news.google.com/rss/search?q=generative+AI+LLM+when:1d&hl=en-US&gl=US&ceid=US:en",
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "3bf6f7ee-9ee6-44d1-82b4-51a1e3a49f66",
      "name": "AI Agent",
      "type": "n8n-nodes-base.rssFeedRead",
      "position": [
        368,
        336
      ],
      "parameters": {
        "url": "https://news.google.com/rss/search?q=AI+agents+automation+tools+when:1d&hl=en-US&gl=US&ceid=US:en",
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "fdeeafbc-409b-4fb5-a120-318056941a87",
      "name": "Artificial Intelligence",
      "type": "n8n-nodes-base.rssFeedRead",
      "position": [
        368,
        16
      ],
      "parameters": {
        "url": "https://news.google.com/rss/search?q=artificial+intelligence+when:1d&hl=en-US&gl=US&ceid=US:en",
        "options": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "16ee74fd-50aa-410b-9ff3-bf21f7a59312",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -112,
        -144
      ],
      "parameters": {
        "width": 304,
        "height": 480,
        "content": "## Node 1: Schedule Trigger (9 AM)\n\n* What It Does\nAutomatically starts the workflow every day at 9:00 AM (UTC).\n\n\n* How to Set Up\nClick the Schedule Trigger node\n\nSet Trigger Interval \u2192 Days\n\nLeave all other settings as default"
      },
      "typeVersion": 1
    },
    {
      "id": "ff951938-8af4-46f3-8546-c60cb129aed8",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        256,
        -336
      ],
      "parameters": {
        "color": 2,
        "width": 304,
        "height": 864,
        "content": "## Node 2: Artificial Intelligence (RSS Feed)\n\n* Position: Connected from Schedule Trigger \u2192 input 0 of Merge node\n\n* What It Does\nFetches the latest news articles from Google News using the keyword \"artificial intelligence\" covers broad AI news from the last 24 hours.\n\n### How to Set Up\nRSS Feed Read node\n\nLeave all other options as default\n"
      },
      "typeVersion": 1
    },
    {
      "id": "19100762-b975-4e5b-be55-68a88a585393",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        608,
        -128
      ],
      "parameters": {
        "color": 3,
        "width": 304,
        "height": 480,
        "content": "## Node 5: Merge All RSS Feeds\nPosition: After all 3 RSS nodes \u2192 before Prepare Articles\n\n* What It Does\nCombines the output of all 3 RSS Feed nodes into one single stream so the next node can process all articles together.\n\nLeave all other options as default\n"
      },
      "typeVersion": 1
    },
    {
      "id": "d2247551-5004-458a-bedf-5e75106c4c93",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        992,
        -128
      ],
      "parameters": {
        "color": 4,
        "width": 304,
        "height": 448,
        "content": "## Node 6: Prepare Articles (Code)\nPosition: After Merge node \u2192 before AI Chain node\n\n* What It Does\nLoops through all merged RSS articles, extracts title, link, date, source, and summary. Removes HTML tags from text, eliminates duplicate articles, and limits output to 15 unique stories. Passes a clean JSON object to the AI.\n\nLeave all other options as default\n"
      },
      "typeVersion": 1
    },
    {
      "id": "816fc2fb-971d-4c73-9776-6769c2adbdfa",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1376,
        -496
      ],
      "parameters": {
        "color": 5,
        "width": 304,
        "height": 1024,
        "content": "## Node 7: OpenRouter Chat Model\nPosition: Sub-node  connects to the purple AI Language Model connector at the bottom of the AI Chain node (Node 8)\n\n### What It Does\n* Provides the free AI model to the AI Chain node. Uses nvidia/nemotron-3-super-120b-a12b:free from OpenRouter  a 120B parameter model available completely free with no credit card needed.\n\n### How to Set Up\n* Add an OpenRouter Chat Model node (found under AI \u2192 Language Models)\n\n* Set Model \u2192 nvidia/nemotron-3-super-120b-a12b:free\n\n* Select your OpenRouter API credential\n\n* If not created yet: go to openrouter.ai \u2192 Sign up free \u2192 API Keys \u2192 Create Key \u2192 copy it \u2192 in n8n go to Credentials \u2192 New \u2192 OpenRouter API \u2192 paste key \u2192 Save\n\n\u26a0\ufe0f Important: Connect this node to the purple AI Language Model connector at the bottom of Node 8  NOT the green main connector\n\nLeave all other options as default"
      },
      "typeVersion": 1
    },
    {
      "id": "bff7f502-5008-4769-b25e-79bb20b2359b",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1760,
        -128
      ],
      "parameters": {
        "color": 6,
        "width": 304,
        "height": 464,
        "content": "## Node 8: AI Chain Select & Summarize\n* Position: After Prepare Articles \u2192 before Build HTML Email. Receives OpenRouter Chat Model as sub-node.\n\n### What It Does\n* Sends all 15* articles to the AI model with a structured prompt. The AI selects the top 8 most important stories, writes a 2\u20133 sentence summary for each, and adds a \"Why It Matters\" insight. Returns a clean JSON array."
      },
      "typeVersion": 1
    },
    {
      "id": "5ac1858a-5c6b-4f74-ba2f-7cbb0caded7d",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2112,
        -128
      ],
      "parameters": {
        "color": 7,
        "width": 304,
        "height": 464,
        "content": "## Node 9: Build HTML Email (Code)\n* Position: After AI Chain node \u2192 before Send Email via Gmail\n\n* What It Does\nReads the JSON array from the AI, then builds a complete styled HTML email with a gradient header, numbered article cards, a \"Why It Matters\" callout box for each story, source credits, and read buttons. Outputs the final emailHtml and subject for the Gmail node."
      },
      "typeVersion": 1
    },
    {
      "id": "bb2d8c2c-c89a-477e-8336-38ad17ed3c3c",
      "name": "Schedule Trigger (9 AM)",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -16,
        176
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 9
            }
          ]
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "91233706-e13c-4753-8670-46005367dccb",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -896,
        -160
      ],
      "parameters": {
        "width": 672,
        "height": 544,
        "content": "## 100% Free Daily AI News Digest via Google News RSS\n\n\n* Runs every day at 9:00 AM IST\n\n* 100% free workflow\n\n* Sources: 3 Google News RSS searches\n\n      --> artificial intelligence\n      --> generative AI + LLM\n      --> AI agents + automation tools\n\n\n### Flow:\nSchedule \u2192 RSS \u2192 Merge \u2192 Prepare Articles \u2192 OpenRouter AI \u2192 Build HTML Email \u2192 Gmail\n\n\n### Credentials needed:\n* OpenRouter API\n*Gmail OAuth2\n\n### Edit before use:\n* Change recipient email in Gmail node\n* Keep OpenRouter connected to AI Chain with purple connector"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "executionOrder": "v1"
  },
  "versionId": "81b6da23-29a8-4514-8790-7f883f3c26a9",
  "connections": {
    "AI Agent": {
      "main": [
        [
          {
            "node": "Merge All RSS Feeds",
            "type": "main",
            "index": 2
          }
        ]
      ]
    },
    "Gen AI + LLM": {
      "main": [
        [
          {
            "node": "Merge All RSS Feeds",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Build HTML Email": {
      "main": [
        [
          {
            "node": "Send Email via Gmail",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Articles": {
      "main": [
        [
          {
            "node": "AI Chain - Select & Summarize",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge All RSS Feeds": {
      "main": [
        [
          {
            "node": "Prepare Articles",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenRouter Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI Chain - Select & Summarize",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Artificial Intelligence": {
      "main": [
        [
          {
            "node": "Merge All RSS Feeds",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger (9 AM)": {
      "main": [
        [
          {
            "node": "Artificial Intelligence",
            "type": "main",
            "index": 0
          },
          {
            "node": "AI Agent",
            "type": "main",
            "index": 0
          },
          {
            "node": "Gen AI + LLM",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Chain - Select & Summarize": {
      "main": [
        [
          {
            "node": "Build HTML Email",
            "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

This workflow runs daily and pulls the latest AI-related News from three Google News RSS searches, uses an OpenRouter LLM to pick and summarize the top items, then formats the results into a styled HTML digest and sends it via Gmail. Runs every day at 9:00 based on the schedule…

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

More Email & Gmail workflows → · Browse all categories →

Related workflows

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

Email & Gmail

workflow. Uses rssFeedRead, lmChatDeepSeek, chainLlm, gmail. Scheduled trigger; 10 nodes.

RSS Feed Read, Lm Chat Deep Seek, Chain Llm +1
Email & Gmail

This template automates the complete hiring pipeline for digital agencies managing applications across multiple job roles. When a candidate submits a Google Form with their CV, the system scores it wi

OpenRouter Chat, Output Parser Structured, Google Sheets +6
Email & Gmail

News_Tech_EN. Uses rssFeedRead, stickyNote, sort, gmail. Scheduled trigger; 48 nodes.

RSS Feed Read, Gmail, Google Gemini
Email & Gmail

🎦💌Advanced YouTube RSS Feed Buddy for Your Favorite Channels. Uses formTrigger, httpRequest, stickyNote, lmChatOpenAi. Event-driven trigger; 41 nodes.

Form Trigger, HTTP Request, OpenAI Chat +4
Email & Gmail

Doc Processing. Uses chainLlm, lmChatGroq, googleDrive, googleSheets. Scheduled trigger; 39 nodes.

Chain Llm, Groq Chat, Google Drive +3