AutomationFlowsAI & RAG › Generate Business Proposals with Gpt-4o, Google Sheets and Google Docs

Generate Business Proposals with Gpt-4o, Google Sheets and Google Docs

ByRahul Joshi @rahul08 on n8n.io

Automate your client proposal creation with this intelligent workflow that transforms Google Sheets entries into professional Google Docs proposals using OpenAI GPT-4o. Designed for agencies and sales teams, it delivers personalized, branded, and structured proposals in minutes…

Event trigger★★★★☆ complexityAI-powered16 nodesMemory Buffer WindowAgentGoogle Sheets TriggerOpenAI ChatOutput Parser StructuredGoogle DocsGoogle Drive
AI & RAG Trigger: Event Nodes: 16 Complexity: ★★★★☆ AI nodes: yes Added:

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

This workflow follows the Agent → Google Docs 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": "Lim9HD2pvEN6vAIe",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Generate AI-Powered Business Proposals from Google Sheets to Google Docs Automatically",
  "tags": [],
  "nodes": [
    {
      "id": "27862039-1480-43c0-a29b-e96940aad676",
      "name": "Workflow Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1440,
        -224
      ],
      "parameters": {
        "color": 5,
        "width": 386,
        "height": 576,
        "content": "## \ud83c\udfaf AI-Powered Proposal Generator Workflow\n\n**Purpose:** Automatically generates professional business proposals from Google Sheets data using AI\n\n**Key Features:**\n- Triggers on new Google Sheets rows\n- Uses OpenAI GPT-4o for intelligent content generation\n- Structured output with JSON schema validation\n- Automated Google Docs population\n- File management and archiving\n\n**Use Case:** Perfect for agencies generating client proposals at scale\n\n**Requirements:**\n- Google Sheets with columns: clientName, jobDescription\n- Google Docs template with placeholders\n- OpenAI API key\n- Google Drive folder for output\n\n**Flow:** Trigger \u2192 Process \u2192 Generate \u2192 Populate \u2192 Download \u2192 Archive \u2192 Reset"
      },
      "typeVersion": 1
    },
    {
      "id": "370827ff-0b85-4489-92bc-23dbc5182112",
      "name": "Trigger Instructions",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1040,
        -272
      ],
      "parameters": {
        "width": 280,
        "height": 288,
        "content": "## \ud83d\udce5 Step 1: Trigger Setup\n\n**Configure your Google Sheet:**\n- Column A: `clientName`\n- Column B: `jobDescription`\n\n**Replace with YOUR Sheet ID** (don't use hardcoded IDs in templates)\n\n**Polling:** Checks every minute for new rows"
      },
      "typeVersion": 1
    },
    {
      "id": "1393c26b-8979-4df5-b577-55f54f4d6517",
      "name": "Data Filter Guide",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -784,
        176
      ],
      "parameters": {
        "width": 280,
        "height": 232,
        "content": "## \ud83d\udd04 Step 2: Data Processing\n\n**Purpose:** Filters only the last appended row\n\n**Why?** Google Sheets trigger may return multiple rows. This ensures we process only the newest entry."
      },
      "typeVersion": 1
    },
    {
      "id": "5cccf135-cd79-4a6c-a286-f9cd41a9367b",
      "name": "AI Components Guide",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -416,
        -352
      ],
      "parameters": {
        "width": 320,
        "height": 364,
        "content": "## \ud83e\udd16 Step 3: AI Generation\n\n**Components:**\n- **Agent:** Orchestrates the generation\n- **Memory:** Maintains context per client\n- **Parser:** Ensures JSON output format\n- **Model:** GPT-4o (temperature: 0.7)\n\n**Output Fields:**\n- Executive Summary\n- Scope of Work (formatted)\n- 4-month costing breakdown\n- Timeline & Conclusion\n\n**Customize:** Adjust system prompt for your brand voice"
      },
      "typeVersion": 1
    },
    {
      "id": "76079566-7068-4264-902f-4972027a4b04",
      "name": "Document Setup Guide",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        32,
        208
      ],
      "parameters": {
        "width": 300,
        "height": 432,
        "content": "## \ud83d\udcdd Step 4: Document Population\n\n**Setup Required:**\n1. Create Google Docs template\n2. Add placeholders: `{{executive_summary}}`, `{{scope_of_work}}`, etc.\n3. Replace Document ID in node settings\n\n**Placeholders:**\n- `{{executive_summary}}`\n- `{{scope_of_work}}`\n- `{{month1_focus}}` to `{{month4_focus}}`\n- `{{month1_cost}}` to `{{month4_cost}}`\n- `{{total_cost}}`\n- `{{timeline}}`\n- `{{conclusion}}`"
      },
      "typeVersion": 1
    },
    {
      "id": "4c21284b-9934-48d5-9c24-f6f966c907aa",
      "name": "File Operations Guide",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        352,
        -304
      ],
      "parameters": {
        "width": 280,
        "height": 320,
        "content": "## \ud83d\udcbe Step 5: File Management\n\n**Process:**\n1. Download populated document as PDF\n2. Upload to designated Drive folder\n3. Reset template for next use\n\n**Configure:**\n- Set your output folder ID\n- Customize file naming (optional)"
      },
      "typeVersion": 1
    },
    {
      "id": "6701d2dc-21f8-418a-96ce-77fe5941e956",
      "name": "Memory: Client Context",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "position": [
        -288,
        256
      ],
      "parameters": {
        "sessionKey": "=\"proposal_\" + $('Trigger: New Sheet Row').item.json.clientName",
        "sessionIdType": "customKey"
      },
      "typeVersion": 1.3
    },
    {
      "id": "464cf18b-ed47-41a4-8075-5b0aee4c1ff2",
      "name": "AI Agent: Generate Proposal",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -368,
        32
      ],
      "parameters": {
        "text": "=Job Description:\n{{ $json.jobDescription }}\n\nClient Name:\n{{ $json.clientName }}\n\nTask:\nGenerate a complete, professional business proposal for {{ $json.clientName }} based on the job description above.\n\nRequirements:\n\u2713 Analyze the job requirements carefully\n\u2713 Create a tailored executive summary (150-250 words)\n\u2713 Develop 4-6 detailed scope of work sections with specific deliverables\n\u2713 Provide realistic 4-month cost breakdown in INR (format: \u20b9XX,XXX)\n\u2713 Include implementation timeline description\n\u2713 Write a professional conclusion with contact details\n\nGenerate the proposal content now in the exact JSON format specified.",
        "options": {
          "systemMessage": "=You are an expert proposal writer for [YOUR COMPANY NAME].\n\nYou will generate complete, professional proposal content for a Google Docs template.\n\nThe Google Doc has these sections:\n- Executive Summary\n- Scope Of Work\n- Costing (table format)\n- Timeline\n- Conclusion\n\nStyle Guidelines:\n\u2713 Professional, confident, and persuasive tone\n\u2713 Clear and concise language suitable for business proposals\n\u2713 Match the style and format of professional SEO/development proposals\n\u2713 Use proper formatting that renders correctly in Google Docs\n\nCRITICAL FORMATTING RULES:\n\n1. **Executive Summary** (2-3 paragraphs, 150-250 words):\n   - Write flowing paragraphs separated by blank lines\n   - No bullets or numbers\n   - Professional, engaging introduction\n\n2. **Scope of Work** (4-6 main sections):\n   - Format EXACTLY like this:\n   \n   1. Section Title\n   \u25cf First deliverable point\n   \u25cf Second deliverable point\n   \u25cf Third deliverable point\n   \n   2. Next Section Title\n   \u25cf First deliverable point\n   \u25cf Second deliverable point\n   \n   - Use actual bullet character: \u25cf\n   - Add blank line between sections\n   - Each bullet should be a complete, clear deliverable\n   - 3-6 bullets per section\n\n3. **Costing** - Generate as separate fields:\n   - month1_focus: Brief description (e.g., \"Technical SEO + Setup\")\n   - month1_cost: Amount with \u20b9 symbol (e.g., \"\u20b91,50,000\")\n   - Repeat for months 2, 3, 4\n   - total_cost: Total amount\n\n4. **Timeline** (2-3 sentences, 100-150 words):\n   - Describe the 4-month execution plan\n   - Professional paragraph format\n   - Mention structured delivery and communication\n\n5. **Conclusion** (60-100 words):\n   - Professional closing paragraph\n   - Express eagerness to collaborate\n   - Include contact: [YOUR_EMAIL], [YOUR_PHONE]\n   - Mention proposal validity: 30 days\n\nOUTPUT FORMAT:\nReturn ONLY valid JSON with these exact fields:\n{\n  \"executive_summary\": \"Paragraph 1 text here.\\n\\nParagraph 2 text here.\\n\\nParagraph 3 text here.\",\n  \"scope_of_work\": \"1. Section Title\\n\u25cf Deliverable one\\n\u25cf Deliverable two\\n\u25cf Deliverable three\\n\\n2. Next Section\\n\u25cf Deliverable one\\n\u25cf Deliverable two\",\n  \"month1_focus\": \"Focus area description\",\n  \"month1_cost\": \"\u20b9X,XX,XXX\",\n  \"month2_focus\": \"Focus area description\",\n  \"month2_cost\": \"\u20b9X,XX,XXX\",\n  \"month3_focus\": \"Focus area description\",\n  \"month3_cost\": \"\u20b9X,XX,XXX\",\n  \"month4_focus\": \"Focus area description\",\n  \"month4_cost\": \"\u20b9X,XX,XXX\",\n  \"total_cost\": \"\u20b9X,XX,XXX\",\n  \"timeline\": \"Timeline description paragraph.\",\n  \"conclusion\": \"Closing paragraph with contact details.\"\n}\n\nIMPORTANT:\n- Use \\n for single line break\n- Use \\n\\n for paragraph break\n- Use actual \u25cf character for bullets (not asterisk or dash)\n- Never use markdown formatting\n- Ensure costs are realistic for 4-month engagements (\u20b91,20,000 - \u20b97,00,000 range)\n- Match the professional tone of the reference SEO proposal"
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 2.1
    },
    {
      "id": "fe0185ea-bd06-4a26-9299-5e0a107721ee",
      "name": "Trigger: New Sheet Row",
      "type": "n8n-nodes-base.googleSheetsTrigger",
      "position": [
        -864,
        32
      ],
      "parameters": {
        "options": {},
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR_GOOGLE_SHEET_ID",
          "cachedResultName": "Proposal Input Sheet"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "f7977e27-0016-4c9b-b4b4-da5bc31a5e5f",
      "name": "Model: GPT-4o",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        -416,
        256
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o",
          "cachedResultName": "gpt-4o"
        },
        "options": {
          "temperature": 0.7
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "c70c2f9e-e563-475d-91f4-c40fc2170681",
      "name": "Parser: JSON Output",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        -160,
        256
      ],
      "parameters": {
        "jsonSchemaExample": "{\n    \"executive_summary\": \"Professional summary paragraph\",\n    \"scope_of_work\": \"1. Section\\\\n\u25cf Item\\\\n\u25cf Item\\\\n\\\\n2. Section\\\\n\u25cf Item\",\n    \"month1_focus\": \"Discovery & Planning\",\n    \"month1_cost\": \"\u20b91,50,000\",\n    \"month2_focus\": \"Development\",\n    \"month2_cost\": \"\u20b92,00,000\",\n    \"month3_focus\": \"Integration\",\n    \"month3_cost\": \"\u20b91,80,000\",\n    \"month4_focus\": \"Deployment\",\n    \"month4_cost\": \"\u20b91,70,000\",\n    \"total_cost\": \"\u20b97,00,000\",\n    \"timeline\": \"Timeline description\",\n    \"conclusion\": \"Closing with contact info\"\n  }"
      },
      "typeVersion": 1.3
    },
    {
      "id": "fc54a244-22a4-4149-b63b-022dc7b8471a",
      "name": "Populate: Template Document",
      "type": "n8n-nodes-base.googleDocs",
      "position": [
        64,
        32
      ],
      "parameters": {
        "actionsUi": {
          "actionFields": [
            {
              "text": "{{executive_summary}}",
              "action": "replaceAll",
              "replaceText": "={{ $json.output.executive_summary }}"
            },
            {
              "text": "{{scope_of_work}}",
              "action": "replaceAll",
              "replaceText": "={{ $json.output.scope_of_work }}"
            },
            {
              "text": "{{timeline}}",
              "action": "replaceAll",
              "replaceText": "={{ $json.output.timeline }}"
            },
            {
              "text": "{{conclusion}}",
              "action": "replaceAll",
              "replaceText": "={{ $json.output.conclusion }}"
            },
            {
              "text": "{{month1_focus}}",
              "action": "replaceAll",
              "replaceText": "={{ $json.output.month1_focus }}"
            },
            {
              "text": "{{month1_cost}}",
              "action": "replaceAll",
              "replaceText": "={{ $json.output.month1_cost }}"
            },
            {
              "text": "{{month2_focus}}",
              "action": "replaceAll",
              "replaceText": "={{ $json.output.month2_focus }}"
            },
            {
              "text": "{{month2_cost}}",
              "action": "replaceAll",
              "replaceText": "={{ $json.output.month2_cost }}"
            },
            {
              "text": "{{month3_focus}}",
              "action": "replaceAll",
              "replaceText": "={{ $json.output.month3_focus }}"
            },
            {
              "text": "{{month3_cost}}",
              "action": "replaceAll",
              "replaceText": "={{ $json.output.month3_cost }}"
            },
            {
              "text": "{{month4_focus}}",
              "action": "replaceAll",
              "replaceText": "={{ $json.output.month4_focus }}"
            },
            {
              "text": "{{month4_cost}}",
              "action": "replaceAll",
              "replaceText": "={{ $json.output.month4_cost }}"
            },
            {
              "text": "{{total_cost}}",
              "action": "replaceAll",
              "replaceText": "={{ $json.output.total_cost }}"
            }
          ]
        },
        "operation": "update",
        "documentURL": "YOUR_TEMPLATE_DOCUMENT_ID"
      },
      "typeVersion": 2
    },
    {
      "id": "686245ec-056d-47de-a147-ce81478c9db7",
      "name": "Download: Completed Proposal",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        288,
        32
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $json.documentId }}"
        },
        "options": {},
        "operation": "download"
      },
      "typeVersion": 3
    },
    {
      "id": "91212aab-6097-471b-83fb-beeec786381a",
      "name": "Archive: Save to Drive",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        512,
        32
      ],
      "parameters": {
        "name": "={{ $('Trigger: New Sheet Row').item.json.clientName + '_Proposal_' + $now.format('yyyy-MM-dd') }}",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "options": {},
        "folderId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR_OUTPUT_FOLDER_ID",
          "cachedResultUrl": "https://drive.google.com/drive/folders/",
          "cachedResultName": "Proposals Output"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "aecc7cee-e436-4813-ac5c-c8cd86bf7d12",
      "name": "Reset: Template Placeholders",
      "type": "n8n-nodes-base.googleDocs",
      "position": [
        736,
        32
      ],
      "parameters": {
        "actionsUi": {
          "actionFields": [
            {
              "text": "={{ $('AI Agent: Generate Proposal').item.json.output.executive_summary }}",
              "action": "replaceAll",
              "replaceText": "{{executive_summary}}"
            },
            {
              "text": "={{ $('AI Agent: Generate Proposal').item.json.output.scope_of_work }}",
              "action": "replaceAll",
              "replaceText": "{{scope_of_work}}"
            },
            {
              "text": "={{ $('AI Agent: Generate Proposal').item.json.output.timeline }}",
              "action": "replaceAll",
              "replaceText": "{{timeline}}"
            },
            {
              "text": "={{ $('AI Agent: Generate Proposal').item.json.output.conclusion }}",
              "action": "replaceAll",
              "replaceText": "{{conclusion}}"
            },
            {
              "text": "={{ $('AI Agent: Generate Proposal').item.json.output.month1_focus }}",
              "action": "replaceAll",
              "replaceText": "{{month1_focus}}"
            },
            {
              "text": "={{ $('AI Agent: Generate Proposal').item.json.output.month1_cost }}",
              "action": "replaceAll",
              "replaceText": "{{month1_cost}}"
            },
            {
              "text": "={{ $('AI Agent: Generate Proposal').item.json.output.month2_focus }}",
              "action": "replaceAll",
              "replaceText": "{{month2_focus}}"
            },
            {
              "text": "={{ $('AI Agent: Generate Proposal').item.json.output.month2_cost }}",
              "action": "replaceAll",
              "replaceText": "{{month2_cost}}"
            },
            {
              "text": "={{ $('AI Agent: Generate Proposal').item.json.output.month3_focus }}",
              "action": "replaceAll",
              "replaceText": "{{month3_focus}}"
            },
            {
              "text": "={{ $('AI Agent: Generate Proposal').item.json.output.month3_cost }}",
              "action": "replaceAll",
              "replaceText": "{{month3_cost}}"
            },
            {
              "text": "={{ $('AI Agent: Generate Proposal').item.json.output.month4_focus }}",
              "action": "replaceAll",
              "replaceText": "{{month4_focus}}"
            },
            {
              "text": "={{ $('AI Agent: Generate Proposal').item.json.output.month4_cost }}",
              "action": "replaceAll",
              "replaceText": "{{month4_cost}}"
            },
            {
              "text": "={{ $('AI Agent: Generate Proposal').item.json.output.total_cost }}",
              "action": "replaceAll",
              "replaceText": "{{total_cost}}"
            }
          ]
        },
        "operation": "update",
        "documentURL": "YOUR_TEMPLATE_DOCUMENT_ID"
      },
      "typeVersion": 2
    },
    {
      "id": "aff26737-275a-4c7f-9c59-8df2d196d1b4",
      "name": "Filter: Latest Row Only",
      "type": "n8n-nodes-base.code",
      "position": [
        -640,
        32
      ],
      "parameters": {
        "jsCode": "// Filter to process only the last appended row\nconst items = $input.all();\n\nif (!items || items.length === 0) {\n  return [];\n}\n\n// Get the most recent entry\nconst lastItem = items[items.length - 1];\n\n// Return as single-item array\nreturn [{ json: lastItem.json }];"
      },
      "typeVersion": 2
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "2140343a-e97e-4439-befe-225b63a8595d",
  "connections": {
    "Model: GPT-4o": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent: Generate Proposal",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Parser: JSON Output": {
      "ai_outputParser": [
        [
          {
            "node": "AI Agent: Generate Proposal",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Archive: Save to Drive": {
      "main": [
        [
          {
            "node": "Reset: Template Placeholders",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Memory: Client Context": {
      "ai_memory": [
        [
          {
            "node": "AI Agent: Generate Proposal",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Trigger: New Sheet Row": {
      "main": [
        [
          {
            "node": "Filter: Latest Row Only",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter: Latest Row Only": {
      "main": [
        [
          {
            "node": "AI Agent: Generate Proposal",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent: Generate Proposal": {
      "main": [
        [
          {
            "node": "Populate: Template Document",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Populate: Template Document": {
      "main": [
        [
          {
            "node": "Download: Completed Proposal",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download: Completed Proposal": {
      "main": [
        [
          {
            "node": "Archive: Save to Drive",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Pro

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

About this workflow

Automate your client proposal creation with this intelligent workflow that transforms Google Sheets entries into professional Google Docs proposals using OpenAI GPT-4o. Designed for agencies and sales teams, it delivers personalized, branded, and structured proposals in minutes…

Source: https://n8n.io/workflows/10336/ — 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

The best content automation template in the market is now even better—with “deep research” on time-sensitive topics\! Unlike most n8n content automation templates that are mainly for “demo purposes,”

OpenAI, HTTP Request, XML +11
AI & RAG

This automation is designed to help you generate AI-powered music tracks, cover art, and fully rendered music videos — all triggered from a simple Telegram chat and managed via Google Sheets.

OpenAI Chat, Memory Buffer Window, Output Parser Structured +11
AI & RAG

Transcript Evalu8r V2 is a robust browser-based transcript analysis tool powered by Deepgram’s speech-to-text API and built into an n8n workflow template. This release introduces full in-browser audio

Google Drive Trigger, HTTP Request, Agent +5
AI & RAG

Transcript Evalu8r is an AI-powered transcript analysis workflow that automates the processing, visualization, and evaluation of transcribed conversations. This n8n workflow template is designed to he

Google Drive Trigger, HTTP Request, Agent +5
AI & RAG

This workflow contains community nodes that are only compatible with the self-hosted version of n8n.

Output Parser Structured, Telegram, N8N Nodes Tesseractjs +14