This workflow corresponds to n8n.io template #12349 — we link there as the canonical source.
This workflow follows the Agent → OpenRouter 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 →
{
"id": "Vss7Y0BEfSUSVUS4",
"name": "Curate daily tech news for Slack and Telegram using BrowserAct & OpenRouter",
"tags": [],
"nodes": [
{
"id": "86875a42-03c0-4bb7-9867-d42cb45dbfa8",
"name": "Open Router",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
"position": [
320,
608
],
"parameters": {
"model": "google/gemini-2.5-pro",
"options": {}
},
"credentials": {
"openRouterApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "eb5905eb-9961-41ca-acdf-8ec867c3c023",
"name": "Structured Output",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
432,
608
],
"parameters": {
"autoFix": true,
"jsonSchemaExample": "{\n \"messages\": [\n \"String containing the first part of the brief...\",\n \"String containing the second part (if needed)...\"\n ]\n}"
},
"typeVersion": 1.3
},
{
"id": "140f4cda-f53d-483f-9e0f-ca630afef6f1",
"name": "Open Router1",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
"position": [
320,
272
],
"parameters": {
"model": "anthropic/claude-sonnet-4.5",
"options": {}
},
"credentials": {
"openRouterApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "00891bba-0ad5-4fc9-8cf1-ad64a6bee398",
"name": "Structured Output1",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
432,
272
],
"parameters": {
"autoFix": true,
"jsonSchemaExample": "{\n \"messages\": [\n \"String containing the formatted Slack message...\",\n \"String containing the second part (if length requires splitting)...\"\n ]\n}"
},
"typeVersion": 1.3
},
{
"id": "5f15eb85-99bc-49f0-93a8-cf765f4dfa15",
"name": "Split Data for Telegram",
"type": "n8n-nodes-base.splitOut",
"position": [
928,
416
],
"parameters": {
"options": {},
"fieldToSplitOut": "output.messages"
},
"typeVersion": 1
},
{
"id": "99922415-ce97-4334-ab36-7ae3ee2e46f4",
"name": "Split Data for Slack",
"type": "n8n-nodes-base.splitOut",
"position": [
928,
80
],
"parameters": {
"options": {},
"fieldToSplitOut": "output.messages"
},
"typeVersion": 1
},
{
"id": "03363539-d4b8-46e8-a27b-42b8fa6dd7f2",
"name": "Documentation",
"type": "n8n-nodes-base.stickyNote",
"position": [
-704,
-320
],
"parameters": {
"width": 380,
"height": 452,
"content": "## \u26a1 Workflow Overview & Setup\n\n**Summary:** A daily automation that scrapes tech news from The Verge and Product Hunt, using platform-specific AI agents to format and deliver briefings to Slack and Telegram.\n\n### Requirements\n* **Credentials:** BrowserAct, OpenRouter, Slack, Telegram.\n* **Mandatory:** BrowserAct API (Template: **Automated Multi-Site Morning Brief**)\n\n### How to Use\n1. **Credentials:** Configure all required API keys in n8n.\n2. **BrowserAct Template:** Ensure you have the **Automated Multi-Site Morning Brief** template saved in your BrowserAct account.\n3. **Schedule:** Adjust the **Schedule Trigger** to your preferred delivery time (default is 10:00 AM).\n\n### Need Help?\n[How to Find Your BrowserAct API Key & Workflow ID](https://docs.browseract.com)\n[How to Connect n8n to BrowserAct ](https://docs.browseract.com)\n[How to Use & Customize BrowserAct Templates](https://docs.browseract.com)"
},
"typeVersion": 1
},
{
"id": "d1a05a68-8bbb-461b-9017-97f6d21594f9",
"name": "Step 1 Explanation",
"type": "n8n-nodes-base.stickyNote",
"position": [
-288,
64
],
"parameters": {
"color": 7,
"width": 408,
"height": 140,
"content": "### \ud83d\udcc5 Step 1: Schedule & Scrape\n\nIt runs a BrowserAct to gather the latest headlines and product launches from sources like The Verge and Product Hunt."
},
"typeVersion": 1
},
{
"id": "f51040e5-2d99-4731-9eba-c000718ce3b4",
"name": "Step 2a Explanation",
"type": "n8n-nodes-base.stickyNote",
"position": [
224,
-96
],
"parameters": {
"color": 7,
"width": 460,
"height": 128,
"content": "### \ud83d\udcac Step 2: Apply Platform-Specific Formatting\n\nAI agent processes the news, It groups items by category."
},
"typeVersion": 1
},
{
"id": "aa31b5ec-0405-4674-81f7-3d42105749b7",
"name": "Step 3 Explanation",
"type": "n8n-nodes-base.stickyNote",
"position": [
848,
-96
],
"parameters": {
"color": 7,
"width": 552,
"height": 140,
"content": "### \ud83d\ude80 Step 3: Split & Deliver\n\nBoth paths manage long newsletters by splitting them to stay within platform character limits. The AI determines the split points, which the Split node then executes to create multiple posts."
},
"typeVersion": 1
},
{
"id": "412403eb-7c1c-4783-8552-228a2c50da70",
"name": "Publish to Telegram Channel",
"type": "n8n-nodes-base.telegram",
"position": [
1200,
416
],
"parameters": {
"text": "={{ $json[\"output.messages\"] }}",
"chatId": "chatId==\"Your Telegram Channel ID\"",
"additionalFields": {
"parse_mode": "HTML"
}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "652ffbd0-f86d-4948-be3c-508bcbd36b17",
"name": "Publish to Slack Channel",
"type": "n8n-nodes-base.slack",
"position": [
1200,
80
],
"parameters": {
"text": "={{ $json[\"output.messages\"] }}",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "list",
"value": "C09KLV9DJSX",
"cachedResultName": "all-browseract-workflow-test"
},
"otherOptions": {}
},
"credentials": {
"slackApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.4
},
{
"id": "7dfda366-25b2-4c55-bc68-cbfd32d1b79b",
"name": "Daily Schedule",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-256,
240
],
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 10
}
]
}
},
"typeVersion": 1.3
},
{
"id": "7436de9d-1e12-4443-afc1-f181265a245a",
"name": "Extract Latest News and Products",
"type": "n8n-nodes-browseract.browserAct",
"position": [
0,
240
],
"parameters": {
"type": "WORKFLOW",
"workflowId": "70367719194706940",
"workflowConfig": {
"value": {},
"schema": [
{
"id": "input-theverge",
"type": "string",
"display": true,
"removed": true,
"required": false,
"description": "If left blank, the default value defined in BrowserAct will be used.",
"displayName": "theverge",
"defaultMatch": true
},
{
"id": "input-producthunt",
"type": "string",
"display": true,
"removed": true,
"required": false,
"description": "If left blank, the default value defined in BrowserAct will be used.",
"displayName": "producthunt",
"defaultMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"input-theverge",
"input-producthunt"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"open_incognito_mode": false
},
"credentials": {
"browserActApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "d027fe09-3c32-47f0-8c19-1a8273509d64",
"name": "Slack Content Generation",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
320,
80
],
"parameters": {
"text": "=Data Input : {{ $json.output.string }}",
"options": {
"systemMessage": "You are \"SlackBrief,\" an intelligent team assistant designed to curate daily tech news and developer updates.\n\nInput: A JSON array containing objects with title, link, and optional fields like description, summary, or category.\n\nOutput Format: You must respond strictly with a valid JSON object following this structure:\n\n\n{\n \"messages\": [\n \"String containing the formatted Slack message...\",\n \"String containing the second part (if length requires splitting)...\"\n ]\n}\nContent Guidelines:\n\nSlack Formatting Syntax (CRITICAL):\n\nBold: Use single asterisks. Example: *This is bold*.\n\nLinks: Use angle brackets with a pipe separator. Example: <https://example.com|Link Text Here>.\n\nLists: Use bullet points (\u2022).\n\nTone & Style:\n\nFriendly, efficient, and optimized for a team chat environment.\n\nUse emojis to differentiate sections and add visual interest.\n\nKeep summaries punchy (1 sentence max per item).\n\nCuration & Sorting (Priority Order):\n\n\ud83d\udea8 Breaking & Major Tech: Government regulations, major security breaches, huge company news (Google, Apple, Nvidia).\n\n\ud83d\udee0\ufe0f Dev Tools & Product Hunt: New GitHub tools, IDE updates (JetBrains, VS Code), and productivity apps. (Group these together).\n\n\ud83d\udcf1 Hardware & Gadgets: New phones, robots, or hardware reviews.\n\n\ud83d\udcc9 Deals & Misc: Sales, gift guides, and lighter stories.\n\nLength & Splitting:\n\nWhile Slack allows longer messages (up to 40,000 chars), for readability, aim to keep messages under 3,000 characters.\n\nIf the content exceeds this, split it into two strings in the messages array.\n\nEnsure the split happens cleanly between sections.\n\nExecution Steps:\n\nStep 1: Ingest JSON.\n\nStep 2: Group items by category (News, Dev Tools, Lifestyle).\n\nStep 3: Format using Slack syntax <url|text>.\n\nStep 4: Add a short summary for each link.\n\nStep 5: Output valid JSON."
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 3
},
{
"id": "6b50d490-3ecd-4c20-96f6-40bd67fb5844",
"name": "Telegram Content Generation",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
320,
416
],
"parameters": {
"text": "=Data Input : {{ $json.output.string }}",
"options": {
"systemMessage": "You are \"TelegramBriefBot,\" an advanced content curator designed to process raw news feeds into valid, HTML-formatted JSON payloads for the Telegram Bot API.\n\nObjective: Receive a JSON list of articles, prioritize them by importance, and generate a JSON response containing an array of message strings. You must ensure no single message string exceeds the \"Safe Split\" character limit.\n\nInput Format: A JSON array of objects, where each object contains:\n- title (String)\n- link (String)\n- description (Optional String)\n- category (Optional String)\n\nOutput Format: You must return a valid JSON object with a single key \"messages\".\n{\n \"messages\": [\n \"String containing the first part... (Max 2500 chars)\",\n \"String containing the second part... (Max 2500 chars)\"\n ]\n}\n\nCritical Rules & Constraints\n\n1. HTML Formatting (Telegram API Standard)\nYou must strictly use ONLY the following allowed HTML tags. Do not use Markdown or unsupported tags like <br>, <p>, or <ul>.\n- Bold: <b>Text</b>\n- Links: <a href=\"URL\">Text</a>\n- Code/Monospace: <code>Text</code>\n- Italic: <i>Text</i>\n\n*Crucial Safety Rule:* You must escape the characters <, >, and & within the visual text (titles/summaries) to avoid breaking the HTML parser (e.g., use & instead of &). Do not escape the angle brackets of the actual HTML tags.\n\n2. The \"Safe Split\" Rule (Character Limits)\n- Your Safety Limit is 2500 characters per message string.\n- Mandatory Split: If the text approaches this limit, you MUST close the current string and start a new string in the \"messages\" array.\n- Never split inside a sentence or an HTML tag. Only split between list items.\n- If a split occurs, the next message must start with: \u2b07\ufe0f <i>Continued...</i>\n\n3. Content Sorting & Curation\nAnalyze the input list and group items logically using this hierarchy:\n- \ud83d\udea8 Top Stories: Major news (Government bans, massive lawsuits, Big Tech announcements, security breaches).\n- \ud83d\udee0 Developer Tools: GitHub repos, IDE updates, Product Hunt launches.\n- \ud83d\udcf1 Gadgets & Hardware: New phones, hardware releases.\n- \ud83d\udcb8 Deals & Lifestyle: Sales, gift guides, minor reviews.\n\n4. Style & Layout\n- Emoji Headers: Use emojis to denote sections (e.g., \ud83d\udea8, \ud83d\udee0, \ud83d\udcf1, \ud83d\udcb8).\n- Concise: Each item must be a single bullet point.\n- Link Structure: \u2022 <a href=\"LINK\"><b>Title of Article</b></a> \u2014 A short, punchy 1-sentence summary.\n\nExample of correct item formatting:\n\u2022 <a href=\"https://apple.com\"><b>Apple Fined $116M</b></a> \u2014 Italy hit Apple with a fine over privacy prompts.\n\nStep-by-Step Execution Plan\n1. Ingest the raw JSON list.\n2. Filter & Sort: Identify the top critical stories, then dev tools, then lifestyle/deals. Discard low-value noise if the list is long.\n3. Draft Message 1:\n - Start with header: \u2615\ufe0f <b>Morning Brief</b> \u2600\ufe0f\n - Add \"\ud83d\udea8 <b>Top Headlines</b>\" section.\n - Add \"\ud83d\udee0 <b>Developer Tools</b>\" section.\n - Monitor character count.\n4. Draft Message 2 (if limit reached):\n - If Message 1 nears 2500 chars, close it.\n - Start Message 2 with: \u2b07\ufe0f <i>Continued...</i>\n - Add \"\ud83d\udcf1 <b>Gadgets</b>\" and \"\ud83d\udcb8 <b>Deals</b>\" sections.\n - Add Footer: Have a productive day! \ud83d\ude80\n5. Finalize JSON: Wrap the strings in the JSON structure and ensure valid syntax."
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 3
},
{
"id": "acca050a-6743-4bc1-a596-d5e32b38b738",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-304,
-320
],
"parameters": {
"color": 6,
"width": 480,
"height": 288,
"content": "@[youtube](MIvUFkpobvc)"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "882950b5-6bc2-404f-a205-6e02069c9d7c",
"connections": {
"Open Router": {
"ai_languageModel": [
[
{
"node": "Telegram Content Generation",
"type": "ai_languageModel",
"index": 0
},
{
"node": "Structured Output",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Open Router1": {
"ai_languageModel": [
[
{
"node": "Slack Content Generation",
"type": "ai_languageModel",
"index": 0
},
{
"node": "Structured Output1",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Daily Schedule": {
"main": [
[
{
"node": "Extract Latest News and Products",
"type": "main",
"index": 0
}
]
]
},
"Structured Output": {
"ai_outputParser": [
[
{
"node": "Telegram Content Generation",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Structured Output1": {
"ai_outputParser": [
[
{
"node": "Slack Content Generation",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Split Data for Slack": {
"main": [
[
{
"node": "Publish to Slack Channel",
"type": "main",
"index": 0
}
]
]
},
"Split Data for Telegram": {
"main": [
[
{
"node": "Publish to Telegram Channel",
"type": "main",
"index": 0
}
]
]
},
"Slack Content Generation": {
"main": [
[
{
"node": "Split Data for Slack",
"type": "main",
"index": 0
}
]
]
},
"Telegram Content Generation": {
"main": [
[
{
"node": "Split Data for Telegram",
"type": "main",
"index": 0
}
]
]
},
"Extract Latest News and Products": {
"main": [
[
{
"node": "Telegram Content Generation",
"type": "main",
"index": 0
},
{
"node": "Slack Content Generation",
"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.
browserActApiopenRouterApislackApitelegramApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow automates the creation and delivery of a professional morning tech briefing. It scrapes headlines from major sources like The Verge and Product Hunt, uses parallel AI agents to format the content specifically for Telegram (HTML) and Slack (Markdown), and broadcasts…
Source: https://n8n.io/workflows/12349/ — 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 comprehensive N8N automation template revolutionizes content creation by delivering a complete end-to-end solution for AI-powered blog generation. Transform simple ideas into fully SEO-optimized,
This n8n workflow is designed for SEO managers, content creators, and blog administrators who want to automate their blog publishing pipeline. The workflow creates an end-to-end AI-powered system that
This advanced n8n workflow is designed for SEO specialists, digital agency owners, webmasters, and marketing managers who need a comprehensive, automated solution to track and improve their website's
Automatically fetch, curate, and distribute Reddit content digests using AI-powered filtering. This workflow monitors multiple subreddits, ranks posts by relevance, removes spam and duplicates, then d
This n8n workflow, BlogBlitz, automates the creation and publishing of SEO-optimized blog posts for WordPress, saving you hours of content creation time. Triggered via Telegram or a scheduled interval