This workflow corresponds to n8n.io template #10168 — we link there as the canonical source.
This workflow follows the Agent → Google Sheets 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 →
{
"id": "L75BmalAEZZ1orS5",
"name": "RSS Feed Intelligence Hub with Daily Slack Digest",
"tags": [],
"nodes": [
{
"id": "b53e19f4-42d6-4433-be23-dee9d43d4c96",
"name": "Daily Morning Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
1088,
160
],
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 8
}
]
}
},
"typeVersion": 1.2
},
{
"id": "df28a219-fa77-408f-b842-1394c04bd8db",
"name": "Workflow Configuration",
"type": "n8n-nodes-base.set",
"position": [
1408,
160
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "id-1",
"name": "rssFeeds",
"type": "array",
"value": "[\"https://techcrunch.com/feed/\"]"
},
{
"id": "id-2",
"name": "notionDatabaseId",
"type": "string",
"value": "296863ef60d880f28e32e8212b244d30"
},
{
"id": "id-3",
"name": "slackChannel",
"type": "string",
"value": "#general"
}
]
},
"includeOtherFields": true
},
"typeVersion": 3.4
},
{
"id": "7f7de5b9-dd1a-4a5a-9eb3-c85030a8bb59",
"name": "Read RSS Feeds",
"type": "n8n-nodes-base.rssFeedRead",
"position": [
2016,
64
],
"parameters": {
"url": "={{ $json.rssFeeds }}",
"options": {}
},
"typeVersion": 1.2
},
{
"id": "f6b25f54-0635-4498-b878-4468c633c932",
"name": "AI Summarizer and Tagger",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
2256,
64
],
"parameters": {
"text": "You are an expert content analyst.\nYour task is to analyze the provided RSS feed item based on the tag dictionary below.\n\nHere is the dictionary of available tags you MUST use:\n{{ JSON.stringify($('Aggregate Tags').first().json.tagDictionary) }}\n\n---\n\nNow, analyze the following RSS feed item:\nTitle: {{ $json.title }}\nContent: {{ $json.content }}\n\nBased on the content and the tag dictionary, create a 3-line summary and assign relevant tags.\nOutput a single, valid JSON object with these fields: \"title\", \"summary\" (max 3 lines), \"tags\" (array of strings), \"priority\" (integer 1-5, 5 is most important), \"url\", \"publishedDate\".\n\n**IMPORTANT: You MUST only output the JSON object itself. Do not include any explanatory text, markdown formatting (like ```json), or anything else before or after the JSON object.**",
"options": {},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 2.2
},
{
"id": "fb2fe89f-b551-47e0-a133-cb585c92a517",
"name": "Get Tag Dictionary",
"type": "n8n-nodes-base.googleSheets",
"position": [
1712,
256
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1dLUTeDxFv8zOeVXDB6_e05BsZBWrG_Ar-r4T8V0GacE/edit#gid=0",
"cachedResultName": "Tags"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "1dLUTeDxFv8zOeVXDB6_e05BsZBWrG_Ar-r4T8V0GacE"
}
},
"typeVersion": 4.7
},
{
"id": "92010737-ab4a-49de-a1ee-670759347865",
"name": "Parse AI Output",
"type": "n8n-nodes-base.code",
"position": [
2624,
64
],
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "// Parse AI agent output and extract relevant fields\nlet aiOutput = $input.item.json.output;\n\n// --- START: AI Output Cleaning ---\nconst jsonMatch = aiOutput.match(/\\{[\\s\\S]*\\}/);\nif (jsonMatch) {\n aiOutput = jsonMatch[0];\n} else {\n aiOutput = null; \n}\n// --- END: AI Output Cleaning ---\n\nlet parsedData;\ntry {\n if (aiOutput === null) throw new Error(\"No valid JSON object found in AI output.\");\n parsedData = JSON.parse(aiOutput);\n} catch (e) {\n // Parsing failed, return data that won't cause a Notion API error\n return { \n title: 'Error: Failed to parse AI output', \n summary: $input.item.json.output, // Keep original output for debugging\n tags: [], \n priority: 1, \n url: null, \n publishedDate: null \n };\n}\n\n// === START: Notion Multi-Select Fix ===\nconst tagsArray = parsedData.tags || [];\n// === END: Notion Multi-Select Fix ===\n\n// === START: Robust Notion Date Fix ===\n// Ensure the publishedDate is a valid ISO string or null.\nlet notionDate = null;\nif (parsedData.publishedDate) {\n const dateObject = new Date(parsedData.publishedDate);\n \n // Create a Date object and check if it's a valid date.\n // isNaN(dateObject.getTime()) is a reliable way to check for \"Invalid Date\".\n if (dateObject instanceof Date && !isNaN(dateObject.getTime())) {\n notionDate = dateObject.toISOString();\n } else {\n // If the date string is invalid, notionDate remains null.\n console.log(`Could not parse date: ${parsedData.publishedDate}`);\n }\n}\n// === END: Robust Notion Date Fix ===\n\n\n// Extract the fields and create the final result object\nconst result = {\n title: parsedData.title || '',\n summary: parsedData.summary || '',\n tags: tagsArray,\n priority: parsedData.priority || 1,\n url: parsedData.url || null,\n publishedDate: notionDate \n};\n\nreturn result;"
},
"typeVersion": 2
},
{
"id": "808a0b99-b2d7-4b4e-970a-c3f8e189e87c",
"name": "Write to Notion Database",
"type": "n8n-nodes-base.notion",
"position": [
2944,
64
],
"parameters": {
"title": "={{ $json.title }}",
"options": {},
"resource": "databasePage",
"databaseId": {
"__rl": true,
"mode": "id",
"value": "={{ $('Workflow Configuration').first().json.notionDatabaseId }}"
},
"propertiesUi": {
"propertyValues": [
{
"key": "summary|rich_text",
"textContent": "={{ $json.summary }}"
},
{
"key": "tags|multi_select",
"multiSelectValue": "={{ $json.tags }}"
},
{
"key": "priority|number",
"numberValue": "={{ $json.priority }}"
},
{
"key": "url|url",
"urlValue": "={{ $json.url }}"
},
{
"key": "publishedDate|date",
"date": "={{ $json.publishedDate }}"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "970b77bd-6c52-43b8-800a-2d236d9a7cd3",
"name": "Sort by Priority",
"type": "n8n-nodes-base.sort",
"position": [
3248,
64
],
"parameters": {
"options": {},
"sortFieldsUi": {
"sortField": [
{
"order": "descending",
"fieldName": "property_priority"
}
]
}
},
"typeVersion": 1
},
{
"id": "075978c2-5ee8-453e-a75e-0fb7708889a2",
"name": "Top 3 Headlines",
"type": "n8n-nodes-base.limit",
"position": [
3568,
64
],
"parameters": {
"maxItems": 3
},
"typeVersion": 1
},
{
"id": "643c4d99-f909-4287-ab22-203526c96c02",
"name": "Format Slack Message",
"type": "n8n-nodes-base.code",
"position": [
3872,
64
],
"parameters": {
"jsCode": "// Format top 3 items into a Slack message\nconst items = $input.all();\n\n// Slack\u306e\u6539\u884c\u306b\u306f \\\\n \u3067\u306f\u306a\u304f \\n \u3092\u4f7f\u3044\u307e\u3059\nlet message = \"*\ud83d\udcf0 Your Daily Top 3 Headlines*\\n\\n\";\n\nfor (let i = 0; i < items.length; i++) {\n const item = items[i].json;\n const number = i + 1;\n \n // Notion\u30ce\u30fc\u30c9\u304b\u3089\u306e\u30c7\u30fc\u30bf\u540d\u306b\u5408\u308f\u305b\u3066\u30d7\u30ed\u30d1\u30c6\u30a3\u3092\u53d6\u5f97\n const title = item.name || 'No Title';\n const summary = item.property_summary || 'No summary available';\n const tags = item.property_tags || [];\n const url = item.property_url;\n \n message += `*${number}. ${title}*\\n`;\n message += `${summary}\\n`;\n \n // \u30bf\u30b0\u306e\u8868\u793a\u90e8\u5206\u3082\u4fee\u6b63\n if (tags.length > 0) {\n const tagNames = tags.map(tag => tag.name); // \u30bf\u30b0\u540d\u3092\u53d6\u5f97\n message += `\ud83c\udff7\ufe0f Tags: ${tagNames.join(', ')}\\n`;\n }\n \n if (url) {\n message += `\ud83d\udd17 <${url}|Read more>\\n`;\n }\n \n // \u5404\u9805\u76ee\u306e\u9593\u306b\u30b9\u30da\u30fc\u30b9\u3092\u5165\u308c\u307e\u3059\n message += \"\\n\";\n}\n\nreturn [{ json: { message } }];"
},
"typeVersion": 2
},
{
"id": "4b73b33f-b7b8-4305-9f96-afecab761db2",
"name": "Post to Slack",
"type": "n8n-nodes-base.slack",
"position": [
4176,
64
],
"parameters": {
"text": "={{ $json.message }}",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "id",
"value": "={{ $('Workflow Configuration').first().json.slackChannel }}"
},
"otherOptions": {},
"authentication": "oAuth2"
},
"typeVersion": 2.3
},
{
"id": "2b77e4b0-f37e-4d05-a4c9-4b6f4015ef1e",
"name": "Code in JavaScript",
"type": "n8n-nodes-base.code",
"position": [
1712,
64
],
"parameters": {
"jsCode": "const rssFeedsArray = $input.item.json.rssFeeds;\nconst outputItems = [];\n\nfor (const feedUrl of rssFeedsArray) {\n outputItems.push({ \n json: { \n rssFeeds: feedUrl \n } \n });\n}\n\nreturn outputItems;"
},
"typeVersion": 2
},
{
"id": "cb8efc38-c306-4c35-ae0e-230a28686529",
"name": "Aggregate Tags",
"type": "n8n-nodes-base.code",
"position": [
2016,
256
],
"parameters": {
"jsCode": "// Google\u30b7\u30fc\u30c8\u306e\u5168\u884c\u3092\u53d7\u3051\u53d6\u308a\u3001'tagDictionary'\u3068\u3044\u3046\u4e00\u3064\u306e\u30ea\u30b9\u30c8\u306b\u307e\u3068\u3081\u307e\u3059\u3002\nconst allTags = $input.all().map(item => item.json);\n\n// \u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u306e\u5f8c\u7d9a\u30ce\u30fc\u30c9\u304c\u4f7f\u3044\u3084\u3059\u3044\u3088\u3046\u306b\u3001\u4e00\u3064\u306e\u30a2\u30a4\u30c6\u30e0\u3068\u3057\u3066\u51fa\u529b\u3057\u307e\u3059\u3002\nreturn [{ json: { tagDictionary: allTags } }];"
},
"typeVersion": 2
},
{
"id": "335c2541-e71d-4992-afd2-1262aa810ae2",
"name": "Google Gemini Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
2240,
256
],
"parameters": {
"options": {},
"modelName": "models/gemini-2.0-flash-lite"
},
"typeVersion": 1
},
{
"id": "e4c64295-aad1-4a04-a328-9fd9a1d51614",
"name": "Note: Daily Morning Trigger",
"type": "n8n-nodes-base.stickyNote",
"position": [
1024,
-144
],
"parameters": {
"color": "white",
"height": 176,
"content": "**Purpose:** Kicks off the workflow every morning.\n**Key setting:** Change trigger hour in the node options.\n**Tip:** Switch to weekdays only if you don't brief on weekends."
},
"typeVersion": 1
},
{
"id": "51d8fc1b-5195-42cb-85b7-6d1d00a4829d",
"name": "Note: Workflow Configuration",
"type": "n8n-nodes-base.stickyNote",
"position": [
1344,
-144
],
"parameters": {
"color": "white",
"height": 176,
"content": "**Purpose:** Central config hub.\n**Fields:** `rssFeeds` (array), `notionDatabaseId` (string), `slackChannel` (string).\n**Tip:** Keep all user-editable values here."
},
"typeVersion": 1
},
{
"id": "37dfe9c2-c412-454b-8aa5-ed580d2c88dc",
"name": "Note: Code in JavaScript",
"type": "n8n-nodes-base.stickyNote",
"position": [
1648,
-144
],
"parameters": {
"color": "white",
"height": 176,
"content": "**Purpose:** Splits the `rssFeeds` array into one item per feed URL.\n**Why:** Lets downstream nodes process feeds independently."
},
"typeVersion": 1
},
{
"id": "24192a09-f208-4eaa-837e-00ccece1d873",
"name": "Note: Read RSS Feeds",
"type": "n8n-nodes-base.stickyNote",
"position": [
1952,
-144
],
"parameters": {
"color": "white",
"height": 176,
"content": "**Purpose:** Fetches articles for each feed URL.\n**Output:** Items with `title`, `content`, `link`, `pubDate`, etc."
},
"typeVersion": 1
},
{
"id": "21304a64-1034-44ba-97c8-f4040d074fc4",
"name": "Note: Get Tag Dictionary",
"type": "n8n-nodes-base.stickyNote",
"position": [
1648,
416
],
"parameters": {
"color": "white",
"content": "**Purpose:** Loads the Tag Dictionary from Google Sheets.\n**Note:** Reconnect your own Google Sheets credential in n8n."
},
"typeVersion": 1
},
{
"id": "ccd7838e-b26f-4e95-ab9f-4c3deb157c94",
"name": "Note: Aggregate Tags",
"type": "n8n-nodes-base.stickyNote",
"position": [
1952,
416
],
"parameters": {
"color": "white",
"content": "**Purpose:** Combines all sheet rows into `tagDictionary` (single item).\n**Downstream:** Used by the AI node to enforce consistent tagging."
},
"typeVersion": 1
},
{
"id": "7f6c10fb-10ad-4f39-90a7-713af4b676a6",
"name": "Note: Google Gemini Chat Model",
"type": "n8n-nodes-base.stickyNote",
"position": [
2256,
416
],
"parameters": {
"color": "white",
"content": "**Purpose:** Provides the LLM runtime for the AI agent.\n**Note:** Reconnect your own Gemini (PaLM) API credential in n8n."
},
"typeVersion": 1
},
{
"id": "32def482-d498-47a1-8905-6b7ec2629307",
"name": "Note: AI Summarizer and Tagger",
"type": "n8n-nodes-base.stickyNote",
"position": [
2256,
-144
],
"parameters": {
"color": "white",
"height": 176,
"content": "**Purpose:** Produces a strict JSON payload: title, summary (\u22643 lines), tags[], priority (1\u20135), url, publishedDate.\n**Prompt tip:** Update wording and tag schema as your taxonomy evolves."
},
"typeVersion": 1
},
{
"id": "be9475cf-e641-4b92-9845-84b71cda8c6d",
"name": "Note: Parse AI Output",
"type": "n8n-nodes-base.stickyNote",
"position": [
2560,
-144
],
"parameters": {
"color": "white",
"height": 176,
"content": "**Purpose:** Validates and normalizes AI JSON.\n**Includes:** JSON-safe extraction, Notion date formatting, tag array fix."
},
"typeVersion": 1
},
{
"id": "e985e8c7-c9ea-4e3b-b568-a6e3105980d4",
"name": "Note: Write to Notion Database",
"type": "n8n-nodes-base.stickyNote",
"position": [
2864,
-144
],
"parameters": {
"color": "white",
"width": 256,
"height": 176,
"content": "**Purpose:** Creates a Notion page per item.\n**Mapping:** summary\u2192rich_text, tags\u2192multi_select, priority\u2192number, url\u2192url, publishedDate\u2192date.\n**Note:** Reconnect Notion credential."
},
"typeVersion": 1
},
{
"id": "deb714fc-9818-48a1-a6b4-dd3dacc4414e",
"name": "Note: Sort by Priority",
"type": "n8n-nodes-base.stickyNote",
"position": [
3184,
-144
],
"parameters": {
"color": "white",
"height": 176,
"content": "**Purpose:** Orders items by `priority` (desc).\n**Tip:** Change to `publishedDate` or hybrid scoring if preferred."
},
"typeVersion": 1
},
{
"id": "8817c32a-ed51-4086-b7a8-75f1c81f05ef",
"name": "Note: Top 3 Headlines",
"type": "n8n-nodes-base.stickyNote",
"position": [
3488,
-144
],
"parameters": {
"color": "white",
"height": 176,
"content": "**Purpose:** Limits items to the top three for Slack brevity.\n**Tip:** Adjust `maxItems` for longer digests."
},
"typeVersion": 1
},
{
"id": "c5cbb7ef-b3c3-416a-9bc1-47852f1edaa5",
"name": "Note: Format Slack Message",
"type": "n8n-nodes-base.stickyNote",
"position": [
3792,
-144
],
"parameters": {
"color": "white",
"height": 176,
"content": "**Purpose:** Builds a readable Slack digest.\n**Includes:** Title, summary, tags, and `Read more` URL per item."
},
"typeVersion": 1
},
{
"id": "f7ee2819-01f5-4150-9c5a-33c22d000066",
"name": "Note: Post to Slack",
"type": "n8n-nodes-base.stickyNote",
"position": [
4096,
-144
],
"parameters": {
"color": "white",
"height": 176,
"content": "**Purpose:** Sends the digest to your channel.\n**Config:** Uses `slackChannel` from the Set node.\n**Note:** Reconnect Slack OAuth2 credential."
},
"typeVersion": 1
},
{
"id": "a1b407c5-4e5a-4cff-9e19-b7d0d131b893",
"name": "Template Overview",
"type": "n8n-nodes-base.stickyNote",
"position": [
288,
-384
],
"parameters": {
"color": "yellow",
"width": 608,
"height": 688,
"content": "## RSS Feed Intelligence Hub with Daily Slack Digest\n\n**Who\u2019s it for** \nTeams that track multiple news sources and want an automated, tagged, and prioritized daily briefing in Slack (PMM, PR/Comms, Sales/CS, founders).\n\n**How it works / What it does** \n1) Runs each morning. \n2) Loads **rssFeeds**, **notionDatabaseId**, **slackChannel** from *Workflow Configuration (Set)*. \n3) Reads each RSS feed \u2192 summarizes & tags via **AI Summarizer and Tagger** (with **Aggregate Tags** dictionary). \n4) Writes items to **Notion** with summary/tags/priority/date. \n5) Sorts by priority \u2192 picks **Top 3 Headlines** \u2192 posts a Slack digest.\n\n**How to set up** \n- Edit `rssFeeds`, `notionDatabaseId`, `slackChannel` in **Workflow Configuration (Set)**. \n- Connect your own **Google Sheets**, **Notion**, **Slack**, and **LLM** credentials in n8n (kept unconfigured in this template). \n- (Optional) Change the trigger time in **Daily Morning Trigger**.\n\n**Requirements** \n- n8n (Cloud or self-hosted) \n- Slack app with chat:write permission for the target channel \n- Notion DB with properties: `summary` (rich_text), `tags` (multi_select), `priority` (number), `url` (url), `publishedDate` (date) \n- Google Sheets (for the Tag Dictionary), or replace with another source\n\n**Customize** \n- Add more feeds, tweak the AI prompt, change the sort key (e.g., by recency), or post separate Slack threads per tag."
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "fab6bf45-898d-47e3-a790-add5ccd6767d",
"connections": {
"Read RSS Feeds": {
"main": [
[
{
"node": "AI Summarizer and Tagger",
"type": "main",
"index": 0
}
]
]
},
"Parse AI Output": {
"main": [
[
{
"node": "Write to Notion Database",
"type": "main",
"index": 0
}
]
]
},
"Top 3 Headlines": {
"main": [
[
{
"node": "Format Slack Message",
"type": "main",
"index": 0
}
]
]
},
"Sort by Priority": {
"main": [
[
{
"node": "Top 3 Headlines",
"type": "main",
"index": 0
}
]
]
},
"Code in JavaScript": {
"main": [
[
{
"node": "Read RSS Feeds",
"type": "main",
"index": 0
}
]
]
},
"Get Tag Dictionary": {
"main": [
[
{
"node": "Aggregate Tags",
"type": "main",
"index": 0
}
]
]
},
"Format Slack Message": {
"main": [
[
{
"node": "Post to Slack",
"type": "main",
"index": 0
}
]
]
},
"Daily Morning Trigger": {
"main": [
[
{
"node": "Workflow Configuration",
"type": "main",
"index": 0
}
]
]
},
"Workflow Configuration": {
"main": [
[
{
"node": "Get Tag Dictionary",
"type": "main",
"index": 0
},
{
"node": "Code in JavaScript",
"type": "main",
"index": 0
}
]
]
},
"AI Summarizer and Tagger": {
"main": [
[
{
"node": "Parse AI Output",
"type": "main",
"index": 0
}
]
]
},
"Google Gemini Chat Model": {
"ai_languageModel": [
[
{
"node": "AI Summarizer and Tagger",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Write to Notion Database": {
"main": [
[
{
"node": "Sort by Priority",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Who’s it for
Source: https://n8n.io/workflows/10168/ — 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.
Overview This workflow automates news monitoring by fetching RSS feeds, rewriting content using AI, translating it (EN/ZH/KO), and archiving it.
🤖 Automated AI content researcher: YouTube & RSS to Notion via Gemini
This project is an automated news publisher for LinkedIn. It uses RSS feeds to fetch news, processes the content with the Gemini API to generate precise summaries, and automatically publishes to Linke
This workflow is the AI analysis and alerting engine for a complete social media monitoring system. It's designed to work with data scraped from X (formerly Twitter) using a tool like the Apify Tweet
Categories Content Creation AI Automation Publishing Social Media