This workflow corresponds to n8n.io template #5712 — 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": "zyj0hJZNNR3mKvEx",
"name": "Automated Stock News Alerts via Google RSS, Openrouter & Telegram",
"tags": [],
"nodes": [
{
"id": "b4739068-769f-4638-83cf-94a7c611caad",
"name": "Append or update row in sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
2380,
620
],
"parameters": {
"columns": {
"value": {
"ID": "={{ $('Merge').item.json.id }}",
"URL": "={{ $json.realUrl }}",
"Date": "={{ $('Merge').item.json.pubDate }}",
"Title": "={{ $('Merge').item.json.title }}"
},
"schema": [
{
"id": "ID",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "ID",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Date",
"type": "string",
"display": true,
"required": false,
"displayName": "Date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Title",
"type": "string",
"display": true,
"required": false,
"displayName": "Title",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "URL",
"type": "string",
"display": true,
"required": false,
"displayName": "URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Summary",
"type": "string",
"display": true,
"required": false,
"displayName": "Summary",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "SentToTelegram",
"type": "string",
"display": true,
"required": false,
"displayName": "SentToTelegram",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"ID"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "109kj97ABR37XviIpxARCFviZwq8opOoe--rayOeFDSo"
}
},
"typeVersion": 4.6
},
{
"id": "4d5abad5-44ac-4698-a178-f6da494d83d7",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
860,
140
],
"parameters": {
"color": 7,
"width": 460,
"height": 760,
"content": "### \u23f0 Scheduler\n\n**Function:** \nThis node triggers the entire workflow at a predefined interval. It ensures that the system checks for new stock news regularly without manual intervention.\n\n**Configuration:**\n- **Mode:** Every X minutes\n- **Interval:** 15 minutes (default, can be customized based on user needs)\n\n**Notes:**\n- You can adjust the interval depending on how frequently you want to monitor news updates.\n\n"
},
"typeVersion": 1
},
{
"id": "8f3aeb9c-380e-4d91-a8e0-f2c856d360b5",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
0,
0
],
"parameters": {
"color": 6,
"width": 780,
"height": 1300,
"content": "## \ud83c\udfaf Purpose\nThis workflow helps you automatically monitor stock related news, extract the main content, summarize it using a LLM (via OpenRouter), and send real time alerts to Telegram and store them in Google Sheets.\n\n## \u2699\ufe0f How It Works\n### Trigger\n- A Cron node triggers the workflow every 15 minutes (adjustable).\n- RSS Feed node checks latest articles from Google Alerts RSS.\n- The workflow filters duplicates using Google Sheets as a log.\n- The article URL is sent to Jina AI Readability API to extract the main body text.\n- The content is summarized using a model from OpenRouter (e.g., Gemini, Claude, GPT-4).\n- You can customize the prompt to suit your tone and analysis needs.\n- The result is appended to a Google Sheets file.\n- Sends the title, summary, and reccomendation to Telegram chat.\n\n**\ud83e\uddfe Google Sheets Template**\nCreate a Google Sheet using this template: [Stock Alert](https://docs.google.com/spreadsheets/d/109kj97ABR37XviIpxARCFviZwq8opOoe--rayOeFDSo/edit?usp=sharing)\n\n## \ud83e\uddf0 Requirements\n- Telegram Bot + your Chat ID\n- OpenRouter account and API key\n- Jina AI account for content extraction\n- Google Account with access to Google Sheets\n- Google Alerts RSS feed\n\n## \ud83d\udee0 Setup Instructions\n- Install required credentials:\n - Add OpenRouter API key to n8n credentials.\n - Add Telegram Bot Token and Chat ID.\n - Add Google Sheets credentials.\n - Add Jina AI credentials.\n- Create or copy the Google Sheet using the link above.\n- Go to Google Alerts, create alerts, and copy the RSS feed URL.\n- Replace placeholder API keys and URLs.\n- Adjust Telegram Chat ID.\n\n## \ud83d\udd10 Security Note\nAll sensitive credentials (e.g., API keys, personal chat IDs) have been removed from this template. Please replace them using the n8n credentials manager before activating the workflow."
},
"typeVersion": 1
},
{
"id": "f00e3efd-e11e-4340-adef-c87b01c4818c",
"name": "Read URL content",
"type": "n8n-nodes-base.jinaAi",
"position": [
2980,
500
],
"parameters": {
"url": "={{ $('Get row(s) in sheet').item.json.URL }}",
"options": {},
"requestOptions": {}
},
"typeVersion": 1
},
{
"id": "f86e1a17-48b9-4a3b-a428-b4e6edc27d6f",
"name": "AI Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
3300,
500
],
"parameters": {
"text": "=Create a summary of up to 200 words from {{ $json.content }} Add a description of the affected stocks (stock code). Add a sentiment description (uptrend, downtrend, sideways, positive, negative or others). The writing format is as follows: Title\\nCategory\\nSummary\\nSentiment\\nReccomendation. Write in plain text without punctuation, use emoji to more interactive.",
"options": {
"systemMessage": "You are a professional analyst who has studied a lot about stock movements. Use the following news articles to see the company's fundamentals, sentiment, and future projections."
},
"promptType": "define"
},
"typeVersion": 2
},
{
"id": "b94dff41-913d-4e8b-9ea8-3fe9d36041ab",
"name": "OpenRouter Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
"position": [
3300,
700
],
"parameters": {
"model": "google/gemini-2.0-flash-exp:free",
"options": {}
},
"typeVersion": 1
},
{
"id": "f4d18c3e-7ed8-44d8-b699-82c6923e642f",
"name": "Merge",
"type": "n8n-nodes-base.merge",
"position": [
1960,
620
],
"parameters": {
"numberInputs": 3
},
"typeVersion": 3.2
},
{
"id": "552b48ff-8921-4878-8c65-4d1f9c63f6e0",
"name": "Get row(s) in sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
2580,
620
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "109kj97ABR37XviIpxARCFviZwq8opOoe--rayOeFDSo"
}
},
"typeVersion": 4.6
},
{
"id": "2dc342e9-9f0b-4f1e-8889-60b61bcb42f2",
"name": "Send a text message",
"type": "n8n-nodes-base.telegram",
"position": [
3960,
500
],
"parameters": {
"text": "={{ $json.Summary }}",
"additionalFields": {
"appendAttribution": false
}
},
"typeVersion": 1.2
},
{
"id": "f49aa596-c969-4c4f-b466-79f962c2a658",
"name": "Append or update row in sheet1",
"type": "n8n-nodes-base.googleSheets",
"position": [
3740,
500
],
"parameters": {
"columns": {
"value": {
"URL": "={{ $('Read URL content').item.json.url }}",
"Summary": "={{ $json.output }}",
"SentToTelegram": "true"
},
"schema": [
{
"id": "ID",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "ID",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Date",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Title",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Title",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "URL",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Summary",
"type": "string",
"display": true,
"required": false,
"displayName": "Summary",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "SentToTelegram",
"type": "string",
"display": true,
"required": false,
"displayName": "SentToTelegram",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"URL"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "109kj97ABR37XviIpxARCFviZwq8opOoe--rayOeFDSo"
}
},
"typeVersion": 4.6
},
{
"id": "966d4fb2-39e1-4e8f-a6bc-847f49e2f6f0",
"name": "Schedule Trigger1",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
1020,
620
],
"parameters": {
"rule": {
"interval": [
{
"field": "minutes",
"minutesInterval": 15
}
]
}
},
"typeVersion": 1.2
},
{
"id": "b9d23403-da7b-4c43-a6b4-aeaa38ac6e2d",
"name": "No Operation, do nothing",
"type": "n8n-nodes-base.noOp",
"position": [
2980,
720
],
"parameters": {},
"typeVersion": 1
},
{
"id": "002d50e3-f1d5-4bcc-b342-7c94f9d22bf8",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
1420,
140
],
"parameters": {
"color": 7,
"width": 460,
"height": 840,
"content": "### \ud83d\udce1 RSS Feed (Google Alerts)\n\n**Function:** \nThis node fetches the latest news articles from Google Alerts RSS feeds based on specific stock related keywords.\n\n**Configuration:**\n- **RSS Feed URL:** Generated from Google Alerts using chosen keywords (e.g., `IPO`, `stock acquisition`, `company merger`, or specific company names like `AAPL`, `NVDA`, etc.)\n"
},
"typeVersion": 1
},
{
"id": "c17cce05-0f63-47ee-abdf-e5c016819766",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
1940,
140
],
"parameters": {
"color": 7,
"width": 560,
"height": 840,
"content": "### \ud83d\udd17 Merge & Extract Real URL\n\n**Function:** \nAfter collecting articles from multiple RSS Feed nodes, this step merges the data and **extracts the actual article URL**, since Google Alerts RSS provides redirect URLs (e.g., `https://www.google.com/url?...`).\n\n**Processing Steps:**\n- Use a **Merge** node to combine outputs from multiple RSS nodes.\n- Use a **Function** node to:\n - Parse the `link` field from the RSS item.\n - Extract the real URL from the `url` query parameter of Google's redirect link.\n- Save data to **Google Sheets**\n"
},
"typeVersion": 1
},
{
"id": "134bf506-303f-45aa-a659-93c7a9c8252d",
"name": "Get Real URL",
"type": "n8n-nodes-base.code",
"position": [
2160,
620
],
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "return {\n realUrl: $json.link.includes(\"google.com/url\")\n ? decodeURIComponent($json.link.match(/url=([^&]+)/)[1])\n : $json.link\n};\n"
},
"typeVersion": 2
},
{
"id": "6011ec34-cb71-4db6-b3a6-a8a190db78fc",
"name": "If",
"type": "n8n-nodes-base.if",
"position": [
2760,
620
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "67a8680d-5aca-4e40-9ae7-f91925461807",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.Summary }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "4a05175a-00ef-42b7-a8f5-87d6d729313f",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
2560,
140
],
"parameters": {
"color": 7,
"width": 620,
"height": 840,
"content": "### \ud83d\udcc4 Extract Content (Jina AI)\n\n**Function:** \nThis step extracts the **main content** (article body) from the real URL using **Jina AI\u2019s article reader API**.\n\n**Processing Steps:**\n- Use an **IF node** to check whether the article already contains extracted content.\n - **If content exists:** Do nothing.\n - **If content is empty or missing:** Continue to next step.\n- Use **Jina AI API** to extract the full article content from the `realUrl`.\n\n**Output:**\n- The full article text is stored in a field such as `extractedContent` or `fullText`.\n- This text will be passed to the summarization step."
},
"typeVersion": 1
},
{
"id": "cdf4b5fd-8da9-49d4-a79b-cfb6bcf4dac3",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
3200,
140
],
"parameters": {
"color": 7,
"width": 440,
"height": 840,
"content": "### \ud83e\udde0 Summarize & Analyze (LLM via OpenRouter)\n\n**Function:** \nThis node uses a **Large Language Model (LLM)** via the **OpenRouter API** to summarize and analyze the extracted article content. The goal is to turn raw text into concise, actionable insights.\n\n- You can customize the **system message** and **user prompt** to suit your use case.\n- **Model**: Choose from a variety of models via OpenRouter (GPT-4, Claude, etc.).\n\n**Output:**\n- `summary`: A brief overview of the article.\n- `analysis`: Optional insight or investment angle.\n"
},
"typeVersion": 1
},
{
"id": "f71646be-296c-47d0-9443-126c03405faa",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
3700,
140
],
"parameters": {
"color": 7,
"width": 440,
"height": 840,
"content": "### \ud83d\uddc2\ufe0f Save to Google Sheets and Send to Telegram\nThis step saves the results of the summarization and analysis into the existing **Google Sheets database** to maintain a structured log of processed news.\n\n### \ud83d\udcf2 Send to Telegram\nDelivers the summarized news and analysis via **Telegram Bot API** for real-time alerts.\n"
},
"typeVersion": 1
},
{
"id": "ce580e6b-e954-4cf0-a55b-f9e67be8a905",
"name": "Stock Acquisition",
"type": "n8n-nodes-base.rssFeedRead",
"position": [
1580,
440
],
"parameters": {
"options": {}
},
"typeVersion": 1.2
},
{
"id": "d64cf706-d073-4d1a-a793-4ab66a32da28",
"name": "Stock Buyback",
"type": "n8n-nodes-base.rssFeedRead",
"position": [
1580,
620
],
"parameters": {
"options": {}
},
"typeVersion": 1.2
},
{
"id": "1a3e5030-0b82-4649-910f-bfc8d0a28866",
"name": "NVDA Stock",
"type": "n8n-nodes-base.rssFeedRead",
"position": [
1580,
800
],
"parameters": {
"options": {}
},
"typeVersion": 1.2
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"connections": {
"If": {
"main": [
[
{
"node": "Read URL content",
"type": "main",
"index": 0
}
],
[
{
"node": "No Operation, do nothing",
"type": "main",
"index": 0
}
]
]
},
"Merge": {
"main": [
[
{
"node": "Get Real URL",
"type": "main",
"index": 0
}
]
]
},
"AI Agent": {
"main": [
[
{
"node": "Append or update row in sheet1",
"type": "main",
"index": 0
}
]
]
},
"NVDA Stock": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 2
}
]
]
},
"Get Real URL": {
"main": [
[
{
"node": "Append or update row in sheet",
"type": "main",
"index": 0
}
]
]
},
"Stock Buyback": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
}
]
]
},
"Read URL content": {
"main": [
[
{
"node": "AI Agent",
"type": "main",
"index": 0
}
]
]
},
"Schedule Trigger1": {
"main": [
[
{
"node": "NVDA Stock",
"type": "main",
"index": 0
},
{
"node": "Stock Buyback",
"type": "main",
"index": 0
},
{
"node": "Stock Acquisition",
"type": "main",
"index": 0
}
]
]
},
"Stock Acquisition": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 0
}
]
]
},
"Get row(s) in sheet": {
"main": [
[
{
"node": "If",
"type": "main",
"index": 0
}
]
]
},
"OpenRouter Chat Model": {
"ai_languageModel": [
[
{
"node": "AI Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Append or update row in sheet": {
"main": [
[
{
"node": "Get row(s) in sheet",
"type": "main",
"index": 0
}
]
]
},
"Append or update row in sheet1": {
"main": [
[
{
"node": "Send a text message",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow contains community nodes that are only compatible with the self-hosted version of n8n.
Source: https://n8n.io/workflows/5712/ — 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.
This cutting-edge n8n workflow is a comprehensive automation solution designed to streamline various Instagram operations. It combines an intelligent AI chatbot for direct message management, automate
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
This workflow automatically fetches the latest public grant information from the Ministry of Health, Labour and Welfare (MHLW) RSS feed. It uses AI to summarize and structure each grant post into a cl
Automates Singapore COE price tracking, predicts trends using AI, and recommends optimal car purchase timing. Scrapes LTA data biweekly, analyzes historical trends, forecasts next 6 bidding rounds, an
<h1>🚀 Cybersecurity News Automation Workflow</h1> <p> This <strong>n8n automation workflow</strong> fetches daily cybersecurity news, cleans it, summarizes with AI, and posts it automatically to a Tel