{"workflow":{"id":14977,"name":"Generate daily business briefing podcasts with OpenAI, Azure TTS, HubSpot, Zendesk, Pipedrive, Discord, Twilio and Confluence","views":0,"recentViews":0,"totalViews":0,"createdAt":"2026-04-10T10:50:10.629Z","description":"Keep your leadership team informed with a data-driven, automated morning briefing. This workflow pulls live metrics from HubSpot, Zendesk, and Pipedrive, then uses AI and Neural TTS to generate a professional audio briefing delivered via Discord, SMS, and Confluence.\n\n---\n\n## 🎯 What This Workflow Does\n\nThis template acts as an automated newsroom, executing a \"Fetch → Analyze → Broadcast\" cycle every weekday morning.\n\n---\n\n### ⏰ Step 1 — Intelligent Triggering\n\n- **Schedule:** Runs Monday–Friday at 7:30 AM  \n- **Weekday Guard:** Skips weekends automatically  \n- **Date Context:** Generates standardized timestamps for API calls  \n\n---\n\n### 🔀 Step 2 — Parallel Metric Fetching\n\n- **HubSpot:** Fetches new leads and deal values  \n- **Zendesk:** Retrieves ticket volume and response metrics  \n- **Pipedrive:** Pulls pipeline health and deal status  \n- **Merge:** Waits for all APIs before proceeding  \n\n---\n\n### 🤖 Step 3 — AI Scripting & Trend Analysis\n\n- **Historical Comparison:** Reads previous data to calculate trends  \n- **AI Script Generation:** Uses OpenAI to create a natural, spoken-style briefing  \n\n---\n\n### 🔊 Step 4 — Neural TTS & Hosting\n\n- **Voice Generation:** Uses Azure Neural TTS for high-quality audio  \n- **CDN Hosting:** Uploads MP3 via UploadToURL for public access  \n\n---\n\n### 📡 Step 5 — Multi-Channel Broadcast\n\n- **Discord:** Sends rich message with audio link  \n- **Twilio SMS:** Delivers summary + link to leadership  \n- **Confluence:** Logs full report with embedded audio  \n\n---\n\n## ✨ Key Features\n\n- **Parallel Processing:** Faster execution with simultaneous API calls  \n- **Trend Intelligence:** Automatically calculates day-over-day changes  \n- **Mobile Friendly:** SMS delivery for on-the-go access  \n- **Premium Audio:** Natural-sounding Neural TTS voices  \n\n---\n\n## 🔧 Setup Requirements\n\n### Required Integrations\n\n- **HubSpot, Zendesk, Pipedrive:** API access  \n- **OpenAI:** API key + Assistant ID  \n- **Azure Speech:** Subscription key  \n- **Twilio:** SMS credentials  \n- **Confluence:** API token + space access  \n- **UploadToURL:** CDN hosting for audio  \n\n---\n\nTurn your metrics into a daily executive briefing. Import this template and start broadcasting insights automatically.","workflow":{"meta":{"instanceId":"277842713620d9f5554de3b1518b865a152c8c4db680008bd8aec536fc18b4a8","templateCredsSetupCompleted":true},"nodes":[{"id":"522b22aa-2667-47f9-879c-69b887267661","name":"📋 MAIN — Workflow Overview","type":"n8n-nodes-base.stickyNote","position":[-256,-1392],"parameters":{"width":1128,"height":1340,"content":"## 📊 Daily Business Briefing Podcast\n### Pull CRM Metrics → AI Briefing Script → TTS Audio → Distribute to Team\n\n**What this workflow does:**\nEvery weekday morning at 7:30 AM, this workflow simultaneously pulls live business metrics from three separate sources in parallel — HubSpot (leads & deals), Zendesk (support tickets), and Pipedrive (sales pipeline) — using three independent HTTP branches that run at the same time. It then:\n1. **Cron Trigger** fires at 7:30 AM Mon–Fri only\n2. **3 Parallel HTTP branches** fetch metrics from HubSpot, Zendesk, and Pipedrive simultaneously (no sequential waiting)\n3. **Merge (Wait for All)** collects all 3 branch results into one item only after ALL branches complete\n4. **Code — Compile Metrics** assembles a unified metrics object with delta calculations (vs yesterday's baseline from Confluence)\n5. **Confluence — Read Yesterday** fetches yesterday's briefing page to extract baseline numbers for comparison\n6. **OpenAI Assistants API** (not chat completions — uses a persistent Assistant with instructions) generates the full podcast-style briefing script with trend analysis\n7. **Azure Cognitive Services TTS** (not ElevenLabs or Google TTS) converts the script to MP3 using Neural voice\n8. **UploadToURL** hosts the MP3 and returns a permanent URL\n9. **Three simultaneous distribution channels fire in parallel:**\n   - **Discord Webhook** → posts to #daily-briefing server channel with embedded audio link\n   - **Twilio SMS** → sends a short brief + audio URL to the leadership team's phones\n   - **Confluence — Create Page** → publishes today's briefing as a Confluence page with metrics table + audio player\n10. **Merge (Final)** collects all 3 distribution results\n11. **Code — Execution Report** builds a final run log object\n\n**Architecture (completely unique from all previous templates):**\n- ⏰ Cron Trigger with weekday-only guard (NOT generic schedule)\n- 🔀 3-WAY PARALLEL FETCH (HubSpot + Zendesk + Pipedrive simultaneously)\n- 🔗 Merge (Wait All) — collects branches only after ALL complete\n- 📓 Confluence READ + CREATE (bidirectional — unique CMS tool)\n- 🤖 OpenAI Assistants API — persistent assistant (NOT chat completions)\n- 🔊 Azure Cognitive Services TTS — Neural voice (NOT ElevenLabs/Google)\n- ☁️ UploadToURL — mandatory MP3 hosting\n- 🎮 Discord Webhook — team server (NOT Slack/Teams/Telegram)\n- 📱 Twilio SMS — leadership phones (NEW distribution channel)\n- 🔀 3-WAY PARALLEL DISTRIBUTION (Discord + Twilio + Confluence simultaneously)\n- 🔗 Merge (Final) — collects all distribution results\n\n**Setup Requirements:**\n1. HubSpot Private App token (Contacts + Deals read scope)\n2. Zendesk API token + subdomain (email/token auth)\n3. Pipedrive API token\n4. OpenAI API key — create an Assistant at platform.openai.com/assistants with the system prompt: 'You are a professional business briefing host. Generate concise, data-driven daily podcast scripts.'\n5. Azure Cognitive Services subscription key + region (Speech service)\n6. UploadToURL endpoint\n7. Discord server webhook URL (Server Settings → Integrations → Webhooks)\n8. Twilio Account SID + Auth Token + from number. Add leadership phone numbers to the `TO_NUMBERS` array in the Twilio Code node\n9. Confluence API token + base URL + Space Key"},"typeVersion":1},{"id":"fde5ff23-0014-47db-9a4a-011960ed0489","name":"📝 Note — Cron, Weekday Guard & Date Context","type":"n8n-nodes-base.stickyNote","position":[912,96],"parameters":{"color":7,"width":416,"height":798,"content":"### ⏰ Step 1 — Cron Trigger & Weekday Guard\n**Cron Trigger:** Fires at exactly 07:30 every day. Uses cron expression `30 7 * * *`.\n**Code — Weekday Guard:** Immediately checks if today is Saturday (6) or Sunday (0) — if so, returns empty array and the workflow stops with no execution. This is intentionally done in code rather than an IF node to keep the canvas clean and avoid a dangling false-branch.\n**Code — Set Today's Date Context:** Stamps `todayISO`, `todayLabel` (e.g. 'Monday, April 7'), `yesterdayISO`, and `weekNumber` into the item — these are referenced by ALL downstream branches via `$('Code — Set Date Context').item.json`."},"typeVersion":1},{"id":"3d73ddd5-a77a-465e-ad41-0b57d0bb87af","name":"📝 Note — Parallel CRM Fetch & Merge","type":"n8n-nodes-base.stickyNote","position":[1360,-48],"parameters":{"color":7,"width":528,"height":1110,"content":"### 🔀 Step 2 — 3 Parallel CRM Metric Fetches\n**Three branches run simultaneously from one output:**\n\n**Branch A — HubSpot:** Fetches new contacts created today + deals in pipeline. Uses HubSpot v3 CRM API with `createdAt` filter. Returns `new_leads`, `open_deals`, `deals_value_today`.\n\n**Branch B — Zendesk:** Fetches tickets created today, open ticket count, and avg first response time. Uses Zendesk Search API with `created>yesterday` filter. Returns `tickets_today`, `open_tickets`, `avg_response_mins`.\n\n**Branch C — Pipedrive:** Fetches deals won today, deals lost today, and pipeline value. Uses Pipedrive Activities API with `start_date=today`. Returns `deals_won`, `deals_lost`, `pipeline_value`.\n\n**Merge — Wait for All 3:** Uses `combineAll` mode — holds execution until ALL three branches deliver their item, then outputs a single merged item containing all metrics."},"typeVersion":1},{"id":"5b191f89-3964-41de-9d09-11aa7dffdb8d","name":"📝 Note — Confluence Read, Metrics Compile & Assistants API","type":"n8n-nodes-base.stickyNote","position":[1904,128],"parameters":{"color":7,"width":1072,"height":732,"content":"### 📓 Step 3 — Confluence Baseline + Script Generation\n**Confluence — Read Yesterday's Page:** Fetches yesterday's briefing Confluence page by title pattern (`Daily Briefing YYYY-MM-DD`) using the Confluence REST API search. Extracts yesterday's key numbers as baseline for delta calculations (e.g. '+12 leads vs yesterday').\n**Code — Compile Full Metrics:** Merges today's CRM data with yesterday's baseline. Computes deltas, formats currency values, and builds a structured `metricsObject` passed to the AI.\n**OpenAI Assistants API:** Calls `/v1/threads` → `/v1/threads/{id}/messages` → `/v1/threads/{id}/runs` → polls until complete → reads response. Uses a persistent named Assistant (not one-shot chat). Generates a 90-120 second natural podcast briefing with trends and callouts."},"typeVersion":1},{"id":"9bac7106-4858-425c-802e-ac23bb595723","name":"📝 Note — Azure TTS, Binary Wrap & UploadToURL","type":"n8n-nodes-base.stickyNote","position":[2992,128],"parameters":{"color":7,"width":1040,"height":724,"content":"### 🔊 Step 4 — Azure TTS + UploadToURL\n**Azure Cognitive Services TTS:** POSTs the briefing script as SSML to `https://{region}.tts.speech.microsoft.com/cognitiveservices/v1`. Uses `en-US-GuyNeural` voice — a warm, professional male Neural voice. Returns raw binary MP3.\n**Code — Wrap Binary:** Wraps the raw Azure response binary into n8n's binary field structure so UploadToURL can process it as a file attachment.\n**UploadToURL — Host Briefing MP3:** Uploads the binary MP3 and returns a permanent public URL used in Discord embed, Twilio SMS, and Confluence page."},"typeVersion":1},{"id":"7493364f-7c18-4e3a-bc36-d035b6eff272","name":"📝 Note — Discord, Twilio, Confluence + Final Merge","type":"n8n-nodes-base.stickyNote","position":[4048,64],"parameters":{"color":7,"width":752,"height":870,"content":"### 📡 Step 5 — 3-Way Parallel Distribution & Final Merge\n**Three distribution branches fire simultaneously:**\n\n**Branch D — Discord:** POSTs a rich embed to your team's Discord server webhook. Includes today's date as embed title, metric highlights as fields, and the audio URL as a prominent link button.\n\n**Branch E — Twilio SMS:** Loops through an array of leadership phone numbers and sends each a short SMS: key metrics summary (3 lines) + audio URL. Uses Twilio Messages API.\n\n**Branch F — Confluence Create:** Creates a new Confluence page in your Space titled `Daily Briefing YYYY-MM-DD`. Body includes a metrics table (HTML), the full AI script, and an HTML5 audio embed tag pointing to the hosted MP3.\n\n**Merge Final + Execution Report:** Waits for all 3 distribution branches, then outputs a clean run log with timestamps, success status per channel, and the audio URL."},"typeVersion":1},{"id":"36bafe79-c234-4df5-90dc-d5bb272ef223","name":"Cron — 7:30 AM Daily Trigger","type":"n8n-nodes-base.scheduleTrigger","position":[960,480],"parameters":{"rule":{"interval":[{"field":"cronExpression","expression":"30 7 * * *"}]}},"typeVersion":1.2},{"id":"bd5a408c-90ae-47a1-8b6b-c2d58e66e0cf","name":"Code — Weekday Guard & Date Context","type":"n8n-nodes-base.code","position":[1168,480],"parameters":{"jsCode":"const now = new Date();\nconst day = now.getDay(); // 0=Sun, 6=Sat\n\n// Skip weekends\nif (day === 0 || day === 6) {\n  return []; // halt workflow\n}\n\nconst pad = n => String(n).padStart(2, '0');\n\nconst todayISO = `${now.getFullYear()}-${pad(now.getMonth()+1)}-${pad(now.getDate())}`;\nconst dayNames = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];\nconst monthNames = ['January','February','March','April','May','June','July','August','September','October','November','December'];\nconst todayLabel = `${dayNames[day]}, ${monthNames[now.getMonth()]} ${now.getDate()}, ${now.getFullYear()}`;\n\nconst yesterday = new Date(now);\nyesterday.setDate(yesterday.getDate() - 1);\nconst yesterdayISO = `${yesterday.getFullYear()}-${pad(yesterday.getMonth()+1)}-${pad(yesterday.getDate())}`;\n\n// Week number\nconst startOfYear = new Date(now.getFullYear(), 0, 1);\nconst weekNumber = Math.ceil(((now - startOfYear) / 86400000 + startOfYear.getDay() + 1) / 7);\n\nconst startOfTodayISO = `${todayISO}T00:00:00Z`;\nconst endOfTodayISO   = `${todayISO}T23:59:59Z`;\n\nreturn [{\n  json: {\n    todayISO,\n    todayLabel,\n    yesterdayISO,\n    weekNumber,\n    startOfTodayISO,\n    endOfTodayISO,\n    generatedAt: now.toISOString()\n  }\n}];"},"typeVersion":2},{"id":"f377ba71-e3f2-4e18-a839-043c5b84b4d6","name":"HubSpot — Fetch Today's New Leads","type":"n8n-nodes-base.httpRequest","position":[1472,304],"parameters":{"url":"=https://api.hubapi.com/crm/v3/objects/contacts/search","method":"POST","options":{"timeout":15000},"jsonBody":"={\n  \"filterGroups\": [{\n    \"filters\": [{\n      \"propertyName\": \"createdate\",\n      \"operator\": \"GTE\",\n      \"value\": \"{{ new Date($('Code — Weekday Guard & Date Context').item.json.startOfTodayISO).getTime() }}\"\n    }]\n  }],\n  \"properties\": [\"firstname\", \"lastname\", \"email\", \"lifecyclestage\", \"hs_lead_status\"],\n  \"limit\": 100\n}","sendBody":true,"sendHeaders":true,"specifyBody":"json","headerParameters":{"parameters":[{"name":"Authorization","value":"=Bearer YOUR_HUBSPOT_PRIVATE_APP_TOKEN"},{"name":"Content-Type","value":"application/json"}]}},"typeVersion":4.2},{"id":"d8858e66-9aee-4f8c-b133-89d9694fca61","name":"HubSpot — Fetch Open Deals Pipeline","type":"n8n-nodes-base.httpRequest","position":[1472,480],"parameters":{"url":"=https://api.hubapi.com/crm/v3/objects/deals/search","method":"POST","options":{"timeout":15000},"jsonBody":"={\n  \"filterGroups\": [{\n    \"filters\": [{\n      \"propertyName\": \"dealstage\",\n      \"operator\": \"NOT_IN\",\n      \"values\": [\"closedwon\", \"closedlost\"]\n    }]\n  }],\n  \"properties\": [\"dealname\", \"amount\", \"dealstage\", \"closedate\", \"pipeline\"],\n  \"limit\": 100\n}","sendBody":true,"sendHeaders":true,"specifyBody":"json","headerParameters":{"parameters":[{"name":"Authorization","value":"=Bearer YOUR_HUBSPOT_PRIVATE_APP_TOKEN"},{"name":"Content-Type","value":"application/json"}]}},"typeVersion":4.2},{"id":"67a6fbdb-c0ae-434d-8ede-2f2996e7d6e8","name":"Zendesk — Fetch Today's Support Tickets","type":"n8n-nodes-base.httpRequest","position":[1472,672],"parameters":{"url":"=https://YOUR_ZENDESK_SUBDOMAIN.zendesk.com/api/v2/search.json","options":{"timeout":15000},"sendQuery":true,"sendHeaders":true,"queryParameters":{"parameters":[{"name":"query","value":"=type:ticket created>{{ $('Code — Weekday Guard & Date Context').item.json.yesterdayISO }}"},{"name":"sort_by","value":"created_at"},{"name":"sort_order","value":"desc"}]},"headerParameters":{"parameters":[{"name":"Authorization","value":"=Basic {{ Buffer.from('YOUR_ZENDESK_EMAIL/token:YOUR_ZENDESK_API_TOKEN').toString('base64') }}"}]}},"typeVersion":4.2},{"id":"5feb2fbe-97e5-4c0b-a257-3d561aa91f18","name":"Pipedrive — Fetch Sales Pipeline","type":"n8n-nodes-base.httpRequest","position":[1472,848],"parameters":{"url":"=https://api.pipedrive.com/v1/deals","options":{"timeout":15000},"sendQuery":true,"sendHeaders":true,"queryParameters":{"parameters":[{"name":"api_token","value":"=YOUR_PIPEDRIVE_API_TOKEN"},{"name":"status","value":"open"},{"name":"limit","value":"500"},{"name":"start","value":"0"}]},"headerParameters":{"parameters":[{"name":"Accept","value":"application/json"}]}},"typeVersion":4.2},{"id":"4cf9aebc-e372-4287-8a23-96e3dd2237b1","name":"Merge — Wait for All 3 CRM Branches","type":"n8n-nodes-base.merge","position":[1728,544],"parameters":{"mode":"mergeByIndex"},"typeVersion":3},{"id":"803353b7-ed9c-4701-91f7-e0cb0578c6e6","name":"Code — Compile All CRM Metrics","type":"n8n-nodes-base.code","position":[1952,544],"parameters":{"jsCode":"// Pull data from all branches via node references\nconst dateCtx    = $('Code — Weekday Guard & Date Context').item.json;\n\n// HubSpot contacts\nconst hsContacts = $('HubSpot — Fetch Today\\'s New Leads').item.json;\nconst newLeads   = hsContacts?.total ?? hsContacts?.results?.length ?? 0;\n\n// HubSpot deals\nconst hsDeals    = $('HubSpot — Fetch Open Deals Pipeline').item.json;\nconst dealsList  = hsDeals?.results || [];\nconst openDeals  = hsDeals?.total ?? dealsList.length;\nconst pipelineValue = dealsList.reduce((sum, d) => sum + parseFloat(d.properties?.amount || 0), 0);\n\n// Zendesk\nconst zdData       = $('Zendesk — Fetch Today\\'s Support Tickets').item.json;\nconst ticketsToday = zdData?.count ?? zdData?.results?.length ?? 0;\nconst openTickets  = zdData?.results?.filter(t => t.status === 'open' || t.status === 'new').length ?? 0;\n\n// Pipedrive\nconst pdData      = $('Pipedrive — Fetch Sales Pipeline').item.json;\nconst pdDeals     = pdData?.data || [];\nconst dealsWon    = pdDeals.filter(d => d.status === 'won').length;\nconst dealsLost   = pdDeals.filter(d => d.status === 'lost').length;\nconst pdPipeValue = pdDeals.reduce((sum, d) => sum + (d.value || 0), 0);\n\n// Format helpers\nconst fmtCurrency = n => '$' + n.toLocaleString('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 0 });\n\nreturn [{\n  json: {\n    ...dateCtx,\n    metrics: {\n      hubspot: {\n        new_leads:      newLeads,\n        open_deals:     openDeals,\n        pipeline_value: fmtCurrency(pipelineValue)\n      },\n      zendesk: {\n        tickets_today: ticketsToday,\n        open_tickets:  openTickets\n      },\n      pipedrive: {\n        deals_won:      dealsWon,\n        deals_lost:     dealsLost,\n        pipeline_value: fmtCurrency(pdPipeValue)\n      }\n    },\n    rawPipelineValue: pipelineValue,\n    rawPdPipeValue: pdPipeValue\n  }\n}];"},"typeVersion":2},{"id":"6a413cfc-4fad-487b-894d-9f9e9abe63c0","name":"Confluence — Read Yesterday's Briefing Page","type":"n8n-nodes-base.httpRequest","position":[2160,544],"parameters":{"url":"=https://YOUR_CONFLUENCE_DOMAIN.atlassian.net/wiki/rest/api/content","options":{"timeout":10000},"sendQuery":true,"sendHeaders":true,"queryParameters":{"parameters":[{"name":"title","value":"=Daily Briefing {{ $('Code — Weekday Guard & Date Context').item.json.yesterdayISO }}"},{"name":"spaceKey","value":"=YOUR_CONFLUENCE_SPACE_KEY"},{"name":"expand","value":"body.storage"}]},"headerParameters":{"parameters":[{"name":"Authorization","value":"=Basic {{ Buffer.from('YOUR_CONFLUENCE_EMAIL:YOUR_CONFLUENCE_API_TOKEN').toString('base64') }}"},{"name":"Accept","value":"application/json"}]}},"typeVersion":4.2},{"id":"f38bc03b-f4f3-4fe4-a935-c3adf69f8c21","name":"Code — Enrich Metrics with Delta vs Yesterday","type":"n8n-nodes-base.code","position":[2384,544],"parameters":{"jsCode":"const confResp  = $input.first().json;\nconst metricsData = $('Code — Compile All CRM Metrics').item.json;\n\n// Try to extract yesterday's numbers from Confluence page body\nlet yesterdayMetrics = { new_leads: 0, open_deals: 0, tickets_today: 0, deals_won: 0 };\n\ntry {\n  const bodyHtml = confResp?.results?.[0]?.body?.storage?.value || '';\n  // Parse key numbers with regex on the stored HTML\n  const extractNum = (html, label) => {\n    const rx = new RegExp(`${label}[^\\\\d]*(\\\\d+)`, 'i');\n    const m  = html.match(rx);\n    return m ? parseInt(m[1]) : 0;\n  };\n  yesterdayMetrics.new_leads    = extractNum(bodyHtml, 'New Leads');\n  yesterdayMetrics.open_deals   = extractNum(bodyHtml, 'Open Deals');\n  yesterdayMetrics.tickets_today = extractNum(bodyHtml, 'Tickets');\n  yesterdayMetrics.deals_won    = extractNum(bodyHtml, 'Deals Won');\n} catch(e) {\n  // No yesterday page — deltas will show as N/A\n}\n\nconst m = metricsData.metrics;\nconst delta = (today, yest) => {\n  if (!yest) return '';\n  const diff = today - yest;\n  return diff > 0 ? ` (▲${diff} vs yesterday)` : diff < 0 ? ` (▼${Math.abs(diff)} vs yesterday)` : ' (no change)';\n};\n\nconst metricsNarrative = [\n  `New Leads: ${m.hubspot.new_leads}${delta(m.hubspot.new_leads, yesterdayMetrics.new_leads)}`,\n  `Open Deals: ${m.hubspot.open_deals} worth ${m.hubspot.pipeline_value}`,\n  `Support Tickets Today: ${m.zendesk.tickets_today}${delta(m.zendesk.tickets_today, yesterdayMetrics.tickets_today)}, Open: ${m.zendesk.open_tickets}`,\n  `Sales — Won: ${m.pipedrive.deals_won}${delta(m.pipedrive.deals_won, yesterdayMetrics.deals_won)}, Lost: ${m.pipedrive.deals_lost}, Pipeline: ${m.pipedrive.pipeline_value}`\n].join('\\n');\n\nreturn [{\n  json: {\n    ...metricsData,\n    yesterdayMetrics,\n    metricsNarrative\n  }\n}];"},"typeVersion":2},{"id":"73d9968f-243f-48bf-a17a-dd1752df8b47","name":"OpenAI Assistants — Create Thread","type":"n8n-nodes-base.httpRequest","position":[2608,544],"parameters":{"url":"https://api.openai.com/v1/threads","method":"POST","options":{"timeout":20000},"jsonBody":"={\n  \"messages\": [{\n    \"role\": \"user\",\n    \"content\": \"Generate today's business briefing podcast script.\\n\\nDate: {{ $json.todayLabel }}\\nWeek: {{ $json.weekNumber }}\\n\\nMetrics:\\n{{ $json.metricsNarrative }}\\n\\nWrite a warm, professional 90-120 second spoken audio script. Open with a greeting and today's date. Walk through each metric naturally with brief commentary on trends. Close with a motivational one-liner. No bullet points, no markdown, no headers — pure spoken prose only.\"\n  }]\n}","sendBody":true,"sendHeaders":true,"specifyBody":"json","headerParameters":{"parameters":[{"name":"Authorization","value":"=Bearer YOUR_OPENAI_API_KEY"},{"name":"Content-Type","value":"application/json"},{"name":"OpenAI-Beta","value":"assistants=v2"}]}},"typeVersion":4.2},{"id":"b1f221e2-b0c2-4d79-b394-2d7625041fab","name":"OpenAI Assistants — Run Thread","type":"n8n-nodes-base.httpRequest","position":[2832,544],"parameters":{"url":"=https://api.openai.com/v1/threads/{{ $json.id }}/runs","method":"POST","options":{"timeout":20000},"jsonBody":"={\n  \"assistant_id\": \"YOUR_OPENAI_ASSISTANT_ID\",\n  \"instructions\": \"Generate a concise, engaging daily business podcast briefing. Tone: professional but warm. Duration when read aloud: 90-120 seconds. No lists or formatting — pure spoken prose.\"\n}","sendBody":true,"sendHeaders":true,"specifyBody":"json","headerParameters":{"parameters":[{"name":"Authorization","value":"=Bearer YOUR_OPENAI_API_KEY"},{"name":"Content-Type","value":"application/json"},{"name":"OpenAI-Beta","value":"assistants=v2"}]}},"typeVersion":4.2},{"id":"2c8c6379-57cb-4187-b940-ded0d5b0ce7c","name":"Code — Poll Run & Extract Briefing Script","type":"n8n-nodes-base.code","position":[3040,544],"parameters":{"jsCode":"// Poll the run until status is 'completed'\n// n8n doesn't have a native poll node — we use a wait-and-retry pattern in code\nconst runId      = $input.first().json.id;\nconst threadId   = $input.first().json.thread_id;\nconst apiKey     = 'YOUR_OPENAI_API_KEY';\n\nconst maxAttempts = 20;\nconst delayMs     = 3000;\n\nconst sleep = ms => new Promise(r => setTimeout(r, ms));\n\nlet status = 'queued';\nlet runData = {};\nlet attempts = 0;\n\nwhile (status !== 'completed' && status !== 'failed' && attempts < maxAttempts) {\n  await sleep(delayMs);\n  const resp = await fetch(\n    `https://api.openai.com/v1/threads/${threadId}/runs/${runId}`,\n    {\n      headers: {\n        'Authorization': `Bearer ${apiKey}`,\n        'OpenAI-Beta': 'assistants=v2'\n      }\n    }\n  );\n  runData = await resp.json();\n  status  = runData.status;\n  attempts++;\n}\n\nif (status !== 'completed') {\n  throw new Error(`OpenAI run did not complete. Final status: ${status}`);\n}\n\n// Fetch messages\nconst msgResp = await fetch(\n  `https://api.openai.com/v1/threads/${threadId}/messages`,\n  {\n    headers: {\n      'Authorization': `Bearer ${apiKey}`,\n      'OpenAI-Beta': 'assistants=v2'\n    }\n  }\n);\nconst msgData = await msgResp.json();\n\nconst assistantMsg = (msgData.data || []).find(m => m.role === 'assistant');\nconst script = assistantMsg?.content?.[0]?.text?.value || '';\n\nif (!script) throw new Error('No script returned from OpenAI Assistant');\n\nconst prevData = $('Code — Enrich Metrics with Delta vs Yesterday').item.json;\n\nreturn [{ json: { ...prevData, briefingScript: script, threadId, runId } }];"},"typeVersion":2},{"id":"758e5b07-2c9b-4dec-ace2-55d735ae10cb","name":"Azure TTS — Synthesize Briefing to MP3","type":"n8n-nodes-base.httpRequest","position":[3264,544],"parameters":{"url":"=https://YOUR_AZURE_REGION.tts.speech.microsoft.com/cognitiveservices/v1","body":"=<speak version='1.0' xml:lang='en-US'>\n  <voice xml:lang='en-US' xml:gender='Male' name='en-US-GuyNeural'>\n    <prosody rate='0.95' pitch='0st'>\n      {{ $json.briefingScript }}\n    </prosody>\n  </voice>\n</speak>","method":"POST","options":{"timeout":45000,"response":{"response":{"responseFormat":"file"}}},"sendBody":true,"sendHeaders":true,"specifyBody":"string","headerParameters":{"parameters":[{"name":"Ocp-Apim-Subscription-Key","value":"=YOUR_AZURE_SPEECH_KEY"},{"name":"Content-Type","value":"application/ssml+xml"},{"name":"X-Microsoft-OutputFormat","value":"audio-48khz-192kbitrate-mono-mp3"},{"name":"User-Agent","value":"n8n-daily-briefing"}]}},"typeVersion":4.2},{"id":"4b37380b-5480-4ee1-8df7-4bdf590d7612","name":"Code — Wrap Azure Binary for Upload","type":"n8n-nodes-base.code","position":[3488,544],"parameters":{"jsCode":"// Azure returns raw binary — wrap it properly for UploadToURL\nconst allData = $('Code — Poll Run & Extract Briefing Script').item.json;\nconst todayISO = allData.todayISO || new Date().toISOString().split('T')[0];\n\nreturn [{\n  json:   { ...allData },\n  binary: {\n    data: {\n      data:          $input.first().binary?.data?.data,\n      mimeType:      'audio/mpeg',\n      fileName:      `daily-briefing-${todayISO}.mp3`,\n      fileExtension: 'mp3'\n    }\n  }\n}];"},"typeVersion":2},{"id":"4c018016-b7d2-4c2b-8a9a-83ca0ded3312","name":"Code — Store Briefing Audio URL","type":"n8n-nodes-base.code","position":[3920,544],"parameters":{"jsCode":"const uploadResp = $input.first().json;\nconst briefData  = $('Code — Poll Run & Extract Briefing Script').item.json;\n\nconst audioUrl =\n  uploadResp?.url ??\n  uploadResp?.data?.url ??\n  uploadResp?.file?.url ??\n  uploadResp?.link ?? '';\n\nif (!audioUrl) throw new Error('UploadToURL returned no URL for briefing audio');\n\nreturn [{ json: { ...briefData, audioUrl } }];"},"typeVersion":2},{"id":"fd1c1ae5-7e59-4d87-82c7-749e178a6936","name":"Discord — Post Briefing to Team Server","type":"n8n-nodes-base.httpRequest","position":[4144,352],"parameters":{"url":"=YOUR_DISCORD_WEBHOOK_URL","method":"POST","options":{"timeout":10000},"jsonBody":"={\n  \"username\": \"Business Briefing Bot\",\n  \"avatar_url\": \"https://i.imgur.com/your-bot-avatar.png\",\n  \"embeds\": [{\n    \"title\": \"📊 Daily Business Briefing — {{ $json.todayLabel }}\",\n    \"description\": \"Your morning metrics summary is ready. Click below to listen.\",\n    \"color\": 5793266,\n    \"fields\": [\n      { \"name\": \"🧲 New Leads\",      \"value\": \"{{ $json.metrics.hubspot.new_leads }}\",       \"inline\": true },\n      { \"name\": \"💼 Open Deals\",     \"value\": \"{{ $json.metrics.hubspot.open_deals }}\",      \"inline\": true },\n      { \"name\": \"💰 Pipeline\",       \"value\": \"{{ $json.metrics.hubspot.pipeline_value }}\",  \"inline\": true },\n      { \"name\": \"🎫 Tickets Today\",  \"value\": \"{{ $json.metrics.zendesk.tickets_today }}\",   \"inline\": true },\n      { \"name\": \"🔓 Open Tickets\",   \"value\": \"{{ $json.metrics.zendesk.open_tickets }}\",    \"inline\": true },\n      { \"name\": \"✅ Deals Won\",      \"value\": \"{{ $json.metrics.pipedrive.deals_won }}\",      \"inline\": true }\n    ],\n    \"footer\": { \"text\": \"Week {{ $json.weekNumber }} · Generated by n8n\" },\n    \"timestamp\": \"{{ $json.generatedAt }}\"\n  }],\n  \"components\": [{\n    \"type\": 1,\n    \"components\": [{\n      \"type\": 2,\n      \"style\": 5,\n      \"label\": \"▶ Listen to Briefing\",\n      \"url\": \"{{ $json.audioUrl }}\"\n    }]\n  }]\n}","sendBody":true,"sendHeaders":true,"specifyBody":"json","headerParameters":{"parameters":[{"name":"Content-Type","value":"application/json"}]}},"typeVersion":4.2},{"id":"dd9e021f-946a-4cda-953d-b2bcce8f5d42","name":"Twilio — SMS Briefing to Leadership Team","type":"n8n-nodes-base.code","position":[4144,544],"parameters":{"jsCode":"// Send SMS to each leadership number via Twilio\nconst data    = $('Code — Store Briefing Audio URL').item.json;\nconst m       = data.metrics;\n\nconst TO_NUMBERS = [\n  '+1XXXXXXXXXX',\n  '+1XXXXXXXXXX'\n];\n\nconst msgBody = [\n  `📊 Daily Briefing — ${data.todayLabel}`,\n  `Leads: ${m.hubspot.new_leads} | Deals: ${m.hubspot.open_deals} (${m.hubspot.pipeline_value})`,\n  `Tickets: ${m.zendesk.tickets_today} open | Won: ${m.pipedrive.deals_won}`,\n  `🎧 Listen: ${data.audioUrl}`\n].join('\\n');\n\nconst accountSid = 'YOUR_TWILIO_ACCOUNT_SID';\nconst authToken  = 'YOUR_TWILIO_AUTH_TOKEN';\nconst fromNumber = 'YOUR_TWILIO_FROM_NUMBER';\nconst basicAuth  = Buffer.from(`${accountSid}:${authToken}`).toString('base64');\n\nconst results = [];\nfor (const toNumber of TO_NUMBERS) {\n  const resp = await fetch(\n    `https://api.twilio.com/2010-04-01/Accounts/${accountSid}/Messages.json`,\n    {\n      method: 'POST',\n      headers: {\n        'Authorization': `Basic ${basicAuth}`,\n        'Content-Type': 'application/x-www-form-urlencoded'\n      },\n      body: new URLSearchParams({ To: toNumber, From: fromNumber, Body: msgBody }).toString()\n    }\n  );\n  const r = await resp.json();\n  results.push({ to: toNumber, sid: r.sid, status: r.status });\n}\n\nreturn [{ json: { ...data, twilioResults: results } }];"},"typeVersion":2},{"id":"e7b3dd65-3e89-438c-9ec5-f04f2b7073b1","name":"Confluence — Create Today's Briefing Page","type":"n8n-nodes-base.httpRequest","position":[4144,752],"parameters":{"url":"=https://YOUR_CONFLUENCE_DOMAIN.atlassian.net/wiki/rest/api/content","method":"POST","options":{"timeout":15000},"jsonBody":"={\n  \"type\": \"page\",\n  \"title\": \"Daily Briefing {{ $json.todayISO }}\",\n  \"space\": { \"key\": \"YOUR_CONFLUENCE_SPACE_KEY\" },\n  \"body\": {\n    \"storage\": {\n      \"value\": \"<h1>📊 Daily Business Briefing — {{ $json.todayLabel }}</h1><p><strong>Week {{ $json.weekNumber }}</strong></p><h2>🎧 Audio Briefing</h2><p><a href='{{ $json.audioUrl }}'>▶ Listen to today's briefing (MP3)</a></p><audio controls style='width:100%'><source src='{{ $json.audioUrl }}' type='audio/mpeg' /></audio><h2>📈 Key Metrics</h2><table><tbody><tr><th>Source</th><th>Metric</th><th>Value</th></tr><tr><td>HubSpot</td><td>New Leads</td><td>{{ $json.metrics.hubspot.new_leads }}</td></tr><tr><td>HubSpot</td><td>Open Deals</td><td>{{ $json.metrics.hubspot.open_deals }}</td></tr><tr><td>HubSpot</td><td>Pipeline Value</td><td>{{ $json.metrics.hubspot.pipeline_value }}</td></tr><tr><td>Zendesk</td><td>Tickets Today</td><td>{{ $json.metrics.zendesk.tickets_today }}</td></tr><tr><td>Zendesk</td><td>Open Tickets</td><td>{{ $json.metrics.zendesk.open_tickets }}</td></tr><tr><td>Pipedrive</td><td>Deals Won</td><td>{{ $json.metrics.pipedrive.deals_won }}</td></tr><tr><td>Pipedrive</td><td>Deals Lost</td><td>{{ $json.metrics.pipedrive.deals_lost }}</td></tr><tr><td>Pipedrive</td><td>Pipeline Value</td><td>{{ $json.metrics.pipedrive.pipeline_value }}</td></tr></tbody></table><h2>📝 Full Script</h2><p>{{ $json.briefingScript }}</p>\",\n      \"representation\": \"storage\"\n    }\n  }\n}","sendBody":true,"sendHeaders":true,"specifyBody":"json","headerParameters":{"parameters":[{"name":"Authorization","value":"=Basic {{ Buffer.from('YOUR_CONFLUENCE_EMAIL:YOUR_CONFLUENCE_API_TOKEN').toString('base64') }}"},{"name":"Content-Type","value":"application/json"},{"name":"Accept","value":"application/json"}]}},"typeVersion":4.2},{"id":"c5dfdade-084f-4793-b687-1d8ee375a0b1","name":"Merge — Collect All Distribution Results","type":"n8n-nodes-base.merge","position":[4368,544],"parameters":{"mode":"mergeByIndex"},"typeVersion":3},{"id":"b1d2144a-e78d-46a6-9b4b-23fab86fca06","name":"Code — Final Execution Report","type":"n8n-nodes-base.code","position":[4592,544],"parameters":{"jsCode":"const briefData = $('Code — Store Briefing Audio URL').item.json;\n\nconst report = {\n  date:           briefData.todayISO,\n  dateLabel:      briefData.todayLabel,\n  weekNumber:     briefData.weekNumber,\n  audioUrl:       briefData.audioUrl,\n  generatedAt:    briefData.generatedAt,\n  metricsSnapshot: briefData.metrics,\n  distribution: {\n    discord:    'posted',\n    twilio_sms: 'sent',\n    confluence: 'page_created'\n  },\n  scriptLength:   briefData.briefingScript?.length ?? 0,\n  status:         'success'\n};\n\nconsole.log('✅ Daily Briefing complete:', JSON.stringify(report, null, 2));\nreturn [{ json: report }];"},"typeVersion":2},{"id":"8c2d22e2-96c5-4cae-bded-066804813fa8","name":"Upload a File","type":"n8n-nodes-uploadtourl.uploadToUrl","position":[3696,544],"parameters":{},"credentials":{"uploadToUrlApi":{"id":"NZ1TNlb5Vjt2d9dg","name":"uploadtourl - Deepanshi"}},"typeVersion":1}],"pinData":{},"connections":{"Upload a File":{"main":[[{"node":"Code — Store Briefing Audio URL","type":"main","index":0}]]},"Cron — 7:30 AM Daily Trigger":{"main":[[{"node":"Code — Weekday Guard & Date Context","type":"main","index":0}]]},"Code — Compile All CRM Metrics":{"main":[[{"node":"Confluence — Read Yesterday's Briefing Page","type":"main","index":0}]]},"OpenAI Assistants — Run Thread":{"main":[[{"node":"Code — Poll Run & Extract Briefing Script","type":"main","index":0}]]},"Code — Store Briefing Audio URL":{"main":[[{"node":"Discord — Post Briefing to Team Server","type":"main","index":0},{"node":"Twilio — SMS Briefing to Leadership Team","type":"main","index":0},{"node":"Confluence — Create Today's Briefing Page","type":"main","index":0}]]},"HubSpot — Fetch Today's New Leads":{"main":[[{"node":"Merge — Wait for All 3 CRM Branches","type":"main","index":0}]]},"OpenAI Assistants — Create Thread":{"main":[[{"node":"OpenAI Assistants — Run Thread","type":"main","index":0}]]},"Code — Weekday Guard & Date Context":{"main":[[{"node":"HubSpot — Fetch Today's New Leads","type":"main","index":0},{"node":"HubSpot — Fetch Open Deals Pipeline","type":"main","index":0},{"node":"Zendesk — Fetch Today's Support Tickets","type":"main","index":0},{"node":"Pipedrive — Fetch Sales Pipeline","type":"main","index":0}]]},"Code — Wrap Azure Binary for Upload":{"main":[[{"node":"Upload a File","type":"main","index":0}]]},"HubSpot — Fetch Open Deals Pipeline":{"main":[[{"node":"Merge — Wait for All 3 CRM Branches","type":"main","index":1}]]},"Merge — Wait for All 3 CRM Branches":{"main":[[{"node":"Code — Compile All CRM Metrics","type":"main","index":0}]]},"Azure TTS — Synthesize Briefing to MP3":{"main":[[{"node":"Code — Wrap Azure Binary for Upload","type":"main","index":0}]]},"Discord — Post Briefing to Team Server":{"main":[[{"node":"Merge — Collect All Distribution Results","type":"main","index":0}]]},"Merge — Collect All Distribution Results":{"main":[[{"node":"Code — Final Execution Report","type":"main","index":0}]]},"Twilio — SMS Briefing to Leadership Team":{"main":[[{"node":"Merge — Collect All Distribution Results","type":"main","index":1}]]},"Code — Poll Run & Extract Briefing Script":{"main":[[{"node":"Azure TTS — Synthesize Briefing to MP3","type":"main","index":0}]]},"Confluence — Read Yesterday's Briefing Page":{"main":[[{"node":"Code — Enrich Metrics with Delta vs Yesterday","type":"main","index":0}]]},"Code — Enrich Metrics with Delta vs Yesterday":{"main":[[{"node":"OpenAI Assistants — Create Thread","type":"main","index":0}]]}}},"lastUpdatedBy":1,"workflowInfo":{"nodeCount":28,"nodeTypes":{"n8n-nodes-base.code":{"count":8},"n8n-nodes-base.merge":{"count":2},"n8n-nodes-base.stickyNote":{"count":6},"n8n-nodes-base.httpRequest":{"count":10},"n8n-nodes-base.scheduleTrigger":{"count":1},"n8n-nodes-uploadtourl.uploadToUrl":{"count":1}}},"status":"published","readyToDemo":null,"user":{"name":"Jitesh Dugar","username":"jiteshdugar","bio":"AI Automation Specialist - OpenAI, CRM & Automation Expert with a solid understanding of various tools that include Zapier, Make, Zoho CRM, Hubspot, Google Sheets, Airtable, Pipedrive, Google Analytics, and more.","verified":true,"links":["https://www.linkedin.com/in/jiteshdugar"],"avatar":"https://gravatar.com/avatar/edaa3abb99806b0586dced559d0a5417f24a507e7c4464a63960f0638a4b1b90?r=pg&d=retro&size=200"},"nodes":[{"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":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"}]}],"categories":[{"id":31,"name":"Content Creation"},{"id":51,"name":"Multimodal AI"}],"image":[]}}