{"workflow":{"id":12715,"name":"Generate AI sales proposals with Gemini and Google Docs","views":86,"recentViews":0,"totalViews":86,"createdAt":"2026-01-14T18:24:13.210Z","description":"**Generate professional sales proposals from a simple form—AI writes the content, you deliver the document.**\n\n  Fill out client details, pain points, and pricing, and this workflow creates a polished proposal with calculated ROI metrics, executive summary, solution strategy, and team bios.\n\n  ## How It Works\n\n  1. Sales rep submits a form with client name, industry, pain points, and pricing\n  2. Code node calculates ROI, net savings, and break-even period\n  3. Gemini AI generates proposal content: executive summary, key challenges, solution strategy, team bios, and call to action\n  4. Copies your Google Doc template and replaces all placeholders with generated content\n  5. Final proposal is ready in Google Drive\n\n  ## Setup\n\n  1. **Import** the workflow JSON\n  2. **Create a Google Doc template** with placeholders:\n     - `{{client_name}}`, `{{executive_summary}}`, `{{key_challenges}}`\n     - `{{solution_strategy}}`, `{{team_bios}}`, `{{next_steps}}`\n     - `{{formatted_roi}}`, `{{formatted_net_savings}}`, `{{formatted_break_even}}`\n     - `{{formatted_solution_cost}}`, `{{date}}`\n  3. **Add credentials:**\n     - Google Drive → OAuth2\n     - Google Docs → OAuth2\n     - Google Gemini → API key from [aistudio.google.com](https://aistudio.google.com)\n  4. **Configure \"Copy proposal template\" node** → Point to your template document\n  5. **Customize the AI** → Edit system message in \"Generate proposal content\" to match your tone\n  6. **Test** → Submit the form and check the generated proposal\n  7. **Activate**\n\n","workflow":{"id":"WNMNYGtBnhK3XivgdCN0w","meta":{"instanceId":"3029945ca1a614a45f2f8c21dd75a6c031ae8ec72000e574e413eddf72e92b9b","templateCredsSetupCompleted":true},"name":"Generate sales proposals with Gemini and Google Docs","tags":[{"id":"K6D3K6nP6k9TByzr","name":"sales-automation","createdAt":"2026-01-14T17:39:47.009Z","updatedAt":"2026-01-14T17:39:47.009Z"},{"id":"NCFzdO7mRAguwdoQ","name":"proposal-generation","createdAt":"2026-01-21T20:39:12.676Z","updatedAt":"2026-01-21T20:39:12.676Z"},{"id":"VoJMSzkknWaPzhGO","name":"google-docs","createdAt":"2026-01-21T20:39:12.679Z","updatedAt":"2026-01-21T20:39:12.679Z"}],"nodes":[{"id":"95aec752-5f78-481d-b7df-11097d6521c5","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[1920,448],"parameters":{"color":5,"width":380,"height":816,"content":"## How it works\n\nThis workflow generates professional sales proposals from a simple form:\n\n1. **Form** - Sales rep submits client details, pain points, and pricing\n2. **Calculate** - Computes ROI, savings, and break-even metrics\n3. **Generate** - Gemini AI writes executive summary, challenges, solution strategy, and team bios\n4. **Create** - Copies your Google Doc template and populates all placeholders\n\nThe AI tailors content to the client's industry and pain points while incorporating your calculated financial metrics.\n\n## Setup steps\n\n1. **Google Doc template** - Create a doc with placeholders: `{{client_name}}`, `{{executive_summary}}`, `{{key_challenges}}`, `{{solution_strategy}}`, `{{team_bios}}`, `{{formatted_roi}}`, `{{formatted_net_savings}}`, `{{formatted_break_even}}`, `{{next_steps}}`, `{{date}}`\n2. **Credentials** - Connect Google Drive, Google Docs, and Gemini API\n3. **Configure Copy node** - Point to your template document\n4. **Customize AI** - Edit the system message in \"Generate proposal content\" to match your company's tone\n5. **Test** - Submit the form and check the generated proposal"},"typeVersion":1},{"id":"9a99fd38-b5fe-45e8-9f9c-f9318bc3b3c0","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[2400,608],"parameters":{"color":7,"width":280,"height":96,"content":"**Data preparation**\nForm collects client info. Code node calculates ROI, savings, and break-even from financials."},"typeVersion":1},{"id":"5b84d41d-8a9a-402a-8eef-a3bb0628fc86","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[2816,608],"parameters":{"color":7,"width":280,"height":96,"content":"**AI generation**\nGemini writes proposal sections based on pain points and financials. Parser extracts JSON fields."},"typeVersion":1},{"id":"cd31ccaa-8356-4b3a-b266-e5ead83fef69","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[3376,608],"parameters":{"color":7,"width":300,"height":96,"content":"**Document creation**\nCopies template, formats bullet points, and replaces all placeholders with generated content."},"typeVersion":1},{"id":"49b28a3b-13e6-4e01-9453-6144be48c82d","name":"Receive proposal details","type":"n8n-nodes-base.formTrigger","position":[2400,752],"webhookId":"8d0afde2-58eb-4ea9-9a26-73da4d878af1","parameters":{"options":{},"formTitle":"Proposal Generation Form","formFields":{"values":[{"fieldName":"user_company_name","fieldLabel":"Your Company Name"},{"fieldName":"team_members_input","fieldType":"textarea","fieldLabel":"Team Members & Roles","placeholder":"ane Doe (Lead Engineer), John Smith (Project Manager)"},{"fieldName":"client_name","fieldLabel":"Client Name","placeholder":"For the cover page and headers.","requiredField":true},{"fieldName":"client_industry","fieldLabel":"Client Industry","placeholder":"Helps the AI customize the tone (e.g., Medical vs. Construction).","requiredField":true},{"fieldName":"key_pain_points","fieldType":"textarea","fieldLabel":"Key Pain Points","placeholder":"The raw notes the AI will turn into \"Key Challenges.\"","requiredField":true},{"fieldName":"current_annual_spend","fieldType":"number","fieldLabel":"Current Annual Spend ($)","placeholder":"Crucial for the ROI Logic (e.g., \"50000\").","requiredField":true},{"fieldName":"offer_type","fieldType":"dropdown","fieldLabel":"Offer Type","defaultValue":"Selects which \"Company Context\" to load (e.g., \"SEO Retainer\" vs. \"Web Dev\").","fieldOptions":{"values":[{"option":"SEO Retainer"},{"option":"Web Dev"}]},"requiredField":true},{"fieldName":"proposed_solution_cost","fieldType":"number","fieldLabel":"Proposed Solution Cost ($)","placeholder":"Crucial for the ROI Logic (e.g., \"12000\").","requiredField":true},{"fieldName":"project_start_date","fieldType":"date","fieldLabel":"Project Start Date","requiredField":true}]},"formDescription":"Fill out these fields for your client to generate a proposal."},"typeVersion":2.4},{"id":"a2afdd6b-a539-44a5-8740-cfb714337059","name":"Calculate ROI metrics","type":"n8n-nodes-base.code","position":[2608,752],"parameters":{"jsCode":"// 1. Get the data\nconst formData = items[0].json;\n\n// 2. Helper function to clean inputs\nfunction cleanNumber(value) {\n  if (typeof value === 'number') return value;\n  if (!value) return 0;\n  return parseFloat(value.toString().replace(/[^0-9.-]+/g,\"\"));\n}\n\n// 3. Extract and Clean Variables\nconst currentSpend = cleanNumber(formData.current_annual_spend || 0);\nconst solutionCost = cleanNumber(formData.proposed_solution_cost || 0);\nconst clientName = formData.client_name || \"Valued Client\";\nconst painPoints = formData.key_pain_points || \"\";\n\n// --- CONFIGURATION ---\nconst efficiencyAssumption = 1.0; \n// ---------------------\n\n// 4. Perform Calculations\nconst grossSavings = currentSpend * efficiencyAssumption; \nconst netSavings = grossSavings - solutionCost;\nlet roiPercent = 0;\nlet breakEvenMonths = 0;\n\nif (solutionCost > 0) {\n  roiPercent = (netSavings / solutionCost) * 100;\n  breakEvenMonths = solutionCost / (grossSavings / 12);\n}\n\n// 5. Format for Humans\nconst currencyFormatter = new Intl.NumberFormat('en-US', {\n  style: 'currency',\n  currency: 'USD',\n  maximumFractionDigits: 0\n});\n\nreturn {\n  json: {\n    client_name: clientName,\n    pain_points: painPoints,\n    \n    // Financials\n    raw_savings: netSavings,\n    raw_roi: roiPercent,\n    \n    // Formatted Text\n    formatted_current_spend: currencyFormatter.format(currentSpend),\n    formatted_solution_cost: currencyFormatter.format(solutionCost),\n    formatted_net_savings: currencyFormatter.format(netSavings),\n    formatted_roi: Math.round(roiPercent) + \"%\",\n    formatted_break_even: breakEvenMonths.toFixed(1) + \" Months\",\n    \n    // AI Context\n    ai_financial_context: `By implementing this solution, ${clientName} is projected to see a ${Math.round(roiPercent)}% ROI, recovering the initial investment in approximately ${breakEvenMonths.toFixed(1)} months.`\n  }\n}"},"typeVersion":2},{"id":"a1eac7e9-acf9-497b-88d8-670b643deded","name":"Generate proposal content","type":"@n8n/n8n-nodes-langchain.agent","position":[2816,752],"parameters":{"text":"=Here are the details for the new proposal:\n\nCLIENT: {{ $('Receive proposal details').item.json.client_name }}\nMY COMPANY: {{ $('Receive proposal details').first().json.user_company_name }}\nMY TEAM MEMBERS (Raw List): {{ $('Receive proposal details').first().json.team_members_input }}\n\nPAIN POINTS: {{ $('Receive proposal details').item.json.key_pain_points }}\n\nFINANCIAL DATA:\n- ROI: {{ $('Calculate ROI metrics').first().json.formatted_roi }}\n- Annual Savings: {{ $('Calculate ROI metrics').first().json.formatted_net_savings }}\n- Break Even: {{ $('Calculate ROI metrics').first().json.formatted_break_even }}\n\nFINANCIAL NARRATIVE:\n{{ $('Calculate ROI metrics').first().json.ai_financial_context }}\n\nPlease generate the JSON proposal now.","options":{"systemMessage":"You are an expert Enterprise Sales Engineer. Your goal is to write a winning business proposal based on the client data provided.\n\n### YOUR WRITING RULES:\n1. Tone: Professional, confident, and value-driven.\n2. Financials: Always tie the solution back to the financial savings provided.\n3. Team Section: You must write the \"team_bio_section\" as a complete narrative text block (not a JSON list).\n   - Start with a warm introductory sentence (e.g., \"We have assembled a team of experts dedicated to [Client Name]'s success...\").\n   - Then, list the team members provided in the \"MY TEAM MEMBERS\" input using a dash (-) for each new line. Include their Name, Title, and a brief 1-sentence bio.\n   - End with a closing sentence about their commitment to the project (e.g., \"This team will be your dedicated support...\").\n   - DO NOT invent a fake company name. Use the \"MY COMPANY\" name provided.\n\n### OUTPUT FORMAT:\nOutput ONLY a valid JSON object with these keys:\n{\n  \"short_outcome_phrase\": \"A 2-5 word strategic goal based on their pain points.\",\n  \"executive_summary\": \"A 3-4 sentence hook summarizing the problem and value.\",\n  \"key_challenges_bullet_points\": \"A list of the 3 biggest pain points.\",\n  \"solution_strategy\": \"A 2 paragraph roadmap of the solution.\",\n  \"team_bio_section\": \"A single text string containing the Intro, the List (with line breaks), and the Outro.\",\n  \"call_to_action\": \"A closing sentence urging them to sign.\"\n}"},"promptType":"define"},"typeVersion":3.1},{"id":"317d80a5-dd25-47a2-a385-43a424014653","name":"Gemini 1.5 Flash","type":"@n8n/n8n-nodes-langchain.lmChatGoogleGemini","position":[2800,960],"parameters":{"options":{}},"credentials":{"googlePalmApi":{"id":"lcpFWRO5yqAaIbjF","name":"Gemini n8n"}},"typeVersion":1},{"id":"7aea949b-296c-408f-8c38-dd419a53e182","name":"Parse AI response","type":"n8n-nodes-base.code","position":[3168,752],"parameters":{"jsCode":"// 1. Get the raw text output from the AI Agent\nconst rawOutput = $('Generate proposal content').first().json.output;\n\ntry {\n  // 2. Locate the JSON object within the text\n  const jsonMatch = rawOutput.match(/\\{[\\s\\S]*\\}/);\n\n  if (!jsonMatch) {\n    throw new Error(\"No JSON object found in AI response\");\n  }\n\n  // 3. Parse the cleaned string into a real Object\n  const cleanJson = JSON.parse(jsonMatch[0]);\n\n  // 4. Return the clean data\n  return {\n    json: cleanJson\n  };\n\n} catch (error) {\n  return {\n    json: {\n      error: \"Failed to parse JSON\",\n      message: error.message,\n      raw_ai_response: rawOutput\n    }\n  };\n}"},"typeVersion":2},{"id":"7965738d-fdd8-4877-bc93-c32bb1287367","name":"Copy proposal template","type":"n8n-nodes-base.googleDrive","position":[3376,752],"parameters":{"name":"={{ $('Receive proposal details').item.json.client_name }} Proposal","fileId":{"__rl":true,"mode":"list","value":"1SCu_o75YfEPgTaP3JgaLYncZ8hz--AQ_wNPpJq4qrFE","cachedResultUrl":"https://docs.google.com/document/d/1SCu_o75YfEPgTaP3JgaLYncZ8hz--AQ_wNPpJq4qrFE/edit?usp=drivesdk","cachedResultName":"Proposal Template Master"},"options":{},"operation":"copy"},"credentials":{"googleDriveOAuth2Api":{"id":"OYUUQEpjIx9WbjM5","name":"Daniel Google Drive account"}},"typeVersion":3},{"id":"dca9cd9e-4dc8-47e6-8138-a93d9a925f16","name":"Format bullet points","type":"n8n-nodes-base.code","position":[3584,752],"parameters":{"jsCode":"// 1. Get the raw data\nconst aiData = $('Parse AI response').first().json;\n\n// 2. Helper function\nfunction formatAsBullets(input) {\n  if (Array.isArray(input)) {\n    const cleanItems = input.map(item => item.replace(/^[-•*]\\s*/, '').trim());\n    return \"• \" + cleanItems.join(\"\\n• \");\n  }\n  return input || \"\"; \n}\n\n// 3. Format fields\nconst challengesClean = formatAsBullets(aiData.key_challenges_bullet_points);\nconst biosClean = formatAsBullets(aiData.team_bio_section);\n\nreturn {\n  json: {\n    ready_challenges: challengesClean,\n    ready_bios: biosClean\n  }\n}"},"typeVersion":2},{"id":"c46fc679-3e25-4459-81a5-cb376acaf2ca","name":"Populate proposal document","type":"n8n-nodes-base.googleDocs","position":[3792,752],"parameters":{"actionsUi":{"actionFields":[{"text":"{{client_name}}","action":"replaceAll","replaceText":"={{ $('Receive proposal details').item.json.client_name }}"},{"text":"{{user_company_name}}","action":"replaceAll","replaceText":"={{ $('Receive proposal details').item.json.user_company_name }}"},{"text":"{{dynamic_title}}","action":"replaceAll","replaceText":"={{ $('Receive proposal details').item.json.client_name }}+ {{ $('Receive proposal details').first().json['user_company_name'] }}: {{ $('Parse AI response').first().json['short_outcome_phrase'] }}"},{"text":"{{formatted_roi}}","action":"replaceAll","replaceText":"={{ $('Calculate ROI metrics').item.json.formatted_roi }}"},{"text":"{{executive_summary}}","action":"replaceAll","replaceText":"={{ $('Parse AI response').item.json.executive_summary }}"},{"text":"{{key_challenges}}","action":"replaceAll","replaceText":"={{ $json.ready_challenges }}"},{"text":"{{solution_strategy}}","action":"replaceAll","replaceText":"={{ $('Parse AI response').item.json.solution_strategy }}"},{"text":"{{team_bios}}","action":"replaceAll","replaceText":"={{ $('Parse AI response').item.json.team_bio_section }}"},{"text":"{{next_steps}}","action":"replaceAll","replaceText":"={{ $('Parse AI response').item.json.call_to_action }}"},{"text":"{{formatted_net_savings}}","action":"replaceAll","replaceText":"={{ $('Calculate ROI metrics').item.json.formatted_net_savings }}"},{"text":"{{formatted_solution_cost}}","action":"replaceAll","replaceText":"={{ $('Calculate ROI metrics').item.json.formatted_solution_cost }}"},{"text":"{{formatted_break_even}}","action":"replaceAll","replaceText":"={{ $('Calculate ROI metrics').item.json.formatted_break_even }}"},{"text":"{{date}}","action":"replaceAll","replaceText":"={{ $now.toFormat('MMMM dd, yyyy') }}"}]},"operation":"update","documentURL":"={{ $('Copy proposal template').item.json.id }}"},"credentials":{"googleDocsOAuth2Api":{"id":"ufaYx3eTw6eTgLPM","name":"Daniel Google Docs account"}},"typeVersion":2}],"active":true,"pinData":{},"settings":{"availableInMCP":false,"executionOrder":"v1"},"versionId":"d7076d3a-3856-4857-b4fd-96125a4353c3","connections":{"Gemini 1.5 Flash":{"ai_languageModel":[[{"node":"Generate proposal content","type":"ai_languageModel","index":0}]]},"Parse AI response":{"main":[[{"node":"Copy proposal template","type":"main","index":0}]]},"Format bullet points":{"main":[[{"node":"Populate proposal document","type":"main","index":0}]]},"Calculate ROI metrics":{"main":[[{"node":"Generate proposal content","type":"main","index":0}]]},"Copy proposal template":{"main":[[{"node":"Format bullet points","type":"main","index":0}]]},"Receive proposal details":{"main":[[{"node":"Calculate ROI metrics","type":"main","index":0}]]},"Generate proposal content":{"main":[[{"node":"Parse AI response","type":"main","index":0}]]}}},"lastUpdatedBy":1,"workflowInfo":{"nodeCount":12,"nodeTypes":{"n8n-nodes-base.code":{"count":3},"n8n-nodes-base.googleDocs":{"count":1},"n8n-nodes-base.stickyNote":{"count":4},"n8n-nodes-base.formTrigger":{"count":1},"n8n-nodes-base.googleDrive":{"count":1},"@n8n/n8n-nodes-langchain.agent":{"count":1},"@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":58,"icon":"file:googleDrive.svg","name":"n8n-nodes-base.googleDrive","codex":{"data":{"resources":{"generic":[{"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/why-this-product-manager-loves-workflow-automation-with-n8n/","icon":"🧠","label":"Why this Product Manager loves workflow automation with 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/app-nodes/n8n-nodes-base.googledrive/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"}]},"categories":["Data & Storage"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"input\"]","defaults":{"name":"Google Drive"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiB2aWV3Qm94PSIwIDAgODEgNzMiPjx1c2UgeGxpbms6aHJlZj0iI2EiIHg9Ii41IiB5PSIuNSIvPjxzeW1ib2wgaWQ9ImEiIG92ZXJmbG93PSJ2aXNpYmxlIj48ZyBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZT0ibm9uZSI+PHBhdGggZmlsbD0iIzAwNjZkYSIgZD0ibTYuMDQ4IDYxLjI2IDMuNTI4IDYuMDk0Yy43MzMgMS4yODMgMS43ODcgMi4yOTEgMy4wMjQgMy4wMjRsMTIuNi0yMS44MUgwYTguMyA4LjMgMCAwIDAgMS4xIDQuMTI0eiIvPjxwYXRoIGZpbGw9IiMwMGFjNDciIGQ9Ik00MCAyMi45MSAyNy40IDEuMWMtMS4yMzcuNzMzLTIuMjkxIDEuNzQxLTMuMDI0IDMuMDI0TDEuMSA0NC40NDVBOC4zIDguMyAwIDAgMCAwIDQ4LjU2OGgyNS4yeiIvPjxwYXRoIGZpbGw9IiNlYTQzMzUiIGQ9Ik02Ny40IDcwLjM3OGMxLjIzNy0uNzMzIDIuMjkxLTEuNzQxIDMuMDI0LTMuMDI0bDEuNDY2LTIuNTIgNy4wMS0xMi4xNDJhOC4zIDguMyAwIDAgMCAxLjEtNC4xMjRINTQuNzk4bDUuMzYzIDEwLjUzOHoiLz48cGF0aCBmaWxsPSIjMDA4MzJkIiBkPSJNNDAgMjIuOTEgNTIuNiAxLjFDNTEuMzYzLjM2NyA0OS45NDMgMCA0OC40NzcgMEgzMS41MjRjLTEuNDY2IDAtMi44ODcuNDEyLTQuMTI0IDEuMXoiLz48cGF0aCBmaWxsPSIjMjY4NGZjIiBkPSJNNTQuNzk5IDQ4LjU2OEgyNS4ybC0xMi42IDIxLjgxYzEuMjM3LjczMyAyLjY1NyAxLjEgNC4xMjQgMS4xaDQ2LjU1MmMxLjQ2NiAwIDIuODg3LS40MTIgNC4xMjQtMS4xeiIvPjxwYXRoIGZpbGw9IiNmZmJhMDAiIGQ9Ik02Ny4yNjIgMjQuMjg0IDU1LjYyNCA0LjEyNEM1NC44OTEgMi44NDEgNTMuODM3IDEuODMzIDUyLjYgMS4xTDQwIDIyLjkxbDE0LjggMjUuNjU5aDI1LjE1NWE4LjMgOC4zIDAgMCAwLTEuMS00LjEyNHoiLz48L2c+PC9zeW1ib2w+PC9zdmc+"},"displayName":"Google Drive","typeVersion":3,"nodeCategories":[{"id":3,"name":"Data & Storage"}]},{"id":495,"icon":"file:googleDocs.svg","name":"n8n-nodes-base.googleDocs","codex":{"data":{"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.googledocs/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"}]},"categories":["Miscellaneous"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"input\"]","defaults":{"name":"Google Docs"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiB2aWV3Qm94PSItMTggMCA5MCA4MCI+PHVzZSB4bGluazpocmVmPSIjYSIgeD0iLjUiIHk9Ii41Ii8+PHN5bWJvbCBpZD0iYSIgb3ZlcmZsb3c9InZpc2libGUiPjxnIHN0cm9rZT0ibm9uZSI+PHBhdGggZmlsbD0iIzU0OGRmNiIgZD0ibTM2IDAgMjIgMjJ2NTNhNC45OSA0Ljk5IDAgMCAxLTUgNUg1YTQuOTkgNC45OSAwIDAgMS01LTVWNWE0Ljk5IDQuOTkgMCAwIDEgNS01eiIvPjxwYXRoIGQ9Ik0xNCA0MGgzMHYzSDE0em0wIDdoMzB2M0gxNHptMCA4aDMwdjNIMTR6bTAgN2gyMXYzSDE0eiIvPjxwYXRoIGZpbGw9IiNhYmQwZmIiIGQ9Im0zNiAwIDIyIDIySDQxYy0yLjc3IDAtNS0yLjQ4LTUtNS4yNXoiLz48cGF0aCBmaWxsPSIjM2U1YmI5IiBkPSJNNDAuNzUgMjIgNTggMjkuMTI1VjIyeiIvPjwvZz48L3N5bWJvbD48L3N2Zz4="},"displayName":"Google Docs","typeVersion":2,"nodeCategories":[{"id":11,"name":"Miscellaneous"}]},{"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":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":1225,"icon":"file:form.svg","name":"n8n-nodes-base.formTrigger","codex":{"data":{"alias":["table","submit","post"],"resources":{"generic":[],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.formtrigger/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Other Trigger Nodes"]}}},"group":"[\"trigger\"]","defaults":{"name":"On form submission"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0NiIgaGVpZ2h0PSI0MCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwQjdCQyIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMzQuOTc4IDM3LjczMmExLjU2IDEuNTYgMCAwIDEtMS41NjIgMS41NjNINi4yNmExLjU2IDEuNTYgMCAwIDEtMS41NjMtMS41NjNWOS42MDdjMC0uNDA1LjE1Ny0uNzk0LjQzOC0xLjA4Nmw2LjMwNC02LjUzMXY1LjM0NEg4LjIxM2ExLjE3MiAxLjE3MiAwIDEgMCAwIDIuMzQzaDQuNDNhMS4xNyAxLjE3IDAgMCAwIDEuMTcxLTEuMTcxVi4yMzJoMTkuNjAyYTEuNTYgMS41NiAwIDAgMSAxLjU2MiAxLjU2M3YxMC4zMjdsLTIuODYgMi44Ni04LjI1MiA4LjI3NmE0MTMuMDA2IDQxMy4wMDYgMCAwIDEtMS42NTQgMS42NjJsLS4zMzcuMzM3YTIgMiAwIDAgMC0uNTU3IDEuMDhMMjAuMyAzMS45MjJjLS4xMDguNjM4LS4yMTUgMS4wNzkuMjExIDEuNDE4LjQwMy4zMi45LjE3NCAxLjU0LjA2Nmw1LjQwOC0uOTI4YTIgMiAwIDAgMCAxLjA4LS41NTZsNi40NC02LjQyOXptLTI0LjAzLTIxLjI2NWExLjE4IDEuMTggMCAwIDAgMS4xNzEgMS4xNzJoMTMuMTYzYTEuMTcyIDEuMTcyIDAgMSAwIDAtMi4zNDRIMTIuMTE5YTEuMTcgMS4xNyAwIDAgMC0xLjE3MiAxLjE3Mm03LjI5NCAxNC43NjZhMS4xNyAxLjE3IDAgMCAwLTEuMTcyLTEuMTcySDEyLjEyYTEuMTcyIDEuMTcyIDAgMSAwIDAgMi4zNDNoNC45NTFhMS4xNyAxLjE3IDAgMCAwIDEuMTcyLTEuMTcybS44Ni03LjM5MWExLjE3IDEuMTcgMCAwIDAtMS4xNzItMS4xNzJoLTUuODExYTEuMTcyIDEuMTcyIDAgMSAwIDAgMi4zNDNoNS44MWExLjE2NCAxLjE2NCAwIDAgMCAxLjE3My0xLjE3MSIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iIzAwQjdCQyIgZD0ibTMzLjUzMiAxNi4zOTcgNC4yODktNC4yODkgMy43NTggMy43MSAxLjYxNy0xLjYxNiAyLjI1OCAyLjI1N2MuMjE4LjIxOC4zNC41MTMuMzQzLjgyLS4wMDIuMzExLS4xMjUuNjA4LS4zNDQuODNsLTYuODA0IDYuNzk2YTEuMTMgMS4xMyAwIDAgMS0uODI4LjM0MyAxLjE1IDEuMTUgMCAwIDEtLjgyOC0uMzQzIDEuMTggMS4xOCAwIDAgMSAwLTEuNjU3bDUuOTc2LTUuOTY4LTEuMzEyLTEuMzEzLTEuMzgzIDEuNDE0LTEzLjE0OSAxMy4xMjUtNC42MTcuNzgyLjc4Mi00LjYxNy4zMzYtLjMzNyAyLjU2MiAyLjU1NWExLjEgMS4xIDAgMCAwIC44MjguMzQ0Yy4zMTIuMDA1LjYxMi0uMTIuODI4LS4zNDRhMS4xOCAxLjE4IDAgMCAwIDAtMS42NTZsLTIuNTYyLTIuNTYyek00NC43MzYgMTIuMjRjMCAuNDE0LS4xNjMuODEtLjQ1NCAxLjEwMmwtLjkyMi45MTQtMy44NTItMy44MjguOTMtLjkzYTEuNTYzIDEuNTYzIDAgMCAxIDIuMjAzIDBsMS42NCAxLjY0MWMuMjkxLjI5My40NTUuNjkuNDU1IDEuMTAyIi8+PC9zdmc+"},"displayName":"n8n Form Trigger","typeVersion":3,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"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":35,"name":"Document Extraction"},{"id":51,"name":"Multimodal AI"}],"image":[]}}