{"workflow":{"id":13653,"name":"Monitor brand mentions with OpenAI across Twitter/X, Reddit, News, Airtable and Slack","views":96,"recentViews":1,"totalViews":96,"createdAt":"2026-02-24T11:44:11.912Z","description":"Monitors brand mentions across Twitter/X, Reddit, and News APIs in real-time (or scheduled), fetches mentions in parallel, normalizes data, uses AI to analyze sentiment/urgency/topics, detects duplicates, filters critical mentions, logs everything to Airtable, posts alerts to Slack, and emails daily HTML digest reports to the marketing team.\n\n## Good to Know\n- Runs **every hour** (configurable) to provide near-real-time brand monitoring\n- Pulls mentions from **multiple platforms** in parallel: Twitter/X, Reddit, News sources\n- Uses **AI** (OpenAI/Grok/etc.) for advanced sentiment classification, urgency detection, topic extraction, and duplicate deduplication\n- Focuses on **actionable insights**: flags negative/urgent mentions for immediate response\n- Generates **beautiful HTML daily digest** with summarized mentions, sentiment trends, and key highlights\n- Stores historical data in **Airtable** for tracking, analytics, and long-term reporting\n- Sends **real-time Slack alerts** for high-priority/negative mentions\n- Reduces manual social monitoring time dramatically and helps catch reputation issues early\n\n## How It Works\n\n### 1. Trigger & configure\n- **Schedule Trigger** — Runs every hour (or custom interval) to check for new brand mentions\n- **Set brand monitoring config** — Defines brand name, keywords, excluded terms, monitoring parameters (via Set node or variables)\n\n### 2. Fetch & collect mentions\n- **Fetch Twitter/X mentions** — Uses Twitter/X node or HTTP Request to search recent tweets (mentions, keywords)\n- **Fetch Reddit mentions** — Searches relevant subreddits or Reddit-wide for brand keywords/posts\n- **Fetch news article mentions** — Queries news APIs (e.g. NewsAPI, Google News via RSS/HTTP) for brand coverage\n- **Merge platform mentions** — Combines results from all sources into a unified stream\n- **Normalize mentions into unified schema** — Standardizes fields (text, author, platform, timestamp, URL, etc.) for consistent processing\n\n### 3. AI analyze & deduplicate\n- **AI sentiment and urgency analysis** — Sends mentions to AI model (OpenAI node) with prompt to classify:\n  - Sentiment: positive / neutral / negative\n  - Urgency/severity: low / medium / high / critical\n  - Topics/themes\n  - Key excerpts\n- **Wait For Result** — Ensures AI responses are complete\n- **Process analysis results** — Parses structured JSON output from AI\n- **Filter mentions requiring alerts** — Routes based on sentiment/urgency thresholds\n- **Deduplicate** — Removes near-duplicate mentions (e.g. same content reposted)\n\n### 4. Store, alert & report\n- **Log mention to Airtable** — Appends/updates records with full details, sentiment, AI analysis, timestamp\n- **Route by sentiment and urgency** — Critical/negative → immediate action path\n- **Send mention alert** — Posts formatted message to **Slack** (or Discord/Teams) with link, text snippet, sentiment badge\n- **Generate HTML daily digest report** — Compiles summary: total mentions, sentiment breakdown, top issues, trends\n- **Email HTML digest** — Sends polished report to marketing team via **Email** node (SMTP/Gmail)\n- **Log success and update listings** — Records workflow completion, stats for monitoring\n\n## Data Sources\n- **Twitter/X** — Recent search for mentions/keywords (via Twitter node or HTTP Request with API)\n- **Reddit** — Subreddit or site-wide search for brand mentions\n- **News APIs** — NewsAPI.org, Google News RSS, or similar for article mentions\n- **AI Model** — OpenAI (GPT-4o / GPT series), Grok, or other LLM for sentiment/urgency analysis\n- **Storage** — Airtable base (tables for mentions, daily summaries)\n- **Notifications** — Slack (webhook or app), Email (SMTP)\n\n## How to Use\n1. **Import** the workflow JSON into your n8n instance\n2. **Configure credentials**:\n   - Twitter/X API (OAuth or Bearer token for search)\n   - Reddit API (if using official; or RSS/HTTP for subreddits)\n   - News API key (e.g. NewsAPI.org)\n   - OpenAI API key (or Grok/other LLM)\n   - Airtable API key + base/table\n   - Slack webhook or app token\n   - Email SMTP credentials\n3. **Set monitoring parameters** — Edit brand name, keywords, exclude lists in **Set monitoring config** node\n4. **Customize AI prompt** — In the **AI sentiment** node, tweak for brand-specific tone, industry terms, urgency criteria\n5. **Adjust schedule** — Change interval in **Monitor mentions every hour** trigger\n6. **Tune filters** — Set thresholds for alerts (e.g. only negative + high urgency)\n7. **Test manually** — Use Execute Workflow to simulate with known mentions\n8. **Activate** — Turn on and watch Executions + Airtable/Slack for results\n\n## Requirements\n- n8n instance (self-hosted or cloud)\n- API access/keys for Twitter/X, Reddit (optional), News source\n- OpenAI (or compatible LLM) API key with good token limit\n- Airtable workspace/base for logging\n- Slack workspace for alerts\n- Email account for daily digests\n\n## Customizing This Workflow\n- **Add more platforms** — Include Facebook/Instagram (via Meta API), LinkedIn, Discord mentions\n- **Enhance AI analysis** — Add topic clustering, competitor comparison, virality scoring\n- **Improve deduplication** — Use fuzzy matching or embeddings for better duplicate detection\n- **Visual dashboard** — Export Airtable data to Google Looker Studio / Grafana for sentiment trends\n- **Auto-response** — For low-risk positive mentions, generate draft replies\n- **Language support** — Add multilingual sentiment detection\n- **Hourly vs. real-time** — Switch to webhook triggers if platforms support (e.g. Twitter webhooks if available)\n- **Daily/weekly reports** — Aggregate more stats, charts in HTML email\n\n","workflow":{"id":"am1RwBADxjmSSZRZ","meta":{"instanceId":"dd69efaf8212c74ad206700d104739d3329588a6f3f8381a46a481f34c9cc281","templateCredsSetupCompleted":true},"name":"AI Social Listening Agent","tags":[],"nodes":[{"id":"7c80824c-f381-4551-a857-74c7cd35337d","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-2752,-464],"parameters":{"width":820,"height":720,"content":"## AI Social Listening Agent\n\nMonitors brand mentions across Twitter/X, Reddit, and news sources in real-time. Uses AI to analyze sentiment (positive/negative/neutral), detects trending topics, classifies urgency, and delivers actionable insights via Slack and Email with daily digest reports.\n\n## How it works\n\n1. **Trigger** — Runs every hour to check for new brand mentions\n2. **Fetch & collect** — Pulls mentions from Twitter/X, Reddit, and News APIs in parallel\n3. **Analyze** — AI sentiment analysis, urgency classification, and trend detection\n4. **Deduplicate** — Filters already-processed mentions to avoid noise\n5. **Alert** — Sends real-time Slack alerts for negative/urgent mentions; logs all to Airtable\n6. **Report** — Generates daily HTML digest and emails summary to marketing team\n\n## Setup steps\n\n1. **Social APIs** — Add your Twitter/X Bearer Token, Reddit Client ID/Secret, and News API Key\n2. **OpenAI** — Add your OpenAI API key for sentiment analysis\n3. **Airtable** — Create a `brand_mentions` base and add your API key\n4. **Slack** — Add your incoming webhook URL to the Slack node\n5. **Email** — Configure SMTP credentials and set `from` / `to` addresses\n6. **Brand Config** — Update the brand name and keywords in the Config node\n7. **Test** — Run manually to verify all connections, then activate"},"typeVersion":1},{"id":"43b61124-1746-4b60-9632-91ef576a8de4","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-1840,-368],"parameters":{"color":5,"width":468,"height":465,"content":"## 1. Trigger & configure\n\nRuns every hour to initiate brand monitoring. Config node sets brand name, keywords, and monitoring parameters"},"typeVersion":1},{"id":"875435b7-441a-46b2-a86f-1ccfced6b2a3","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[-1328,-496],"parameters":{"color":5,"width":668,"height":820,"content":"## 2. Fetch & collect mentions\n\nFetches brand mentions from Twitter/X, Reddit, and News APIs in parallel, then merges all results into a unified stream"},"typeVersion":1},{"id":"67f60b4a-55fc-4e5e-9200-2553a772f960","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[-624,-544],"parameters":{"color":5,"width":588,"height":905,"content":"## 3. AI analyze & deduplicate\n\nUses OpenAI to classify sentiment, detect urgency, extract topics, and deduplicates mentions already seen this session"},"typeVersion":1},{"id":"62d00e40-ad6e-458e-8ef6-13793c17d173","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[32,-528],"parameters":{"color":5,"width":1328,"height":713,"content":"## 4. Store, alert & report\n\nLogs all mentions to Airtable, sends real-time Slack alerts for negative/urgent mentions, and emails a daily HTML digest to the marketing team"},"typeVersion":1},{"id":"28fbfdd8-4086-47b1-a30d-eaf8b80d5d54","name":"Monitor brand mentions every hour","type":"n8n-nodes-base.scheduleTrigger","position":[-1712,-64],"parameters":{"rule":{"interval":[{"field":"hours"}]}},"typeVersion":1.2},{"id":"39123f7b-7809-4887-bdf8-9105af94f0f7","name":"Set brand monitoring config","type":"n8n-nodes-base.set","position":[-1488,-64],"parameters":{"options":{},"assignments":{"assignments":[{"id":"brand-name","name":"brandName","type":"string","value":"YourBrand"},{"id":"keywords","name":"keywords","type":"string","value":"YourBrand,@YourBrand,#YourBrand"},{"id":"lookback-hours","name":"lookbackHours","type":"number","value":1},{"id":"alert-threshold","name":"negativeAlertThreshold","type":"number","value":3}]}},"typeVersion":3.4},{"id":"dbac966d-a71b-4dc9-84b3-621beca97b98","name":"Fetch Twitter/X mentions","type":"n8n-nodes-base.httpRequest","position":[-1264,-352],"parameters":{"url":"https://api.twitter.com/2/tweets/search/recent","options":{},"sendQuery":true,"sendHeaders":true,"queryParameters":{"parameters":[{"name":"query","value":"={{ $json.brandName + ' -is:retweet lang:en' }}"},{"name":"tweet.fields","value":"created_at,author_id,text,public_metrics,geo"},{"name":"max_results","value":"50"}]},"headerParameters":{"parameters":[{"name":"Authorization","value":"Bearer YOUR_TOKEN_HERE"}]}},"typeVersion":4.2},{"id":"f3a1d9e5-14e8-4b1c-a04c-57a23f5cd2a4","name":"Fetch Reddit mentions","type":"n8n-nodes-base.httpRequest","position":[-1264,-160],"parameters":{"url":"https://www.reddit.com/search.json","options":{},"sendQuery":true,"queryParameters":{"parameters":[{"name":"q","value":"={{ $json.brandName }}"},{"name":"sort","value":"new"},{"name":"t","value":"day"},{"name":"limit","value":"25"}]}},"typeVersion":4.2},{"id":"d6f98d40-927b-41b0-bd18-5246780b10b8","name":"Fetch news article mentions","type":"n8n-nodes-base.httpRequest","position":[-1264,32],"parameters":{"url":"https://newsapi.org/v2/everything","options":{},"sendQuery":true,"queryParameters":{"parameters":[{"name":"q","value":"={{ $json.brandName }}"},{"name":"sortBy","value":"publishedAt"},{"name":"language","value":"en"},{"name":"pageSize","value":"20"},{"name":"apiKey","value":"YOUR_NEWS_API_KEY"}]}},"typeVersion":4.2},{"id":"0a3f264c-b449-41de-822f-888ac8b0e899","name":"Merge all platform mentions","type":"n8n-nodes-base.merge","position":[-1040,-160],"parameters":{"mode":"combine","options":{}},"typeVersion":3},{"id":"81837c5d-634f-4019-8195-46fc6268d41c","name":"Normalize mentions into unified schema","type":"n8n-nodes-base.code","position":[-816,-160],"parameters":{"jsCode":"// Normalize all platform data into a unified mention schema\nconst items = $input.all();\nconst normalizedMentions = [];\nconst now = new Date();\nconst brandName = 'YourBrand'; // Update to match config\n\nitems.forEach(item => {\n  const data = item.json;\n\n  // Twitter/X mentions\n  if (data.data && Array.isArray(data.data)) {\n    data.data.forEach(tweet => {\n      normalizedMentions.push({\n        platform: 'Twitter/X',\n        mentionId: `tw_${tweet.id}`,\n        text: tweet.text || '',\n        author: tweet.author_id || 'unknown',\n        url: `https://twitter.com/i/web/status/${tweet.id}`,\n        publishedAt: tweet.created_at || now.toISOString(),\n        likes: tweet.public_metrics?.like_count || 0,\n        shares: tweet.public_metrics?.retweet_count || 0,\n        reach: (tweet.public_metrics?.like_count || 0) + (tweet.public_metrics?.retweet_count || 0),\n        rawData: tweet\n      });\n    });\n  }\n\n  // Reddit mentions\n  if (data.data?.children && Array.isArray(data.data.children)) {\n    data.data.children.forEach(post => {\n      const p = post.data;\n      normalizedMentions.push({\n        platform: 'Reddit',\n        mentionId: `rd_${p.id}`,\n        text: `${p.title} ${p.selftext || ''}`.trim(),\n        author: p.author || 'unknown',\n        url: `https://reddit.com${p.permalink}`,\n        publishedAt: new Date(p.created_utc * 1000).toISOString(),\n        likes: p.score || 0,\n        shares: p.num_comments || 0,\n        reach: p.score || 0,\n        rawData: p\n      });\n    });\n  }\n\n  // News mentions\n  if (data.articles && Array.isArray(data.articles)) {\n    data.articles.forEach((article, idx) => {\n      normalizedMentions.push({\n        platform: 'News',\n        mentionId: `nw_${Buffer.from(article.url || idx.toString()).toString('base64').slice(0,12)}`,\n        text: `${article.title} ${article.description || ''}`.trim(),\n        author: article.source?.name || 'Unknown Source',\n        url: article.url || '',\n        publishedAt: article.publishedAt || now.toISOString(),\n        likes: 0,\n        shares: 0,\n        reach: 0,\n        rawData: article\n      });\n    });\n  }\n});\n\nconst reportTimestamp = now.toISOString();\nconst reportDate = now.toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' });\n\nreturn normalizedMentions.map(mention => ({\n  json: {\n    ...mention,\n    brandName,\n    reportTimestamp,\n    reportDate,\n    totalMentionsCollected: normalizedMentions.length\n  }\n}));"},"typeVersion":2},{"id":"c5e986df-9285-4d2b-b43f-4ea0f4569d8d","name":"AI sentiment and urgency analysis","type":"n8n-nodes-base.httpRequest","position":[-592,-160],"parameters":{"url":"https://api.openai.com/v1/chat/completions","method":"POST","options":{},"jsonBody":"={\n  \"model\": \"gpt-4o-mini\",\n  \"max_tokens\": 300,\n  \"response_format\": { \"type\": \"json_object\" },\n  \"messages\": [\n    {\n      \"role\": \"system\",\n      \"content\": \"You are a brand monitoring AI. Analyze the given text and return ONLY valid JSON with these fields: sentiment (positive/negative/neutral), sentimentScore (-1.0 to 1.0), urgency (low/medium/high/critical), topics (array of up to 3 key topics), summary (one sentence), requiresResponse (boolean), language (ISO 639-1 code).\"\n    },\n    {\n      \"role\": \"user\",\n      \"content\": \"Analyze this brand mention from {{ $json.platform }}: {{ $json.text }}\"\n    }\n  ]\n}","sendBody":true,"sendHeaders":true,"specifyBody":"json","headerParameters":{"parameters":[{"name":"Authorization","value":"Bearer YOUR_TOKEN_HERE"},{"name":"Content-Type","value":"application/json"}]}},"typeVersion":4.2},{"id":"11463390-874b-43e1-ab29-1b5dc31f4b76","name":"Process AI analysis results","type":"n8n-nodes-base.code","position":[-160,-160],"parameters":{"mode":"runOnceForEachItem","jsCode":"// Parse AI response and enrich mention with sentiment data\nconst item = $input.item.json;\n\nlet aiAnalysis = {};\ntry {\n  const content = item.choices?.[0]?.message?.content || '{}';\n  aiAnalysis = JSON.parse(content);\n} catch (e) {\n  aiAnalysis = {\n    sentiment: 'neutral',\n    sentimentScore: 0,\n    urgency: 'low',\n    topics: [],\n    summary: 'Analysis unavailable',\n    requiresResponse: false,\n    language: 'en'\n  };\n}\n\nconst sentiment = aiAnalysis.sentiment || 'neutral';\nconst urgency = aiAnalysis.urgency || 'low';\n\n// Generate mention ID for dedup tracking\nconst mentionId = item.mentionId || `gen_${Date.now()}`;\n\n// Check duplicate via static data\nconst processedMentions = $getWorkflowStaticData('global').processedMentions || {};\nconst isDuplicate = !!processedMentions[mentionId];\n\nif (!isDuplicate) {\n  processedMentions[mentionId] = {\n    timestamp: new Date().toISOString(),\n    sentiment,\n    urgency\n  };\n  // Clean up mentions older than 7 days\n  const sevenDaysAgo = Date.now() - (7 * 24 * 60 * 60 * 1000);\n  for (const key in processedMentions) {\n    if (new Date(processedMentions[key].timestamp).getTime() < sevenDaysAgo) {\n      delete processedMentions[key];\n    }\n  }\n  $getWorkflowStaticData('global').processedMentions = processedMentions;\n}\n\n// Update cumulative stats\nconst stats = $getWorkflowStaticData('global').mentionStats || {\n  total: 0, positive: 0, negative: 0, neutral: 0, critical: 0, byPlatform: {}\n};\nif (!isDuplicate) {\n  stats.total++;\n  if (sentiment === 'positive') stats.positive++;\n  else if (sentiment === 'negative') stats.negative++;\n  else stats.neutral++;\n  if (urgency === 'critical') stats.critical++;\n  stats.byPlatform[item.platform] = (stats.byPlatform[item.platform] || 0) + 1;\n  $getWorkflowStaticData('global').mentionStats = stats;\n}\n\nconst requiresAlert = (sentiment === 'negative' && urgency !== 'low') || urgency === 'critical';\n\nreturn {\n  json: {\n    ...item,\n    mentionId,\n    sentiment,\n    sentimentScore: aiAnalysis.sentimentScore || 0,\n    urgency,\n    topics: aiAnalysis.topics || [],\n    aiSummary: aiAnalysis.summary || '',\n    requiresResponse: aiAnalysis.requiresResponse || false,\n    language: aiAnalysis.language || 'en',\n    isDuplicate,\n    requiresAlert,\n    processedAt: new Date().toISOString()\n  }\n};"},"typeVersion":2},{"id":"d74607a5-73b7-48ae-90fa-5ef7f0b2722c","name":"Route by sentiment and urgency","type":"n8n-nodes-base.switch","position":[64,-176],"parameters":{"rules":{"values":[{"outputKey":"Critical — Immediate Alert","conditions":{"options":{"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.urgency }}","rightValue":"critical"}]},"renameOutput":true},{"outputKey":"Negative — Needs Attention","conditions":{"options":{"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.sentiment }}","rightValue":"negative"}]},"renameOutput":true},{"outputKey":"Positive or Neutral","conditions":{"options":{"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"or","conditions":[{"operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.sentiment }}","rightValue":"positive"},{"operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.sentiment }}","rightValue":"neutral"}]},"renameOutput":true}]},"options":{}},"typeVersion":3},{"id":"56f4a0f6-87ae-48b3-8c63-356a4938a057","name":"Send critical mention alert","type":"n8n-nodes-base.httpRequest","position":[288,-352],"parameters":{"url":"https://api.example.com/alerts/send","method":"POST","options":{},"sendBody":true,"sendHeaders":true,"bodyParameters":{"parameters":[{"name":"alert_type","value":"CRITICAL_BRAND_MENTION"},{"name":"severity","value":"critical"},{"name":"platform","value":"={{ $json.platform }}"},{"name":"mention_id","value":"={{ $json.mentionId }}"},{"name":"sentiment","value":"={{ $json.sentiment }}"},{"name":"message","value":"={{ 'CRITICAL brand mention on ' + $json.platform + ': ' + $json.aiSummary + ' — URL: ' + $json.url }}"}]},"headerParameters":{"parameters":[{"name":"Content-Type","value":"application/json"}]}},"typeVersion":4.2},{"id":"bcc14722-99ac-42a7-8558-63db38e82b2c","name":"Log mention to Airtable","type":"n8n-nodes-base.httpRequest","position":[288,-160],"parameters":{"url":"https://api.airtable.com/v0/YOUR_BASE_ID/brand_mentions","method":"POST","options":{},"jsonBody":"={\n  \"fields\": {\n    \"Mention ID\": \"{{ $json.mentionId }}\",\n    \"Platform\": \"{{ $json.platform }}\",\n    \"Text\": \"{{ $json.text.slice(0, 500) }}\",\n    \"Author\": \"{{ $json.author }}\",\n    \"URL\": \"{{ $json.url }}\",\n    \"Sentiment\": \"{{ $json.sentiment }}\",\n    \"Sentiment Score\": {{ $json.sentimentScore }},\n    \"Urgency\": \"{{ $json.urgency }}\",\n    \"Topics\": \"{{ $json.topics.join(', ') }}\",\n    \"AI Summary\": \"{{ $json.aiSummary }}\",\n    \"Requires Response\": {{ $json.requiresResponse }},\n    \"Published At\": \"{{ $json.publishedAt }}\",\n    \"Processed At\": \"{{ $json.processedAt }}\",\n    \"Is Duplicate\": {{ $json.isDuplicate }},\n    \"Reach\": {{ $json.reach }}\n  }\n}","sendBody":true,"sendHeaders":true,"specifyBody":"json","headerParameters":{"parameters":[{"name":"Authorization","value":"Bearer YOUR_TOKEN_HERE"},{"name":"Content-Type","value":"application/json"}]}},"typeVersion":4.2},{"id":"06e26387-1dc9-46c9-9af2-41b4f73509fb","name":"Generate HTML daily digest report","type":"n8n-nodes-base.code","position":[512,-240],"parameters":{"mode":"runOnceForEachItem","jsCode":"// Generate HTML daily digest report for brand mentions\nconst mention = $input.item.json;\nconst stats = $getWorkflowStaticData('global').mentionStats || { total: 0, positive: 0, negative: 0, neutral: 0, critical: 0, byPlatform: {} };\n\nconst sentimentColor = mention.sentiment === 'positive' ? '#22c55e' : mention.sentiment === 'negative' ? '#ef4444' : '#94a3b8';\nconst urgencyColor = mention.urgency === 'critical' ? '#ef4444' : mention.urgency === 'high' ? '#f97316' : mention.urgency === 'medium' ? '#f59e0b' : '#22c55e';\nconst sentimentIcon = mention.sentiment === 'positive' ? '😊' : mention.sentiment === 'negative' ? '😠' : '😐';\n\nconst platformRows = Object.entries(stats.byPlatform).map(([p, count]) => `<tr><td>${p}</td><td>${count}</td></tr>`).join('') || '<tr><td colspan=\"2\">No data yet</td></tr>';\n\nconst positiveRate = stats.total > 0 ? Math.round((stats.positive / stats.total) * 100) : 0;\nconst negativeRate = stats.total > 0 ? Math.round((stats.negative / stats.total) * 100) : 0;\nconst neutralRate = stats.total > 0 ? Math.round((stats.neutral / stats.total) * 100) : 0;\n\nconst reportHtml = `\n<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"UTF-8\">\n  <title>Brand Mention Digest — ${mention.reportDate}</title>\n  <style>\n    body { font-family: Arial, sans-serif; color: #1e293b; margin: 0; padding: 24px; background: #f8fafc; }\n    .header { background: #0f172a; color: white; padding: 24px; border-radius: 8px; margin-bottom: 24px; }\n    .header h1 { margin: 0 0 8px 0; font-size: 22px; }\n    .header p { margin: 0; opacity: 0.7; font-size: 13px; }\n    .badge { display: inline-block; padding: 6px 16px; border-radius: 20px; font-weight: bold; font-size: 14px; background: ${sentimentColor}; color: white; margin-top: 12px; }\n    .cards { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; margin-bottom: 24px; }\n    .card { background: white; border-radius: 8px; padding: 16px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }\n    .card .value { font-size: 28px; font-weight: bold; }\n    .card .label { font-size: 12px; color: #64748b; margin-top: 4px; }\n    .section { background: white; border-radius: 8px; padding: 20px; margin-bottom: 20px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }\n    .section h2 { margin: 0 0 16px 0; font-size: 16px; border-bottom: 2px solid #e2e8f0; padding-bottom: 8px; }\n    table { width: 100%; border-collapse: collapse; font-size: 13px; }\n    th { background: #f1f5f9; text-align: left; padding: 8px 12px; }\n    td { padding: 8px 12px; border-bottom: 1px solid #e2e8f0; }\n    .mention-card { border-left: 4px solid ${sentimentColor}; padding: 12px 16px; background: #f8fafc; border-radius: 4px; margin-bottom: 8px; }\n    .footer { text-align: center; font-size: 11px; color: #94a3b8; margin-top: 24px; }\n  </style>\n</head>\n<body>\n  <div class=\"header\">\n    <h1>📡 Brand Social Listening Digest</h1>\n    <p>Brand: ${mention.brandName} &nbsp;|&nbsp; Report Date: ${mention.reportDate} &nbsp;|&nbsp; Platforms: Twitter/X, Reddit, News</p>\n    <div class=\"badge\">${sentimentIcon} Latest: ${mention.sentiment?.toUpperCase()}</div>\n  </div>\n\n  <div class=\"cards\">\n    <div class=\"card\"><div class=\"value\">${stats.total}</div><div class=\"label\">Total Mentions</div></div>\n    <div class=\"card\"><div class=\"value\" style=\"color:#22c55e\">${positiveRate}%</div><div class=\"label\">Positive Sentiment</div></div>\n    <div class=\"card\"><div class=\"value\" style=\"color:#ef4444\">${negativeRate}%</div><div class=\"label\">Negative Sentiment</div></div>\n    <div class=\"card\"><div class=\"value\" style=\"color:#f59e0b\">${stats.critical}</div><div class=\"label\">Critical Alerts</div></div>\n  </div>\n\n  <div class=\"section\">\n    <h2>📊 Sentiment Breakdown</h2>\n    <table><thead><tr><th>Sentiment</th><th>Count</th><th>Rate</th></tr></thead><tbody>\n      <tr><td>✅ Positive</td><td style=\"color:#22c55e;font-weight:bold\">${stats.positive}</td><td>${positiveRate}%</td></tr>\n      <tr><td>❌ Negative</td><td style=\"color:#ef4444;font-weight:bold\">${stats.negative}</td><td>${negativeRate}%</td></tr>\n      <tr><td>😐 Neutral</td><td style=\"color:#94a3b8\">${stats.neutral}</td><td>${neutralRate}%</td></tr>\n    </tbody></table>\n  </div>\n\n  <div class=\"section\">\n    <h2>🌐 Mentions by Platform</h2>\n    <table><thead><tr><th>Platform</th><th>Mentions</th></tr></thead><tbody>${platformRows}</tbody></table>\n  </div>\n\n  <div class=\"section\">\n    <h2>🔔 Latest Mention</h2>\n    <div class=\"mention-card\">\n      <strong>${mention.platform}</strong> — <span style=\"color:${sentimentColor}\">${mention.sentiment?.toUpperCase()}</span> &nbsp;|&nbsp; Urgency: <span style=\"color:${urgencyColor}\">${mention.urgency?.toUpperCase()}</span><br>\n      <p style=\"margin:8px 0;font-size:13px\">${mention.aiSummary || mention.text?.slice(0, 200)}</p>\n      <small>Topics: ${(mention.topics || []).join(', ') || 'N/A'} &nbsp;|&nbsp; Author: ${mention.author} &nbsp;|&nbsp; <a href=\"${mention.url}\">View Original</a></small>\n    </div>\n  </div>\n\n  <div class=\"footer\">Automated report generated by AI Social Listening Agent &nbsp;|&nbsp; ${mention.processedAt}</div>\n</body>\n</html>`;\n\nconst notificationMessage = `${sentimentIcon} *BRAND MENTION — ${mention.platform}*\\n\\n` +\n  `*Brand:* ${mention.brandName}\\n` +\n  `*Sentiment:* ${mention.sentiment?.toUpperCase()} (${mention.sentimentScore > 0 ? '+' : ''}${mention.sentimentScore?.toFixed(2)})\\n` +\n  `*Urgency:* ${mention.urgency?.toUpperCase()}\\n` +\n  `*Summary:* ${mention.aiSummary}\\n` +\n  `*Topics:* ${(mention.topics || []).join(', ') || 'N/A'}\\n` +\n  `*Author:* ${mention.author}\\n` +\n  `*Platform:* ${mention.platform}\\n` +\n  `*URL:* ${mention.url}\\n\\n` +\n  `*Session Stats:* ${stats.total} mentions | ${positiveRate}% positive | ${negativeRate}% negative`;\n\nreturn {\n  json: {\n    ...mention,\n    reportHtml,\n    notificationMessage,\n    notificationTitle: `${sentimentIcon} [${mention.platform}] ${mention.sentiment?.toUpperCase()} brand mention — ${mention.urgency?.toUpperCase()} urgency`,\n    shouldAlert: mention.requiresAlert || mention.urgency === 'critical',\n    sessionStats: stats\n  }\n};"},"typeVersion":2},{"id":"f146210a-6a32-406e-8798-8a779df66147","name":"Filter mentions requiring alerts","type":"n8n-nodes-base.filter","position":[736,-240],"parameters":{"options":{},"conditions":{"options":{"leftValue":"","caseSensitive":false,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"alert-filter","operator":{"type":"boolean","operation":"true"},"leftValue":"={{ $json.shouldAlert }}"}]}},"typeVersion":2},{"id":"72fb1a15-ce54-48cb-bd79-7e78689bc5dc","name":"Post mention alert to Slack","type":"n8n-nodes-base.httpRequest","position":[960,-256],"parameters":{"url":"YOUR_SLACK_WEBHOOK_URL","method":"POST","options":{},"jsonBody":"={\n  \"text\": \"{{ $json.notificationTitle }}\",\n  \"blocks\": [\n    {\n      \"type\": \"section\",\n      \"text\": {\n        \"type\": \"mrkdwn\",\n        \"text\": \"{{ $json.notificationMessage }}\"\n      }\n    }\n  ]\n}","sendBody":true,"specifyBody":"json"},"typeVersion":4.2},{"id":"64a6aa14-c229-45c8-b818-f245f8868bbd","name":"Email HTML digest to marketing team","type":"n8n-nodes-base.emailSend","position":[960,-64],"webhookId":"993g6804-dg8e-573d-ce10-596bc69g874f","parameters":{"html":"={{ $json.reportHtml }}","options":{},"subject":"={{ $json.notificationTitle }}","toEmail":"user@example.com","fromEmail":"user@example.com"},"credentials":{"smtp":{"id":"credential-id","name":"SMTP -test"}},"typeVersion":2.1},{"id":"3eda856c-07fe-4eb2-8876-b8d8433c24be","name":"Log success and update listening statistics","type":"n8n-nodes-base.code","position":[1184,-240],"parameters":{"mode":"runOnceForEachItem","jsCode":"// Log successful mention processing and track statistics\nconst timestamp = new Date().toISOString();\nconst mention = $input.item.json;\n\nconsole.log(`✅ SUCCESS: Mention ${mention.mentionId} | Platform: ${mention.platform} | Sentiment: ${mention.sentiment} | Urgency: ${mention.urgency} | Duplicate: ${mention.isDuplicate} | Time: ${timestamp}`);\n\nconst stats = $getWorkflowStaticData('global').mentionStats || {};\n\nreturn {\n  json: {\n    success: true,\n    mentionId: mention.mentionId,\n    platform: mention.platform,\n    sentiment: mention.sentiment,\n    urgency: mention.urgency,\n    requiresResponse: mention.requiresResponse,\n    isDuplicate: mention.isDuplicate,\n    alertSent: mention.shouldAlert,\n    timestamp,\n    sessionStats: {\n      totalMentions: stats.total || 0,\n      positiveCount: stats.positive || 0,\n      negativeCount: stats.negative || 0,\n      neutralCount: stats.neutral || 0,\n      criticalAlerts: stats.critical || 0,\n      byPlatform: stats.byPlatform || {}\n    }\n  }\n};"},"typeVersion":2},{"id":"a9cc90cf-9c9c-481a-afc2-67af5d0de035","name":"Wait For Result","type":"n8n-nodes-base.wait","position":[-384,-160],"webhookId":"ffce5ead-b7b9-45ee-890e-20ca241fa867","parameters":{},"typeVersion":1.1}],"active":false,"pinData":{},"settings":{"executionOrder":"v1"},"versionId":"7a1be7c0-e86e-4a4c-9003-f703640dd3bf","connections":{"Wait For Result":{"main":[[{"node":"Process AI analysis results","type":"main","index":0}]]},"Fetch Reddit mentions":{"main":[[{"node":"Merge all platform mentions","type":"main","index":1}]]},"Log mention to Airtable":{"main":[[{"node":"Generate HTML daily digest report","type":"main","index":0}]]},"Fetch Twitter/X mentions":{"main":[[{"node":"Merge all platform mentions","type":"main","index":0}]]},"Fetch news article mentions":{"main":[[{"node":"Merge all platform mentions","type":"main","index":1}]]},"Merge all platform mentions":{"main":[[{"node":"Normalize mentions into unified schema","type":"main","index":0}]]},"Post mention alert to Slack":{"main":[[{"node":"Log success and update listening statistics","type":"main","index":0}]]},"Process AI analysis results":{"main":[[{"node":"Route by sentiment and urgency","type":"main","index":0}]]},"Send critical mention alert":{"main":[[{"node":"Generate HTML daily digest report","type":"main","index":0}]]},"Set brand monitoring config":{"main":[[{"node":"Fetch Twitter/X mentions","type":"main","index":0},{"node":"Fetch Reddit mentions","type":"main","index":0},{"node":"Fetch news article mentions","type":"main","index":0}]]},"Route by sentiment and urgency":{"main":[[{"node":"Send critical mention alert","type":"main","index":0},{"node":"Log mention to Airtable","type":"main","index":0},{"node":"Generate HTML daily digest report","type":"main","index":0}],[{"node":"Log mention to Airtable","type":"main","index":0},{"node":"Generate HTML daily digest report","type":"main","index":0}],[{"node":"Log mention to Airtable","type":"main","index":0},{"node":"Generate HTML daily digest report","type":"main","index":0}]]},"Filter mentions requiring alerts":{"main":[[{"node":"Post mention alert to Slack","type":"main","index":0},{"node":"Email HTML digest to marketing team","type":"main","index":0}]]},"AI sentiment and urgency analysis":{"main":[[{"node":"Wait For Result","type":"main","index":0}]]},"Generate HTML daily digest report":{"main":[[{"node":"Filter mentions requiring alerts","type":"main","index":0}]]},"Monitor brand mentions every hour":{"main":[[{"node":"Set brand monitoring config","type":"main","index":0}]]},"Email HTML digest to marketing team":{"main":[[{"node":"Log success and update listening statistics","type":"main","index":0}]]},"Normalize mentions into unified schema":{"main":[[{"node":"AI sentiment and urgency analysis","type":"main","index":0}]]}}},"lastUpdatedBy":1,"workflowInfo":{"nodeCount":23,"nodeTypes":{"n8n-nodes-base.set":{"count":1},"n8n-nodes-base.code":{"count":4},"n8n-nodes-base.wait":{"count":1},"n8n-nodes-base.merge":{"count":1},"n8n-nodes-base.filter":{"count":1},"n8n-nodes-base.switch":{"count":1},"n8n-nodes-base.emailSend":{"count":1},"n8n-nodes-base.stickyNote":{"count":5},"n8n-nodes-base.httpRequest":{"count":7},"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":38,"icon":"fa:pen","name":"n8n-nodes-base.set","codex":{"data":{"alias":["Set","JS","JSON","Filter","Transform","Map"],"resources":{"generic":[{"url":"https://n8n.io/blog/learn-to-automate-your-factorys-incident-reporting-a-step-by-step-guide/","icon":"🏭","label":"Learn to Automate Your Factory's Incident Reporting: A Step by Step Guide"},{"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/automatically-pulling-and-visualizing-data-with-n8n/","icon":"📈","label":"Automatically pulling and visualizing data with n8n"},{"url":"https://n8n.io/blog/database-monitoring-and-alerting-with-n8n/","icon":"📡","label":"Database Monitoring and Alerting 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/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/how-to-build-a-low-code-self-hosted-url-shortener/","icon":"🔗","label":"How to build a low-code, self-hosted URL shortener in 3 steps"},{"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-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/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/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"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/the-ultimate-guide-to-automate-your-video-collaboration-with-whereby-mattermost-and-n8n/","icon":"📹","label":"The ultimate guide to automate your video collaboration with Whereby, Mattermost, and n8n"},{"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/learn-to-build-powerful-api-endpoints-using-webhooks/","icon":"🧰","label":"Learn to Build Powerful API Endpoints Using Webhooks"},{"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/benefits-of-automation-and-n8n-an-interview-with-hubspots-hugh-durkin/","icon":"🎖","label":"Benefits of automation and n8n: An interview with HubSpot's Hugh Durkin"},{"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.set/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Data Transformation"]}}},"group":"[\"input\"]","defaults":{"name":"Edit Fields"},"iconData":{"icon":"pen","type":"icon"},"displayName":"Edit Fields (Set)","typeVersion":3,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"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":514,"icon":"fa:pause-circle","name":"n8n-nodes-base.wait","codex":{"data":{"alias":["pause","sleep","delay","timeout"],"resources":{"generic":[{"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/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.wait/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers","Flow"]}}},"group":"[\"organization\"]","defaults":{"name":"Wait","color":"#804050"},"iconData":{"icon":"pause-circle","type":"icon"},"displayName":"Wait","typeVersion":1,"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":32,"name":"Market Research"},{"id":49,"name":"AI Summarization"}],"image":[]}}