{"workflow":{"id":12714,"name":"Curate and send weekly AI newsletters with Tavily, Gemini, and Gmail","views":105,"recentViews":0,"totalViews":105,"createdAt":"2026-01-14T18:22:16.694Z","description":" ## What this workflow does\n\n  Automatically curates and sends a weekly newsletter by combining your internal blog posts with external news. The workflow researches your topic using Tavily, has Gemini write professional newsletter content, and delivers a beautifully formatted HTML email via Gmail.\n\n  ## How it works\n\n  1. **Weekly Trigger** - Runs on a configurable schedule (default: every 7 days at 9:30 AM)\n  2. **Dual Research** - Tavily searches your company blog for internal updates AND external sources for market news in parallel\n  3. **AI Writing** - Gemini generates a complete newsletter with warm intro, product updates section, and curated news\n  4. **Email Assembly** - Merges AI content with a professional HTML template\n  5. **Delivery** - Gmail sends the formatted newsletter to your subscribers\n\n  ## Setup steps\n\n  1. Open the **Set newsletter config** node to customize:\n     - Topic (what Tavily searches for)\n     - Newsletter name, author, email title\n     - Logo URL, blog URL, subscribe URL\n  2. Add your **Tavily API** credentials (get a key at tavily.com)\n  3. Add your **Google Gemini API** credentials\n  4. Add your **Gmail OAuth** credentials\n  5. Update the recipient email in the **Send newsletter** node\n  6. Test with manual execution before enabling the schedule\n\n  ## API keys required\n\n  | Service | Purpose | Cost |\n  |---------|---------|------|\n  | Tavily | Web search for blog + news | Free tier available |\n  | Google Gemini | Newsletter writing | Free tier available |\n  | Gmail | Email delivery | Free |\n\n","workflow":{"id":"X4idZqm7o2a1BYH_6hM_d","meta":{"instanceId":"3029945ca1a614a45f2f8c21dd75a6c031ae8ec72000e574e413eddf72e92b9b","templateCredsSetupCompleted":true},"name":"Curate and send AI newsletters with Tavily and Gemini","tags":[],"nodes":[{"id":"016c5451-563a-477e-8e22-b9d99e660ca5","name":"Weekly schedule trigger","type":"n8n-nodes-base.scheduleTrigger","position":[1680,624],"parameters":{"rule":{"interval":[{"daysInterval":7,"triggerAtHour":9,"triggerAtMinute":30}]}},"typeVersion":1.3},{"id":"e2e4c91f-492d-41f0-9780-6004205ea4fe","name":"Set newsletter config","type":"n8n-nodes-base.set","position":[1888,624],"parameters":{"options":{},"assignments":{"assignments":[{"id":"60bd8e76-aad8-46ad-9e4a-499ea78b75aa","name":"topic","type":"string","value":"AI Sales Agents"},{"id":"dfa69b2c-2ff1-4a29-9dff-535630af7aa6","name":"company_blog_url","type":"string","value":"https://aisalesagenthq.scoot.app/"},{"id":"e1618443-25be-4035-a588-358a87d0d499","name":"logo_url","type":"string","value":"https://aisalesagenthq.scoot.app/content/images/size/w256h256/2025/10/Preciate-AppIcon-256x256.png"},{"id":"d21e1fd4-0826-403b-b893-5ba443c04b5c","name":"subscribe_url","type":"string","value":"https://aisalesagenthq.scoot.app/"},{"id":"62741640-54c4-4a87-8499-cd0482b75f56","name":"newsletter_name","type":"string","value":"AI Sales Agent HQ"},{"id":"7ba3ed5d-e943-4ace-97ed-313e0909ef58","name":"author_name","type":"string","value":"The AI Team"},{"id":"9b6e6400-3061-44f3-9d2b-501520c9e2ce","name":"email_title","type":"string","value":"Weekly Update: AI Sales Agents"},{"id":"ffeac650-26a9-4887-99c6-64d224c83259","name":"header_internal","type":"string","value":"New this Week from AI Sales Agent HQ"},{"id":"ef1783d7-7427-4185-9c61-1d9baa65123c","name":"header_external","type":"string","value":"AI News"}]}},"typeVersion":3.4},{"id":"030cd0b3-9f5e-4c75-a489-b76f75bc097b","name":"Generate newsletter content","type":"@n8n/n8n-nodes-langchain.agent","position":[3520,624],"parameters":{"text":"=Raw Search Data: {{ JSON.stringify($('Aggregate all articles').first().json.research_data) }}\n\nTask: I have provided a list of search results.\n\nIdentify Internal Updates: Look for results from the domain {{ $('Set newsletter config').item.json.company_blog_url }}. Summarize these into the product_section JSON field.\n\nIdentify Market News: Look for all other results (NOT from that domain). Summarize these into the news_section JSON field.\"","options":{"systemMessage":"=You are the editor of '{{ $('Set newsletter config').item.json.newsletter_name }}'. You write in a professional, narrative style.\n\n**Output Format:**\nReturn a SINGLE valid JSON object. Do not wrap in markdown.\n\n**1. intro_text**\nA warm, 2-paragraph introduction. Wrap each paragraph in <p> tags.\n\n**2. product_section**\nA HTML string containing your internal updates.\n- Start with the header: <h3>{{ $('Set newsletter config').item.json.header_internal }}</h3>\n- If internal updates are found, format them as a numbered list:\n  <h4>1. [Product Name]</h4>\n  <p>[Description]</p>\n  <p><strong>Why it matters:</strong> [Benefit]</p>\n- If NO internal updates are found, return an empty string \"\".\n\n**3. news_section**\nA HTML string containing market news.\n- Start with the header: <h3>{{ $('Set newsletter config').item.json.header_external }}</h3>\n- List 3-4 key stories using a clean unordered list:\n  <ul>\n    <li><strong>[Headline]:</strong> [Summary].</li>\n  </ul>"},"promptType":"define"},"typeVersion":3.1},{"id":"1ea0bd18-8885-4812-b389-63e0bf557c7e","name":"Send newsletter (Gmail)","type":"n8n-nodes-base.gmail","position":[4144,624],"webhookId":"ef053511-6073-47ae-a74a-6ea4fd22dcf2","parameters":{"sendTo":"user@example.com","message":"={{ $json.html_email }}","options":{},"subject":"=Weekly AI Update:  {{ $('Set newsletter config').item.json.topic }}"},"credentials":{"gmailOAuth2":{"id":"credential-id","name":"Daniel Gmail account"}},"typeVersion":2.2},{"id":"fae4711b-db62-4865-a3b3-7de0c80a62a4","name":"Load email template","type":"n8n-nodes-base.code","position":[3264,624],"parameters":{"jsCode":"// 1. GET TEMPLATE\nconst template = `\n<!doctype html>\n<html>\n<head>\n  <meta name=\"viewport\" content=\"width=device-width\">\n  <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n  <style>\n    body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; background-color: #ffffff; color: #15212A; line-height: 1.6; margin: 0; padding: 0; }\n    .main-container { max-width: 600px; margin: 0 auto; padding: 20px; }\n    .header { text-align: center; padding-bottom: 30px; }\n    .site-title { color: #15212A; font-weight: 700; text-transform: uppercase; font-size: 16px; text-decoration: none; letter-spacing: -0.1px; }\n    .post-title { font-size: 32px; line-height: 1.2; font-weight: 700; color: #000000; margin-top: 10px; margin-bottom: 10px; text-align: center; }\n    .meta { color: rgba(0, 0, 0, 0.6); font-size: 13px; text-align: center; margin-bottom: 40px; }\n    .content { font-size: 17px; color: #15212A; }\n    .content p { margin: 0 0 1.5em 0; }\n    .content a { color: #0c58c6; text-decoration: underline; }\n    .content h3 { font-size: 24px; font-weight: 700; margin-top: 40px; margin-bottom: 20px; color: #15212A; }\n    .content h4 { font-size: 18px; font-weight: 700; margin-top: 25px; margin-bottom: 10px; color: #15212A; }\n    .content ul { padding-left: 20px; margin-bottom: 1.5em; }\n    .content li { margin-bottom: 10px; }\n    .btn { display: inline-block; background-color: #0c58c6; color: #ffffff; padding: 12px 24px; border-radius: 6px; text-decoration: none; font-weight: 600; font-size: 16px; margin-top: 20px; }\n    .footer { text-align: center; font-size: 13px; color: rgba(0, 0, 0, 0.6); margin-top: 60px; border-top: 1px solid #e0e7eb; padding-top: 30px; }\n  </style>\n</head>\n<body>\n  <div class=\"main-container\">\n    <div class=\"header\">\n      <img src=\"{{LOGO_URL}}\" width=\"48\" style=\"width: 48px; max-width: 48px; height: auto; border-radius: 4px; margin-bottom: 12px; display: block; margin-left: auto; margin-right: auto;\">\n      <br>\n      <a href=\"#\" class=\"site-title\">{{NEWSLETTER_NAME}}</a>\n      \n      <div class=\"post-title\">{{EMAIL_TITLE}}</div>\n      \n      <div class=\"meta\">By {{AUTHOR}} • {{DATE}}</div>\n    </div>\n    <div class=\"content\">\n      {{INTRO_TEXT}}\n      <hr style=\"border: 0; border-top: 1px solid #e0e7eb; margin: 40px 0;\">\n      {{PRODUCT_SECTION}}\n      {{NEWS_SECTION}}\n      <div style=\"text-align: center; margin-top: 50px; margin-bottom: 30px;\">\n        <a href=\"{{SUBSCRIBE_URL}}\" class=\"btn\" style=\"color: #ffffff !important; text-decoration: none;\">Subscribe</a>\n      </div>\n    </div>\n    <div class=\"footer\">\n      <p>{{NEWSLETTER_NAME}} © 2026</p>\n      <p><a href=\"#\" style=\"color: inherit; text-decoration: underline;\">Unsubscribe</a></p>\n    </div>\n  </div>\n</body>\n</html>\n`;\n\n// 2. PASS THE TEMPLATE\nreturn [{ json: { html_template: template } }];"},"typeVersion":2},{"id":"c421ab4e-b401-4430-ae32-d6eb84ae32c5","name":"Build final email","type":"n8n-nodes-base.code","position":[3872,624],"parameters":{"jsCode":"// 1. GET TEMPLATE & CONFIG\nconst template = $('Load email template').first().json.html_template;\nconst config = $('Set newsletter config').first().json;\n\n// 2. CLEAN AI OUTPUT\nlet aiRaw = $('Generate newsletter content').first().json.output;\nif (typeof aiRaw === 'string') {\n    aiRaw = aiRaw.replace(/```json/g, '').replace(/```/g, '').trim();\n}\n\nlet aiData;\ntry {\n    aiData = typeof aiRaw === 'object' ? aiRaw : JSON.parse(aiRaw);\n} catch (e) {\n    aiData = { \n        intro_text: \"<p>Here is your weekly update.</p>\", \n        product_section: \"\",\n        news_section: aiRaw \n    };\n}\n\n// 3. GET DATE\nconst today = new Date().toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' });\n\n// 4. MERGE VARIABLES (The Magic Step)\nlet finalEmail = template\n    .replace('{{LOGO_URL}}', config.logo_url)\n    .replace('{{SUBSCRIBE_URL}}', config.subscribe_url)\n    .replace('{{DATE}}', today)\n    \n    // NEW: Replace the 3 Text Fields\n    .replace(/{{NEWSLETTER_NAME}}/g, config.newsletter_name) // Global replace in header & footer\n    .replace('{{EMAIL_TITLE}}', config.email_title)\n    .replace('{{AUTHOR}}', config.author_name)\n    \n    // Content Sections\n    .replace('{{INTRO_TEXT}}', aiData.intro_text || \"\")\n    .replace('{{PRODUCT_SECTION}}', aiData.product_section || \"\") \n    .replace('{{NEWS_SECTION}}', aiData.news_section || \"\");\n\n// 5. OUTPUT\nreturn [{ json: { html_email: finalEmail } }];"},"typeVersion":2},{"id":"b00176eb-82f0-45e3-af6a-11226a14a12c","name":"Search company blog (Tavily)","type":"@tavily/n8n-nodes-tavily.tavily","position":[2224,768],"parameters":{"query":"=site:{{ $('Set newsletter config').item.json.company_blog_url }} \"news\" OR \"update\" OR \"launch\" OR \"release\" OR \"template\" OR \"New\"","options":{"days":7,"topic":"general","max_results":5,"search_depth":"advanced"}},"credentials":{"tavilyApi":{"id":"credential-id","name":"Tavily account"}},"typeVersion":1,"alwaysOutputData":true},{"id":"e51124a2-db62-4151-99d7-79387729c1ca","name":"Search external news (Tavily)","type":"@tavily/n8n-nodes-tavily.tavily","position":[2224,512],"parameters":{"query":"={{ $json.topic }}","options":{"days":7,"topic":"news","max_results":5,"search_depth":"advanced"}},"credentials":{"tavilyApi":{"id":"credential-id","name":"Tavily account"}},"typeVersion":1},{"id":"ac850d71-fe32-4c12-bc37-d28633304ff5","name":"Combine search results","type":"n8n-nodes-base.merge","position":[2736,624],"parameters":{"mode":"combine","options":{"includeUnpaired":false},"combineBy":"combineByPosition"},"typeVersion":3.2},{"id":"d6d88dc5-b524-4f33-9e5d-616ad729503a","name":"Aggregate all articles","type":"n8n-nodes-base.code","position":[2944,624],"parameters":{"jsCode":"// DIRECT ACCESS SCRIPT\n// This ignores the Merge/Rename nodes and grabs clean data directly from the source.\n\nlet allArticles = [];\n\n// 1. Grab Global News directly from the search node\ntry {\n    // We access the 'Search external news (Tavily)' node directly\n    const newsItems = $('Search external news (Tavily)').all();\n    \n    // Loop through results in case there are multiple items\n    for (const item of newsItems) {\n        if (item.json.results && Array.isArray(item.json.results)) {\n            allArticles = allArticles.concat(item.json.results);\n        }\n    }\n} catch (error) {\n    // If the node didn't run, just skip it\n    console.log(\"News search data not found\");\n}\n\n// 2. Grab Internal Blog Posts directly from the search node\ntry {\n    // We access the 'Search company blog (Tavily)' node directly\n    const blogItems = $('Search company blog (Tavily)').all();\n    \n    for (const item of blogItems) {\n        if (item.json.results && Array.isArray(item.json.results)) {\n            allArticles = allArticles.concat(item.json.results);\n        }\n    }\n} catch (error) {\n    // If the node didn't run, just skip it\n    console.log(\"Blog search data not found\");\n}\n\n// 3. Output the combined list\nreturn [{ json: { research_data: allArticles } }];"},"typeVersion":2},{"id":"fbc79854-e759-4886-9e0e-c3911d7aee4d","name":"Gemini 1.5 Flash","type":"@n8n/n8n-nodes-langchain.lmChatGoogleGemini","position":[3392,832],"parameters":{"options":{}},"credentials":{"googlePalmApi":{"id":"credential-id","name":"Google Gemini(PaLM) Api account"}},"typeVersion":1},{"id":"79cb9b73-39aa-4e3a-94c0-dd5890270186","name":"Extract news results","type":"n8n-nodes-base.set","position":[2448,512],"parameters":{"options":{},"assignments":{"assignments":[{"id":"3dd7c376-09e7-4729-ad71-ebcffc4b8e0e","name":"news_results","type":"string","value":"={{ $json.results }}"}]}},"typeVersion":3.4},{"id":"3af5b005-ad64-4742-8c28-68dbd07b62ac","name":"Extract blog results","type":"n8n-nodes-base.set","position":[2448,768],"parameters":{"options":{},"assignments":{"assignments":[{"id":"3dd7c376-09e7-4729-ad71-ebcffc4b8e0e","name":"blog_results","type":"string","value":"={{ $json.results }}"}]}},"typeVersion":3.4},{"id":"ff3e458e-8fe7-44c6-881e-f73c07200344","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[1184,448],"parameters":{"color":5,"width":400,"height":560,"content":"## How it works\nThis workflow automatically curates and sends a weekly AI newsletter by combining internal blog posts with external news.\n\n1. **Trigger** - Runs weekly on a schedule (configurable)\n2. **Research** - Tavily searches your company blog and external news for your topic\n3. **AI Writing** - Gemini generates a professional newsletter with intro, internal updates, and market news\n4. **Send** - Gmail delivers the formatted HTML email to your subscribers\n\n## Setup steps\n1. Open **Set newsletter config** node to customize: topic, newsletter name, logo URL, blog URL\n2. Add your **Tavily API** credentials (get key at tavily.com)\n3. Add your **Google Gemini API** credentials\n4. Add your **Gmail OAuth** credentials\n5. Update the recipient email in **Send newsletter** node\n6. Test with manual execution before enabling the schedule"},"typeVersion":1},{"id":"582729d7-79ae-424a-b802-23ff191cb9de","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[2176,400],"parameters":{"color":7,"width":480,"height":80,"content":"**Research Phase**\nSearches your blog and external news sources in parallel using Tavily"},"typeVersion":1},{"id":"5f3e80ea-6206-4127-989e-2520f4a08d10","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[3376,512],"parameters":{"color":7,"width":320,"height":80,"content":"**AI Generation**\nGemini writes the newsletter content in structured HTML format"},"typeVersion":1},{"id":"cf72ee23-9ebf-4b2c-81f5-82daa592c642","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[3776,512],"parameters":{"color":7,"width":400,"height":80,"content":"**Email Output**\nMerges AI content with HTML template and sends via Gmail"},"typeVersion":1}],"active":false,"pinData":{},"settings":{"availableInMCP":false,"executionOrder":"v1"},"versionId":"eba523d8-705d-470d-9c76-0180b11476c9","connections":{"Gemini 1.5 Flash":{"ai_languageModel":[[{"node":"Generate newsletter content","type":"ai_languageModel","index":0}]]},"Build final email":{"main":[[{"node":"Send newsletter (Gmail)","type":"main","index":0}]]},"Load email template":{"main":[[{"node":"Generate newsletter content","type":"main","index":0}]]},"Extract blog results":{"main":[[{"node":"Combine search results","type":"main","index":1}]]},"Extract news results":{"main":[[{"node":"Combine search results","type":"main","index":0}]]},"Set newsletter config":{"main":[[{"node":"Search external news (Tavily)","type":"main","index":0},{"node":"Search company blog (Tavily)","type":"main","index":0}]]},"Aggregate all articles":{"main":[[{"node":"Load email template","type":"main","index":0}]]},"Combine search results":{"main":[[{"node":"Aggregate all articles","type":"main","index":0}]]},"Weekly schedule trigger":{"main":[[{"node":"Set newsletter config","type":"main","index":0}]]},"Generate newsletter content":{"main":[[{"node":"Build final email","type":"main","index":0}]]},"Search company blog (Tavily)":{"main":[[{"node":"Extract blog results","type":"main","index":0}]]},"Search external news (Tavily)":{"main":[[{"node":"Extract news results","type":"main","index":0}]]}}},"lastUpdatedBy":1,"workflowInfo":{"nodeCount":17,"nodeTypes":{"n8n-nodes-base.set":{"count":3},"n8n-nodes-base.code":{"count":3},"n8n-nodes-base.gmail":{"count":1},"n8n-nodes-base.merge":{"count":1},"n8n-nodes-base.stickyNote":{"count":4},"@n8n/n8n-nodes-langchain.agent":{"count":1},"n8n-nodes-base.scheduleTrigger":{"count":1},"@tavily/n8n-nodes-tavily.tavily":{"count":2},"@n8n/n8n-nodes-langchain.lmChatGoogleGemini":{"count":1}}},"status":"published","readyToDemo":null,"user":{"name":"AI Sales Agent HQ","username":"daniellopezscoot","bio":"","verified":false,"links":["https://x.com/aisalesagenthq"],"avatar":"https://gravatar.com/avatar/3d5f97a3209d12207d5e0532e23819cf14372954b7130f49e20f116d06aefe4d?r=pg&d=retro&size=200"},"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":356,"icon":"file:gmail.svg","name":"n8n-nodes-base.gmail","codex":{"data":{"alias":["email","human","form","wait","hitl","approval"],"resources":{"generic":[{"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/supercharging-your-conference-registration-process-with-n8n/","icon":"🎫","label":"Supercharging your conference registration process with 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-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/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/your-business-doesnt-need-you-to-operate/","icon":" 🖥️","label":"Hey founders! Your business doesn't need you to operate"},{"url":"https://n8n.io/blog/using-automation-to-boost-productivity-in-the-workplace/","icon":"💪","label":"Using Automation to Boost Productivity in the Workplace"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.gmail/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"}]},"categories":["Communication","HITL"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"HITL":["Human in the Loop"]}}},"group":"[\"transform\"]","defaults":{"name":"Gmail"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNTYiIGhlaWdodD0iMTkzIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCI+PHBhdGggZmlsbD0iIzQyODVGNCIgZD0iTTU4LjE4MiAxOTIuMDVWOTMuMTRMMjcuNTA3IDY1LjA3NyAwIDQ5LjUwNHYxMjUuMDkxYzAgOS42NTggNy44MjUgMTcuNDU1IDE3LjQ1NSAxNy40NTV6Ii8+PHBhdGggZmlsbD0iIzM0QTg1MyIgZD0iTTE5Ny44MTggMTkyLjA1aDQwLjcyN2M5LjY1OSAwIDE3LjQ1NS03LjgyNiAxNy40NTUtMTcuNDU1VjQ5LjUwNWwtMzEuMTU2IDE3LjgzNy0yNy4wMjYgMjUuNzk4eiIvPjxwYXRoIGZpbGw9IiNFQTQzMzUiIGQ9Im01OC4xODIgOTMuMTQtNC4xNzQtMzguNjQ3IDQuMTc0LTM2Ljk4OUwxMjggNjkuODY4bDY5LjgxOC01Mi4zNjQgNC42NyAzNC45OTItNC42NyA0MC42NDRMMTI4IDE0NS41MDR6Ii8+PHBhdGggZmlsbD0iI0ZCQkMwNCIgZD0iTTE5Ny44MTggMTcuNTA0VjkzLjE0TDI1NiA0OS41MDRWMjYuMjMxYzAtMjEuNTg1LTI0LjY0LTMzLjg5LTQxLjg5LTIwLjk0NXoiLz48cGF0aCBmaWxsPSIjQzUyMjFGIiBkPSJtMCA0OS41MDQgMjYuNzU5IDIwLjA3TDU4LjE4MiA5My4xNFYxNy41MDRMNDEuODkgNS4yODZDMjQuNjEtNy42NiAwIDQuNjQ2IDAgMjYuMjN6Ii8+PC9zdmc+"},"displayName":"Gmail","typeVersion":2,"nodeCategories":[{"id":6,"name":"Communication"},{"id":28,"name":"HITL"}]},{"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":1119,"icon":"fa:robot","name":"@n8n/n8n-nodes-langchain.agent","codex":{"data":{"alias":["LangChain","Chat","Conversational","Plan and Execute","ReAct","Tools"],"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.agent/"}]},"categories":["AI","Langchain"],"subcategories":{"AI":["Agents","Root Nodes"]}}},"group":"[\"transform\"]","defaults":{"name":"AI Agent","color":"#404040"},"iconData":{"icon":"robot","type":"icon"},"displayName":"AI Agent","typeVersion":3,"nodeCategories":[{"id":25,"name":"AI"},{"id":26,"name":"Langchain"}]},{"id":1262,"icon":"file:google.svg","name":"@n8n/n8n-nodes-langchain.lmChatGoogleGemini","codex":{"data":{"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.lmchatgooglegemini/"}]},"categories":["AI","Langchain"],"subcategories":{"AI":["Language Models","Root Nodes"],"Language Models":["Chat Models (Recommended)"]}}},"group":"[\"transform\"]","defaults":{"name":"Google Gemini Chat Model"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgNDggNDgiPjxkZWZzPjxwYXRoIGlkPSJhIiBkPSJNNDQuNSAyMEgyNHY4LjVoMTEuOEMzNC43IDMzLjkgMzAuMSAzNyAyNCAzN2MtNy4yIDAtMTMtNS44LTEzLTEzczUuOC0xMyAxMy0xM2MzLjEgMCA1LjkgMS4xIDguMSAyLjlsNi40LTYuNEMzNC42IDQuMSAyOS42IDIgMjQgMiAxMS44IDIgMiAxMS44IDIgMjRzOS44IDIyIDIyIDIyYzExIDAgMjEtOCAyMS0yMiAwLTEuMy0uMi0yLjctLjUtNCIvPjwvZGVmcz48Y2xpcFBhdGggaWQ9ImIiPjx1c2UgeGxpbms6aHJlZj0iI2EiIG92ZXJmbG93PSJ2aXNpYmxlIi8+PC9jbGlwUGF0aD48cGF0aCBmaWxsPSIjRkJCQzA1IiBkPSJNMCAzN1YxMWwxNyAxM3oiIGNsaXAtcGF0aD0idXJsKCNiKSIvPjxwYXRoIGZpbGw9IiNFQTQzMzUiIGQ9Im0wIDExIDE3IDEzIDctNi4xTDQ4IDE0VjBIMHoiIGNsaXAtcGF0aD0idXJsKCNiKSIvPjxwYXRoIGZpbGw9IiMzNEE4NTMiIGQ9Im0wIDM3IDMwLTIzIDcuOSAxTDQ4IDB2NDhIMHoiIGNsaXAtcGF0aD0idXJsKCNiKSIvPjxwYXRoIGZpbGw9IiM0Mjg1RjQiIGQ9Ik00OCA0OCAxNyAyNGwtNC0zIDM1LTEweiIgY2xpcC1wYXRoPSJ1cmwoI2IpIi8+PC9zdmc+"},"displayName":"Google Gemini Chat Model","typeVersion":1,"nodeCategories":[{"id":25,"name":"AI"},{"id":26,"name":"Langchain"}]}],"categories":[{"id":33,"name":"Social Media"},{"id":51,"name":"Multimodal AI"}],"image":[]}}