This workflow corresponds to n8n.io template #16755 — we link there as the canonical source.
This workflow follows the Chainllm → Emailsend 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": false
},
"name": "Send daily AI market briefings to email and Discord using AlphaAI and GPT",
"nodes": [
{
"id": "ff3fc636-16f3-4ec2-a739-bef79f6cad1e",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1232,
-160
],
"parameters": {
"width": 480,
"height": 896,
"content": "## Send daily AI market briefings to email and Discord using AlphaAI and GPT\n\n### How it works\n\n1. A Schedule Trigger fires every weekday at 7am, and a Set node defines the watchlist, the relevance floor and the red flag threshold.\n2. Four parallel HTTP Request nodes pull per ticker news, a 7 day sentiment tally, a 30 day SEC Form 4 insider summary and trending stories from the AlphaAI news API.\n3. A Code node merges the branches into one payload and derives red flags deterministically, so the AI narrates but cannot invent alerts.\n4. An LLM chain writes the morning brief from that payload with any chat model.\n5. The workflow emails the full brief as HTML and, when red flags exist, pings a Discord channel immediately.\n\n### Setup steps\n\n- [ ] Create a free AlphaAI API key at alphai.io (Account, API keys) and add it as one shared Bearer Auth credential on the four AlphaAI nodes, without the \"Bearer \" prefix.\n- [ ] Add your OpenAI credential on the \"OpenAI Chat Model\" node, or swap it for any other chat model.\n- [ ] Set your SMTP credential and the from and to addresses on the \"Send Briefing Email\" node.\n- [ ] Optional: paste a Discord channel webhook URL into the \"Send Urgent Discord Ping\" node, or delete that branch.\n- [ ] Put your tickers into the \"Set Watchlist and Settings\" node and activate the workflow.\n\n### Customization\n\nUp to 6 tickers fits the AlphaAI Free tier (at most 19 calls per run). Adjust the thresholds in the Set node or edit the prompt in the LLM chain."
},
"typeVersion": 1
},
{
"id": "4bb657f3-4f68-4ba1-b729-8722302855ac",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-672,
-32
],
"parameters": {
"color": 7,
"width": 416,
"height": 320,
"content": "## Set schedule and watchlist\n\nRuns every weekday at 7am and defines the tickers, the relevance floor and the red flag threshold."
},
"typeVersion": 1
},
{
"id": "5158136d-395b-43ba-9bc1-78a92c2274a8",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-224,
-160
],
"parameters": {
"color": 7,
"width": 480,
"height": 800,
"content": "## Fetch AlphaAI market data\n\nSplits the watchlist and calls four AlphaAI endpoints in parallel: per ticker news, 7 day sentiment, 30 day insider activity and trending stories."
},
"typeVersion": 1
},
{
"id": "2ac81e28-5883-4111-9222-0c852bf07294",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
352,
80
],
"parameters": {
"color": 7,
"width": 432,
"height": 320,
"content": "## Merge and assemble the payload\n\nWaits for all branches, zips them into one payload and derives red flags deterministically, so the AI cannot invent alerts."
},
"typeVersion": 1
},
{
"id": "18eef37a-4f8a-473a-a589-59ecdc20453f",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
832,
64
],
"parameters": {
"color": 7,
"width": 240,
"height": 560,
"content": "## Write the brief with AI\n\nAn LLM chain turns the payload into a morning brief. Swap the model node for any chat model."
},
"typeVersion": 1
},
{
"id": "66941620-260e-4b90-bab3-550ceea501f6",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
1184,
80
],
"parameters": {
"color": 7,
"width": 240,
"height": 320,
"content": "## Render email and alerts\n\nBuilds the HTML email and formats red flag embed cards for Discord."
},
"typeVersion": 1
},
{
"id": "e462250f-013e-462b-afca-80b6cd0c7281",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
1456,
-16
],
"parameters": {
"color": 7,
"width": 432,
"height": 544,
"content": "## Deliver by email and Discord\n\nEmails the full brief, and posts red flags to a Discord webhook when any exist."
},
"typeVersion": 1
},
{
"id": "00000006-0000-4000-8000-000000000006",
"name": "Every Weekday at 7am",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-620,
120
],
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 7 * * 1-5"
}
]
}
},
"typeVersion": 1.2
},
{
"id": "00000007-0000-4000-8000-000000000007",
"name": "Set Watchlist and Settings",
"type": "n8n-nodes-base.set",
"position": [
-400,
120
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "a-watchlist",
"name": "watchlist",
"type": "string",
"value": "AAPL, NVDA, MSFT, TSLA"
},
{
"id": "a-minrel",
"name": "min_relevance",
"type": "number",
"value": 6
},
{
"id": "a-urgent",
"name": "urgent_min_score",
"type": "number",
"value": 8
}
]
}
},
"typeVersion": 3.4
},
{
"id": "00000008-0000-4000-8000-000000000008",
"name": "Split Watchlist by Ticker",
"type": "n8n-nodes-base.code",
"position": [
-180,
240
],
"parameters": {
"mode": "runOnceForAllItems",
"jsCode": "// Turn the comma-separated watchlist into one item per ticker.\n// Capped at 6 tickers: the whole briefing then costs at most\n// 6 tickers x 3 calls + 1 trending = 19 AlphaAI calls -> fits the Free tier\n// (20 req/min, 100 req/day) in a single burst. Raise the cap on Basic/Pro.\nconst cfg = $input.first().json;\nconst tickers = String(cfg.watchlist || '')\n .split(',')\n .map(t => t.trim().toUpperCase())\n .filter(Boolean);\n\nconst MAX_FREE = 6;\nconst capped = tickers.slice(0, MAX_FREE);\n\nreturn capped.map(ticker => ({\n json: {\n ticker,\n min_relevance: cfg.min_relevance ?? 6,\n urgent_min_score: cfg.urgent_min_score ?? 8,\n },\n}));\n"
},
"typeVersion": 2
},
{
"id": "00000009-0000-4000-8000-000000000009",
"name": "Fetch Trending Market News",
"type": "n8n-nodes-base.httpRequest",
"onError": "continueRegularOutput",
"maxTries": 3,
"position": [
-180,
0
],
"parameters": {
"url": "https://api.alphai.io/api/news/trending/",
"options": {},
"authentication": "genericCredentialType",
"genericAuthType": "httpBearerAuth"
},
"retryOnFail": true,
"typeVersion": 4.2,
"waitBetweenTries": 3000
},
{
"id": "0000000a-0000-4000-8000-00000000000a",
"name": "Fetch Ticker News",
"type": "n8n-nodes-base.httpRequest",
"onError": "continueRegularOutput",
"maxTries": 3,
"position": [
100,
120
],
"parameters": {
"url": "=https://api.alphai.io/api/news/?symbol={{ $json.ticker }}&min_relevance={{ $json.min_relevance }}&page_size=10",
"options": {},
"authentication": "genericCredentialType",
"genericAuthType": "httpBearerAuth"
},
"retryOnFail": true,
"typeVersion": 4.2,
"waitBetweenTries": 3000
},
{
"id": "0000000b-0000-4000-8000-00000000000b",
"name": "Fetch 7-Day Sentiment",
"type": "n8n-nodes-base.httpRequest",
"onError": "continueRegularOutput",
"maxTries": 3,
"position": [
100,
300
],
"parameters": {
"url": "=https://api.alphai.io/api/symbols/{{ $json.ticker }}/sentiment-summary/",
"options": {},
"authentication": "genericCredentialType",
"genericAuthType": "httpBearerAuth"
},
"retryOnFail": true,
"typeVersion": 4.2,
"waitBetweenTries": 3000
},
{
"id": "0000000c-0000-4000-8000-00000000000c",
"name": "Fetch 30-Day Insider Activity",
"type": "n8n-nodes-base.httpRequest",
"onError": "continueRegularOutput",
"maxTries": 3,
"position": [
100,
480
],
"parameters": {
"url": "=https://api.alphai.io/api/symbols/{{ $json.ticker }}/insider-summary/",
"options": {},
"authentication": "genericCredentialType",
"genericAuthType": "httpBearerAuth"
},
"retryOnFail": true,
"typeVersion": 4.2,
"waitBetweenTries": 3000
},
{
"id": "0000000d-0000-4000-8000-00000000000d",
"name": "Merge All Branches",
"type": "n8n-nodes-base.merge",
"position": [
400,
240
],
"parameters": {
"numberInputs": 4
},
"typeVersion": 3
},
{
"id": "0000000e-0000-4000-8000-00000000000e",
"name": "Assemble Briefing Data",
"type": "n8n-nodes-base.code",
"position": [
640,
240
],
"parameters": {
"mode": "runOnceForAllItems",
"jsCode": "// Join the four AlphaAI branches into one structured briefing object.\n// Items are read from the named nodes (the Merge before this node is a\n// synchronization barrier), zipped by ticker order \u2014 n8n preserves item order.\n\nfunction trunc(s, n) {\n s = (s == null ? '' : String(s));\n return s.length > n ? s.slice(0, n - 1) + '\u2026' : s;\n}\nfunction slugify(text) {\n return (text || '').toLowerCase()\n .replace(/[^\\w\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .trim();\n}\nfunction dateForUrl(iso) {\n const d = new Date(iso);\n if (isNaN(d.getTime())) { return ''; }\n const m = String(d.getUTCMonth() + 1).padStart(2, '0');\n const day = String(d.getUTCDate()).padStart(2, '0');\n return `${m}-${day}`;\n}\nfunction articleUrl(org) {\n const base = `https://alphai.io/news/article/${dateForUrl(org.time_published)}/${org.uid}/${slugify(org.title)}`;\n return `${base}?utm_source=n8n&utm_medium=email&utm_campaign=morning_briefing`;\n}\nfunction usdM(v) {\n const n = Number(v);\n if (!v || isNaN(n) || n === 0) { return null; }\n const abs = Math.abs(n);\n if (abs >= 1e9) { return `$${(n / 1e9).toFixed(1)}B`; }\n if (abs >= 1e6) { return `$${(n / 1e6).toFixed(1)}M`; }\n return `$${Math.round(n / 1e3)}K`;\n}\nfunction pickArticles(resp, minScore, cap) {\n let rows = [];\n const j = resp || {};\n if (Array.isArray(j)) { rows = j; }\n else if (Array.isArray(j.results)) { rows = j.results; }\n const out = [];\n for (const a of rows) {\n const org = (a && a.original) || {};\n const enr = (a && a.enrichment) || {};\n if (!org.uid || (enr.relevance_score || 0) < minScore) { continue; }\n const ta = ((enr.ai_trading_insights || {}).ticker_analysis || [])[0] || {};\n const ia = ta.impact_analysis || {};\n out.push({\n title: trunc(org.title, 160),\n url: articleUrl(org),\n published: org.time_published,\n score: enr.relevance_score || 0,\n category: enr.category || 'other',\n tickers: enr.tickers || [],\n sentiment: ia.sentiment || 'neutral',\n summary: trunc(org.summary || ia.summary || '', 220),\n });\n if (out.length >= cap) { break; }\n }\n return out;\n}\n\nconst tickerItems = $('Split Watchlist by Ticker').all().map(i => i.json);\nconst newsItems = $('Fetch Ticker News').all();\nconst sentItems = $('Fetch 7-Day Sentiment').all();\nconst insItems = $('Fetch 30-Day Insider Activity').all();\nconst trendItems = $('Fetch Trending Market News').all();\n\nconst urgentMin = (tickerItems[0] || {}).urgent_min_score || 8;\nconst minRel = (tickerItems[0] || {}).min_relevance || 6;\nconst DAY_MS = 24 * 60 * 60 * 1000;\nconst now = Date.now();\n\nconst watchlist = [];\nconst redFlags = [];\n\nfor (let i = 0; i < tickerItems.length; i++) {\n const ticker = tickerItems[i].ticker;\n const newsJ = (newsItems[i] || {}).json || {};\n const sentJ = (sentItems[i] || {}).json || {};\n const insJ = (insItems[i] || {}).json || {};\n\n const articles = newsJ.error ? [] : pickArticles(newsJ, minRel, 5);\n\n // Deterministic red flags \u2014 the AI narrates them, code decides them.\n for (const a of articles) {\n const fresh = a.published && (now - new Date(a.published).getTime()) < DAY_MS;\n if (!fresh) { continue; }\n if (a.sentiment === 'negative' && a.score >= urgentMin) {\n redFlags.push({ ticker, reason: `Bearish high-relevance news (score ${a.score}): ${a.title}`, url: a.url });\n } else if (a.category === 'insider' && a.score >= 7) {\n redFlags.push({ ticker, reason: `Notable insider filing (score ${a.score}): ${a.title}`, url: a.url });\n }\n }\n\n const sentiment = sentJ.error ? null : {\n days: sentJ.days ?? 7,\n total: sentJ.total ?? 0,\n bullish: sentJ.bullish ?? 0,\n neutral: sentJ.neutral ?? 0,\n bearish: sentJ.bearish ?? 0,\n };\n\n let insider = null;\n if (!insJ.error && (insJ.total_transactions ?? 0) > 0) {\n const top = (insJ.top_insiders || [])[0] || {};\n insider = {\n days: insJ.days ?? 30,\n buys: insJ.buy_count ?? 0,\n sells: insJ.sell_count ?? 0,\n bought: usdM(insJ.buy_value_usd),\n sold: usdM(insJ.sell_value_usd),\n pct_10b5_1: insJ.pct_10b5_1 ?? 0,\n top_insider: top.name ? `${top.name}${top.title ? ' (' + top.title + ')' : ''}, ${top.transaction_count} tx, net ${usdM(top.net_value) || 'n/a'}` : null,\n };\n }\n\n watchlist.push({ ticker, sentiment, insider, articles });\n}\n\nconst market = pickArticles(((trendItems[0] || {}).json) || {}, 7, 5)\n .filter(a => !watchlist.some(w => w.articles.some(x => x.url === a.url)));\n\nconst quiet = watchlist\n .filter(w => w.articles.length === 0 && !w.insider)\n .map(w => w.ticker);\n\nconst briefing = {\n date: new Date(now).toISOString().slice(0, 10),\n watchlist: watchlist.filter(w => !quiet.includes(w.ticker)),\n quiet_tickers: quiet,\n market,\n red_flags: redFlags,\n};\n\nreturn [{\n json: {\n briefing,\n llm_input: JSON.stringify(briefing),\n has_red_flags: redFlags.length > 0,\n red_flags: redFlags,\n },\n}];\n"
},
"typeVersion": 2
},
{
"id": "0000000f-0000-4000-8000-00000000000f",
"name": "Write the Brief with AI",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
880,
240
],
"parameters": {
"text": "=You are a buy-side analyst writing a pre-open morning briefing for a private investor. Below is a JSON payload with (a) the investor's watchlist \u2014 per ticker: high-relevance news from roughly the last day (each with an AI relevance score 1-10 and per-ticker sentiment), a 7-day sentiment tally (bullish/neutral/bearish article counts) and a 30-day SEC Form 4 insider summary; (b) market-wide trending stories; (c) deterministic red flags (bearish score>=8 news or notable insider filings, last 24h).\n\nWrite the briefing in Markdown, under 600 words, in this exact structure:\n\n# Morning Market Briefing \u2014 <date>\n## TL;DR\nUp to 3 bullets \u2014 only what changes decisions today.\n## Red flags\nOnly if red_flags is non-empty: one bullet per flag \u2014 what happened and what to verify before the open. Omit the whole section when there are none.\n## Your watchlist\nOne short block per ticker in `watchlist`: lead with the read (bullish/bearish/mixed and why), cite specifics \u2014 relevance scores, insider dollar values, sentiment tallies. If `quiet_tickers` is non-empty, end the section with exactly one line: \"Quiet: <quiet_tickers joined with commas> \u2014 no significant coverage.\" If `quiet_tickers` is empty, write no Quiet line at all.\n## Market pulse\n2-4 trending stories that matter beyond the watchlist; one line each on why they matter, with the article link.\n\nRules: be specific and quantitative, no filler, no generic advice, no disclaimers. Never invent facts, numbers or tickers \u2014 mention ONLY tickers present in the payload. Whenever you reference an article, link it as a Markdown link whose anchor text is the article's title, like [Apple Intelligence Fails To Ignite Upgrade Activity](https://alphai.io/news/article/\u2026) \u2014 a shortened title is fine, but NEVER use \"here\", \"Read more\" or similar as anchor text, and use each url exactly as given in the payload.\n\nPayload:\n{{ $json.llm_input }}",
"promptType": "define"
},
"typeVersion": 1.5
},
{
"id": "00000010-0000-4000-8000-000000000010",
"name": "OpenAI Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
900,
460
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini"
},
"options": {}
},
"typeVersion": 1.2
},
{
"id": "00000011-0000-4000-8000-000000000011",
"name": "Render Email and Alerts",
"type": "n8n-nodes-base.code",
"position": [
1240,
240
],
"parameters": {
"mode": "runOnceForAllItems",
"jsCode": "// Render the AI brief: Markdown -> email-safe HTML, plus the urgent\n// Discord payload for the red-flag branch.\nconst ai = $input.first().json;\nconst data = $('Assemble Briefing Data').first().json;\nconst md = ai.text || ai.output || '';\n\nfunction esc(s) {\n return String(s).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n}\nfunction inline(s) {\n return s\n .replace(/\\[([^\\]]+)\\]\\((https?:[^\\s)]+)\\)/g, '<a href=\"$2\" style=\"color:#0a5c46;\">$1</a>')\n .replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>')\n .replace(/\\*([^*]+)\\*/g, '<em>$1</em>')\n .replace(/`([^`]+)`/g, '<code>$1</code>');\n}\n\nconst lines = esc(md).split('\\n');\nconst parts = [];\nlet inList = false;\nfor (const raw of lines) {\n const line = raw.trim();\n const isBullet = /^[-*] /.test(line);\n if (inList && !isBullet) { parts.push('</ul>'); inList = false; }\n if (!line) { continue; }\n if (line.startsWith('### ')) { parts.push(`<h3 style=\"margin:18px 0 6px;font-size:15px;\">${inline(line.slice(4))}</h3>`); }\n else if (line.startsWith('## ')) { parts.push(`<h2 style=\"margin:22px 0 8px;font-size:17px;border-bottom:1px solid #e5e5e5;padding-bottom:4px;\">${inline(line.slice(3))}</h2>`); }\n else if (line.startsWith('# ')) { parts.push(`<h1 style=\"margin:0 0 10px;font-size:20px;\">${inline(line.slice(2))}</h1>`); }\n else if (isBullet) {\n if (!inList) { parts.push('<ul style=\"margin:6px 0;padding-left:20px;\">'); inList = true; }\n parts.push(`<li style=\"margin:4px 0;\">${inline(line.slice(2))}</li>`);\n }\n else { parts.push(`<p style=\"margin:8px 0;\">${inline(line)}</p>`); }\n}\nif (inList) { parts.push('</ul>'); }\n\nconst flagBanner = data.has_red_flags\n ? `<div style=\"background:#fdecea;border:1px solid #e57373;border-radius:6px;padding:10px 14px;margin:0 0 14px;\"><strong>\ud83d\udea9 ${data.red_flags.length} red flag${data.red_flags.length > 1 ? 's' : ''} before the open</strong></div>`\n : '';\n\nconst email_html = `<!doctype html><html><body style=\"margin:0;padding:0;background:#f6f6f4;\">\n<div style=\"max-width:640px;margin:0 auto;padding:24px;background:#ffffff;font-family:Arial,Helvetica,sans-serif;font-size:14px;line-height:1.55;color:#1a1a1a;\">\n${flagBanner}\n${parts.join('\\n')}\n<hr style=\"border:none;border-top:1px solid #e5e5e5;margin:24px 0 12px;\">\n<p style=\"font-size:12px;color:#888;\">Enriched news, sentiment & SEC Form 4 data by <a href=\"https://alphai.io?utm_source=n8n&utm_medium=email&utm_campaign=morning_briefing\" style=\"color:#0a5c46;\">AlphaAI</a> \u00b7 brief written by your own AI model \u00b7 assembled with n8n</p>\n</div></body></html>`;\n\nconst subject = data.has_red_flags\n ? `\ud83d\udea9 Morning Market Briefing ${data.briefing.date} \u2014 ${data.red_flags.length} red flag${data.red_flags.length > 1 ? 's' : ''}`\n : `\u2600\ufe0f Morning Market Briefing ${data.briefing.date} \u2014 all clear`;\n\nconst urgent_payload = {\n content: `\ud83d\udea9 **Pre-open red flags \u2014 ${data.briefing.date}**`,\n embeds: (data.red_flags || []).slice(0, 10).map(f => ({\n title: `${f.ticker} \u2014 check before the open`,\n description: f.reason,\n url: f.url,\n color: 15158332,\n })),\n};\n\nreturn [{ json: { subject, email_html, has_red_flags: data.has_red_flags, urgent_payload } }];\n"
},
"typeVersion": 2
},
{
"id": "00000012-0000-4000-8000-000000000012",
"name": "Send Briefing Email",
"type": "n8n-nodes-base.emailSend",
"maxTries": 3,
"position": [
1500,
120
],
"parameters": {
"html": "={{ $json.email_html }}",
"options": {},
"subject": "={{ $json.subject }}",
"toEmail": "you@example.com",
"fromEmail": "user@example.com",
"emailFormat": "html"
},
"retryOnFail": true,
"typeVersion": 2.1,
"waitBetweenTries": 3000
},
{
"id": "00000013-0000-4000-8000-000000000013",
"name": "Check for Red Flags",
"type": "n8n-nodes-base.if",
"position": [
1500,
360
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "cond-flags",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": "={{ $json.has_red_flags }}",
"rightValue": true
}
]
}
},
"typeVersion": 2.2
},
{
"id": "00000014-0000-4000-8000-000000000014",
"name": "Send Urgent Discord Ping",
"type": "n8n-nodes-base.httpRequest",
"maxTries": 3,
"position": [
1740,
360
],
"parameters": {
"url": "https://discord.com/api/webhooks/REPLACE_WITH_YOUR_WEBHOOK_URL",
"method": "POST",
"options": {},
"jsonBody": "={{ $json.urgent_payload }}",
"sendBody": true,
"contentType": "json",
"specifyBody": "json"
},
"retryOnFail": true,
"typeVersion": 4.2,
"waitBetweenTries": 3000
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"connections": {
"Fetch Ticker News": {
"main": [
[
{
"node": "Merge All Branches",
"type": "main",
"index": 1
}
]
]
},
"OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "Write the Brief with AI",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Merge All Branches": {
"main": [
[
{
"node": "Assemble Briefing Data",
"type": "main",
"index": 0
}
]
]
},
"Check for Red Flags": {
"main": [
[
{
"node": "Send Urgent Discord Ping",
"type": "main",
"index": 0
}
],
[]
]
},
"Every Weekday at 7am": {
"main": [
[
{
"node": "Set Watchlist and Settings",
"type": "main",
"index": 0
}
]
]
},
"Fetch 7-Day Sentiment": {
"main": [
[
{
"node": "Merge All Branches",
"type": "main",
"index": 2
}
]
]
},
"Assemble Briefing Data": {
"main": [
[
{
"node": "Write the Brief with AI",
"type": "main",
"index": 0
}
]
]
},
"Render Email and Alerts": {
"main": [
[
{
"node": "Send Briefing Email",
"type": "main",
"index": 0
},
{
"node": "Check for Red Flags",
"type": "main",
"index": 0
}
]
]
},
"Write the Brief with AI": {
"main": [
[
{
"node": "Render Email and Alerts",
"type": "main",
"index": 0
}
]
]
},
"Split Watchlist by Ticker": {
"main": [
[
{
"node": "Fetch Ticker News",
"type": "main",
"index": 0
},
{
"node": "Fetch 7-Day Sentiment",
"type": "main",
"index": 0
},
{
"node": "Fetch 30-Day Insider Activity",
"type": "main",
"index": 0
}
]
]
},
"Fetch Trending Market News": {
"main": [
[
{
"node": "Merge All Branches",
"type": "main",
"index": 0
}
]
]
},
"Set Watchlist and Settings": {
"main": [
[
{
"node": "Fetch Trending Market News",
"type": "main",
"index": 0
},
{
"node": "Split Watchlist by Ticker",
"type": "main",
"index": 0
}
]
]
},
"Fetch 30-Day Insider Activity": {
"main": [
[
{
"node": "Merge All Branches",
"type": "main",
"index": 3
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow runs every 15 minutes to fetch AlphaAI’s trending market news, filter for new high-relevance, ticker-linked stories, and post them to a Discord channel via webhook as rich embed cards with sentiment and impact details. Runs every 15 minutes on a schedule trigger.…
Source: https://n8n.io/workflows/16755/ — 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.
Automate your daily AI news briefing: fetch AI-tagged stories from Hacker News, filter for the last 24 hours, scrape and summarize with GPT, then deliver a clean HTML email digest—no manual curation n
Complete PostgreSQL-backed system: Keyword scoring → AI research → Multi-part content generation → fal.ai Nano Banana image generation → WordPress publishing
This n8n workflow orchestrates a powerful suite of AI Agents and automations to manage and optimize various aspects of an e-commerce operation, particularly for platforms like Shopify. It leverages La
Template Nodes Example. Uses CUSTOM, formTrigger, executeWorkflowTrigger, chatTrigger. Event-driven trigger; 70 nodes.
This workflow automates the creation, rendering, approval, and posting of TikTok-style POV (Point of View) videos to Instagram, with cross-posting to Facebook and YouTube. It eliminates manual video p