Google Sheets to Google Docs, proposals ready to send
Proposal writing gets messy fast. One “quick” custom doc turns into copy-paste from old projects, half-remembered pricing, and last-minute formatting that somehow always breaks in the PDF.
This is where Sheets Docs proposals automation pays off. Agency owners feel it when leads pile up, sales reps feel it when they’re chasing approvals, and consultants feel it when every project needs a “fresh” proposal that’s basically the same as the last one.
This workflow turns a new Google Sheets row into a branded Google Docs proposal, exports it to PDF, and files it in Google Drive. You’ll see what it does, what you need, and how to get reliable results without babysitting the process.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Sheets to Google Docs, proposals ready to send
flowchart LR
subgraph sg0["Trigger: New Sheet Row Flow"]
direction LR
n0@{ icon: "mdi:memory", form: "rounded", label: "Memory: Client Context", pos: "b", h: 48 }
n1@{ icon: "mdi:robot", form: "rounded", label: "AI Agent: Generate Proposal", pos: "b", h: 48 }
n2@{ icon: "mdi:play-circle", form: "rounded", label: "Trigger: New Sheet Row", pos: "b", h: 48 }
n3@{ icon: "mdi:brain", form: "rounded", label: "Model: GPT-4o", pos: "b", h: 48 }
n4@{ icon: "mdi:robot", form: "rounded", label: "Parser: JSON Output", pos: "b", h: 48 }
n5@{ icon: "mdi:cog", form: "rounded", label: "Populate: Template Document", pos: "b", h: 48 }
n6@{ icon: "mdi:cog", form: "rounded", label: "Download: Completed Proposal", pos: "b", h: 48 }
n7@{ icon: "mdi:cog", form: "rounded", label: "Archive: Save to Drive", pos: "b", h: 48 }
n8@{ icon: "mdi:cog", form: "rounded", label: "Reset: Template Placeholders", pos: "b", h: 48 }
n9["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Filter: Latest Row Only"]
n3 -.-> n1
n4 -.-> n1
n7 --> n8
n0 -.-> n1
n2 --> n9
n9 --> n1
n1 --> n5
n5 --> n6
n6 --> n7
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n2 trigger
class n1,n4 ai
class n3 aiModel
class n0 ai
class n9 code
classDef customIcon fill:none,stroke:none
class n9 customIcon
The Problem: Proposals Take Too Long (and Still Look Rushed)
Most teams don’t lose deals because their service is bad. They lose momentum because proposals take forever to produce, and the “final” version still needs edits. A single request can mean pulling client notes from one place, scope details from another, then rewriting the same sections you wrote last week. And when you’re under time pressure, consistency disappears. Pricing tables drift, timelines get vague, and the executive summary ends up sounding like a template (because it is).
The friction compounds. It shows up in speed, quality, and follow-through.
- Copying details from an intake form into a doc usually takes about 20 minutes, and that’s before you write anything.
- Every manual proposal has “micro-errors” (wrong company name, outdated scope wording), which creates awkward back-and-forth.
- Brand consistency slips when different people reuse different old documents as their starting point.
- Filing and naming PDFs is easy to skip, so later you can’t find the version you actually sent.
The Solution: New Sheet Row → Branded Proposal PDF, Automatically
This workflow watches a Google Sheet for new rows (think: a simple intake sheet your team already uses). When a new entry lands, it grabs only the latest row so you don’t accidentally regenerate older proposals. Then an AI agent powered by OpenAI GPT-4o drafts a structured proposal using the details you captured, such as clientName and jobDescription. The AI output is forced into a clean JSON format, which matters because it keeps each section mapped to the right placeholder.
Next, n8n fills a Google Docs template using your placeholders (executive summary, scope, costing, timeline, conclusion). The finished document is exported as a PDF, archived into a specific Google Drive folder, and the template fields are restored so the next proposal starts from a clean slate. No “why did the last client’s scope show up?” surprises.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you send 10 proposals a week. Manually, even a “repeatable” proposal usually takes about 60 minutes to draft, format, export to PDF, and file correctly in Drive, which is roughly 10 hours weekly. With this workflow, you add one row to Google Sheets (about 2 minutes), then wait a few minutes for the AI drafting and PDF export to finish. You still review before sending, but you get most of that 10 hours back for higher-value work.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets to capture client name and job details.
- Google Docs for your branded proposal template.
- Google Drive to store the exported PDF proposals.
- OpenAI API key (get it from your OpenAI dashboard)
Skill level: Intermediate. You’ll connect accounts, set IDs for your Sheet/Doc/Drive folder, and lightly adjust an AI prompt.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A new intake row appears in Google Sheets. The trigger watches for new rows so your team can keep using a simple sheet as the “source of truth.”
The workflow isolates the latest entry. A small selection step ensures you generate one proposal per new submission, rather than reprocessing older rows when the trigger runs.
GPT-4o drafts structured proposal sections. The AI agent uses your client context (name and job description) to write an executive summary, scope of work, costing, timeline, and conclusion. Then the JSON parser validates the structure so each section lands in the right place.
A Google Doc gets filled, exported, and filed. n8n replaces placeholders in your Google Docs template, exports the finished proposal as a PDF, and archives it to a designated Google Drive folder. After that, it restores the template fields for the next run.
You can easily modify the proposal sections to match your offer and tone based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Sheet Row Trigger
Set up the workflow to watch your proposal intake sheet and fire when a new row is added.
- Add the Sheet Row Trigger node and open its configuration.
- Set Document to your sheet ID:
YOUR_GOOGLE_SHEET_ID. - Set Sheet to
Sheet1(gid=0). - Keep the poll schedule as Every Minute to check for new rows.
- Credential Required: Connect your Google Sheets credentials (this node currently has none configured).
Step 2: Connect Google Sheets
Ensure the input sheet contains the fields used downstream for proposal generation.
- Confirm the sheet includes columns for clientName and jobDescription (used in Proposal Drafting Agent).
- Test a manual run of Sheet Row Trigger to verify it pulls the latest row correctly.
- Credential Required: Connect your Google Sheets credentials (if not already set in Step 1).
Step 3: Set Up Proposal Drafting Agent
Configure AI generation and parsing to produce structured proposal content from the latest sheet entry.
- In Select Latest Entry, keep the default JavaScript Code that returns only the last row.
- Open Proposal Drafting Agent and set Text to the existing prompt that references
{{$json.jobDescription}}and{{$json.clientName}}. - Confirm Prompt Type is set to
defineand Has Output Parser is enabled. - Attach GPT-4o Chat Model as the language model with Model set to
gpt-4oand Temperature set to0.7. - Attach JSON Schema Parser with the provided schema example for structured output.
- Attach Client Context Memory and set Session Key to
="proposal_" + $('Sheet Row Trigger').item.json.clientName. - Credential Required: Connect your OpenAI credentials in GPT-4o Chat Model (AI sub-nodes like JSON Schema Parser and Client Context Memory inherit credentials from the parent Proposal Drafting Agent).
Step 4: Configure Output and Drive Archiving
Populate your Google Docs template, export the finished proposal, then archive the file to Drive.
- In Fill Doc Template, set Operation to
updateand Document URL toYOUR_TEMPLATE_DOCUMENT_ID. - Verify each replace action matches the output fields, e.g., Replace Text for
{{executive_summary}}is={{ $json.output.executive_summary }}. - In Download Proposal File, set Operation to
downloadand File ID to={{ $json.documentId }}. - In Archive to Drive Folder, set Folder ID to
YOUR_OUTPUT_FOLDER_IDand Name to={{ $('Sheet Row Trigger').item.json.clientName + '_Proposal_' + $now.format('yyyy-MM-dd') }}. - In Restore Template Fields, keep the reverse replacements to restore
{{executive_summary}},{{scope_of_work}},{{timeline}}, and the cost fields for template reusability. - Credential Required: Connect your Google Docs credentials for Fill Doc Template and Restore Template Fields.
- Credential Required: Connect your Google Drive credentials for Download Proposal File and Archive to Drive Folder.
YOUR_TEMPLATE_DOCUMENT_ID or YOUR_OUTPUT_FOLDER_ID unchanged, the workflow will fail when trying to update or archive the document.
Step 5: Test and Activate Your Workflow
Validate the end-to-end proposal generation and turn on the automation.
- Click Execute Workflow and add a test row in the sheet with clientName and jobDescription.
- Confirm Select Latest Entry outputs only the last row.
- Verify Proposal Drafting Agent returns structured JSON with fields like
executive_summary,scope_of_work, andtotal_cost. - Check that Fill Doc Template updates the Google Doc and Download Proposal File retrieves it successfully.
- Confirm the final file is saved by Archive to Drive Folder and the template is reset by Restore Template Fields.
- Toggle the workflow to Active to enable continuous proposal generation.
Common Gotchas
- Google Docs credentials can expire or need specific permissions. If things break, check the n8n credential connection status and the sharing permissions on the template document first.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Frequently Asked Questions
About 30 minutes if your template and sheet are already prepared.
No. You’ll mostly connect Google and OpenAI accounts and paste in your template placeholders. The only “logic” part is choosing which columns map to which sections.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in OpenAI API costs, which are usually a few cents per proposal depending on length.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, and you should. You can adjust the AI agent instructions to produce different sections (for example: “Retainer Options” or “Case Studies”), then update the JSON schema parser so the output stays structured. From there, swap or add placeholders in the Google Docs “Fill Doc Template” step to match your new sections. Many teams also customize tone by adding a short brand voice note and a couple of example proposals.
Usually it’s expired Google credentials or the template Doc is in a Drive location your connected account can’t access. Reconnect the Google Docs/Drive credential in n8n, then confirm the template is shared with that same Google account. If it fails only on export, check Drive API access and make sure the workflow can create files in your target folder.
If you self-host, there’s no fixed execution limit (it depends on your server). On n8n Cloud, your monthly execution limit depends on your plan, but this workflow is lightweight and typically handles dozens of proposals per day comfortably.
Often, yes. This flow benefits from structured AI output (JSON validation), multi-step document handling, and the option to self-host so you’re not paying per tiny step. Zapier or Make can be simpler for basic “row added → send email” tasks, but they get pricey when you add AI generation plus document export and filing. n8n also makes it easier to keep everything in one workflow, with clearer debugging when something fails. If you’re on the fence, Talk to an automation expert and we’ll help you choose based on volume and complexity.
Once this is live, proposals stop being a bottleneck. The workflow handles the repeatable parts so you can focus on tailoring the offer and closing the deal.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.