This workflow corresponds to n8n.io template #14932 — we link there as the canonical source.
This workflow follows the Agent → Anthropic 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 →
{
"name": "Monitor supply chain risk events from RSS feeds with Claude and Telegram",
"tags": [],
"nodes": [
{
"id": "node-sticky-readme",
"name": "README",
"type": "n8n-nodes-base.stickyNote",
"position": [
-592,
64
],
"parameters": {
"width": 848,
"height": 940,
"content": "## Who's it for\n\nSupply chain operators, freight forwarders, importers/exporters, and risk teams who need early warning when maritime, carrier, geopolitical, or weather events threaten their cargo or trade lanes.\n\n## How it works\n\nThe workflow runs every 6 hours and polls 12 free public RSS feeds across 4 supply chain risk dimensions:\n\n- **Maritime**: gCaptain, Maritime Executive, Safety4Sea, Splash247\n- **Carrier**: The Loadstar, FreightWaves, Container News\n- **Geopolitical**: Google News searches for sanctions, tariffs, OFAC, export bans\n- **Weather**: GDACS, NOAA Hurricane Center, USGS Significant Earthquakes\n\nEach new item is deduped against past runs (n8n static data, no database needed), then classified by Claude Sonnet 4.5 into a primary risk dimension, severity 1-5, affected region, trade lanes, and recommended action (monitor / alert / escalate).\n\nItems at or above your severity threshold are reformatted by a second Claude pass into a scannable HTML Telegram alert with dimension-specific emoji and severity color codes. Items below threshold end silently.\n\n## How to set up\n\n1. Connect your Anthropic API credential to both Claude Sonnet sub-nodes (the same credential can be reused)\n2. Connect your Telegram Bot credential (token from BotFather) and set the `TELEGRAM_CHAT_ID` environment variable in n8n to your operator chat ID\n3. Open the Configuration node and adjust `severity_threshold` (1-5), `watched_dimensions`, and `watched_regions` to match your operation\n4. Click Execute Workflow once to test, then toggle Active\n\n## Requirements\n\n- Anthropic API key (Claude Sonnet 4.5 recommended)\n- Telegram Bot token from BotFather\n- A Telegram chat ID for receiving alerts\n\nNo databases, no Docker, no scraping, no paid APIs.\n\n## How to customize the workflow\n\nAdd or remove RSS feeds in the lane that matches your dimension. Edit the Configuration node to change the severity threshold or watched dimensions list. Extend the Sonar Analyst system prompt with new risk categories or industry-specific few-shot examples. Swap Telegram for Slack, Discord, or email by replacing the final node.\n\nThe dedupe Code node uses n8n workflow static data so no external storage is required, and caps items per run at 40 to control LLM cost."
},
"typeVersion": 1
},
{
"id": "node-sticky-maritime",
"name": "Lane: Maritime",
"type": "n8n-nodes-base.stickyNote",
"position": [
336,
64
],
"parameters": {
"color": 7,
"width": 528,
"height": 660,
"content": "### \ud83d\udef0\ufe0f Maritime Disruption\n4 sources covering chokepoints, port closures, vessel incidents"
},
"typeVersion": 1
},
{
"id": "node-sticky-carrier",
"name": "Lane: Carrier",
"type": "n8n-nodes-base.stickyNote",
"position": [
336,
752
],
"parameters": {
"color": 7,
"width": 528,
"height": 500,
"content": "### \ud83d\udea2 Carrier & Container\n3 sources covering blank sailings, equipment shortages, schedule reliability"
},
"typeVersion": 1
},
{
"id": "node-sticky-geo",
"name": "Lane: Geopolitical",
"type": "n8n-nodes-base.stickyNote",
"position": [
336,
1264
],
"parameters": {
"color": 7,
"width": 528,
"height": 360,
"content": "### \u2696\ufe0f Geopolitical & Trade\n2 Google News searches for sanctions, tariffs, trade bans"
},
"typeVersion": 1
},
{
"id": "node-sticky-weather",
"name": "Lane: Weather",
"type": "n8n-nodes-base.stickyNote",
"position": [
336,
1648
],
"parameters": {
"color": 7,
"width": 528,
"height": 500,
"content": "### \ud83c\udf2a\ufe0f Weather & Natural Disaster\n3 sources covering hurricanes, earthquakes, multi-hazard alerts"
},
"typeVersion": 1
},
{
"id": "node-schedule",
"name": "Every 6 Hours",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
240,
992
],
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 6
}
]
}
},
"typeVersion": 1.2
},
{
"id": "node-config",
"name": "Configuration",
"type": "n8n-nodes-base.set",
"notes": "Edit these values to tune the cockpit:\n- severity_threshold: minimum severity (1-5) to alert on\n- watched_dimensions: comma-separated dimensions (maritime, carrier, geopolitical, weather)\n- watched_regions: geographic focus list\n- alert_language: english | spanish | french | german\n- post_all_clear_digest: send a digest even when nothing critical",
"position": [
464,
992
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "assign-severity",
"name": "severity_threshold",
"type": "number",
"value": 3
},
{
"id": "assign-dimensions",
"name": "watched_dimensions",
"type": "string",
"value": "maritime,carrier,geopolitical,weather"
},
{
"id": "assign-regions",
"name": "watched_regions",
"type": "string",
"value": "Red Sea,Gulf of Aden,Strait of Hormuz,Strait of Malacca,Bab el-Mandeb,Suez Canal,Panama Canal,Black Sea,Taiwan Strait,US Gulf Coast,North Europe,Asia-Europe,Trans-Pacific"
},
{
"id": "assign-language",
"name": "alert_language",
"type": "string",
"value": "english"
},
{
"id": "assign-quietmode",
"name": "post_all_clear_digest",
"type": "boolean",
"value": false
}
]
}
},
"typeVersion": 3.4
},
{
"id": "node-rss-gcaptain",
"name": "RSS: gCaptain",
"type": "n8n-nodes-base.rssFeedRead",
"position": [
704,
144
],
"parameters": {
"url": "https://gcaptain.com/feed/",
"options": {}
},
"typeVersion": 1.2
},
{
"id": "node-rss-maritime-exec",
"name": "RSS: Maritime Executive",
"type": "n8n-nodes-base.rssFeedRead",
"position": [
704,
304
],
"parameters": {
"url": "https://www.maritime-executive.com/articles.rss",
"options": {}
},
"typeVersion": 1.2
},
{
"id": "node-rss-safety4sea",
"name": "RSS: Safety4Sea",
"type": "n8n-nodes-base.rssFeedRead",
"position": [
704,
464
],
"parameters": {
"url": "https://safety4sea.com/feed/",
"options": {}
},
"typeVersion": 1.2
},
{
"id": "node-rss-splash247",
"name": "RSS: Splash247",
"type": "n8n-nodes-base.rssFeedRead",
"position": [
704,
624
],
"parameters": {
"url": "https://splash247.com/feed/",
"options": {}
},
"typeVersion": 1.2
},
{
"id": "node-rss-loadstar",
"name": "RSS: The Loadstar",
"type": "n8n-nodes-base.rssFeedRead",
"position": [
704,
832
],
"parameters": {
"url": "https://theloadstar.com/feed/",
"options": {}
},
"typeVersion": 1.2
},
{
"id": "node-rss-freightwaves",
"name": "RSS: FreightWaves",
"type": "n8n-nodes-base.rssFeedRead",
"position": [
704,
992
],
"parameters": {
"url": "https://www.freightwaves.com/feed/",
"options": {}
},
"typeVersion": 1.2
},
{
"id": "node-rss-container-news",
"name": "RSS: Container News",
"type": "n8n-nodes-base.rssFeedRead",
"position": [
704,
1152
],
"parameters": {
"url": "https://container-news.com/feed/",
"options": {}
},
"typeVersion": 1.2
},
{
"id": "node-rss-gnews-tariffs",
"name": "Google News: Tariffs & Sanctions",
"type": "n8n-nodes-base.rssFeedRead",
"position": [
704,
1344
],
"parameters": {
"url": "https://news.google.com/rss/search?q=supply+chain+tariff+OR+sanctions&hl=en-US&gl=US&ceid=US:en",
"options": {}
},
"typeVersion": 1.2
},
{
"id": "node-rss-gnews-ofac",
"name": "Google News: OFAC & Export Bans",
"type": "n8n-nodes-base.rssFeedRead",
"position": [
704,
1504
],
"parameters": {
"url": "https://news.google.com/rss/search?q=OFAC+OR+%22export+ban%22+shipping&hl=en-US&gl=US&ceid=US:en",
"options": {}
},
"typeVersion": 1.2
},
{
"id": "node-rss-gdacs",
"name": "RSS: GDACS (Global Disaster Alerts)",
"type": "n8n-nodes-base.rssFeedRead",
"position": [
704,
1728
],
"parameters": {
"url": "https://www.gdacs.org/xml/rss.xml",
"options": {}
},
"typeVersion": 1.2
},
{
"id": "node-rss-noaa-nhc",
"name": "RSS: NOAA Hurricane Center",
"type": "n8n-nodes-base.rssFeedRead",
"position": [
704,
1888
],
"parameters": {
"url": "https://www.nhc.noaa.gov/index-at.xml",
"options": {}
},
"typeVersion": 1.2
},
{
"id": "node-rss-usgs",
"name": "RSS: USGS Significant Earthquakes",
"type": "n8n-nodes-base.rssFeedRead",
"position": [
704,
2048
],
"parameters": {
"url": "https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/significant_week.atom",
"options": {}
},
"typeVersion": 1.2
},
{
"id": "node-merge",
"name": "Merge All Feeds",
"type": "n8n-nodes-base.merge",
"notes": "Combines items from all 12 RSS feeds into a single stream.",
"position": [
960,
1088
],
"parameters": {
"mode": "combine",
"options": {},
"combineBy": "combineAll"
},
"typeVersion": 3
},
{
"id": "node-dedupe",
"name": "Dedupe + Tag Source",
"type": "n8n-nodes-base.code",
"notes": "Filters out items already seen in past runs.\nTags each item with a source-inferred dimension hint (maritime/carrier/geopolitical/weather).\nUses n8n workflow static data - no external storage needed.\nCaps at 800 cached URLs and 40 items per run to protect LLM cost.",
"position": [
1184,
1088
],
"parameters": {
"jsCode": "// Sonar - Dedupe via workflow static data + source-to-dimension tagging\n// Persists seen URLs across runs (n8n static data, no external DB needed)\nconst staticData = $getWorkflowStaticData('global');\nstaticData.seenUrls = staticData.seenUrls || [];\n\nconst MAX_CACHE = 800; // cap memory growth\nconst MAX_ITEMS_PER_RUN = 40; // protect downstream LLM cost\n\n// Source URL fragment \u2192 primary dimension hint\nconst dimensionMap = [\n { match: 'gcaptain.com', dim: 'maritime' },\n { match: 'maritime-executive.com', dim: 'maritime' },\n { match: 'safety4sea.com', dim: 'maritime' },\n { match: 'splash247.com', dim: 'maritime' },\n { match: 'theloadstar.com', dim: 'carrier' },\n { match: 'freightwaves.com', dim: 'carrier' },\n { match: 'container-news.com', dim: 'carrier' },\n { match: 'news.google.com', dim: 'geopolitical' },\n { match: 'gdacs.org', dim: 'weather' },\n { match: 'nhc.noaa.gov', dim: 'weather' },\n { match: 'earthquake.usgs.gov', dim: 'weather' }\n];\n\nfunction inferDimension(url) {\n if (!url) return 'other';\n for (const { match, dim } of dimensionMap) {\n if (url.includes(match)) return dim;\n }\n return 'other';\n}\n\nconst items = $input.all();\nconst fresh = [];\n\nfor (const item of items) {\n const url = item.json.link || item.json.url || item.json.guid;\n if (!url) continue;\n if (staticData.seenUrls.includes(url)) continue;\n\n staticData.seenUrls.push(url);\n fresh.push({\n json: {\n title: item.json.title || '',\n summary: (item.json.contentSnippet || item.json.content || item.json.summary || '').slice(0, 800),\n url,\n published: item.json.pubDate || item.json.isoDate || new Date().toISOString(),\n source: item.json.creator || item.json.source || 'unknown',\n source_dimension_hint: inferDimension(url)\n }\n });\n if (fresh.length >= MAX_ITEMS_PER_RUN) break;\n}\n\n// Trim cache to last MAX_CACHE entries\nif (staticData.seenUrls.length > MAX_CACHE) {\n staticData.seenUrls = staticData.seenUrls.slice(-MAX_CACHE);\n}\n\nreturn fresh;"
},
"typeVersion": 2
},
{
"id": "node-analyst",
"name": "Sonar Analyst (Claude)",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
1424,
1040
],
"parameters": {
"text": "=Classify the following news item for supply chain risk across all 4 dimensions.\n\nTitle: {{ $json.title }}\nSummary: {{ $json.summary }}\nURL: {{ $json.url }}\nPublished: {{ $json.published }}\nSource: {{ $json.source }}\nSource-inferred dimension hint: {{ $json.source_dimension_hint }}\n\nWatched dimensions: {{ $node['Configuration'].json.watched_dimensions }}\nWatched regions: {{ $node['Configuration'].json.watched_regions }}\n\nReturn ONLY valid JSON matching the schema in your system prompt. No prose, no markdown fences.",
"options": {
"systemMessage": "You are the Sonar Analyst - a multi-dimensional supply chain risk classification agent. You receive news items from 12 free public feeds and produce structured JSON classifications across 4 risk dimensions.\n\n## The 4 Risk Dimensions\n\n1. **maritime** - chokepoint disruptions, vessel attacks, port closures, piracy, naval incidents\n2. **carrier** - blank sailings, equipment shortages, schedule reliability, carrier financial distress, freight rate spikes\n3. **geopolitical** - sanctions (OFAC, EU, UN), tariffs, trade bans, export controls, customs disputes\n4. **weather** - hurricanes, typhoons, earthquakes, floods, droughts, volcanic eruptions, extreme cold/heat\n\nEvents that don't clearly fit any of these \u2192 primary_dimension = 'other' and severity = 1.\n\n## Severity Scale (always use this exact scale)\n\n1 = Monitoring: Unconfirmed reports, no immediate cargo/route impact\n2 = Advisory: Confirmed event, monitor for escalation\n3 = Alert: Active disruption, cargo or routes likely affected\n4 = Critical: Major disruption, multi-day delays or rerouting confirmed\n5 = Emergency: Catastrophic event, immediate operator action required\n\n## Output Schema\n\nReturn valid JSON ONLY (no markdown fences, no prose):\n{\n \"crisis_id\": \"DIM-REGION-YYYY-NNN (e.g. MAR-RED-SEA-2026-001 or GEO-RUSSIA-2026-001)\",\n \"primary_dimension\": \"maritime | carrier | geopolitical | weather | other\",\n \"crisis_type\": \"specific subtype: missile_attack | port_closure | piracy | blank_sailing | equipment_shortage | rate_spike | sanctions | tariff | export_ban | hurricane | earthquake | flood | drought | strike | accident | other\",\n \"severity\": 1-5,\n \"affected_region\": \"human readable region or country name\",\n \"geo_node\": \"specific port, chokepoint, country, or 'global'\",\n \"trade_lanes_affected\": [\"e.g. Asia-Europe, Trans-Pacific, US-LATAM, Russia-EU\"],\n \"source_url\": \"the URL provided exactly\",\n \"source_reliability\": \"verified | probable | unconfirmed\",\n \"carrier_advisory_issued\": boolean,\n \"recommended_action\": \"monitor | alert | escalate\",\n \"one_line_summary\": \"max 140 chars, action-oriented\",\n \"confidence\": 0.0-1.0\n}\n\n## Source Reliability Rules\n\n- **verified**: UKMTO, OFAC, EU Council, NOAA, USGS, GDACS, official government/military sources, major carrier advisories\n- **probable**: Reuters, Lloyd's List, gCaptain, Maritime Executive, The Loadstar, FreightWaves, Container News, Safety4Sea, Splash247\n- **unconfirmed**: Google News with no clear primary source, social media, anonymous reports, single-source claims\n\nWhen unconfirmed: cap severity at 2, set confidence below 0.4, recommended_action = monitor.\n\n## Recommended Action Rules\n\n- severity 1-2 \u2192 monitor\n- severity 3 OR carrier_advisory_issued = true \u2192 alert\n- severity 4-5 OR active operator decision required \u2192 escalate\n\n## Dimension Selection Heuristics\n\n- If the source is from gdacs.org / nhc.noaa.gov / earthquake.usgs.gov \u2192 almost always **weather** (unless the article is purely informational with no operational impact)\n- If the source is google news AND keywords include 'sanctions', 'tariff', 'OFAC', 'export ban', 'embargo' \u2192 **geopolitical**\n- If the source is theloadstar / freightwaves / container-news AND keywords include 'blank sailing', 'equipment', 'rate', 'schedule' \u2192 **carrier**\n- If the source is gCaptain / maritime-exec / safety4sea / splash247 AND the event happens at a port, chokepoint, or vessel \u2192 **maritime**\n- If the article spans multiple dimensions (e.g. a sanctions package that triggers carrier rerouting), pick the **upstream cause** (geopolitical in this example) and mention the downstream effect in one_line_summary\n\nUse the source_dimension_hint as a strong default but override when the article clearly belongs to a different dimension.\n\n## Few-Shot Examples\n\n### Example 1 - Maritime\nInput: \"Houthi drone attack reported near Bab el-Mandeb. UKMTO confirms vessel struck.\"\nOutput: {\"crisis_id\":\"MAR-BAB-EL-MANDEB-2026-001\",\"primary_dimension\":\"maritime\",\"crisis_type\":\"missile_attack\",\"severity\":4,\"affected_region\":\"Bab el-Mandeb\",\"geo_node\":\"Bab el-Mandeb\",\"trade_lanes_affected\":[\"Asia-Europe\",\"Asia-Mediterranean\"],\"source_url\":\"https://gcaptain.com/...\",\"source_reliability\":\"probable\",\"carrier_advisory_issued\":true,\"recommended_action\":\"escalate\",\"one_line_summary\":\"Houthi drone strikes vessel in Bab el-Mandeb - Asia-Europe rerouting expected\",\"confidence\":0.92}\n\n### Example 2 - Carrier\nInput: \"Maersk announces 8 blank sailings on Asia-Europe in Q2 due to demand weakness\"\nOutput: {\"crisis_id\":\"CAR-ASIA-EU-2026-001\",\"primary_dimension\":\"carrier\",\"crisis_type\":\"blank_sailing\",\"severity\":2,\"affected_region\":\"Asia-Europe\",\"geo_node\":\"global\",\"trade_lanes_affected\":[\"Asia-Europe\"],\"source_url\":\"https://theloadstar.com/...\",\"source_reliability\":\"probable\",\"carrier_advisory_issued\":false,\"recommended_action\":\"monitor\",\"one_line_summary\":\"Maersk blanks 8 Asia-Europe sailings in Q2 - capacity tightening\",\"confidence\":0.85}\n\n### Example 3 - Geopolitical\nInput: \"OFAC adds 12 shipping companies to sanctions list for Russia oil trade\"\nOutput: {\"crisis_id\":\"GEO-RUSSIA-2026-001\",\"primary_dimension\":\"geopolitical\",\"crisis_type\":\"sanctions\",\"severity\":4,\"affected_region\":\"Russia\",\"geo_node\":\"global\",\"trade_lanes_affected\":[\"Russia-EU\",\"Russia-Asia\"],\"source_url\":\"https://news.google.com/...\",\"source_reliability\":\"verified\",\"carrier_advisory_issued\":false,\"recommended_action\":\"escalate\",\"one_line_summary\":\"OFAC sanctions 12 shipping firms for Russia oil trade - shadow fleet exposure\",\"confidence\":0.9}\n\n### Example 4 - Weather\nInput: \"Hurricane Beryl Cat 4 approaching US Gulf Coast - Houston port evacuations underway\"\nOutput: {\"crisis_id\":\"WEA-US-GULF-2026-001\",\"primary_dimension\":\"weather\",\"crisis_type\":\"hurricane\",\"severity\":5,\"affected_region\":\"US Gulf Coast\",\"geo_node\":\"Houston\",\"trade_lanes_affected\":[\"US-LATAM\",\"US-Europe\"],\"source_url\":\"https://www.nhc.noaa.gov/...\",\"source_reliability\":\"verified\",\"carrier_advisory_issued\":true,\"recommended_action\":\"escalate\",\"one_line_summary\":\"Hurricane Beryl Cat 4 hitting Houston - port evacuations, Gulf rerouting\",\"confidence\":0.97}\n\n### Example 5 - Other (drop)\nInput: \"Container shipping company holds annual investor day in Singapore\"\nOutput: {\"crisis_id\":\"OTHER-2026-001\",\"primary_dimension\":\"other\",\"crisis_type\":\"other\",\"severity\":1,\"affected_region\":\"Singapore\",\"geo_node\":\"global\",\"trade_lanes_affected\":[],\"source_url\":\"https://...\",\"source_reliability\":\"probable\",\"carrier_advisory_issued\":false,\"recommended_action\":\"monitor\",\"one_line_summary\":\"Investor day announcement - no operational impact\",\"confidence\":0.3}\n\n## Fallback\n\nIf the item is ambiguous or non-supply-chain, return primary_dimension = 'other', severity = 1, recommended_action = 'monitor', confidence below 0.3. Never hallucinate URLs - use the provided URL exactly."
},
"promptType": "define"
},
"typeVersion": 1.7
},
{
"id": "node-analyst-llm",
"name": "Claude Sonnet (Analyst)",
"type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
"notes": "REVIEWER: configure your Anthropic API credential here.",
"position": [
1424,
1264
],
"parameters": {
"model": "claude-sonnet-4-5-20250929",
"options": {
"temperature": 0.1,
"maxTokensToSample": 1024
}
},
"typeVersion": 1.3
},
{
"id": "node-parse-json",
"name": "Parse Analyst JSON",
"type": "n8n-nodes-base.code",
"position": [
1648,
1040
],
"parameters": {
"jsCode": "// Sonar - Parse Analyst JSON output safely\nconst items = $input.all();\nconst out = [];\n\nfor (const item of items) {\n const raw = item.json.output || item.json.text || item.json.response || JSON.stringify(item.json);\n let parsed;\n try {\n // Strip markdown fences if Claude added any\n const cleaned = String(raw).replace(/```json|```/g, '').trim();\n parsed = JSON.parse(cleaned);\n } catch (e) {\n parsed = { severity: 0, primary_dimension: 'other', parse_error: e.message, raw };\n }\n out.push({ json: parsed });\n}\n\nreturn out;"
},
"typeVersion": 2
},
{
"id": "node-if-severity",
"name": "Severity \u2265 Threshold AND Dimension Watched?",
"type": "n8n-nodes-base.if",
"position": [
1872,
1040
],
"parameters": {
"options": {},
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "cond-severity",
"operator": {
"type": "number",
"operation": "gte"
},
"leftValue": "={{ $json.severity }}",
"rightValue": "={{ parseInt($node['Configuration'].json.severity_threshold) }}"
},
{
"id": "cond-dimension",
"operator": {
"type": "string",
"operation": "contains"
},
"leftValue": "={{ $node['Configuration'].json.watched_dimensions }}",
"rightValue": "={{ $json.primary_dimension }}"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "node-reporter",
"name": "Sonar Reporter (Claude)",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
2080,
944
],
"parameters": {
"text": "=Format a Telegram alert for the following classified crisis event.\n\nCrisis JSON:\n{{ JSON.stringify($json) }}\n\nReturn ONLY the message text (HTML-formatted, ready for Telegram parse_mode=HTML). Do not return JSON. Do not return markdown code fences.",
"options": {
"systemMessage": "You are the Sonar Reporter - you turn classified crisis events into concise, scannable Telegram alerts for supply chain operators.\n\n## Output Format (HTML for Telegram parse_mode=HTML)\n\nUse this exact template:\n\n{severity_emoji} <b>SONAR \u00b7 {dimension_emoji} {dimension_label}</b>\n<i>{crisis_type} \u00b7 severity {severity}/5</i>\n\n{one_line_summary}\n\n<b>Region:</b> {affected_region} ({geo_node})\n<b>Lanes:</b> {trade_lanes_affected joined with ', ' or '-' if empty}\n<b>Reliability:</b> {source_reliability}\n<b>Action:</b> {recommended_action}\n<b>Confidence:</b> {confidence}\n\n<a href=\"{source_url}\">Source \u2197</a>\n\n- Sonar Cockpit\n\n## Severity Emoji Mapping\n1 \u2192 \ud83d\udd35\n2 \u2192 \ud83d\udfe2\n3 \u2192 \ud83d\udfe1\n4 \u2192 \ud83d\udfe0\n5 \u2192 \ud83d\udd34\n\n## Dimension Emoji + Label Mapping\nmaritime \u2192 \ud83d\udef0\ufe0f Maritime\ncarrier \u2192 \ud83d\udea2 Carrier\ngeopolitical \u2192 \u2696\ufe0f Geopolitical\nweather \u2192 \ud83c\udf2a\ufe0f Weather\nstrikes \u2192 \u270a Strikes\nother \u2192 \ud83d\udce1 Other\n\n## Rules\n- Output HTML text ONLY. No JSON wrapper. No markdown code fences. No backticks.\n- Escape any < > & inside text fields if they appear in the source data.\n- Keep the message under 1000 characters total.\n- If a field is missing or null or empty list, write '-' (em dash) in its place.\n- Use the source_url EXACTLY as provided. Never invent URLs.\n- For trade_lanes_affected: join with ', ' if non-empty, otherwise use '-'."
},
"promptType": "define"
},
"typeVersion": 1.7
},
{
"id": "node-reporter-llm",
"name": "Claude Sonnet (Reporter)",
"type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
"notes": "REVIEWER: configure your Anthropic API credential here (can reuse the Analyst credential).",
"position": [
2080,
1168
],
"parameters": {
"model": "claude-sonnet-4-5-20250929",
"options": {
"temperature": 0.2,
"maxTokensToSample": 600
}
},
"typeVersion": 1.3
},
{
"id": "node-telegram",
"name": "Send Telegram Alert",
"type": "n8n-nodes-base.telegram",
"notes": "Set the TELEGRAM_CHAT_ID environment variable in n8n, OR replace the chatId expression with your operator chat ID directly.",
"position": [
2304,
944
],
"parameters": {
"text": "={{ $json.output || $json.text }}",
"chatId": "={{ $env.TELEGRAM_CHAT_ID }}",
"additionalFields": {
"parse_mode": "HTML",
"disable_web_page_preview": false
}
},
"typeVersion": 1.2
},
{
"id": "node-end-low",
"name": "End (Below Threshold)",
"type": "n8n-nodes-base.noOp",
"position": [
2080,
1280
],
"parameters": {},
"typeVersion": 1
}
],
"active": false,
"shared": [
{
"role": "workflow:owner",
"project": {
"id": "yaiJdlWTHLCTz1ho",
"icon": null,
"name": "Aleksandrs Sidorecs <aleks@sidorecs.ch>",
"type": "personal",
"createdAt": "2026-03-14T19:09:22.741Z",
"creatorId": "93d906bb-16df-4fb4-b950-4309ac3b09a2",
"updatedAt": "2026-03-14T19:17:53.809Z",
"description": null
},
"createdAt": "2026-04-08T13:45:31.459Z",
"projectId": "yaiJdlWTHLCTz1ho",
"updatedAt": "2026-04-08T13:45:31.459Z",
"workflowId": "cGDRVK7qQ1npVD1J"
}
],
"settings": {
"callerPolicy": "workflowsFromSameOwner",
"availableInMCP": false,
"executionOrder": "v1",
"saveManualExecutions": true,
"saveExecutionProgress": true
},
"connections": {
"Configuration": {
"main": [
[
{
"node": "RSS: gCaptain",
"type": "main",
"index": 0
},
{
"node": "RSS: Maritime Executive",
"type": "main",
"index": 0
},
{
"node": "RSS: Safety4Sea",
"type": "main",
"index": 0
},
{
"node": "RSS: Splash247",
"type": "main",
"index": 0
},
{
"node": "RSS: The Loadstar",
"type": "main",
"index": 0
},
{
"node": "RSS: FreightWaves",
"type": "main",
"index": 0
},
{
"node": "RSS: Container News",
"type": "main",
"index": 0
},
{
"node": "Google News: Tariffs & Sanctions",
"type": "main",
"index": 0
},
{
"node": "Google News: OFAC & Export Bans",
"type": "main",
"index": 0
},
{
"node": "RSS: GDACS (Global Disaster Alerts)",
"type": "main",
"index": 0
},
{
"node": "RSS: NOAA Hurricane Center",
"type": "main",
"index": 0
},
{
"node": "RSS: USGS Significant Earthquakes",
"type": "main",
"index": 0
}
]
]
},
"Every 6 Hours": {
"main": [
[
{
"node": "Configuration",
"type": "main",
"index": 0
}
]
]
},
"RSS: gCaptain": {
"main": [
[
{
"node": "Merge All Feeds",
"type": "main",
"index": 0
}
]
]
},
"RSS: Splash247": {
"main": [
[
{
"node": "Merge All Feeds",
"type": "main",
"index": 0
}
]
]
},
"Merge All Feeds": {
"main": [
[
{
"node": "Dedupe + Tag Source",
"type": "main",
"index": 0
}
]
]
},
"RSS: Safety4Sea": {
"main": [
[
{
"node": "Merge All Feeds",
"type": "main",
"index": 0
}
]
]
},
"RSS: FreightWaves": {
"main": [
[
{
"node": "Merge All Feeds",
"type": "main",
"index": 0
}
]
]
},
"RSS: The Loadstar": {
"main": [
[
{
"node": "Merge All Feeds",
"type": "main",
"index": 0
}
]
]
},
"Parse Analyst JSON": {
"main": [
[
{
"node": "Severity \u2265 Threshold AND Dimension Watched?",
"type": "main",
"index": 0
}
]
]
},
"Dedupe + Tag Source": {
"main": [
[
{
"node": "Sonar Analyst (Claude)",
"type": "main",
"index": 0
}
]
]
},
"RSS: Container News": {
"main": [
[
{
"node": "Merge All Feeds",
"type": "main",
"index": 0
}
]
]
},
"Sonar Analyst (Claude)": {
"main": [
[
{
"node": "Parse Analyst JSON",
"type": "main",
"index": 0
}
]
]
},
"Claude Sonnet (Analyst)": {
"ai_languageModel": [
[
{
"node": "Sonar Analyst (Claude)",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"RSS: Maritime Executive": {
"main": [
[
{
"node": "Merge All Feeds",
"type": "main",
"index": 0
}
]
]
},
"Sonar Reporter (Claude)": {
"main": [
[
{
"node": "Send Telegram Alert",
"type": "main",
"index": 0
}
]
]
},
"Claude Sonnet (Reporter)": {
"ai_languageModel": [
[
{
"node": "Sonar Reporter (Claude)",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"RSS: NOAA Hurricane Center": {
"main": [
[
{
"node": "Merge All Feeds",
"type": "main",
"index": 0
}
]
]
},
"Google News: OFAC & Export Bans": {
"main": [
[
{
"node": "Merge All Feeds",
"type": "main",
"index": 0
}
]
]
},
"Google News: Tariffs & Sanctions": {
"main": [
[
{
"node": "Merge All Feeds",
"type": "main",
"index": 0
}
]
]
},
"RSS: USGS Significant Earthquakes": {
"main": [
[
{
"node": "Merge All Feeds",
"type": "main",
"index": 0
}
]
]
},
"RSS: GDACS (Global Disaster Alerts)": {
"main": [
[
{
"node": "Merge All Feeds",
"type": "main",
"index": 0
}
]
]
},
"Severity \u2265 Threshold AND Dimension Watched?": {
"main": [
[
{
"node": "Sonar Reporter (Claude)",
"type": "main",
"index": 0
}
],
[
{
"node": "End (Below Threshold)",
"type": "main",
"index": 0
}
]
]
}
},
"activeVersion": null
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Supply chain and logistics specialists, freight forwarders, importers/exporters, and risk teams who need early warning when maritime, carrier, geopolitical, or weather events threaten their cargo or trade lanes.
Source: https://n8n.io/workflows/14932/ — 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 workflow is for beauty salons who want consistent, high‑quality social media content without writing every post manually. It also suits agencies and automation builders who manage multiple beauty
This n8n workflow template is crafted for cryptocurrency traders, analysts, and enthusiasts who want to automate professional-grade market update alerts for BTCUSD and ETHUSD pairs. By integrating mul
Who Is This For?
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 automates the creation of a daily sports podcast from your favorite news sources. It fetches articles, uses AI to write a digest and a two-person dialogue, and produces a single, merged