{"workflow":{"id":13651,"name":"Generate AI trading alerts from CoinGecko and Alpha Vantage via Slack, email and SMS","views":1650,"recentViews":8,"totalViews":1650,"createdAt":"2026-02-24T11:29:59.993Z","description":"Automates real-time market monitoring, technical analysis, AI-powered signal generation for cryptocurrencies (and stocks), filters high-confidence trades, and delivers actionable alerts via multiple channels.\n\n## Good to Know\n- Runs **every 5–30 minutes** (configurable trigger) to catch fresh market opportunities\n- Pulls **real-time price data** from multiple crypto/stock sources in parallel\n- Calculates popular **technical indicators** (RSI, MACD, Moving Averages, etc.)\n- Uses an **AI model** (likely Grok/xAI, OpenAI, or similar) to interpret indicators and generate buy/sell signals with confidence scores\n- Applies **multi-layer filtering** to reduce noise (thresholds, validation rules)\n- Stores signals in a **database**, logs execution history, and sends notifications\n- Supports **email**, **Telegram**, **Discord**, **SMS** (via Twilio), or **trading execution** webhooks\n- Saves significant time compared to manual chart watching\n\n## How It Works\n\n### 1. Trigger\n- **Schedule Trigger** or **Manual Trigger** (every 5–30 minutes)\n- Optional: **Market Hours / Kill-zone** filter (e.g. avoid low-volume periods)\n- Can be webhook-based for on-demand runs\n\n### 2. Fetch & Prepare Data\n- Fetches **real-time / recent OHLCV data** for a watchlist of cryptocurrencies (and possibly stocks)\n- Sources: CoinGecko, Binance, Alpha Vantage, CoinMarketCap, Bybit, Kraken, etc. (multiple in parallel)\n- Combines data from different APIs\n- Prepares structured dataset (candles, volume, current price)\n- Calculates **technical indicators** in parallel or via Code node / community nodes (e.g. RSI(14), MACD, EMA/SMA crossovers, Bollinger Bands, etc.)\n\n### 3. Analysis & Signal Generation\n- Sends prepared market data + calculated indicators to an **AI model**\n- Prompt instructs the model to:\n  - Analyze current market structure\n  - Evaluate indicator confluence\n  - Generate **Buy / Sell / Hold** signal\n  - Assign **confidence score** (e.g. 0–100%)\n  - Provide short reasoning\n- Optional: Rule-based pre-filter (e.g. only proceed if RSI &lt; 30 or MACD crossover)\n\n### 4. Validate, Alert & Store\n- **Filters** signals: minimum confidence threshold, no-duplicate check, max signals per run, etc.\n- **Validates** against additional rules (e.g. volume spike, no recent opposite signal)\n- **Stores** signal in database (PostgreSQL, Supabase, Airtable, Google Sheets, etc.)\n  - Includes: timestamp, symbol, signal type, confidence, price, indicators snapshot, AI reasoning\n- **Logs** full execution trace\n- **Sends alerts**:\n  - Email notification\n  - Telegram / Discord message (with formatting)\n  - SMS (Twilio)\n  - Webhook to trading bot / execution system\n  - Optional: Push to tradingview alert or auto-execute (paper/live)\n\n## Data Sources\n- **Market Data APIs** — CoinGecko, Binance, Alpha Vantage, CoinMarketCap, etc.\n- **Technical Indicators** — Calculated via Code node, community nodes (e.g. phoenix indicators), or external libraries\n- **AI Model** — Grok (xAI), OpenAI (GPT-4o), Claude, Gemini, or local LLM\n- **Notification Channels** — Email (Gmail/SMTP), Telegram, Discord, Twilio, webhook\n- **Storage** — Google Sheets, PostgreSQL, Supabase, Notion, Airtable\n\n## How to Use\n1. **Import** the workflow JSON into your n8n instance\n2. **Configure credentials**:\n   - API keys for market data providers (Alpha Vantage, CoinGecko Pro, Binance, etc.)\n   - AI provider (Grok API key, OpenAI key, etc.)\n   - Notification services (Telegram bot token, email SMTP, Twilio, etc.)\n   - Database connection if used\n3. **Set your watchlist** — edit the symbols in the fetch node(s)\n4. **Tune the schedule** — change interval in the trigger node\n5. **Customize AI prompt** — adjust in the AI node for more aggressive/conservative signals\n6. **Set filters** — confidence threshold, max alerts per cycle, etc.\n7. **Test manually** — use Execute Workflow button with sample data\n8. **Activate & monitor** — check Executions tab for logs\n\n## Requirements\n- n8n (self-hosted or cloud)\n- API keys for at least one market data provider\n- AI API access (Grok, OpenAI, etc.)\n- Notification credentials (Telegram bot, email account, etc.)\n- Optional: Database for persistent signal history\n\n## Customizing This Workflow\n- Add more **exchanges/sources** for better data redundancy\n- Include **on-chain metrics** (whale alerts, funding rates) via additional APIs\n- Switch AI model or fine-tune prompt for your trading style\n- Add **risk management** rules (position sizing, stop-loss levels)\n- Integrate **auto-trading** via exchange API (Binance, Bybit, Alpaca, etc.)\n- Create **dashboard** output (Google Sheets + Looker Studio / Grafana)\n- Add **backtesting mode** using historical data\n- Implement **blackout periods** or news filter to avoid high-impact events\n","workflow":{"id":"tPBS4o6KFeFMZuxJ","meta":{"instanceId":"dd69efaf8212c74ad206700d104739d3329588a6f3f8381a46a481f34c9cc281","templateCredsSetupCompleted":true},"name":"AI Trading Alert Bot","tags":[],"nodes":[{"id":"df58effa-87e1-49b9-97ea-61f70e0df077","name":"Sticky Note - Main Overview","type":"n8n-nodes-base.stickyNote","position":[-2128,48],"parameters":{"width":820,"height":720,"content":"## AI Trading Alert Bot\n\nAutomates market data fetching, technical analysis, and AI-powered buy/sell signal generation. Monitors multiple cryptocurrencies and stocks in real-time, analyzes price trends, and delivers actionable trading alerts.\n\n## How it works\n\n1. **Trigger** — Runs every 15 minutes or on manual trigger\n2. **Fetch Market Data** — Retrieves real-time price data from multiple sources\n3. **Technical Analysis** — Calculates indicators (RSI, MACD, Moving Averages)\n4. **AI Signal Generation** — Uses machine learning to predict buy/sell signals\n5. **Alert Processing** — Validates signals and filters false positives\n6. **Notifications** — Sends alerts via Email, Slack, and SMS\n7. **Database Storage** — Logs all signals and trade history\n\n## Setup steps\n\n1. **API Keys** — Configure CoinGecko, Alpha Vantage, or your preferred market data provider\n2. **Database** — Set up PostgreSQL table for trade history and signals\n3. **Notifications** — Configure Slack webhook, email SMTP, and SMS provider credentials\n4. **AI Model** — Replace AI endpoint with your trained model API\n5. **Trading Symbols** — Update symbol list (BTC, ETH, AAPL, GOOGL, etc.)\n6. **Test** — Run manually to verify all connections and validate signals"},"typeVersion":1},{"id":"e241f436-9465-4416-987e-c1bd09529e25","name":"Sticky Note - Group 1: Trigger","type":"n8n-nodes-base.stickyNote","position":[-1216,144],"parameters":{"color":3,"width":468,"height":465,"content":"## 1. Trigger\n\nAutomatically runs every 15 minutes to fetch fresh market data and generate trading signals"},"typeVersion":1},{"id":"a0b528ba-0f7a-40d8-a39d-e0be3723646f","name":"Sticky Note - Group 2: Data Collection","type":"n8n-nodes-base.stickyNote","position":[-704,160],"parameters":{"color":4,"width":668,"height":353,"content":"## 2. Fetch & Prepare Data\n\nCollects real-time market data from APIs and prepares it for technical analysis in parallel"},"typeVersion":1},{"id":"0a5bcdee-af88-48d6-af7c-39caad584c53","name":"Sticky Note - Group 3: Analysis & AI","type":"n8n-nodes-base.stickyNote","position":[-16,-160],"parameters":{"color":7,"width":684,"height":905,"content":"## 3. Analysis & Signal Generation\n\nCalculates technical indicators and uses AI/ML model to generate buy/sell signals with confidence scores"},"typeVersion":1},{"id":"947d885d-6a03-41ed-a63e-baf777e03785","name":"Sticky Note - Group 4: Alert & Execute","type":"n8n-nodes-base.stickyNote","position":[704,32],"parameters":{"color":6,"width":960,"height":697,"content":"## 4. Validate, Alert & Store\n\nFilters signals, sends notifications across multiple channels, logs trades, and stores in database"},"typeVersion":1},{"id":"e3fc0d75-1aba-4ff4-b964-3a442811c1fc","name":"Market Data Trigger - Every 15 minutes","type":"n8n-nodes-base.scheduleTrigger","position":[-1088,352],"parameters":{"rule":{"interval":[{"field":"cronExpression","expression":"*/15 * * * *"}]}},"typeVersion":1.2},{"id":"60e75270-eef8-440f-ae79-dd86ad82e51e","name":"Fetch cryptocurrency prices from CoinGecko","type":"n8n-nodes-base.httpRequest","position":[-864,256],"parameters":{"url":"https://api.coingecko.com/api/v3/simple/price","options":{}},"typeVersion":4.2},{"id":"d1da9648-5725-4cd0-924c-a830e03b45e3","name":"Fetch stock prices from Alpha Vantage","type":"n8n-nodes-base.httpRequest","position":[-864,448],"parameters":{"url":"https://www.alphavantage.co/query","options":{}},"typeVersion":4.2},{"id":"0472f691-42f8-42c8-9d76-bf9994a211c6","name":"Combine crypto and stock market data","type":"n8n-nodes-base.merge","position":[-640,352],"parameters":{"mode":"combine","options":{}},"typeVersion":3},{"id":"0b9f2def-882f-4cee-8045-d336f27e16c6","name":"Calculate technical indicators","type":"n8n-nodes-base.code","position":[-416,352],"parameters":{"mode":"runOnceForEachItem","jsCode":"// Calculate technical indicators for trading signals\nconst data = $input.item.json;\n\n// Mock historical price data (in real scenario, fetch from database)\nconst historicalPrices = {\n  'bitcoin': [42000, 42500, 41800, 43200, 43500, 42900, 43100, 43400],\n  'ethereum': [2200, 2250, 2180, 2300, 2350, 2280, 2320, 2380],\n  'AAPL': [150, 151, 149, 152, 153, 151, 152, 154],\n  'GOOGL': [100, 101, 99, 102, 103, 101, 102, 104]\n};\n\nconst currentPrice = data.price || 0;\nconst symbol = data.symbol || 'UNKNOWN';\nconst priceHistory = historicalPrices[symbol.toLowerCase()] || [currentPrice];\n\n// Calculate Simple Moving Average (SMA)\nconst calculateSMA = (prices, period) => {\n  if (prices.length < period) return null;\n  const sum = prices.slice(-period).reduce((a, b) => a + b, 0);\n  return sum / period;\n};\n\n// Calculate Exponential Moving Average (EMA)\nconst calculateEMA = (prices, period) => {\n  if (prices.length < period) return null;\n  const k = 2 / (period + 1);\n  let ema = prices.slice(0, period).reduce((a, b) => a + b, 0) / period;\n  for (let i = period; i < prices.length; i++) {\n    ema = prices[i] * k + ema * (1 - k);\n  }\n  return ema;\n};\n\n// Calculate RSI (Relative Strength Index)\nconst calculateRSI = (prices, period = 14) => {\n  if (prices.length < period + 1) return null;\n  const deltas = [];\n  for (let i = 1; i < prices.length; i++) {\n    deltas.push(prices[i] - prices[i - 1]);\n  }\n  \n  let gains = 0, losses = 0;\n  for (let i = 0; i < period; i++) {\n    if (deltas[i] > 0) gains += deltas[i];\n    else losses -= deltas[i];\n  }\n  \n  let avgGain = gains / period;\n  let avgLoss = losses / period;\n  \n  for (let i = period; i < deltas.length; i++) {\n    if (deltas[i] > 0) gains = deltas[i];\n    else gains = 0;\n    if (deltas[i] < 0) losses = -deltas[i];\n    else losses = 0;\n    avgGain = (avgGain * (period - 1) + gains) / period;\n    avgLoss = (avgLoss * (period - 1) + losses) / period;\n  }\n  \n  const rs = avgGain / (avgLoss || 1);\n  return 100 - (100 / (1 + rs));\n};\n\n// Calculate MACD (Moving Average Convergence Divergence)\nconst calculateMACD = (prices) => {\n  const ema12 = calculateEMA(prices, 12);\n  const ema26 = calculateEMA(prices, 26);\n  if (!ema12 || !ema26) return null;\n  return { macd: ema12 - ema26, signal: (ema12 - ema26) * 0.7 };\n};\n\n// Calculate Bollinger Bands\nconst calculateBollingerBands = (prices, period = 20, stdDev = 2) => {\n  if (prices.length < period) return null;\n  const sma = calculateSMA(prices, period);\n  const slice = prices.slice(-period);\n  const variance = slice.reduce((sum, p) => sum + Math.pow(p - sma, 2), 0) / period;\n  const stdev = Math.sqrt(variance);\n  return {\n    upper: sma + (stdev * stdDev),\n    middle: sma,\n    lower: sma - (stdev * stdDev)\n  };\n};\n\nconst sma50 = calculateSMA(priceHistory, 50) || calculateSMA(priceHistory, Math.min(priceHistory.length - 1, 50));\nconst sma200 = calculateSMA(priceHistory, 200) || calculateSMA(priceHistory, Math.min(priceHistory.length - 1, 200));\nconst ema12 = calculateEMA(priceHistory, 12) || calculateEMA(priceHistory, Math.min(priceHistory.length - 1, 12));\nconst rsi = calculateRSI(priceHistory) || 50;\nconst macd = calculateMACD(priceHistory) || { macd: 0, signal: 0 };\nconst bollingerBands = calculateBollingerBands(priceHistory) || { upper: currentPrice * 1.05, middle: currentPrice, lower: currentPrice * 0.95 };\n\nconst priceChange24h = data.change_24h || 0;\nconst volume24h = data.volume_24h || 0;\nconst marketCap = data.market_cap || 0;\n\nreturn {\n  json: {\n    symbol: symbol,\n    currentPrice: currentPrice,\n    priceChange24h: priceChange24h,\n    volume24h: volume24h,\n    marketCap: marketCap,\n    \n    // Technical Indicators\n    technicalIndicators: {\n      sma50: sma50 ? parseFloat(sma50.toFixed(2)) : null,\n      sma200: sma200 ? parseFloat(sma200.toFixed(2)) : null,\n      ema12: ema12 ? parseFloat(ema12.toFixed(2)) : null,\n      rsi: parseFloat(rsi.toFixed(2)),\n      macd: parseFloat(macd.macd.toFixed(2)),\n      macdSignal: parseFloat(macd.signal.toFixed(2)),\n      bollingerUpper: parseFloat(bollingerBands.upper.toFixed(2)),\n      bollingerMiddle: parseFloat(bollingerBands.middle.toFixed(2)),\n      bollingerLower: parseFloat(bollingerBands.lower.toFixed(2))\n    },\n    \n    // Trend Analysis\n    trend: {\n      shortTerm: currentPrice > sma50 ? 'BULLISH' : 'BEARISH',\n      longTerm: sma50 > sma200 ? 'BULLISH' : 'BEARISH',\n      rsiStatus: rsi > 70 ? 'OVERBOUGHT' : rsi < 30 ? 'OVERSOLD' : 'NEUTRAL',\n      macdTrend: macd.macd > macd.signal ? 'BULLISH' : 'BEARISH'\n    },\n    \n    // Timestamp\n    timestamp: new Date().toISOString(),\n    analysisDate: new Date().toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' })\n  }\n};"},"typeVersion":2},{"id":"3fac4998-d581-4eb8-915d-cef725e0ab8b","name":"Call AI model for signal prediction","type":"n8n-nodes-base.httpRequest","position":[-192,352],"parameters":{"url":"https://api.example.com/ai/predict-signal","method":"POST","options":{},"sendBody":true,"sendHeaders":true,"bodyParameters":{"parameters":[{"name":"symbol","value":"={{ $json.symbol }}"},{"name":"currentPrice","value":"={{ $json.currentPrice }}"},{"name":"technicalIndicators","value":"={{ $json.technicalIndicators }}"},{"name":"trend","value":"={{ $json.trend }}"},{"name":"volume24h","value":"={{ $json.volume24h }}"}]},"headerParameters":{"parameters":[{"name":"Content-Type","value":"application/json"}]}},"typeVersion":4.2},{"id":"57960c95-154b-461f-b4c1-b4a470ded867","name":"Analyze AI signals and confidence","type":"n8n-nodes-base.code","position":[32,352],"parameters":{"mode":"runOnceForEachItem","jsCode":"// Analyze AI signals and calculate confidence scores\nconst aiResponse = $input.item.json;\nconst signal = aiResponse.signal || 'HOLD';\nconst confidence = aiResponse.confidence || 0.5;\nconst reasoning = aiResponse.reasoning || 'Insufficient data';\n\n// Thresholds\nconst buyThreshold = 0.65;\nconst sellThreshold = 0.65;\nconst holdConfidence = 0.5;\n\n// Determine action based on confidence\nlet action = 'HOLD';\nlet actionConfidence = 0;\nlet riskLevel = 'MEDIUM';\n\nif (signal === 'BUY' && confidence >= buyThreshold) {\n  action = 'BUY';\n  actionConfidence = confidence;\n  riskLevel = confidence > 0.85 ? 'LOW' : 'MEDIUM';\n} else if (signal === 'SELL' && confidence >= sellThreshold) {\n  action = 'SELL';\n  actionConfidence = confidence;\n  riskLevel = confidence > 0.85 ? 'LOW' : 'MEDIUM';\n} else {\n  action = 'HOLD';\n  actionConfidence = confidence;\n  riskLevel = 'LOW';\n}\n\n// Recommended position size based on confidence\nconst positionSize = action === 'HOLD' ? 0 : Math.round(actionConfidence * 100);\n\n// Alert level\nlet alertLevel = 'INFO';\nif (action !== 'HOLD' && actionConfidence > 0.80) {\n  alertLevel = 'CRITICAL';\n} else if (action !== 'HOLD' && actionConfidence > 0.70) {\n  alertLevel = 'HIGH';\n} else if (action !== 'HOLD') {\n  alertLevel = 'MEDIUM';\n}\n\nconst timestamp = new Date().toISOString();\nconst signalId = `SIG-${new Date().getTime()}-${Math.random().toString(36).substr(2, 9)}`;\n\nreturn {\n  json: {\n    signalId: signalId,\n    symbol: aiResponse.symbol,\n    currentPrice: aiResponse.currentPrice,\n    action: action,\n    confidence: parseFloat(actionConfidence.toFixed(4)),\n    riskLevel: riskLevel,\n    positionSize: positionSize,\n    alertLevel: alertLevel,\n    aiReasoning: reasoning,\n    \n    // Recommendation details\n    recommendation: {\n      action: action,\n      entryPrice: aiResponse.currentPrice,\n      targetPrice: action === 'BUY' ? aiResponse.currentPrice * 1.05 : action === 'SELL' ? aiResponse.currentPrice * 0.95 : aiResponse.currentPrice,\n      stopLoss: action === 'BUY' ? aiResponse.currentPrice * 0.98 : action === 'SELL' ? aiResponse.currentPrice * 1.02 : aiResponse.currentPrice,\n      profitTarget: action === 'BUY' ? aiResponse.currentPrice * 1.10 : action === 'SELL' ? aiResponse.currentPrice * 0.90 : aiResponse.currentPrice,\n      timeframe: '15m-1h'\n    },\n    \n    // Validation flags\n    isValidSignal: action !== 'HOLD',\n    shouldAlert: action !== 'HOLD' && actionConfidence >= holdConfidence,\n    shouldExecute: action !== 'HOLD' && actionConfidence >= 0.75,\n    \n    timestamp: timestamp,\n    originalAIResponse: aiResponse\n  }\n};"},"typeVersion":2},{"id":"617614c7-0653-4794-b391-ff61f23daf70","name":"Validate signal strength and filter","type":"n8n-nodes-base.filter","position":[256,352],"parameters":{"options":{},"conditions":{"options":{"leftValue":"","caseSensitive":false,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"signal-validation","operator":{"type":"boolean","operation":"true"},"leftValue":"={{ $json.shouldAlert }}"}]}},"typeVersion":2},{"id":"6e7fe960-95fd-42de-89a6-481b0f626327","name":"Store trade signal in PostgreSQL","type":"n8n-nodes-base.postgres","position":[480,352],"parameters":{"table":"trading_signals","schema":{"__rl":true,"mode":"list","value":"public"},"columns":{"value":{},"schema":[],"mappingMode":"autoMapInputData","matchingColumns":[],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{}},"credentials":{"postgres":{"id":"credential-id","name":"Postgres-test"}},"typeVersion":2.5},{"id":"ccb1db3e-3a2e-47f2-aa8c-3e625ab4dba5","name":"Route by signal action","type":"n8n-nodes-base.switch","position":[704,352],"parameters":{"rules":{"values":[{"outputKey":"BUY Signal","conditions":{"options":{"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.action }}","rightValue":"BUY"}]},"renameOutput":true},{"outputKey":"SELL Signal","conditions":{"options":{"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.action }}","rightValue":"SELL"}]},"renameOutput":true}]},"options":{}},"typeVersion":3},{"id":"80d775b9-32e2-4524-a10b-32c5a33ad281","name":"Generate trading alert message","type":"n8n-nodes-base.code","position":[928,352],"parameters":{"mode":"runOnceForEachItem","jsCode":"// Generate formatted trading alert message\nconst signal = $input.item.json;\nconst action = signal.action;\nconst emoji = action === 'BUY' ? '📈' : action === 'SELL' ? '📉' : '⏸️';\n\nconst slackMessage = `${emoji} *TRADING ALERT — ${action}*\\n\\n` +\n  `*Symbol:* ${signal.symbol}\\n` +\n  `*Action:* ${action}\\n` +\n  `*Confidence:* ${(signal.confidence * 100).toFixed(1)}%\\n` +\n  `*Current Price:* \\$${signal.currentPrice.toFixed(2)}\\n\\n` +\n  `*Recommendations:*\\n` +\n  `Entry: \\$${signal.recommendation.entryPrice.toFixed(2)}\\n` +\n  `Target: \\$${signal.recommendation.targetPrice.toFixed(2)}\\n` +\n  `Stop Loss: \\$${signal.recommendation.stopLoss.toFixed(2)}\\n` +\n  `Take Profit: \\$${signal.recommendation.profitTarget.toFixed(2)}\\n\\n` +\n  `*Position Size:* ${signal.positionSize}%\\n` +\n  `*Risk Level:* ${signal.riskLevel}\\n` +\n  `*Signal ID:* ${signal.signalId}\\n` +\n  `*AI Reasoning:* ${signal.aiReasoning}\\n\\n` +\n  `*Timeframe:* ${signal.recommendation.timeframe}`;\n\nconst emailSubject = `🚀 ${emoji} Trading Alert: ${action} ${signal.symbol} @ ${signal.currentPrice} - ${(signal.confidence * 100).toFixed(1)}% Confidence`;\n\nconst emailBody = `\n<h2>${emoji} Trading Alert - ${action} Signal</h2>\n<p><strong>Symbol:</strong> ${signal.symbol}</p>\n<p><strong>Action:</strong> ${action}</p>\n<p><strong>Confidence:</strong> ${(signal.confidence * 100).toFixed(1)}%</p>\n<p><strong>Current Price:</strong> $${signal.currentPrice.toFixed(2)}</p>\n\n<h3>📊 Recommendations</h3>\n<ul>\n  <li>Entry Price: $${signal.recommendation.entryPrice.toFixed(2)}</li>\n  <li>Target Price: $${signal.recommendation.targetPrice.toFixed(2)}</li>\n  <li>Stop Loss: $${signal.recommendation.stopLoss.toFixed(2)}</li>\n  <li>Take Profit: $${signal.recommendation.profitTarget.toFixed(2)}</li>\n  <li>Position Size: ${signal.positionSize}%</li>\n  <li>Risk Level: ${signal.riskLevel}</li>\n  <li>Timeframe: ${signal.recommendation.timeframe}</li>\n</ul>\n\n<h3>🤖 AI Analysis</h3>\n<p>${signal.aiReasoning}</p>\n\n<p><strong>Signal ID:</strong> ${signal.signalId}</p>\n<p><strong>Generated:</strong> ${signal.timestamp}</p>\n`;\n\nconst smsMessage = `${emoji} ${action} ${signal.symbol} @ $${signal.currentPrice.toFixed(2)} - Confidence: ${(signal.confidence * 100).toFixed(1)}% - ID: ${signal.signalId}`;\n\nreturn {\n  json: {\n    ...signal,\n    alertMessages: {\n      slack: slackMessage,\n      email: {\n        subject: emailSubject,\n        body: emailBody\n      },\n      sms: smsMessage\n    }\n  }\n};"},"typeVersion":2},{"id":"4df28f21-bcf8-4a76-bfc1-ef2ba9175c7b","name":"Send Slack notification","type":"n8n-nodes-base.httpRequest","position":[1152,160],"parameters":{"url":"YOUR_SLACK_WEBHOOK_URL","method":"POST","options":{},"jsonBody":"={\n  \"text\": \"{{ $json.action }} Signal Alert\",\n  \"blocks\": [\n    {\n      \"type\": \"section\",\n      \"text\": {\n        \"type\": \"mrkdwn\",\n        \"text\": \"{{ $json.alertMessages.slack }}\"\n      }\n    }\n  ]\n}","sendBody":true,"specifyBody":"json"},"typeVersion":4.2},{"id":"007071f0-fc96-4b3e-9f91-1a5724f162fa","name":"Send Email alert","type":"n8n-nodes-base.emailSend","position":[1152,352],"webhookId":"886f5793-cf7d-462c-bd09-485ab58f763e","parameters":{"html":"={{ $json.alertMessages.email.body }}","options":{},"subject":"={{ $json.alertMessages.email.subject }}","toEmail":"user@example.com","fromEmail":"user@example.com"},"credentials":{"smtp":{"id":"credential-id","name":"SMTP -test"}},"typeVersion":2.1},{"id":"794e696c-8471-4c44-b5cd-af540408ed39","name":"Send SMS alert (Twilio)","type":"n8n-nodes-base.httpRequest","position":[1152,544],"parameters":{"url":"https://api.twilio.com/2010-04-01/Accounts/YOUR_ACCOUNT_SID/Messages.json","method":"POST","options":{},"sendBody":true,"bodyParameters":{"parameters":[{"name":"From","value":"+1234567890"},{"name":"To","value":"+1234567890"},{"name":"Body","value":"={{ $json.alertMessages.sms }}"}]}},"typeVersion":4.2},{"id":"79e9381e-dbe8-4e3c-8114-29e9bd56c1a7","name":"Log trade execution and success","type":"n8n-nodes-base.code","position":[1376,352],"parameters":{"mode":"runOnceForEachItem","jsCode":"// Log successful trade signal execution\nconst timestamp = new Date().toISOString();\nconst signal = $input.item.json;\n\nconsole.log(`✅ TRADE SIGNAL EXECUTED: ${signal.signalId} | ${signal.action} ${signal.symbol} @ $${signal.currentPrice} | Confidence: ${(signal.confidence * 100).toFixed(1)}% | Risk: ${signal.riskLevel} | Time: ${timestamp}`);\n\n// Cumulative statistics\nconst stats = $getWorkflowStaticData('global').stats || {\n  totalSignals: 0,\n  buySignals: 0,\n  sellSignals: 0,\n  totalAlerts: 0,\n  lastSignal: null,\n  averageConfidence: 0\n};\n\nif (signal.action === 'BUY') stats.buySignals++;\nelse if (signal.action === 'SELL') stats.sellSignals++;\nstats.totalSignals++;\nstats.totalAlerts++;\nstats.lastSignal = timestamp;\nstats.averageConfidence = (stats.averageConfidence + signal.confidence) / 2;\n\n$getWorkflowStaticData('global').stats = stats;\n\nreturn {\n  json: {\n    success: true,\n    signalId: signal.signalId,\n    action: signal.action,\n    symbol: signal.symbol,\n    currentPrice: signal.currentPrice,\n    confidence: signal.confidence,\n    timestamp: timestamp,\n    cumulativeStats: stats,\n    alertsSent: {\n      slack: true,\n      email: true,\n      sms: true\n    }\n  }\n};"},"typeVersion":2}],"active":false,"pinData":{},"settings":{"executionOrder":"v1"},"versionId":"77ade8bc-49da-4a50-91ad-650b7eb95cef","connections":{"Send Email alert":{"main":[[{"node":"Log trade execution and success","type":"main","index":0}]]},"Route by signal action":{"main":[[{"node":"Generate trading alert message","type":"main","index":0}],[{"node":"Generate trading alert message","type":"main","index":0}]]},"Send SMS alert (Twilio)":{"main":[[{"node":"Log trade execution and success","type":"main","index":0}]]},"Send Slack notification":{"main":[[{"node":"Log trade execution and success","type":"main","index":0}]]},"Calculate technical indicators":{"main":[[{"node":"Call AI model for signal prediction","type":"main","index":0}]]},"Generate trading alert message":{"main":[[{"node":"Send Slack notification","type":"main","index":0},{"node":"Send Email alert","type":"main","index":0},{"node":"Send SMS alert (Twilio)","type":"main","index":0}]]},"Store trade signal in PostgreSQL":{"main":[[{"node":"Route by signal action","type":"main","index":0}]]},"Analyze AI signals and confidence":{"main":[[{"node":"Validate signal strength and filter","type":"main","index":0}]]},"Call AI model for signal prediction":{"main":[[{"node":"Analyze AI signals and confidence","type":"main","index":0}]]},"Validate signal strength and filter":{"main":[[{"node":"Store trade signal in PostgreSQL","type":"main","index":0}]]},"Combine crypto and stock market data":{"main":[[{"node":"Calculate technical indicators","type":"main","index":0}]]},"Fetch stock prices from Alpha Vantage":{"main":[[{"node":"Combine crypto and stock market data","type":"main","index":1}]]},"Market Data Trigger - Every 15 minutes":{"main":[[{"node":"Fetch cryptocurrency prices from CoinGecko","type":"main","index":0},{"node":"Fetch stock prices from Alpha Vantage","type":"main","index":0}]]},"Fetch cryptocurrency prices from CoinGecko":{"main":[[{"node":"Combine crypto and stock market data","type":"main","index":0}]]}}},"lastUpdatedBy":1,"workflowInfo":{"nodeCount":20,"nodeTypes":{"n8n-nodes-base.code":{"count":4},"n8n-nodes-base.merge":{"count":1},"n8n-nodes-base.filter":{"count":1},"n8n-nodes-base.switch":{"count":1},"n8n-nodes-base.postgres":{"count":1},"n8n-nodes-base.emailSend":{"count":1},"n8n-nodes-base.stickyNote":{"count":5},"n8n-nodes-base.httpRequest":{"count":5},"n8n-nodes-base.scheduleTrigger":{"count":1}}},"status":"published","readyToDemo":null,"user":{"name":"Oneclick AI Squad","username":"oneclick-ai","bio":"The AI Squad Initiative is a pioneering effort to build, automate and scale AI-powered workflows using n8n.io. Our mission is to help individuals and businesses integrate AI agents seamlessly into their daily operations  from automating tasks and enhancing productivity to creating innovative, intelligent solutions. We design modular, reusable AI workflow templates that empower creators, developers and teams to supercharge their automation with minimal effort and maximum impact.","verified":true,"links":["https://www.oneclickitsolution.com/"],"avatar":"https://gravatar.com/avatar/848fca91367142f65f9e5c55d64e5c9952b160d7b060d103b52aa343c6bc7b3d?r=pg&d=retro&size=200"},"nodes":[{"id":11,"icon":"fa:envelope","name":"n8n-nodes-base.emailSend","codex":{"data":{"alias":["SMTP","email","human","form","wait","hitl","approval"],"resources":{"generic":[{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/build-your-own-virtual-assistant-with-n8n-a-step-by-step-guide/","icon":"👦","label":"Build your own virtual assistant with n8n: A step by step guide"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.sendemail/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/sendemail/"}]},"categories":["Communication","HITL","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"HITL":["Human in the Loop"]}}},"group":"[\"output\"]","defaults":{"name":"Send Email","color":"#00bb88"},"iconData":{"icon":"envelope","type":"icon"},"displayName":"Send Email","typeVersion":2,"nodeCategories":[{"id":6,"name":"Communication"},{"id":9,"name":"Core Nodes"},{"id":28,"name":"HITL"}]},{"id":19,"icon":"file:httprequest.svg","name":"n8n-nodes-base.httpRequest","codex":{"data":{"alias":["API","Request","URL","Build","cURL"],"resources":{"generic":[{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/","icon":"🧬","label":"Why business process automation with n8n can change your daily life"},{"url":"https://n8n.io/blog/automatically-pulling-and-visualizing-data-with-n8n/","icon":"📈","label":"Automatically pulling and visualizing data with n8n"},{"url":"https://n8n.io/blog/learn-how-to-automatically-cross-post-your-content-with-n8n/","icon":"✍️","label":"Learn how to automatically cross-post your content with n8n"},{"url":"https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/","icon":"🧾","label":"Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"},{"url":"https://n8n.io/blog/running-n8n-on-ships-an-interview-with-maranics/","icon":"🛳","label":"Running n8n on ships: An interview with Maranics"},{"url":"https://n8n.io/blog/what-are-apis-how-to-use-them-with-no-code/","icon":" 🪢","label":"What are APIs and how to use them with no code"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/world-poetry-day-workflow/","icon":"📜","label":"Celebrating World Poetry Day with a daily poem in Telegram"},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/automate-designs-with-bannerbear-and-n8n/","icon":"🎨","label":"Automate Designs with Bannerbear and n8n"},{"url":"https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/","icon":" 🕸️","label":"How uProc scraped a multi-page website with a low-code workflow"},{"url":"https://n8n.io/blog/building-an-expense-tracking-app-in-10-minutes/","icon":"📱","label":"Building an expense tracking app in 10 minutes"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/how-to-use-the-http-request-node-the-swiss-army-knife-for-workflow-automation/","icon":"🧰","label":"How to use the HTTP Request Node - The Swiss Army Knife for Workflow Automation"},{"url":"https://n8n.io/blog/learn-how-to-use-webhooks-with-mattermost-slash-commands/","icon":"🦄","label":"Learn how to use webhooks with Mattermost slash commands"},{"url":"https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/","icon":"📈","label":"How a Membership Development Manager automates his work and investments"},{"url":"https://n8n.io/blog/a-low-code-bitcoin-ticker-built-with-questdb-and-n8n-io/","icon":"📈","label":"A low-code bitcoin ticker built with QuestDB and n8n.io"},{"url":"https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/automations-for-activists/","icon":"✨","label":"How Common Knowledge use workflow automation for activism"},{"url":"https://n8n.io/blog/creating-scheduled-text-affirmations-with-n8n/","icon":"🤟","label":"Creating scheduled text affirmations with n8n"},{"url":"https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/","icon":"🛵","label":"How Goomer automated their operations with over 200 n8n workflows"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"output\"]","defaults":{"name":"HTTP Request","color":"#0004F5"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00MCAyMEM0MCA4Ljk1MzE0IDMxLjA0NjkgMCAyMCAwQzguOTUzMTQgMCAwIDguOTUzMTQgMCAyMEMwIDMxLjA0NjkgOC45NTMxNCA0MCAyMCA0MEMzMS4wNDY5IDQwIDQwIDMxLjA0NjkgNDAgMjBaTTIwIDM2Ljk0NThDMTguODg1MiAzNi45NDU4IDE3LjEzNzggMzUuOTY3IDE1LjQ5OTggMzIuNjk4NUMxNC43OTY0IDMxLjI5MTggMTQuMTk2MSAyOS41NDMxIDEzLjc1MjYgMjcuNjg0N0gyNi4xODk4QzI1LjgwNDUgMjkuNTQwMyAyNS4yMDQ0IDMxLjI5MDEgMjQuNTAwMiAzMi42OTg1QzIyLjg2MjIgMzUuOTY3IDIxLjExNDggMzYuOTQ1OCAyMCAzNi45NDU4Wk0xMi45MDY0IDIwQzEyLjkwNjQgMjEuNjA5NyAxMy4wMDg3IDIzLjE2NCAxMy4yMDAzIDI0LjYzMDVIMjYuNzk5N0MyNi45OTEzIDIzLjE2NCAyNy4wOTM2IDIxLjYwOTcgMjcuMDkzNiAyMEMyNy4wOTM2IDE4LjM5MDMgMjYuOTkxMyAxNi44MzYgMjYuNzk5NyAxNS4zNjk1SDEzLjIwMDNDMTMuMDA4NyAxNi44MzYgMTIuOTA2NCAxOC4zOTAzIDEyLjkwNjQgMjBaTTIwIDMuMDU0MTlDMjEuMTE0OSAzLjA1NDE5IDIyLjg2MjIgNC4wMzA3OCAyNC41MDAxIDcuMzAwMzlDMjUuMjA2NiA4LjcxNDA4IDI1LjgwNzIgMTAuNDA2NyAyNi4xOTIgMTIuMzE1M0gxMy43NTAxQzE0LjE5MzMgMTAuNDA0NyAxNC43OTQyIDguNzEyNTQgMTUuNDk5OCA3LjMwMDY0QzE3LjEzNzcgNC4wMzA4MyAxOC44ODUxIDMuMDU0MTkgMjAgMy4wNTQxOVpNMzAuMTQ3OCAyMEMzMC4xNDc4IDE4LjQwOTkgMzAuMDU0MyAxNi44NjE3IDI5LjgyMjcgMTUuMzY5NUgzNi4zMDQyQzM2LjcyNTIgMTYuODQyIDM2Ljk0NTggMTguMzk2NCAzNi45NDU4IDIwQzM2Ljk0NTggMjEuNjAzNiAzNi43MjUyIDIzLjE1OCAzNi4zMDQyIDI0LjYzMDVIMjkuODIyN0MzMC4wNTQzIDIzLjEzODMgMzAuMTQ3OCAyMS41OTAxIDMwLjE0NzggMjBaTTI2LjI3NjcgNC4yNTUxMkMyNy42MzY1IDYuMzYwMTkgMjguNzExIDkuMTMyIDI5LjM3NzQgMTIuMzE1M0gzNS4xMDQ2QzMzLjI1MTEgOC42NjggMzAuMTA3IDUuNzgzNDYgMjYuMjc2NyA0LjI1NTEyWk0xMC42MjI2IDEyLjMxNTNINC44OTI5M0M2Ljc1MTQ3IDguNjY3ODQgOS44OTM1MSA1Ljc4MzQxIDEzLjcyMzIgNC4yNTUxM0MxMi4zNjM1IDYuMzYwMjEgMTEuMjg5IDkuMTMyMDEgMTAuNjIyNiAxMi4zMTUzWk0zLjA1NDE5IDIwQzMuMDU0MTkgMjEuNjAzIDMuMjc3NDMgMjMuMTU3NSAzLjY5NDg0IDI0LjYzMDVIMTAuMTIxN0M5Ljk0NjE5IDIzLjE0MiA5Ljg1MjIyIDIxLjU5NDMgOS44NTIyMiAyMEM5Ljg1MjIyIDE4LjQwNTcgOS45NDYxOSAxNi44NTggMTAuMTIxNyAxNS4zNjk1SDMuNjk0ODRDMy4yNzc0MyAxNi44NDI1IDMuMDU0MTkgMTguMzk3IDMuMDU0MTkgMjBaTTI2LjI3NjYgMzUuNzQyN0MyNy42MzY1IDMzLjYzOTMgMjguNzExIDMwLjg2OCAyOS4zNzc0IDI3LjY4NDdIMzUuMTA0NkMzMy4yNTEgMzEuMzMyMiAzMC4xMDY4IDM0LjIxNzkgMjYuMjc2NiAzNS43NDI3Wk0xMy43MjM0IDM1Ljc0MjdDOS44OTM2OSAzNC4yMTc5IDYuNzUxNTUgMzEuMzMyNCA0Ljg5MjkzIDI3LjY4NDdIMTAuNjIyNkMxMS4yODkgMzAuODY4IDEyLjM2MzUgMzMuNjM5MyAxMy43MjM0IDM1Ljc0MjdaIiBmaWxsPSIjM0E0MkU5Ii8+Cjwvc3ZnPgo="},"displayName":"HTTP Request","typeVersion":4,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"id":24,"icon":"file:merge.svg","name":"n8n-nodes-base.merge","codex":{"data":{"alias":["Join","Concatenate","Wait"],"resources":{"generic":[{"url":"https://n8n.io/blog/how-to-sync-data-between-two-systems/","icon":"🏬","label":"How to synchronize data between two systems (one-way vs. two-way sync"},{"url":"https://n8n.io/blog/supercharging-your-conference-registration-process-with-n8n/","icon":"🎫","label":"Supercharging your conference registration process with n8n"},{"url":"https://n8n.io/blog/migrating-community-metrics-to-orbit-using-n8n/","icon":"📈","label":"Migrating Community Metrics to Orbit using n8n"},{"url":"https://n8n.io/blog/build-your-own-virtual-assistant-with-n8n-a-step-by-step-guide/","icon":"👦","label":"Build your own virtual assistant with n8n: A step by step guide"},{"url":"https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/","icon":"🙌","label":"Sending Automated Congratulations with Google Sheets, Twilio, and n8n "},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.merge/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Flow","Data Transformation"]}}},"group":"[\"transform\"]","defaults":{"name":"Merge"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTc3XzUxOCkiPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTAgNDhDMCAyMS40OTAzIDIxLjQ5MDMgMCA0OCAwSDExMkMxMzguNTEgMCAxNjAgMjEuNDkwMyAxNjAgNDhWNTZIMTk2LjI1MkMyNDAuNDM1IDU2IDI3Ni4yNTIgOTEuODE3MiAyNzYuMjUyIDEzNlYxOTJDMjc2LjI1MiAyMTQuMDkxIDI5NC4xNjEgMjMyIDMxNi4yNTIgMjMySDM1MlYyMjRDMzUyIDE5Ny40OSAzNzMuNDkgMTc2IDQwMCAxNzZINDY0QzQ5MC41MSAxNzYgNTEyIDE5Ny40OSA1MTIgMjI0VjI4OEM1MTIgMzE0LjUxIDQ5MC41MSAzMzYgNDY0IDMzNkg0MDBDMzczLjQ5IDMzNiAzNTIgMzE0LjUxIDM1MiAyODhWMjgwSDMxNi4yNTJDMjk0LjE2MSAyODAgMjc2LjI1MiAyOTcuOTA5IDI3Ni4yNTIgMzIwVjM3NkMyNzYuMjUyIDQyMC4xODMgMjQwLjQzNSA0NTYgMTk2LjI1MiA0NTZIMTYwVjQ2NEMxNjAgNDkwLjUxIDEzOC41MSA1MTIgMTEyIDUxMkg0OEMyMS40OTAzIDUxMiAwIDQ5MC41MSAwIDQ2NFY0MDBDMCAzNzMuNDkgMjEuNDkwMyAzNTIgNDggMzUySDExMkMxMzguNTEgMzUyIDE2MCAzNzMuNDkgMTYwIDQwMFY0MDhIMTk2LjI1MkMyMTMuOTI1IDQwOCAyMjguMjUyIDM5My42NzMgMjI4LjI1MiAzNzZWMzIwQzIyOC4yNTIgMjk0Ljc4NCAyMzguODU5IDI3Mi4wNDQgMjU1Ljg1MyAyNTZDMjM4Ljg1OSAyMzkuOTU2IDIyOC4yNTIgMjE3LjIxNiAyMjguMjUyIDE5MlYxMzZDMjI4LjI1MiAxMTguMzI3IDIxMy45MjUgMTA0IDE5Ni4yNTIgMTA0SDE2MFYxMTJDMTYwIDEzOC41MSAxMzguNTEgMTYwIDExMiAxNjBINDhDMjEuNDkwMyAxNjAgMCAxMzguNTEgMCAxMTJWNDhaTTEwNCA0OEMxMDguNDE4IDQ4IDExMiA1MS41ODE3IDExMiA1NlYxMDRDMTEyIDEwOC40MTggMTA4LjQxOCAxMTIgMTA0IDExMkg1NkM1MS41ODE3IDExMiA0OCAxMDguNDE4IDQ4IDEwNFY1NkM0OCA1MS41ODE3IDUxLjU4MTcgNDggNTYgNDhIMTA0Wk00NTYgMjI0QzQ2MC40MTggMjI0IDQ2NCAyMjcuNTgyIDQ2NCAyMzJWMjgwQzQ2NCAyODQuNDE4IDQ2MC40MTggMjg4IDQ1NiAyODhINDA4QzQwMy41ODIgMjg4IDQwMCAyODQuNDE4IDQwMCAyODBWMjMyQzQwMCAyMjcuNTgyIDQwMy41ODIgMjI0IDQwOCAyMjRINDU2Wk0xMTIgNDA4QzExMiA0MDMuNTgyIDEwOC40MTggNDAwIDEwNCA0MDBINTZDNTEuNTgxNyA0MDAgNDggNDAzLjU4MiA0OCA0MDhWNDU2QzQ4IDQ2MC40MTggNTEuNTgxNyA0NjQgNTYgNDY0SDEwNEMxMDguNDE4IDQ2NCAxMTIgNDYwLjQxOCAxMTIgNDU2VjQwOFoiIGZpbGw9IiM1NEI4QzkiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTc3XzUxOCI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="},"displayName":"Merge","typeVersion":3,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":30,"icon":"file:postgres.svg","name":"n8n-nodes-base.postgres","codex":{"data":{"resources":{"generic":[{"url":"https://n8n.io/blog/love-at-first-sight-ricardos-n8n-journey/","icon":"❤️","label":"Love at first sight: Ricardo’s n8n journey"},{"url":"https://n8n.io/blog/why-i-chose-n8n-over-zapier-in-2020/","icon":"😍","label":"Why I chose n8n over Zapier in 2020"},{"url":"https://n8n.io/blog/database-monitoring-and-alerting-with-n8n/","icon":"📡","label":"Database Monitoring and Alerting with n8n"},{"url":"https://n8n.io/blog/running-n8n-on-ships-an-interview-with-maranics/","icon":"🛳","label":"Running n8n on ships: An interview with Maranics"},{"url":"https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/","icon":"⚙️","label":"Automate your data processing pipeline in 9 steps"},{"url":"https://n8n.io/blog/how-honest-burgers-use-automation-to-save-100k-per-year/","icon":"🍔","label":"How Honest Burgers Use Automation to Save $100k per year"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.postgres/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/postgres/"}]},"categories":["Development","Data & Storage"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"input\"]","defaults":{"name":"Postgres"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiB2aWV3Qm94PSIwIDAgNzkgODEiPjx1c2UgeGxpbms6aHJlZj0iI2EiIHg9Ii41IiB5PSIuNSIvPjxzeW1ib2wgaWQ9ImEiIG92ZXJmbG93PSJ2aXNpYmxlIj48ZyBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZT0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTc3LjM5MSA0Ny45MjJjLS40NjYtMS40MTItMS42ODgtMi4zOTYtMy4yNjgtMi42MzItLjc0NS0uMTExLTEuNTk4LS4wNjQtMi42MDguMTQ0LTEuNzYuMzYzLTMuMDY1LjUwMS00LjAxOC41MjggMy41OTYtNi4wNzIgNi41MjEtMTIuOTk3IDguMjA0LTE5LjUxNSAyLjcyMi0xMC41NCAxLjI2OC0xNS4zNDEtLjQzMi0xNy41MTNDNzAuNzcgMy4xODUgNjQuMjA2LjA5NyA1Ni4yODcuMDAyYy00LjIyNC0uMDUyLTcuOTMzLjc4Mi05Ljg2NyAxLjM4MmEzNyAzNyAwIDAgMC01Ljc3LS41MjhjLTMuODA5LS4wNjEtNy4xNzQuNzctMTAuMDUgMi40NzZhNDYgNDYgMCAwIDAtNy4wOTgtMS43ODJDMTYuNTYxLjQxMSAxMC45NjggMS4yOTkgNi44NzYgNC4xOSAxLjkyMiA3LjY4OS0uMzc1IDEzLjc3LjA1IDIyLjI2MmMuMTM1IDIuNjk2IDEuNjQzIDEwLjkgNC4wMTggMTguNjggMS4zNjUgNC40NzIgMi44MiA4LjE4NSA0LjMyNiAxMS4wMzggMi4xMzUgNC4wNDYgNC40MTkgNi40MjggNi45ODQgNy4yODQgMS40MzguNDc5IDQuMDQ5LjgxNCA2Ljc5Ny0xLjQ3M2E2IDYgMCAwIDAgMS40MjkgMS4yM2MuNzgzLjQ5NCAxLjc0Ljg5NyAyLjY5NiAxLjEzNiAzLjQ0Ni44NjIgNi42NzQuNjQ2IDkuNDI3LS41NjFsLjA0MSAxLjM2Mi4wNiAxLjg5OWMuMTYzIDQuMDY0LjQ0IDcuMjIzIDEuMjU5IDkuNDM0LjA0NS4xMjIuMTA1LjMwNy4xNjkuNTAzLjQwOSAxLjI1MSAxLjA5MiAzLjM0NiAyLjgzIDQuOTg3IDEuOCAxLjY5OSAzLjk3OCAyLjIyIDUuOTcyIDIuMjIgMSAwIDEuOTU1LS4xMzEgMi43OTItLjMxMSAyLjk4NC0uNjM5IDYuMzczLTEuNjE0IDguODI0LTUuMTA0IDIuMzE4LTMuMyAzLjQ0NC04LjI3IDMuNjQ4LTE2LjEwMWwuMDc0LS42MzQuMDQ4LS40MTQuNTQ2LjA0OC4xNDEuMDFjMy4wMzkuMTM4IDYuNzU1LS41MDYgOS4wMzctMS41NjYgMS44MDMtLjgzNyA3LjU4Mi0zLjg4OCA2LjIyMS04LjAwNyIvPjxwYXRoIGZpbGw9IiMzMzY3OTEiIGQ9Ik03Mi4xOTUgNDguNzIzYy05LjAzNiAxLjg2NC05LjY1Ny0xLjE5NS05LjY1Ny0xLjE5NSA5LjU0MS0xNC4xNTcgMTMuNTI5LTMyLjEyNyAxMC4wODctMzYuNTI1QzYzLjIzNS0uOTk0IDQ2Ljk4MSA0LjY4IDQ2LjcxIDQuODI3bC0uMDg3LjAxNmMtMS43ODUtLjM3MS0zLjc4My0uNTkxLTYuMDI5LS42MjgtNC4wODktLjA2Ny03LjE5IDEuMDcyLTkuNTQ0IDIuODU3IDAgMC0yOC45OTUtMTEuOTQ1LTI3LjY0NyAxNS4wMjMuMjg3IDUuNzM3IDguMjIzIDQzLjQxIDE3LjY4OSAzMi4wMzEgMy40Ni00LjE2MSA2LjgwMy03LjY3OSA2LjgwMy03LjY3OSAxLjY2IDEuMTAzIDMuNjQ4IDEuNjY2IDUuNzMyIDEuNDYzbC4xNjItLjEzN2E2LjMgNi4zIDAgMCAwIC4wNjUgMS42MmMtMi40MzkgMi43MjUtMS43MjIgMy4yMDMtNi41OTcgNC4yMDYtNC45MzMgMS4wMTctMi4wMzUgMi44MjYtLjE0MyAzLjI5OSAyLjI5NC41NzQgNy42IDEuMzg2IDExLjE4NS0zLjYzM2wtLjE0My41NzNjLjk1Ni43NjUgMS42MjYgNC45NzggMS41MTQgOC43OTdzLS4xODggNi40NDEuNTY1IDguNDg5IDEuNTAzIDYuNjU2IDcuOTEyIDUuMjgyYzUuMzU1LTEuMTQ4IDguMTMtNC4xMjEgOC41MTYtOS4wODEuMjc0LTMuNTI2Ljg5NC0zLjAwNS45MzMtNi4xNThsLjQ5Ny0xLjQ5M2MuNTczLTQuNzguMDkxLTYuMzIyIDMuMzktNS42MDVsLjgwMi4wN2MyLjQyOC4xMSA1LjYwNi0uMzkxIDcuNDcxLTEuMjU3IDQuMDE2LTEuODY0IDYuMzk4LTQuOTc2IDIuNDM4LTQuMTU4Ii8+PHBhdGggZD0iTTMyLjc0NyAyNC42NmMtLjgxNC0uMTEzLTEuNTUyLS4wMDgtMS45MjUuMjc0YS43LjcgMCAwIDAtLjI5Mi40N2MtLjA0Ny4zMzYuMTg4LjcwNy4zMzMuODk4LjQwOS41NDIgMS4wMDYuOTE1IDEuNTk4Ljk5N2EyIDIgMCAwIDAgLjI1Ni4wMThjLjk4NiAwIDEuODgzLS43NjggMS45NjItMS4zMzUuMDk5LS43MS0uOTMyLTEuMTgzLTEuOTMxLTEuMzIybTI2Ljk3NS4wMjJjLS4wNzgtLjU1Ni0xLjA2OC0uNzE1LTIuMDA3LS41ODRzLTEuODQ4LjU1NC0xLjc3MiAxLjExMmMuMDYxLjQzNC44NDQgMS4xNzQgMS43NzEgMS4xNzRxLjExNyAwIC4yMzctLjAxNmMuNjE5LS4wODYgMS4wNzMtLjQ3OSAxLjI4OC0uNzA1LjMyOS0uMzQ1LjUxOC0uNzMuNDg0LS45OG0xNS40NzcgMjMuODI4Yy0uMzQ1LTEuMDQyLTEuNDUzLTEuMzc3LTMuMjk2LS45OTctNS40NzEgMS4xMjktNy40My4zNDctOC4wNzMtLjEyNyA0LjI1Mi02LjQ3OCA3Ljc1LTE0LjMwOCA5LjYzNy0yMS42MTQuODk0LTMuNDYxIDEuMzg4LTYuNjc1IDEuNDI4LTkuMjk0LjA0NS0yLjg3Ni0uNDQ1LTQuOTg4LTEuNDU1LTYuMjc5LTQuMDcyLTUuMjAzLTEwLjA0OC03Ljk5NC0xNy4yODMtOC4wNy00Ljk3My0uMDU2LTkuMTc1IDEuMjE3LTkuOTkgMS41NzVhMjUgMjUgMCAwIDAtNS42MjItLjcyMmMtMy43MzQtLjA2LTYuOTYxLjgzNC05LjYzMyAyLjY1NWE0MyA0MyAwIDAgMC03LjgyOC0yLjA1MmMtNi4zNDItMS4wMjEtMTEuMzgxLS4yNDgtMTQuOTc4IDIuMy00LjI5MSAzLjA0LTYuMjcyIDguNDc1LTUuODg4IDE2LjE1Mi4xMjkgMi41ODMgMS42MDEgMTAuNTI5IDMuOTIzIDE4LjEzOSAzLjA1NyAxMC4wMTYgNi4zOCAxNS42ODYgOS44NzcgMTYuODUyYTQuNCA0LjQgMCAwIDAgMS40MDIuMjMyYzEuMjc2IDAgMi44MzktLjU3NSA0LjQ2Ni0yLjUzMWExNjEgMTYxIDAgMCAxIDYuMTU2LTYuOTY2IDkuOSA5LjkgMCAwIDAgNC40MjkgMS4xOTFsLjAxLjEyMWMtLjMxLjM2OC0uNTY0LjY5LS43ODEuOTY1LTEuMDcgMS4zNTgtMS4yOTMgMS42NDEtNC43MzggMi4zNTEtLjk4LjIwMi0zLjU4Mi43MzgtMy42MiAyLjU2My0uMDQxIDEuOTkzIDMuMDc2IDIuODMgMy40MzEgMi45MTkgMS4yMzguMzEgMi40My40NjMgMy41NjguNDYzIDIuNzY2IDAgNS4yLS45MDkgNy4xNDUtMi42NjgtLjA2IDcuMTA2LjIzNiAxNC4xMDcgMS4wODkgMTYuMjQxLjY5OSAxLjc0NiAyLjQwNiA2LjAxNCA3Ljc5OCA2LjAxNC43OTEgMCAxLjY2Mi0uMDkyIDIuNjItLjI5NyA1LjYyNy0xLjIwNyA4LjA3MS0zLjY5NCA5LjAxNi05LjE3Ny41MDYtMi45MyAxLjM3NC05LjkyOCAxLjc4Mi0xMy42ODIuODYyLjI2OSAxLjk3MS4zOTIgMy4xNy4zOTIgMi41MDEgMCA1LjM4Ny0uNTMxIDcuMTk3LTEuMzcyIDIuMDMzLS45NDQgNS43MDItMy4yNjEgNS4wMzctNS4yNzR6TTYxLjggMjMuMTQ3Yy0uMDE5IDEuMTA4LS4xNzEgMi4xMTQtLjMzMyAzLjE2NC0uMTc0IDEuMTI5LS4zNTQgMi4yOTctLjM5OSAzLjcxNS0uMDQ1IDEuMzc5LjEyOCAyLjgxNC4yOTQgNC4yLjMzNyAyLjgwMS42ODIgNS42ODUtLjY1NSA4LjUzMWExMSAxMSAwIDAgMS0uNTkyLTEuMjE4Yy0uMTY2LS40MDMtLjUyNy0xLjA1LTEuMDI3LTEuOTQ2LTEuOTQ0LTMuNDg3LTYuNDk3LTExLjY1Mi00LjE2Ny0xNC45ODQuNjk0LS45OTIgMi40NTYtMi4wMTEgNi44NzktMS40NjN6TTU2LjQzOSA0LjM3NGM2LjQ4Mi4xNDMgMTEuNjA5IDIuNTY4IDE1LjI0IDcuMjA3IDIuNzg0IDMuNTU4LS4yODIgMTkuNzQ5LTkuMTU4IDMzLjcxNmwtLjI2OS0uMzM5LS4xMTItLjE0YzIuMjk0LTMuNzg4IDEuODQ1LTcuNTM2IDEuNDQ2LTEwLjg1OS0uMTY0LTEuMzY0LS4zMTktMi42NTItLjI4LTMuODYxLjA0MS0xLjI4My4yMS0yLjM4Mi4zNzQtMy40NDYuMjAyLTEuMzExLjQwNy0yLjY2Ny4zNS00LjI2NWExLjggMS44IDAgMCAwIC4wMzctLjYwMWMtLjE0NC0xLjUzMy0xLjg5NC02LjEyLTUuNDYyLTEwLjI3My0xLjk1MS0yLjI3MS00Ljc5Ny00LjgxMy04LjY4Mi02LjUyN2EyOS4zIDI5LjMgMCAwIDEgNi41MTUtLjYxMnpNMjAuMTY3IDUzLjI5OGMtMS43OTMgMi4xNTUtMy4wMzEgMS43NDItMy40MzggMS42MDctMi42NTMtLjg4NS01LjczLTYuNDkxLTguNDQ0LTE1LjM4Mi0yLjM0OC03LjY5My0zLjcyLTE1LjQyOC0zLjgyOS0xNy41OTctLjM0My02Ljg2IDEuMzItMTEuNjQxIDQuOTQzLTE0LjIxIDUuODk2LTQuMTgxIDE1LjU4OS0xLjY3OSAxOS40ODQtLjQwOWwtLjE3LjE2M2MtNi4zOTEgNi40NTUtNi4yNCAxNy40ODMtNi4yMjQgMTguMTU3YTIyIDIyIDAgMCAwIC4wNTEgMS4xMzVjLjExIDEuODU1LjMxNSA1LjMwNy0uMjMyIDkuMjE3LS41MDggMy42MzMuNjEyIDcuMTg5IDMuMDcyIDkuNzU2cS4zODMuMzk4Ljc5NS43NWExNjQgMTY0IDAgMCAwLTYuMDA4IDYuODE0em02LjgzLTkuMTEzYy0xLjk4My0yLjA2OS0yLjg4NC00Ljk0Ny0yLjQ3MS03Ljg5Ni41NzctNC4xMy4zNjQtNy43MjcuMjUtOS42NTlsLS4wMzktLjY5NGMuOTM0LS44MjggNS4yNjEtMy4xNDYgOC4zNDYtMi40MzkgMS40MDguMzIzIDIuMjY2IDEuMjgxIDIuNjIzIDIuOTMxIDEuODQ2IDguNTM5LjI0NCAxMi4wOTgtMS4wNDMgMTQuOTU3LS4yNjUuNTg5LS41MTYgMS4xNDYtLjczIDEuNzIybC0uMTY2LjQ0NWMtLjQyIDEuMTI2LS44MTEgMi4xNzMtMS4wNTMgMy4xNjctMi4xMDgtLjAwNi00LjE1OS0uOTA3LTUuNzE4LTIuNTM0em0uMzI0IDExLjUxNmE1IDUgMCAwIDEtMS40OTQtLjY0MmMuMjcxLS4xMjguNzU0LS4zMDEgMS41OTEtLjQ3NCA0LjA1Mi0uODM0IDQuNjc4LTEuNDIzIDYuMDQ1LTMuMTU4LjMxMy0uMzk4LjY2OS0uODQ5IDEuMTYtMS4zOTguNzMzLS44MjEgMS4wNjgtLjY4MiAxLjY3Ni0uNDMuNDkzLjIwNC45NzIuODIxIDEuMTY3IDEuNTAxLjA5Mi4zMjEuMTk1LjkzLS4xNDMgMS40MDQtMi44NTUgMy45OTctNy4wMTUgMy45NDYtMTAuMDAzIDMuMTk4em0yMS4yMDcgMTkuNzM1Yy00Ljk1NyAxLjA2Mi02LjcxMy0xLjQ2Ny03Ljg2OS00LjM1OS0uNzQ3LTEuODY3LTEuMTEzLTEwLjI4NS0uODUzLTE5LjU4MmExLjEgMS4xIDAgMCAwLS4wNDgtLjM1NiA1IDUgMCAwIDAtLjEzOS0uNjU3Yy0uMzg3LTEuMzUzLTEuMzMxLTIuNDg0LTIuNDYyLTIuOTUzLS40NS0uMTg2LTEuMjc1LS41MjgtMi4yNjctLjI3NC4yMTItLjg3MS41NzgtMS44NTUuOTc2LTIuOTIxbC4xNjctLjQ0OGMuMTg4LS41MDUuNDIzLTEuMDI5LjY3My0xLjU4MyAxLjM0Ny0yLjk5MiAzLjE5Mi03LjA5MSAxLjE5LTE2LjM1LS43NS0zLjQ2OC0zLjI1NC01LjE2MS03LjA1LTQuNzY4LTIuMjc2LjIzNS00LjM1OCAxLjE1NC01LjM5NiAxLjY4cS0uMzM0LjE2OS0uNjE4LjMyOWMuMjktMy40OTQgMS4zODUtMTAuMDI0IDUuNDgxLTE0LjE1NiAyLjU3OS0yLjYwMSA2LjAxNC0zLjg4NiAxMC4xOTktMy44MTcgOC4yNDYuMTM1IDEzLjUzNCA0LjM2NyAxNi41MTggNy44OTMgMi41NzEgMy4wMzkgMy45NjQgNi4xIDQuNTIgNy43NTEtNC4xNzktLjQyNS03LjAyMi40LTguNDYzIDIuNDYtMy4xMzUgNC40ODEgMS43MTUgMTMuMTc4IDQuMDQ2IDE3LjM1OC40MjcuNzY2Ljc5NiAxLjQyOC45MTIgMS43MDkuNzU5IDEuODM5IDEuNzQyIDMuMDY3IDIuNDU5IDMuOTY0LjIyLjI3NS40MzMuNTQxLjU5Ni43NzQtMS4yNjYuMzY1LTMuNTM5IDEuMjA4LTMuMzMyIDUuNDIyLS4xNjcgMi4xMTUtMS4zNTYgMTIuMDE2LTEuOTU5IDE1LjUxNC0uNzk3IDQuNjIxLTIuNDk3IDYuMzQzLTcuMjc5IDcuMzY4em0yMC42OTMtMjMuNjhjLTEuMjk0LjYwMS0zLjQ2IDEuMDUyLTUuNTE4IDEuMTQ4LTIuMjczLjEwNy0zLjQzLS4yNTUtMy43MDItLjQ3Ny0uMTI4LTIuNjI2Ljg1LTIuOTAxIDEuODg0LTMuMTkxLjE2My0uMDQ2LjMyMS0uMDkuNDc0LS4xNDRhNCA0IDAgMCAwIC4zMTMuMjNjMS44MjcgMS4yMDYgNS4wODUgMS4zMzYgOS42ODUuMzg2bC4wNS0uMDFjLS42Mi41OC0xLjY4MiAxLjM1OS0zLjE4NyAyLjA1OHoiLz48L2c+PC9zeW1ib2w+PC9zdmc+"},"displayName":"Postgres","typeVersion":3,"nodeCategories":[{"id":3,"name":"Data & Storage"},{"id":5,"name":"Development"}]},{"id":112,"icon":"fa:map-signs","name":"n8n-nodes-base.switch","codex":{"data":{"alias":["Router","If","Path","Filter","Condition","Logic","Branch","Case"],"resources":{"generic":[{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/","icon":"👥","label":"How to get started with CRM automation (with 3 no-code workflow ideas"},{"url":"https://n8n.io/blog/build-your-own-virtual-assistant-with-n8n-a-step-by-step-guide/","icon":"👦","label":"Build your own virtual assistant with n8n: A step by step guide"},{"url":"https://n8n.io/blog/automation-for-maintainers-of-open-source-projects/","icon":"🏷️","label":"How to automatically manage contributions to open-source projects"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.switch/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Flow"]}}},"group":"[\"transform\"]","defaults":{"name":"Switch","color":"#506000"},"iconData":{"icon":"map-signs","type":"icon"},"displayName":"Switch","typeVersion":3,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":565,"icon":"fa:sticky-note","name":"n8n-nodes-base.stickyNote","codex":{"data":{"alias":["Comments","Notes","Sticky"],"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"input\"]","defaults":{"name":"Sticky Note","color":"#FFD233"},"iconData":{"icon":"sticky-note","type":"icon"},"displayName":"Sticky Note","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":834,"icon":"file:code.svg","name":"n8n-nodes-base.code","codex":{"data":{"alias":["cpde","Javascript","JS","Python","Script","Custom Code","Function"],"details":"The Code node allows you to execute JavaScript in your workflow.","resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.code/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers","Data Transformation"]}}},"group":"[\"transform\"]","defaults":{"name":"Code"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTcxXzQ0MSkiPgo8cGF0aCBkPSJNMTcwLjI4MyA0OEgxOTYuNUMyMDMuMTI3IDQ4IDIwOC41IDQyLjYyNzQgMjA4LjUgMzZWMTJDMjA4LjUgNS4zNzI1OCAyMDMuMTI3IDAgMTk2LjUgMEgxNzAuMjgzQzEyNi4xIDAgOTAuMjgzIDM1LjgxNzIgOTAuMjgzIDgwVjE3NkM5MC4yODMgMjA2LjkyOCA2NS4yMTA5IDIzMiAzNC4yODMgMjMySDIzQzE2LjM3MjYgMjMyIDExIDIzNy4zNzIgMTEgMjQ0VjI2OEMxMSAyNzQuNjI3IDE2LjM3MjQgMjgwIDIyLjk5OTYgMjgwTDM0LjI4MyAyODBDNjUuMjEwOSAyODAgOTAuMjgzIDMwNS4wNzIgOTAuMjgzIDMzNlY0NDBDOTAuMjgzIDQ3OS43NjQgMTIyLjUxOCA1MTIgMTYyLjI4MyA1MTJIMTk2LjVDMjAzLjEyNyA1MTIgMjA4LjUgNTA2LjYyNyAyMDguNSA1MDBWNDc2QzIwOC41IDQ2OS4zNzMgMjAzLjEyNyA0NjQgMTk2LjUgNDY0SDE2Mi4yODNDMTQ5LjAyOCA0NjQgMTM4LjI4MyA0NTMuMjU1IDEzOC4yODMgNDQwVjMzNkMxMzguMjgzIDMwOS4wMjIgMTI4LjAxMSAyODQuNDQzIDExMS4xNjQgMjY1Ljk2MUMxMDYuMTA5IDI2MC40MTYgMTA2LjEwOSAyNTEuNTg0IDExMS4xNjQgMjQ2LjAzOUMxMjguMDExIDIyNy41NTcgMTM4LjI4MyAyMDIuOTc4IDEzOC4yODMgMTc2VjgwQzEzOC4yODMgNjIuMzI2OSAxNTIuNjEgNDggMTcwLjI4MyA0OFoiIGZpbGw9IiNGRjk5MjIiLz4KPHBhdGggZD0iTTMwNSAzNkMzMDUgNDIuNjI3NCAzMTAuMzczIDQ4IDMxNyA0OEgzNDIuOTc5QzM2MC42NTIgNDggMzc0Ljk3OCA2Mi4zMjY5IDM3NC45NzggODBWMTc2QzM3NC45NzggMjAyLjk3OCAzODUuMjUxIDIyNy41NTcgNDAyLjA5OCAyNDYuMDM5QzQwNy4xNTMgMjUxLjU4NCA0MDcuMTUzIDI2MC40MTYgNDAyLjA5OCAyNjUuOTYxQzM4NS4yNTEgMjg0LjQ0MyAzNzQuOTc4IDMwOS4wMjIgMzc0Ljk3OCAzMzZWNDMyQzM3NC45NzggNDQ5LjY3MyAzNjAuNjUyIDQ2NCAzNDIuOTc5IDQ2NEgzMTdDMzEwLjM3MyA0NjQgMzA1IDQ2OS4zNzMgMzA1IDQ3NlY1MDBDMzA1IDUwNi42MjcgMzEwLjM3MyA1MTIgMzE3IDUxMkgzNDIuOTc5QzM4Ny4xNjEgNTEyIDQyMi45NzggNDc2LjE4MyA0MjIuOTc4IDQzMlYzMzZDNDIyLjk3OCAzMDUuMDcyIDQ0OC4wNTEgMjgwIDQ3OC45NzkgMjgwSDQ5MEM0OTYuNjI3IDI4MCA1MDIgMjc0LjYyOCA1MDIgMjY4VjI0NEM1MDIgMjM3LjM3MyA0OTYuNjI4IDIzMiA0OTAgMjMyTDQ3OC45NzkgMjMyQzQ0OC4wNTEgMjMyIDQyMi45NzggMjA2LjkyOCA0MjIuOTc4IDE3NlY4MEM0MjIuOTc4IDM1LjgxNzIgMzg3LjE2MSAwIDM0Mi45NzkgMEgzMTdDMzEwLjM3MyAwIDMwNSA1LjM3MjU4IDMwNSAxMlYzNloiIGZpbGw9IiNGRjk5MjIiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTcxXzQ0MSI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="},"displayName":"Code","typeVersion":2,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"id":839,"icon":"fa:clock","name":"n8n-nodes-base.scheduleTrigger","codex":{"data":{"alias":["Time","Scheduler","Polling","Cron","Interval"],"resources":{"generic":[],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.scheduletrigger/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"trigger\",\"schedule\"]","defaults":{"name":"Schedule Trigger","color":"#31C49F"},"iconData":{"icon":"clock","type":"icon"},"displayName":"Schedule Trigger","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":844,"icon":"fa:filter","name":"n8n-nodes-base.filter","codex":{"data":{"alias":["Router","Filter","Condition","Logic","Boolean","Branch"],"details":"The Filter node can be used to filter items based on a condition. If the condition is met, the item will be passed on to the next node. If the condition is not met, the item will be omitted. Conditions can be combined together by AND(meet all conditions), or OR(meet at least one condition).","resources":{"generic":[],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.filter/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Flow","Data Transformation"]}}},"group":"[\"transform\"]","defaults":{"name":"Filter","color":"#229eff"},"iconData":{"icon":"filter","type":"icon"},"displayName":"Filter","typeVersion":2,"nodeCategories":[{"id":9,"name":"Core Nodes"}]}],"categories":[{"id":44,"name":"Crypto Trading"},{"id":49,"name":"AI Summarization"}],"image":[]}}