This workflow corresponds to n8n.io template #12211 — we link there as the canonical source.
This workflow follows the Form Trigger → Gmail recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"id": "hNm9hjbAa6fz9JF5",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Proposal Engine",
"tags": [
{
"id": "gHNK5dGHuWndIfUt",
"name": "Atharva_Dragomagte_temp",
"createdAt": "2025-12-27T13:20:23.039Z",
"updatedAt": "2025-12-27T13:20:23.039Z"
}
],
"nodes": [
{
"id": "0c2071b6-0c90-41e2-a236-de443ad4b455",
"name": "On form submission",
"type": "n8n-nodes-base.formTrigger",
"position": [
-224,
288
],
"parameters": {
"options": {
"appendAttribution": false
},
"formTitle": "Client Proposal Builder",
"formFields": {
"values": [
{
"fieldLabel": "Client Email",
"requiredField": true
},
{
"fieldLabel": "Client Name",
"requiredField": true
},
{
"fieldType": "textarea",
"fieldLabel": "Problem",
"requiredField": true
},
{
"fieldType": "textarea",
"fieldLabel": "Solution",
"requiredField": true
},
{
"fieldType": "textarea",
"fieldLabel": "Scope"
},
{
"fieldLabel": "timeline",
"requiredField": true
},
{
"fieldType": "textarea",
"fieldLabel": "need",
"requiredField": true
},
{
"fieldLabel": "Price",
"requiredField": true
},
{
"fieldLabel": "payment link",
"requiredField": true
},
{
"fieldType": "textarea",
"fieldLabel": "context if any"
}
]
},
"formDescription": "Fill out this form to generate a customized client proposal. The proposal is created automatically based on your inputs, including scope, pricing, and deliverables."
},
"typeVersion": 2.2
},
{
"id": "cad37542-1346-4292-a120-dc8f04723b3f",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-368,
128
],
"parameters": {
"color": 7,
"width": 1476,
"height": 904,
"content": "# AI Proposal Engine\nAutomatically creates a personalized client proposal from form inputs using Google Slides."
},
"typeVersion": 1
},
{
"id": "88cdc1e8-90c7-4087-827b-3c799c381a9e",
"name": "Google Sheets Trigger",
"type": "n8n-nodes-base.googleSheetsTrigger",
"position": [
-224,
752
],
"parameters": {
"options": {},
"pollTimes": {
"item": [
{
"mode": "everyMinute"
}
]
},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1-5ungWMwTXHFQalwIZ5xQS_P7jz0A1HmpErmvIyws80/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "1-5ungWMwTXHFQalwIZ5xQS_P7jz0A1HmpErmvIyws80"
}
},
"credentials": {
"googleSheetsTriggerOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "40ae0dd6-c6f6-4fe4-8cf4-3221bca46097",
"name": "Loop Over Items",
"type": "n8n-nodes-base.splitInBatches",
"position": [
240,
752
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "55eafb87-0493-4c71-bd63-f68f05f3d671",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-288,
272
],
"parameters": {
"content": ""
},
"typeVersion": 1
},
{
"id": "eb91b514-ca2b-41a7-bbb8-033db0af5f92",
"name": "Generate Proposal Data",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
32,
288
],
"parameters": {
"modelId": {
"__rl": true,
"mode": "list",
"value": "gpt-5.1",
"cachedResultName": "GPT-5.1"
},
"options": {},
"responses": {
"values": [
{
"role": "system",
"content": "You generate clear, structured, and professional client proposals based on provided inputs."
},
{
"content": "=Inputs: \nClient Name:{{ $json['Client Name'] }}\nProblem: {{ $json.Problem }}\nSolution:{{ $json.Solution }}\nScope:{{ $json.Scope }}\nTimeline:{{ $json.timeline }}\nNeed:{{ $json.need }}\nPrice:{{ $json.Price }}\nPayment Link:{{ $json['payment link'] }}\nContext: {{ $json['context if any'] }}"
},
{
"content": "=From the provided input, generate the following proposal fields and respond only in valid JSON.\n\nRules:\nTitle: generate a concise, professional proposal title (maximum 80 characters).\nClient Name: return exactly as provided.\n\nProblem: one short paragraphs, maximum 500 characters.\n\nSolution: one short paragraphs, maximum 500 characters.\n\nScope: maximum 1100 characters total. Start with a brief overview paragraph, then include a Scope section using bullet points, followed by a Deliverables section using a numbered list.\n\nTimeline: concise statement, maximum 100 characters.\n\nNeed: bullet points only, maximum 200 characters total.\n\nPrice: return exactly as provided.\n\nPayment Link: return exactly as provided.\n\nOutput format:\nReturn a single JSON object with these exact keys:\nClientName, Problem, Solution, Scope, Timeline, Need, Price, PaymentLink\n\nDo not include explanations, markdown, or extra text."
},
{
"content": "=Example Output\n[{\n \"Title\": \"AI UGC Production System Proposal\",\n \"ClientName\": \"Aryan Maheshwari\",\n \"Problem\": \"SaaS companies need high volumes of ad creatives each month, but current UGC production methods are slow, inconsistent, and expensive. At roughly $15 per video, scaling to 30\u201350 videos per client becomes unrealistic.\\n\\nExisting AI tools do not maintain character consistency, do not use structured copywriting frameworks, and rely on generic prompts that do not convert. As a result, creative output is costly, unpredictable, and rarely optimized for performance.\",\n \"Solution\": \"Build an internal AI UGC production system that generates SaaS-focused videos for approximately $1.5 per video, making high-volume output affordable and scalable.\\n\\nUsing talking-head models such as HeyGen, the system maintains strong character consistency while leveraging copywriting formulas, web search, and client briefing documents to create scripts designed to convert. The pipeline supports batch generation, reliable quality, and automated delivery.\",\n \"Scope\": \"Overview:\\nBuild an automated system that generates SaaS-style UGC videos at scale by combining script generation, AI actors, voice synthesis, and automated storage. The system runs with minimal manual effort, supports multiple clients, and produces batches of videos efficiently.\\n\\nScope:\\n- Script generation pipeline based on defined copywriting frameworks\\n- Automated video generation using the HeyGen API\\n- Storage workflow organized by client and date\\n- Dashboard or database to manage clients, scripts, frameworks, and video links\\n- Automated updates to the database with generated video links\\n- Basic monitoring and error handling\\n- Batch generation support for multiple scripts and videos per run\\n- Integration of all tools into a unified automated workflow\\n\\nDeliverables:\\n1. n8n workflow for end-to-end automation\\n2. UGC video generation system covering script and video pipelines\\n3. Configured and integrated apps including Airtable, Google Sheets, HeyGen, Google Drive, Google Docs, and GPT-5 inside the workflow\\n4. Loom walkthrough video demonstrating how the system works\",\n \"Timeline\": \"3\u20135 days after starting the contract\",\n \"Need\": \"- N8N workspace access and permissions\\n- Drive folders for video storage\\n- Brand and client briefing documents\\n- Airtable or Google Sheets access\\n- HeyGen API access and credentials\",\n \"Price\": \"2532 USD\",\n \"PaymentLink\": \"https://wise.com/pay/r/9T0HFkPOD2TicpU\"\n}]\nonly output like this do not output in markdown should not have ```json\neverything in json should be string"
}
]
},
"builtInTools": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "3e5e2739-f453-48f5-b8d3-2121239c3981",
"name": "Parse Json for Proposal Data",
"type": "n8n-nodes-base.code",
"position": [
368,
288
],
"parameters": {
"jsCode": "const rawText = $input.first().json.output[0].content[0].text;\n\nif (!rawText) {\n throw new Error('No text output from OpenAI');\n}\n\nconst parsed = JSON.parse(rawText);\n\nreturn [\n {\n json: Array.isArray(parsed) ? parsed[0] : parsed\n }\n];\n"
},
"typeVersion": 2
},
{
"id": "8c0604e1-9473-4711-9815-aa1bcee2db3c",
"name": "Copy Template",
"type": "n8n-nodes-base.googleDrive",
"position": [
592,
288
],
"parameters": {
"name": "={{ $json.Title }}",
"fileId": {
"__rl": true,
"mode": "id",
"value": "15XFB-6lbXIBufCHgC34XH5NxtzxVJG8TFisbenyx4Rs"
},
"options": {
"copyRequiresWriterPermission": false
},
"operation": "copy"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "089c7743-d132-4d90-81a0-1811664ce2f9",
"name": "Move to Folder",
"type": "n8n-nodes-base.googleDrive",
"position": [
832,
288
],
"parameters": {
"fileId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.id }}"
},
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"folderId": {
"__rl": true,
"mode": "id",
"value": "1NAtCKCeMJKGFfewj1T3fIlWZyQTE2Tbb"
},
"operation": "move"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "dd610cbc-ebbd-45df-991c-feb30933b35d",
"name": "Inject generated Text",
"type": "n8n-nodes-base.googleSlides",
"position": [
64,
480
],
"parameters": {
"textUi": {
"textValues": [
{
"text": "{{title}}",
"replaceText": "={{ $('Parse Json for Proposal Data').item.json.Title }}"
},
{
"text": "{{client_name}}",
"replaceText": "={{ $('Parse Json for Proposal Data').item.json.ClientName }}"
},
{
"text": "{{problem}}",
"replaceText": "={{ $('Parse Json for Proposal Data').item.json.Problem }}"
},
{
"text": "{{solution}}",
"replaceText": "={{ $('Parse Json for Proposal Data').item.json.Solution }}"
},
{
"text": "{{scope}}",
"replaceText": "={{ $('Parse Json for Proposal Data').item.json.Scope }}"
},
{
"text": "{{timeline}}",
"replaceText": "={{ $('Parse Json for Proposal Data').item.json.Timeline }}"
},
{
"text": "{{need}}",
"replaceText": "={{ $('Parse Json for Proposal Data').item.json.Need }}"
},
{
"text": "{{price}}",
"replaceText": "={{ $('Parse Json for Proposal Data').item.json.Price }}"
},
{
"text": "{{payment_link}}",
"replaceText": "={{ $('Parse Json for Proposal Data').item.json.PaymentLink }}"
},
{
"text": "{{date}}",
"replaceText": "={{ new Date().toISOString().split('T')[0] }}"
}
]
},
"options": {},
"operation": "replaceText",
"presentationId": "={{ $json.id }}"
},
"credentials": {
"googleSlidesOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "f9981102-a6fc-48e3-ba29-e90787fd159b",
"name": "Generate Email Draft",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
288,
480
],
"parameters": {
"modelId": {
"__rl": true,
"mode": "list",
"value": "chatgpt-4o-latest",
"cachedResultName": "CHATGPT-4O-LATEST"
},
"options": {},
"responses": {
"values": [
{
"role": "system",
"content": "You write warm, professional proposal emails that clearly explain value, build trust, and guide the client toward the next step."
},
{
"content": "=From the provided Proposal Info, write a short, warm, and professional proposal email on behalf of Dragomagte.\n\nInstructions:\n\nWrite the email as Atharva from Dragomagte.\n\nKeep it concise, friendly, and confident.\n\nStart with a light hook that references the client\u2019s problem or goal.\n\nBriefly summarize the problem and how the proposed solution addresses it.\n\nClearly state that the proposal is attached (PFA) for review.\n\nMention that the payment link is included inside the proposal.\n\nEnd with a clear next step (review, questions, or confirmation to proceed).\n\nOutput format:\nReturn only valid JSON with these exact keys:\nsubject, body\n\nRules:\n\nDo NOT include markdown\n\nDo NOT include ```json\n\nDo NOT include explanations or extra text\n\nUse natural line breaks in the email body\n\nReturn a single JSON object (not an array)\n\nInput:\nProposal Info: {{ $('Generate Proposal Data').first().json.output[0].content[0].text }}\n\nSample Output:\n[{\n\"subject\": \"Proposal for AI UGC Production System\",\n\"body\": \"Hi Gilles,\\n\\nFollowing up on our discussion around scaling UGC content efficiently, I\u2019ve attached the proposal outlining the AI UGC Production System tailored to your needs.\\n\\nThe proposal covers the current challenges with cost and consistency, the proposed solution, scope of work, timeline, and next steps. You\u2019ll also find the payment link included inside the proposal for convenience.\\n\\nPlease review the attached proposal and let me know if you have any questions or would like any adjustments. Once confirmed, I can proceed right away.\\n\\nBest regards,\\nAtharva\\nDragomagte\"\n}]"
}
]
},
"builtInTools": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "acd5f45e-470c-4b32-a7a2-03bbc9bed74a",
"name": "Parse Email Data",
"type": "n8n-nodes-base.code",
"position": [
592,
480
],
"parameters": {
"jsCode": "const rawText = $input.first().json.output[0].content[0].text;\n\nif (!rawText) {\n throw new Error('No text output from OpenAI');\n}\n\nconst parsed = JSON.parse(rawText);\n\nreturn [\n {\n json: Array.isArray(parsed) ? parsed[0] : parsed\n }\n];\n"
},
"typeVersion": 2
},
{
"id": "ee961cb0-9ee4-475b-9411-566e783a0e74",
"name": "Append In Database",
"type": "n8n-nodes-base.googleSheets",
"position": [
848,
480
],
"parameters": {
"columns": {
"value": {
"Date": "={{ $now }}",
"Email": "={{ $('On form submission').first().json['Client Email'] }}",
"Body Draft": "={{ $json.body }}",
"Client Name": "={{ $('Parse Json for Proposal Data').first().json.ClientName }}",
"Send Status": "WAITING",
"Subject Draft": "={{ $json.subject }}",
"Project Titile": "={{ $('Parse Json for Proposal Data').first().json.Title }}",
"Proposall Link": "=https://docs.google.com/presentation/d/{{ $('Inject generated Text').item.json.presentationId }}/edit"
},
"schema": [
{
"id": "Date",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Client Name",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Client Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Project Titile",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Project Titile",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Proposall Link",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Proposall Link",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Subject Draft",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Subject Draft",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Body Draft",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Body Draft",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Send Status",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Send Status",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "name",
"value": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "1-5ungWMwTXHFQalwIZ5xQS_P7jz0A1HmpErmvIyws80"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "3246cb36-dc76-4b29-b495-811e5536cb38",
"name": "Filter Ready Drafts",
"type": "n8n-nodes-base.filter",
"position": [
32,
752
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "14357cf3-2e72-4227-afa2-f2222a6fe007",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json['Send Status'] }}",
"rightValue": "READY"
}
]
}
},
"typeVersion": 2.3
},
{
"id": "bf83a4e7-4ec0-4da5-b68e-bc34673724ff",
"name": "Download Proposal in PDF",
"type": "n8n-nodes-base.googleDrive",
"position": [
480,
768
],
"parameters": {
"fileId": {
"__rl": true,
"mode": "url",
"value": "={{ $json['Proposall Link'] }}"
},
"options": {
"fileName": "={{ $json['Project Titile'] }}.pdf",
"googleFileConversion": {
"conversion": {
"slidesToFormat": "application/pdf"
}
}
},
"operation": "download"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "f1f55f0c-3bca-45f7-8fe8-d57147a6adff",
"name": "Send Email",
"type": "n8n-nodes-base.gmail",
"position": [
640,
768
],
"parameters": {
"sendTo": "={{ $('Google Sheets Trigger').item.json.Email }}",
"message": "={{ $('Google Sheets Trigger').item.json['Body Draft'] }}",
"options": {
"attachmentsUi": {
"attachmentsBinary": [
{}
]
}
},
"subject": "={{ $('Google Sheets Trigger').item.json['Project Titile'] }}",
"emailType": "text"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.2
},
{
"id": "3e2c6ebd-cb33-4345-a0ed-239f3943ad85",
"name": "Update Status",
"type": "n8n-nodes-base.googleSheets",
"position": [
784,
768
],
"parameters": {
"columns": {
"value": {
"Email": "={{ $('Loop Over Items').item.json.Email }}",
"row_number": 0,
"Send Status": "SENT"
},
"schema": [
{
"id": "Date",
"type": "string",
"display": true,
"required": false,
"displayName": "Date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Client Name",
"type": "string",
"display": true,
"required": false,
"displayName": "Client Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Project Titile",
"type": "string",
"display": true,
"required": false,
"displayName": "Project Titile",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Proposall Link",
"type": "string",
"display": true,
"required": false,
"displayName": "Proposall Link",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Subject Draft",
"type": "string",
"display": true,
"required": false,
"displayName": "Subject Draft",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Body Draft",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Body Draft",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Send Status",
"type": "string",
"display": true,
"required": false,
"displayName": "Send Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "row_number",
"type": "number",
"display": true,
"removed": false,
"readOnly": true,
"required": false,
"displayName": "row_number",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"Email"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1-5ungWMwTXHFQalwIZ5xQS_P7jz0A1HmpErmvIyws80/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "1-5ungWMwTXHFQalwIZ5xQS_P7jz0A1HmpErmvIyws80"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "60053c38-0901-4074-b345-6203c2811676",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-288,
736
],
"parameters": {
"height": 176,
"content": ""
},
"typeVersion": 1
},
{
"id": "5081a102-acb9-48bf-9134-ca1ccc267eb2",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-288,
1168
],
"parameters": {
"width": 416,
"height": 592,
"content": "[](https://docs.google.com/presentation/d/1oVW38XP0OyUhFMpij5cmKrljQvLv6NnSnGRgZ4pkW3M/edit?usp=sharing)\n"
},
"typeVersion": 1
},
{
"id": "23abdf9e-79ae-4887-91a3-cebca1d45cba",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
160,
1152
],
"parameters": {
"width": 432,
"height": 608,
"content": "[](https://docs.google.com/presentation/d/1EQBTWCpeFk-mt0ZDyhb5-__58jZf69SxbTS715b4Nc4/edit?usp=sharing)\n\n"
},
"typeVersion": 1
},
{
"id": "b4e1f513-1ef4-4dc4-a792-2afdbbf5e325",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
624,
1152
],
"parameters": {
"width": 432,
"height": 608,
"content": "[](https://docs.google.com/presentation/d/1WEAGDn2VrZCkkIdJVSlLFcXM1yhUaYhFjYaIYmL5zzo/edit?usp=sharing)\n"
},
"typeVersion": 1
},
{
"id": "985b3648-92f9-403b-be7f-9e1f2d576dfb",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
-304,
1056
],
"parameters": {
"color": 3,
"width": 1430,
"height": 752,
"content": "# FREE PROPOSAL TEMPLATES"
},
"typeVersion": 1
},
{
"id": "64661e3f-9f1d-4032-a2d6-d2c02a9b79aa",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
-704,
144
],
"parameters": {
"width": 320,
"height": 880,
"content": "## \ud83d\udcc4 AI Proposal Generator Engine\n\nThe AI Proposal Generator Engine is a simple system built to create client proposals very quickly \u26a1. After a sales call, once the requirements are clear, you can enter key details like client information, scope, pricing, and even the call transcript so the system understands the full context of the conversation.\n\nUsing these inputs, the engine automatically creates a fully customized proposal using a predefined template and also prepares a draft email. Everything is saved in a central sheet for review. When the proposal is marked as ready, the system converts it into a PDF and sends it to the client automatically. The main focus of this engine is speed and reducing manual work while keeping proposals accurate and consistent.\n"
},
"typeVersion": 1
},
{
"id": "745561d7-4cf7-46d0-8ef3-04c2cf9dac41",
"name": "Sticky Note8",
"type": "n8n-nodes-base.stickyNote",
"position": [
1136,
112
],
"parameters": {
"color": 6,
"width": 1072,
"height": 1680,
"content": "## \u2699\ufe0f Proposal Generator Engine \u2013 Setup Guide \n\nThis guide shows how to set up the workflow so proposals can be created and sent automatically.\n\n---\n\n### 1\ufe0f\u20e3 Google Credentials\n\nGo to Google Cloud Console and create a Web App (OAuth).\n\nEnable these APIs:\n\n* Google Sheets\n* Google Drive\n* Gmail\n\nIn n8n, select this Google credential inside:\n\n* Google Sheets nodes\n* Google Drive nodes\n* Gmail nodes\n\nUse the same credential everywhere.\n\n---\n\n### 2\ufe0f\u20e3 Google Drive Structure\n\nCreate this folder setup in Google Drive. You can use the provided templates or your own.\n\n```\nProposal Generator Engine/\n\u251c\u2500\u2500 Template 1 (Slides)\n\u251c\u2500\u2500 Template 2 (Slides)\n\u251c\u2500\u2500 Template 3 (Slides)\n\u251c\u2500\u2500 Proposal Generation Tracker (Sheets)\n\u2514\u2500\u2500 Generated Proposals/\n```\n\n---\n\n### 3\ufe0f\u20e3 Google Sheets Node\n\nOpen the Proposal Generation Tracker and copy the Sheet ID from the URL.\n\nPaste this ID into the Google Sheets node in n8n.\nThis sheet is used to read data and control when a proposal is sent.\n\n---\n\n### 4\ufe0f\u20e3 Slides and Drive Nodes\n\nCopy the Slides template ID you want to use and paste it into the Copy Template node.\n\nCopy the folder ID of Generated Proposals and paste it into the Move File or Move Folder field.\n\n---\n\n### 5\ufe0f\u20e3 OpenAI Key\n\nCreate an OpenAI credential in n8n using your API key.\n\nSelect it in all GPT nodes and adjust the prompts if needed.\n"
},
"typeVersion": 1
},
{
"id": "6ffc84a8-ff1f-433e-9262-11e9172dd57e",
"name": "Sticky Note9",
"type": "n8n-nodes-base.stickyNote",
"position": [
-784,
1056
],
"parameters": {
"color": 4,
"width": 464,
"height": 736,
"content": "# SHEETS DATABASE ATTACHED"
},
"typeVersion": 1
},
{
"id": "3a78542d-7f91-47e1-8347-610e0751f489",
"name": "Sticky Note10",
"type": "n8n-nodes-base.stickyNote",
"position": [
-752,
1184
],
"parameters": {
"width": 416,
"height": 592,
"content": "[](https://docs.google.com/spreadsheets/d/1Ix9zw7bCDPZzv5XSI5M0yE1HOwK1RteODRJrc5899YM/edit?usp=sharing)\n"
},
"typeVersion": 1
}
],
"active": true,
"settings": {
"executionOrder": "v1"
},
"versionId": "80f9550f-5077-478f-99a8-797fa92c8a93",
"connections": {
"Send Email": {
"main": [
[
{
"node": "Update Status",
"type": "main",
"index": 0
}
]
]
},
"Copy Template": {
"main": [
[
{
"node": "Move to Folder",
"type": "main",
"index": 0
}
]
]
},
"Update Status": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Move to Folder": {
"main": [
[
{
"node": "Inject generated Text",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Items": {
"main": [
[],
[
{
"node": "Download Proposal in PDF",
"type": "main",
"index": 0
}
]
]
},
"Parse Email Data": {
"main": [
[
{
"node": "Append In Database",
"type": "main",
"index": 0
}
]
]
},
"On form submission": {
"main": [
[
{
"node": "Generate Proposal Data",
"type": "main",
"index": 0
}
]
]
},
"Filter Ready Drafts": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Generate Email Draft": {
"main": [
[
{
"node": "Parse Email Data",
"type": "main",
"index": 0
}
]
]
},
"Google Sheets Trigger": {
"main": [
[
{
"node": "Filter Ready Drafts",
"type": "main",
"index": 0
}
]
]
},
"Inject generated Text": {
"main": [
[
{
"node": "Generate Email Draft",
"type": "main",
"index": 0
}
]
]
},
"Generate Proposal Data": {
"main": [
[
{
"node": "Parse Json for Proposal Data",
"type": "main",
"index": 0
}
]
]
},
"Download Proposal in PDF": {
"main": [
[
{
"node": "Send Email",
"type": "main",
"index": 0
}
]
]
},
"Parse Json for Proposal Data": {
"main": [
[
{
"node": "Copy Template",
"type": "main",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
gmailOAuth2googleDriveOAuth2ApigoogleSheetsOAuth2ApigoogleSheetsTriggerOAuth2ApigoogleSlidesOAuth2ApiopenAiApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
An n8n-based automation that generates client proposals from a form, lets you review everything in one place, and sends the proposal only when you approve it.
Source: https://n8n.io/workflows/12211/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
What it is An automated LinkedIn content system that takes a simple form (idea + optional file), generates LinkedIn posts with OpenAI, stores them in Notion, builds Google Slides carousels, and auto-p
Reimbursements used to be a headache.
This workflow uses Tally.so to collect client input that you input yourself during the meeting or after from a simple form and send that data to n8n via an API webhook. Once received, n8n processes th
AI Proposal Generator System
Categories: Sales Automation, AI Proposals, Revenue Ops