AutomationFlowsAI & RAG › Monitor Crypto News Risk with Coindesk Rss, Openai, Gmail, and Google Sheets

Monitor Crypto News Risk with Coindesk Rss, Openai, Gmail, and Google Sheets

ByisaWOW @isawow on n8n.io

This workflow polls the CoinDesk RSS feed every 10 minutes, filters for crypto-related stories, checks Google Sheets to avoid duplicates, uses OpenAI to score and summarize risk, logs results to Google Sheets, and sends Gmail alerts when the risk priority is HIGH or MEDIUM.…

Event trigger★★★★☆ complexity17 nodesRss Feed Read TriggerGoogle SheetsHTTP RequestGmail
AI & RAG Trigger: Event Nodes: 17 Complexity: ★★★★☆ Added:

This workflow corresponds to n8n.io template #17174 — we link there as the canonical source.

This workflow follows the Gmail → 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 →

Download .json
{
  "id": "p4FhPdmfEqWAwLQH",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Crypto News Risk Monitor - RSS + AI Alert + Gmail + Google Sheets",
  "tags": [],
  "nodes": [
    {
      "id": "78a14111-b24e-4ca4-b6d5-72e67b3b9592",
      "name": "Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        384,
        -400
      ],
      "parameters": {
        "width": 480,
        "height": 1208,
        "content": "## Crypto News Risk Monitor\n\nKeep an eye on breaking crypto news without watching feeds all day. This workflow polls the CoinDesk RSS feed on a timer, uses an AI model to score each story for market risk, logs everything to Google Sheets, and emails you when something important breaks. It suits traders, analysts, and anyone who wants an early heads up on market moving news.\n\n### How it works\n1. The **RSS** trigger polls CoinDesk on a schedule and passes the latest article forward.\n2. A **Code** node pulls out the title, link, and date, then flags whether the story is crypto relevant.\n3. A **Google Sheets** lookup skips any article that was already handled.\n4. **OpenAI** reads the story and returns a summary, affected coins, a risk level, and a suggested action.\n5. Two Google Sheets tabs store a dedupe record and a full risk log.\n6. **Gmail** sends a formatted alert when the priority is HIGH or MEDIUM.\n\n### Setup steps\n1. Connect your OpenAI credential on node 5.\n2. Create the Google Sheet with the two tabs shown in the white note, connect Google Sheets, then replace YOUR_CRYPTO_MONITOR_SHEET_ID in nodes 4, 7, and 8.\n3. Connect Gmail and replace YOUR_ALERT_EMAIL in node 10.\n4. Save, activate, then run once to test.\n\n### Customization\n- Change the poll timing in node 1 to check more or less often.\n- Edit the keyword list in node 2 to widen or narrow what counts as relevant.\n- Alert on HIGH only by removing the MEDIUM condition in node 9."
      },
      "typeVersion": 1
    },
    {
      "id": "76e694f1-34d4-430b-9836-e948b563a7dc",
      "name": "Section 1 - Ingest and filter",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        896,
        -192
      ],
      "parameters": {
        "color": 7,
        "width": 735,
        "height": 450,
        "content": "## 1. Ingest and filter\nThe RSS trigger polls CoinDesk on a timer. A Code node extracts the article fields, builds a dedupe id, and checks it against a crypto keyword list. The IF node lets only relevant stories continue."
      },
      "typeVersion": 1
    },
    {
      "id": "b92b9e76-64a4-4be5-b845-d2a8b6d70f7c",
      "name": "Section 2 - Dedupe check",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1712,
        -208
      ],
      "parameters": {
        "color": 7,
        "width": 502,
        "height": 498,
        "content": "## 2. Dedupe check\nA Google Sheets lookup reads the Seen Articles tab, and a Code node stops any story that was already handled so nothing is analyzed or emailed twice."
      },
      "typeVersion": 1
    },
    {
      "id": "1cd94f55-afd2-4f8f-8d8b-d8d076870912",
      "name": "Section 3 - AI risk analysis",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2240,
        -208
      ],
      "parameters": {
        "color": 7,
        "width": 614,
        "height": 482,
        "content": "## 3. AI risk analysis\nAn HTTP request sends the story to OpenAI, which returns a summary, affected coins, a risk level, and an action. A Code node parses that reply and sets the final priority."
      },
      "typeVersion": 1
    },
    {
      "id": "d09160b4-aa08-4e2e-bca9-bff4e71a64dc",
      "name": "Section 4 - Save and alert",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2896,
        -288
      ],
      "parameters": {
        "color": 7,
        "width": 943,
        "height": 642,
        "content": "## 4. Save and alert\nTwo Google Sheets appends store the dedupe record and the full risk log. An IF node checks the priority, and Gmail emails a formatted alert for HIGH or MEDIUM stories."
      },
      "typeVersion": 1
    },
    {
      "id": "db091d97-d60e-4ee3-8b59-a0e05226ae37",
      "name": "Google Sheet columns",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        896,
        320
      ],
      "parameters": {
        "color": 7,
        "width": 1352,
        "height": 322,
        "content": "## Google Sheet columns\nCreate one sheet with two tabs and these exact headers.\n\nTab 1 - Seen Articles (read in node 4, written in node 7):\nArticle ID, Title, Processed At\n\nTab 2 - Risk Log (written in node 8):\nDate, Title, Coins, Risk Level, Score, Summary, Action, Link"
      },
      "typeVersion": 1
    },
    {
      "id": "2ab9ac31-539e-41b6-bba3-70e22d3baaa8",
      "name": "1. RSS - Poll CoinDesk Every 10 Minutes",
      "type": "n8n-nodes-base.rssFeedReadTrigger",
      "position": [
        944,
        80
      ],
      "parameters": {
        "feedUrl": "https://www.coindesk.com/arc/outboundfeeds/rss/",
        "pollTimes": {
          "item": [
            {
              "mode": "custom",
              "cronExpression": "*/10 * * * *"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "50a22ee3-7d43-4043-9758-c2044ac9cbe8",
      "name": "2. Code - Extract Fields and Check Keywords",
      "type": "n8n-nodes-base.code",
      "position": [
        1184,
        80
      ],
      "parameters": {
        "jsCode": "// Extract fields and check crypto keyword relevance\nconst item = $json;\n\nconst title       = (item.title          || '').trim();\nconst description = (item.contentSnippet || item.content || '').trim();\nconst link        = (item.link           || '').trim();\nconst pubDate     = (item.isoDate        || new Date().toISOString());\n\n// Build dedupe ID from URL (last path segment is unique per article)\nconst urlParts  = link.split('/');\nconst articleId = urlParts.filter(Boolean).pop() || title.toLowerCase().replace(/\\s+/g, '-').substring(0, 60);\n\n// Crypto relevance keyword check\nconst text = (title + ' ' + description).toLowerCase();\nconst keywords = [\n  'bitcoin', 'btc', 'ethereum', 'eth', 'crypto', 'blockchain',\n  'defi', 'nft', 'altcoin', 'stablecoin', 'solana', 'sol',\n  'regulation', 'sec', 'hack', 'exploit', 'market', 'price',\n  'rally', 'dump', 'crash', 'bull', 'bear', 'whale', 'exchange',\n  'binance', 'coinbase', 'usdt', 'usdc', 'inflation', 'fed'\n];\n\nconst matched = keywords.filter(function(kw) { return text.includes(kw); });\nconst isRelevant = matched.length > 0;\n\nreturn [{\n  json: {\n    title,\n    description: description.substring(0, 500),\n    link,\n    pubDate,\n    articleId,\n    isRelevant,\n    matchedKeywords: matched\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "86d0ba90-e9a3-452d-a982-852fbaffe33d",
      "name": "3. IF - Is Crypto Relevant?",
      "type": "n8n-nodes-base.if",
      "position": [
        1424,
        80
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "cond-relevant",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              },
              "leftValue": "={{ $json.isRelevant }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "36708d59-0e8e-40a4-b6fa-ecb67e82ac0d",
      "name": "4. Sheets - Check If Already Processed",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1760,
        64
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Seen Articles"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "YOUR_CRYPTO_MONITOR_SHEET_ID"
        }
      },
      "typeVersion": 4.5,
      "alwaysOutputData": true
    },
    {
      "id": "2ab7da48-35aa-4896-bc9a-15498368f92c",
      "name": "4b. Code - Skip If Already Seen",
      "type": "n8n-nodes-base.code",
      "position": [
        2000,
        64
      ],
      "parameters": {
        "jsCode": "// Compare this article's id against the Seen Articles rows\nconst sheetsRows = $input.all();\nconst ctx        = $('2. Code - Extract Fields and Check Keywords').first().json;\n\n// Already processed only if a stored row matches this article id\nconst alreadySeen = sheetsRows.some(function(item) {\n  return String(item.json['Article ID']) === String(ctx.articleId);\n});\n\nif (alreadySeen) {\n  // Stop this item, nothing to analyze or send\n  return [];\n}\n\n// New article, pass context forward\nreturn [{ json: ctx }];"
      },
      "typeVersion": 2
    },
    {
      "id": "e901ecf2-12f8-481c-8446-12bb1c6211c1",
      "name": "5. HTTP - OpenAI Crypto Risk Analysis",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2336,
        64
      ],
      "parameters": {
        "url": "https://api.openai.com/v1/chat/completions",
        "method": "POST",
        "options": {
          "timeout": 25000
        },
        "jsonBody": "={\n  \"model\": \"gpt-4o-mini\",\n  \"temperature\": 0,\n  \"max_tokens\": 300,\n  \"messages\": [\n    {\n      \"role\": \"system\",\n      \"content\": \"You are a crypto risk analyst. Analyze the news and return ONLY valid JSON with no markdown. Structure: {\\\"summary\\\": \\\"2 sentences max\\\", \\\"coins\\\": [\\\"BTC\\\"], \\\"risk_level\\\": \\\"HIGH or MEDIUM or LOW\\\", \\\"score\\\": integer 0-100, \\\"action\\\": \\\"what a trader should do right now in one sentence\\\"}. HIGH = major market-moving event. MEDIUM = noteworthy but limited impact. LOW = routine news.\"\n    },\n    {\n      \"role\": \"user\",\n      \"content\": {{ JSON.stringify('Title: ' + $json.title + '\\nDescription: ' + $json.description) }}\n    }\n  ]\n}",
        "sendBody": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "authentication": "predefinedCredentialType",
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "nodeCredentialType": "openAiApi"
      },
      "typeVersion": 4.3
    },
    {
      "id": "7bc1dabc-59c0-4e11-8f2d-cfbbc49b5ae9",
      "name": "6. Code - Parse AI and Set Priority",
      "type": "n8n-nodes-base.code",
      "position": [
        2576,
        64
      ],
      "parameters": {
        "jsCode": "// Parse OpenAI JSON response and compute final priority\nconst gptResp = $json;\nconst ctx     = $('4b. Code - Skip If Already Seen').first().json;\n\nconst raw = gptResp?.choices?.[0]?.message?.content || '';\nif (!raw) throw new Error('OpenAI returned empty response. Check your API key.');\n\nlet ai = {};\ntry {\n  const cleaned = raw.trim()\n    .replace(/^```json\\s*/i, '')\n    .replace(/^```\\s*/i, '')\n    .replace(/```$/i, '')\n    .trim();\n  ai = JSON.parse(cleaned);\n} catch(e) {\n  ai = {\n    summary:    raw.substring(0, 200),\n    coins:      [],\n    risk_level: 'LOW',\n    score:      20,\n    action:     'No specific action recommended.'\n  };\n}\n\n// Final priority from risk_level\nconst riskLevel = (ai.risk_level || 'LOW').toUpperCase();\nconst priority  = riskLevel === 'HIGH' ? 'HIGH' :\n                  riskLevel === 'MEDIUM' ? 'MEDIUM' : 'LOW';\n\nconst coinsStr = Array.isArray(ai.coins) ? ai.coins.join(', ') : (ai.coins || '');\n\nreturn [{\n  json: {\n    title:     ctx.title,\n    link:      ctx.link,\n    pubDate:   ctx.pubDate,\n    articleId: ctx.articleId,\n    summary:   ai.summary    || '',\n    coins:     coinsStr,\n    riskLevel,\n    score:     parseInt(ai.score) || 50,\n    action:    ai.action     || '',\n    priority,\n    processedAt: new Date().toISOString(),\n    dateOnly:    new Date().toISOString().split('T')[0]\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "fabe705d-b234-4713-b2f3-d31b85aab33a",
      "name": "7. Sheets - Save Dedupe Record",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2976,
        -112
      ],
      "parameters": {
        "columns": {
          "value": {
            "Title": "={{ $json.title }}",
            "Article ID": "={{ $json.articleId }}",
            "Processed At": "={{ $json.processedAt }}"
          },
          "schema": [
            {
              "id": "Article ID",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Article ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Title",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Processed At",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Processed At",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": true
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Seen Articles"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "YOUR_CRYPTO_MONITOR_SHEET_ID"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "7346ec14-2af2-440f-85ee-32f29a8300a2",
      "name": "8. Sheets - Log Full Risk Record",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2976,
        64
      ],
      "parameters": {
        "columns": {
          "value": {
            "Date": "={{ $json.dateOnly }}",
            "Link": "={{ $json.link }}",
            "Coins": "={{ $json.coins }}",
            "Score": "={{ $json.score }}",
            "Title": "={{ $json.title }}",
            "Action": "={{ $json.action }}",
            "Summary": "={{ $json.summary }}",
            "Risk Level": "={{ $json.riskLevel }}"
          },
          "schema": [
            {
              "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": "Coins",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Coins",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Risk Level",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Risk Level",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Score",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Score",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Summary",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Summary",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Action",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Action",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Link",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Link",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": true
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Risk Log"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "YOUR_CRYPTO_MONITOR_SHEET_ID"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "f70bd676-922e-4211-8cc2-22be70f7272f",
      "name": "9. IF - HIGH or MEDIUM Priority?",
      "type": "n8n-nodes-base.if",
      "position": [
        3216,
        64
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "or",
          "conditions": [
            {
              "id": "cond-high",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.priority }}",
              "rightValue": "HIGH"
            },
            {
              "id": "cond-medium",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.priority }}",
              "rightValue": "MEDIUM"
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "2f1e64ce-8ddb-4d31-8bf6-d8b25c7ee85d",
      "name": "10. Gmail - Send Risk Alert Email",
      "type": "n8n-nodes-base.gmail",
      "position": [
        3568,
        48
      ],
      "parameters": {
        "sendTo": "YOUR_ALERT_EMAIL",
        "message": "=<div style=\"font-family:Arial,sans-serif;max-width:620px;margin:0 auto;background:#f5f5f5;\">\n  <div style=\"background:{{ $json.priority === 'HIGH' ? '#dc2626' : '#d97706' }};padding:18px 22px;border-radius:8px 8px 0 0;\">\n    <h2 style=\"color:#fff;margin:0;font-size:16px;\">{{ $json.priority }} Priority Crypto Alert</h2>\n    <p style=\"color:rgba(255,255,255,0.85);margin:4px 0 0;font-size:12px;\">{{ $json.pubDate }}</p>\n  </div>\n  <div style=\"background:#fff;padding:18px 22px;\">\n    <h3 style=\"margin:0 0 12px;font-size:15px;color:#111;\">{{ $json.title }}</h3>\n    <table style=\"width:100%;font-size:13px;margin-bottom:14px;\">\n      <tr><td style=\"color:#555;padding:4px 0;width:90px;\">Coins</td><td style=\"color:#111;font-weight:600;\">{{ $json.coins || 'N/A' }}</td></tr>\n      <tr><td style=\"color:#555;padding:4px 0;\">Risk Level</td><td style=\"color:#111;font-weight:600;\">{{ $json.riskLevel }}</td></tr>\n      <tr><td style=\"color:#555;padding:4px 0;\">Score</td><td style=\"color:#111;font-weight:600;\">{{ $json.score }}/100</td></tr>\n    </table>\n    <div style=\"background:#f8f9fa;border-left:4px solid #6366f1;padding:12px 14px;border-radius:0 6px 6px 0;margin-bottom:12px;\">\n      <div style=\"font-size:12px;font-weight:700;color:#4338ca;margin-bottom:4px;\">AI Summary</div>\n      <p style=\"margin:0;font-size:13px;color:#333;line-height:1.6;\">{{ $json.summary }}</p>\n    </div>\n    <div style=\"background:#fef3c7;border-left:4px solid #f59e0b;padding:12px 14px;border-radius:0 6px 6px 0;margin-bottom:14px;\">\n      <div style=\"font-size:12px;font-weight:700;color:#92400e;margin-bottom:4px;\">Recommended Action</div>\n      <p style=\"margin:0;font-size:13px;color:#333;font-weight:600;\">{{ $json.action }}</p>\n    </div>\n    <a href=\"{{ $json.link }}\" style=\"display:inline-block;background:#6366f1;color:#fff;padding:10px 18px;border-radius:6px;text-decoration:none;font-size:13px;font-weight:600;\">Read Full Article</a>\n    <div style=\"margin-top:14px;padding-top:12px;border-top:1px solid #e5e7eb;\">\n      <p style=\"font-size:11px;color:#9ca3af;margin:0;\">Crypto News Risk Monitor - n8n + OpenAI. Not financial advice.</p>\n    </div>\n  </div>\n</div>",
        "options": {
          "senderName": "Crypto Risk Monitor",
          "appendAttribution": false
        },
        "subject": "={{ '[' + $json.priority + '] Crypto Alert: ' + $json.title }}"
      },
      "typeVersion": 2.1
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "executionOrder": "v1"
  },
  "versionId": "91dd97ea-b4b5-4809-8959-d70a0560285a",
  "nodeGroups": [],
  "connections": {
    "3. IF - Is Crypto Relevant?": {
      "main": [
        [
          {
            "node": "4. Sheets - Check If Already Processed",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "4b. Code - Skip If Already Seen": {
      "main": [
        [
          {
            "node": "5. HTTP - OpenAI Crypto Risk Analysis",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "9. IF - HIGH or MEDIUM Priority?": {
      "main": [
        [
          {
            "node": "10. Gmail - Send Risk Alert Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "6. Code - Parse AI and Set Priority": {
      "main": [
        [
          {
            "node": "7. Sheets - Save Dedupe Record",
            "type": "main",
            "index": 0
          },
          {
            "node": "8. Sheets - Log Full Risk Record",
            "type": "main",
            "index": 0
          },
          {
            "node": "9. IF - HIGH or MEDIUM Priority?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "5. HTTP - OpenAI Crypto Risk Analysis": {
      "main": [
        [
          {
            "node": "6. Code - Parse AI and Set Priority",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "4. Sheets - Check If Already Processed": {
      "main": [
        [
          {
            "node": "4b. Code - Skip If Already Seen",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "1. RSS - Poll CoinDesk Every 10 Minutes": {
      "main": [
        [
          {
            "node": "2. Code - Extract Fields and Check Keywords",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "2. Code - Extract Fields and Check Keywords": {
      "main": [
        [
          {
            "node": "3. IF - Is Crypto Relevant?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This workflow polls the CoinDesk RSS feed every 10 minutes, filters for crypto-related stories, checks Google Sheets to avoid duplicates, uses OpenAI to score and summarize risk, logs results to Google Sheets, and sends Gmail alerts when the risk priority is HIGH or MEDIUM.…

Source: https://n8n.io/workflows/17174/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

This workflow monitors unread Gmail support emails, uses Google Gemini to classify and summarize each message and draft a reply, logs the ticket details to Google Sheets, creates a Gmail draft respons

Gmail Trigger, HTTP Request, Google Sheets +2
AI & RAG

This workflow hosts an n8n intake form, sends submissions to Anthropic Claude for practice-area classification and qualification, then routes results to Gmail and Google Sheets before returning a conf

Form Trigger, HTTP Request, Gmail +2
AI & RAG

This workflow polls Gmail for emails with the subject “Trade Instruction”, uses OpenAI Chat Completions to extract trade fields from the email body, logs valid and failed extractions to separate tabs

Gmail Trigger, HTTP Request, Google Sheets +1
AI & RAG

This workflow collects SIP and mutual fund details via an n8n Form, calculates goal and performance metrics, generates a personalized advisory using OpenAI, emails a color-coded HTML report via Gmail,

Form Trigger, HTTP Request, Google Sheets +1
AI & RAG

This workflow collects train trip details via an n8n Form, predicts station crowding and queue times with a rule-based algorithm, generates a short advisory with OpenAI, then emails a color-coded HTML

Form Trigger, HTTP Request, Google Sheets +1