AutomationFlowsAI & RAG › Generate Proposals with Gpt-4o, Google Docs, Gmail and Slack

Generate Proposals with Gpt-4o, Google Docs, Gmail and Slack

ByHyrum Hurst @hyrum-hurst on n8n.io

Consultants, agencies, freelancers, and professional service firms who need to create customized proposals and contracts quickly and efficiently.

Event trigger★★★★☆ complexityAI-powered21 nodesGoogle Sheets TriggerOpenAIGoogle DocsHTTP RequestGmailGoogle SheetsSlackError Trigger
AI & RAG Trigger: Event Nodes: 21 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #12959 — we link there as the canonical source.

This workflow follows the Error 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 →

Download .json
{
  "id": "o0IELmWjFMKhdPS7",
  "name": "Proposal & Contract Generation Automation for Consulting Firms",
  "tags": [],
  "nodes": [
    {
      "id": "40edce11-6045-47d8-aee7-c81f50999bd3",
      "name": "New Client Entry Trigger",
      "type": "n8n-nodes-base.googleSheetsTrigger",
      "position": [
        352,
        -64
      ],
      "parameters": {
        "event": "rowAdded",
        "options": {},
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "id",
          "value": "<__PLACEHOLDER_VALUE__Sheet Name (e.g., Clients)__>"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "<__PLACEHOLDER_VALUE__Google Sheets Document ID__>"
        }
      },
      "credentials": {
        "googleSheetsTriggerOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "ff9b2c32-016f-46b9-8c21-c08395ad2069",
      "name": "Workflow Configuration",
      "type": "n8n-nodes-base.set",
      "position": [
        576,
        -64
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "id-1",
              "name": "proposalTemplateIntro",
              "type": "string",
              "value": "We are pleased to present this proposal for consulting services tailored to your business needs."
            },
            {
              "id": "id-2",
              "name": "pricingTier1",
              "type": "number",
              "value": 5000
            },
            {
              "id": "id-3",
              "name": "pricingTier2",
              "type": "number",
              "value": 10000
            },
            {
              "id": "id-4",
              "name": "pricingTier3",
              "type": "number",
              "value": 25000
            },
            {
              "id": "id-5",
              "name": "highValueThreshold",
              "type": "number",
              "value": 10000
            },
            {
              "id": "id-6",
              "name": "adminEmail",
              "type": "string",
              "value": "<__PLACEHOLDER_VALUE__Admin Email Address__>"
            },
            {
              "id": "id-7",
              "name": "slackChannel",
              "type": "string",
              "value": "<__PLACEHOLDER_VALUE__Slack Channel ID__>"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "cf48607a-2a5c-424e-a646-ca1c35099647",
      "name": "Normalize Client Data",
      "type": "n8n-nodes-base.set",
      "position": [
        800,
        -64
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "id-1",
              "name": "clientName",
              "type": "string",
              "value": "={{ $json.clientName || $json['Client Name'] || '' }}"
            },
            {
              "id": "id-2",
              "name": "clientEmail",
              "type": "string",
              "value": "={{ $json.clientEmail || $json['Client Email'] || '' }}"
            },
            {
              "id": "id-3",
              "name": "projectScope",
              "type": "string",
              "value": "={{ $json.projectScope || $json['Project Scope'] || '' }}"
            },
            {
              "id": "id-4",
              "name": "estimatedValue",
              "type": "number",
              "value": "={{ $json.estimatedValue || $json['Estimated Value'] || 0 }}"
            },
            {
              "id": "id-5",
              "name": "industry",
              "type": "string",
              "value": "={{ $json.industry || $json['Industry'] || '' }}"
            },
            {
              "id": "id-6",
              "name": "proposalDate",
              "type": "string",
              "value": "={{ $now.format('MMMM DD, YYYY') }}"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "699d28bb-ba4e-4d2d-9a25-67ab6c7eebf0",
      "name": "Generate Proposal Content",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        1024,
        -64
      ],
      "parameters": {
        "modelId": {
          "mode": "id",
          "value": "gpt-4o"
        },
        "options": {
          "temperature": 0.7
        },
        "responses": {
          "values": [
            {
              "content": "={{ $json.projectScope }}\n\nClient: {{ $json.clientName }}\nIndustry: {{ $json.industry }}\nEstimated Value: ${{ $json.estimatedValue }}\n\nGenerate a comprehensive consulting proposal including: executive summary, project objectives, methodology, deliverables, timeline, and pricing structure. Use professional tone and format."
            }
          ]
        },
        "builtInTools": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "964e76c5-bcd0-489d-aeef-7cdf584b541a",
      "name": "Create Google Doc Proposal",
      "type": "n8n-nodes-base.googleDocs",
      "position": [
        1376,
        -64
      ],
      "parameters": {
        "title": "=Proposal for {{ $json.clientName }} - {{ $json.proposalDate }}"
      },
      "typeVersion": 2
    },
    {
      "id": "3703213e-4138-4a29-bb97-b315bc69a71b",
      "name": "Convert Doc to PDF",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1600,
        -64
      ],
      "parameters": {
        "url": "=https://docs.google.com/document/d/{{ $('Create Google Doc Proposal').item.json.documentId }}/export?format=pdf",
        "options": {
          "response": {
            "response": {
              "responseFormat": "file",
              "outputPropertyName": "proposalPDF"
            }
          }
        },
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "googleOAuth2Api"
      },
      "typeVersion": 4.3
    },
    {
      "id": "9b6d4a2d-7acf-47e5-a263-14db0dbff7dd",
      "name": "Send Proposal via Email",
      "type": "n8n-nodes-base.gmail",
      "position": [
        1824,
        -64
      ],
      "parameters": {
        "sendTo": "={{ $json.clientEmail }}",
        "message": "=Dear {{ $json.clientName }},\n\nThank you for considering our consulting services. Please find attached our detailed proposal for your review.\n\nWe look forward to the opportunity to work with you.\n\nBest regards,\nYour Consulting Team",
        "options": {
          "attachmentsUi": {
            "attachmentsBinary": [
              {
                "property": "proposalPDF"
              }
            ]
          }
        },
        "subject": "=Proposal for {{ $json.clientName }} - {{ $json.proposalDate }}"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "95806102-bc18-4172-89f9-5a9b28de3c3f",
      "name": "Send to DocuSign for Signature",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2048,
        -64
      ],
      "parameters": {
        "url": "<__PLACEHOLDER_VALUE__DocuSign API Endpoint (e.g., https://demo.docusign.net/restapi/v2.1/accounts/{accountId}/envelopes)__>",
        "method": "POST",
        "options": {},
        "jsonBody": "={{ {\n  \"emailSubject\": \"Please sign this document\",\n  \"documents\": [{\n    \"documentBase64\": $binary.data.toString('base64'),\n    \"name\": \"Proposal.pdf\",\n    \"fileExtension\": \"pdf\",\n    \"documentId\": \"1\"\n  }],\n  \"recipients\": {\n    \"signers\": [{\n      \"email\": $('Normalize Client Data').item.json.clientEmail,\n      \"name\": $('Normalize Client Data').item.json.clientName,\n      \"recipientId\": \"1\",\n      \"routingOrder\": \"1\"\n    }]\n  },\n  \"status\": \"sent\"\n} }}",
        "sendBody": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "authentication": "genericCredentialType",
        "genericAuthType": "oAuth2Api",
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        }
      },
      "typeVersion": 4.3
    },
    {
      "id": "f1b764c0-9752-4062-bf36-a6f4a5ab771e",
      "name": "Log Proposal Creation",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2272,
        -64
      ],
      "parameters": {
        "columns": {
          "value": {
            "Email": "={{ $json.clientEmail }}",
            "Status": "Sent",
            "Client Name": "={{ $json.clientName }}",
            "Document ID": "={{ $('Create Google Doc Proposal').item.json.documentId }}",
            "Project Scope": "={{ $json.projectScope }}",
            "Proposal Date": "={{ $json.proposalDate }}",
            "Estimated Value": "={{ $json.estimatedValue }}"
          },
          "schema": [
            {
              "id": "Client Name",
              "required": false,
              "displayName": "Client Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Email",
              "required": false,
              "displayName": "Email",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Project Scope",
              "required": false,
              "displayName": "Project Scope",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Estimated Value",
              "required": false,
              "displayName": "Estimated Value",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Proposal Date",
              "required": false,
              "displayName": "Proposal Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Document ID",
              "required": false,
              "displayName": "Document ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Status",
              "required": false,
              "displayName": "Status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Client Name"
          ]
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "<__PLACEHOLDER_VALUE__Tracking Sheet Name (e.g., Proposals)__>"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "<__PLACEHOLDER_VALUE__Tracking Sheet Document ID__>"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "42bbbf32-03cd-4598-be76-5d21482dddf0",
      "name": "Notify Team - Standard",
      "type": "n8n-nodes-base.slack",
      "position": [
        2496,
        -64
      ],
      "parameters": {
        "text": "=\ud83d\udcc4 New Proposal Created!\n\n*Client:* {{ $json.clientName }}\n*Value:* ${{ $json.estimatedValue }}\n*Industry:* {{ $json.industry }}\n*Date:* {{ $json.proposalDate }}\n\n<https://docs.google.com/document/d/{{ $('Create Google Doc Proposal').item.json.documentId }}|View Proposal>",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Workflow Configuration').item.json.slackChannel }}"
        },
        "otherOptions": {}
      },
      "typeVersion": 2.4
    },
    {
      "id": "e2f19cae-de23-422b-8d2c-e0913edbc732",
      "name": "Check if High-Value Client",
      "type": "n8n-nodes-base.if",
      "position": [
        2720,
        -64
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "id-1",
              "operator": {
                "type": "number",
                "operation": "gte"
              },
              "leftValue": "={{ $json.estimatedValue }}",
              "rightValue": "={{ $('Workflow Configuration').item.json.highValueThreshold }}"
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "8ff23e56-5adf-4f00-a547-7124a05d4b92",
      "name": "Priority Slack Notification",
      "type": "n8n-nodes-base.slack",
      "position": [
        2944,
        -64
      ],
      "parameters": {
        "text": "=\ud83d\udea8 HIGH-VALUE CLIENT ALERT! \ud83d\udea8\n\n*Client:* {{ $json.clientName }}\n*Value:* ${{ $json.estimatedValue }}\n*Industry:* {{ $json.industry }}\n\nThis is a priority opportunity requiring immediate attention!\n\n<https://docs.google.com/document/d/{{ $('Create Google Doc Proposal').item.json.documentId }}|View Proposal>",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Workflow Configuration').item.json.slackChannel }}"
        },
        "otherOptions": {}
      },
      "typeVersion": 2.4
    },
    {
      "id": "019c55bc-bfac-4781-8214-03f786dd26a4",
      "name": "Schedule Follow-up Reminder",
      "type": "n8n-nodes-base.gmail",
      "position": [
        3168,
        -64
      ],
      "parameters": {
        "sendTo": "={{ $('Workflow Configuration').item.json.adminEmail }}",
        "message": "=High-value client proposal has been sent.\n\nClient: {{ $json.clientName }}\nValue: ${{ $json.estimatedValue }}\nIndustry: {{ $json.industry }}\n\nPlease schedule a follow-up call within 48 hours.\n\nProposal Link: https://docs.google.com/document/d/{{ $('Create Google Doc Proposal').item.json.documentId }}",
        "options": {},
        "subject": "=PRIORITY: Follow-up Required - {{ $json.clientName }}"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "ff4fdeb4-4728-4637-a937-7f511f458984",
      "name": "On Workflow Error",
      "type": "n8n-nodes-base.errorTrigger",
      "position": [
        336,
        208
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "4c96943c-5351-448a-8bf3-7c7d841a94fc",
      "name": "Error Alert to Admin",
      "type": "n8n-nodes-base.slack",
      "position": [
        592,
        208
      ],
      "parameters": {
        "text": "=\u26a0\ufe0f WORKFLOW ERROR ALERT\n\n*Workflow:* Proposal Generation\n*Error Node:* {{ $json.node?.name || \"Unknown\" }}\n*Error Message:* {{ $json.error?.message || \"Proposal creation failed\" }}\n*Time:* {{ $now.format(\"YYYY-MM-DD HH:mm:ss\") }}\n\nPlease investigate immediately.",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "id",
          "value": "<__PLACEHOLDER_VALUE__Slack Channel ID__>"
        },
        "otherOptions": {}
      },
      "typeVersion": 2.4
    },
    {
      "id": "28f9c9db-e3cf-4655-a05f-2f792404865f",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -176,
        -160
      ],
      "parameters": {
        "width": 432,
        "height": 528,
        "content": "## Main\nThis workflow automates proposal and contract generation for consulting firms, agencies, or freelancers. It takes client information from Google Sheets or a CRM, uses AI to generate a customized proposal, creates a PDF, sends it to the client via email, optionally integrates with DocuSign/PandaDoc for signatures, logs the activity in Sheets, and notifies your team via Slack. High-value clients trigger additional follow-ups.\n\n## Setup\n1. Connect Google Sheets for client data input.\n2. Set up Gmail or Outlook credentials for sending emails.\n3. Configure Slack channel for notifications.\n4. Connect OpenAI for proposal generation.\n5. Optional: Configure DocuSign/PandaDoc API for e-signature automation.\n6. Adjust decision logic in IF nodes for high-value client handling.\n7. Test workflow with a sample client entry to ensure all routes work.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "2c059a5e-4a2d-4a19-93f8-a7dd759a426d",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        304,
        -240
      ],
      "parameters": {
        "color": 7,
        "width": 656,
        "height": 352,
        "content": "## Trigger & Setup"
      },
      "typeVersion": 1
    },
    {
      "id": "62ab8e13-b225-40f5-b6a9-60ee4024e939",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        976,
        -240
      ],
      "parameters": {
        "color": 7,
        "width": 784,
        "height": 352,
        "content": "## AI Logic"
      },
      "typeVersion": 1
    },
    {
      "id": "6960acf8-20a3-4b0d-a7b2-70543557aa5a",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1776,
        -240
      ],
      "parameters": {
        "color": 7,
        "width": 640,
        "height": 352,
        "content": "## Send Proposal"
      },
      "typeVersion": 1
    },
    {
      "id": "80150b05-8ee7-4913-98f4-42f235aade2d",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2432,
        -240
      ],
      "parameters": {
        "color": 7,
        "width": 928,
        "height": 352,
        "content": "## Notify Team"
      },
      "typeVersion": 1
    },
    {
      "id": "ce0143cf-e02d-40f4-90f0-1b659d15263e",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        288,
        128
      ],
      "parameters": {
        "color": 7,
        "width": 672,
        "height": 352,
        "content": "## Error"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "05bbc552-a4b1-4114-a673-6f418b9a1944",
  "connections": {
    "On Workflow Error": {
      "main": [
        [
          {
            "node": "Error Alert to Admin",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Convert Doc to PDF": {
      "main": [
        [
          {
            "node": "Send Proposal via Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Log Proposal Creation": {
      "main": [
        [
          {
            "node": "Notify Team - Standard",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Normalize Client Data": {
      "main": [
        [
          {
            "node": "Generate Proposal Content",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Notify Team - Standard": {
      "main": [
        [
          {
            "node": "Check if High-Value Client",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Workflow Configuration": {
      "main": [
        [
          {
            "node": "Normalize Client Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Proposal via Email": {
      "main": [
        [
          {
            "node": "Send to DocuSign for Signature",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "New Client Entry Trigger": {
      "main": [
        [
          {
            "node": "Workflow Configuration",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Proposal Content": {
      "main": [
        [
          {
            "node": "Create Google Doc Proposal",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check if High-Value Client": {
      "main": [
        [
          {
            "node": "Priority Slack Notification",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Google Doc Proposal": {
      "main": [
        [
          {
            "node": "Convert Doc to PDF",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Priority Slack Notification": {
      "main": [
        [
          {
            "node": "Schedule Follow-up Reminder",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send to DocuSign for Signature": {
      "main": [
        [
          {
            "node": "Log Proposal Creation",
            "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.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Consultants, agencies, freelancers, and professional service firms who need to create customized proposals and contracts quickly and efficiently.

Source: https://n8n.io/workflows/12959/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

Complete AI-powered sales system Automates lead capture, qualification, and follow-up from multiple channels. AI INTELLIGENCE:

Gmail Trigger, Google Sheets, OpenAI +3
AI & RAG

Imagine a dedicated financial expert tirelessly working behind the scenes, sifting through every transaction, every investment move, and every accounting entry. That's exactly what this automated syst

HTTP Request, Google Sheets, OpenAI +3
AI & RAG

Overview

Gmail Trigger, Google Drive, OpenAI +4
AI & RAG

Small teams, solo operators, and security-conscious individuals who receive email attachments from external senders. Useful for freelancers, agencies, HR teams, and anyone handling CVs, invoices, or d

Gmail Trigger, HTTP Request, OpenAI +4
AI & RAG

This workflow automatically handles new GitHub issues by reading and understanding them using AI, then taking multiple actions simultaneously — creating tasks, sending notifications, and keeping every

Github Trigger, Slack, OpenAI +5