Google Slides + Gmail proposals, approved in Sheets
Proposals have a sneaky way of turning into rework. You draft something in a doc, copy it into slides, paste it into an email, then someone asks for “one small change,” and suddenly you’re hunting down the latest version again.
This proposal approval automation hits sales ops first, but freelancers sending retainers and agency teams pushing client SOWs feel the same friction. You want fast turnaround without sacrificing control, and you want a clear “approved” moment before anything gets sent.
This n8n workflow generates a proposal from a form, drafts the email, stores everything in Google Sheets for review, then sends a polished PDF through Gmail only when you mark it READY. Below, you’ll see exactly how it works, what you need, and what you can tweak.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Slides + Gmail proposals, approved in Sheets
flowchart LR
subgraph sg0["On form submission Flow"]
direction LR
n0["<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/form.svg' width='40' height='40' /></div><br/>On form submission"]
n3@{ icon: "mdi:robot", form: "rounded", label: "Generate Proposal Data", pos: "b", h: 48 }
n4["<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/>Parse Json for Proposal Data"]
n5@{ icon: "mdi:cog", form: "rounded", label: "Copy Template", pos: "b", h: 48 }
n6@{ icon: "mdi:cog", form: "rounded", label: "Move to Folder", pos: "b", h: 48 }
n7@{ icon: "mdi:cog", form: "rounded", label: "Inject generated Text", pos: "b", h: 48 }
n8@{ icon: "mdi:robot", form: "rounded", label: "Generate Email Draft", 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/>Parse Email Data"]
n10@{ icon: "mdi:database", form: "rounded", label: "Append In Database", pos: "b", h: 48 }
n5 --> n6
n6 --> n7
n9 --> n10
n0 --> n3
n8 --> n9
n7 --> n8
n3 --> n4
n4 --> n5
end
subgraph sg1["Google Sheets Flow"]
direction LR
n1@{ icon: "mdi:play-circle", form: "rounded", label: "Google Sheets Trigger", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n11@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter Ready Drafts", pos: "b", h: 48 }
n12@{ icon: "mdi:cog", form: "rounded", label: "Download Proposal in PDF", pos: "b", h: 48 }
n13@{ icon: "mdi:message-outline", form: "rounded", label: "Send Email", pos: "b", h: 48 }
n14@{ icon: "mdi:database", form: "rounded", label: "Update Status", pos: "b", h: 48 }
n13 --> n14
n14 --> n2
n2 --> n12
n11 --> n2
n1 --> n11
n12 --> n13
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 n0,n1 trigger
class n3,n8 ai
class n11 decision
class n10,n14 database
class n4,n9 code
classDef customIcon fill:none,stroke:none
class n0,n4,n9 customIcon
The Problem: Proposals Get Stuck in Draft Hell
When proposals are manual, “sending a proposal” is rarely one task. It’s collecting notes after a call, rewriting sections to match the client, formatting it so it looks like your brand, converting to PDF, then writing an email that doesn’t sound rushed. After that, you still need internal review, which usually lives in Slack threads and half-updated spreadsheets. The result is slow turnaround, avoidable mistakes, and that lingering worry that you sent the wrong file.
The friction compounds. Here’s where it breaks down most often.
- You rewrite the same core proposal sections over and over, which burns about 2 hours on a “simple” deal.
- Approvals are scattered across email and Slack, so “final” is a guess instead of a status.
- File naming and storage drift fast, and next month you cannot find what you sent.
- Manual PDF exports and Gmail attachments invite errors, especially when you’re rushing before end of day.
The Solution: Generate, Review, Approve, Then Send
This workflow turns proposals into a controlled pipeline instead of a messy scramble. It starts with an n8n Form that captures the essentials right after a sales call (client name, scope, timeline, pricing, and any notes). OpenAI then generates structured proposal content based on your prompts, and n8n copies your chosen Google Slides template to create a fresh proposal deck for that client. The workflow fills in the Slides placeholders, creates a tailored email draft, and logs everything into Google Sheets as a simple “database” with a clear status.
Nothing goes out automatically. You review the proposal link and email draft inside Sheets, make edits if you want, then flip the status to READY. Only then does n8n export the Slides file as a PDF, send it via Gmail, store it in Google Drive, and update the status to SENT so everyone knows it’s done.
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 careful process can take about 2 hours each (drafting, formatting in Slides, exporting PDF, writing the email, filing it), which is roughly 20 hours weekly. With this workflow, submitting the form takes maybe 5 minutes, generation and template fill runs in the background, and your review/approval in Google Sheets is often about 10 minutes. That’s closer to 2–3 hours a week total, not 20.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets for approval status and tracking.
- Google Slides to generate the proposal from a template.
- Gmail to send the PDF after approval.
- Google Drive to store templates and generated PDFs.
- OpenAI API key (get it from your OpenAI API settings page).
Skill level: Intermediate. You’ll connect Google credentials, paste a few IDs (Sheet, folder, template), and adjust prompts to match your voice.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A form submission kicks everything off. After a call (or whenever you’re ready), you submit an n8n Form with the deal details. That becomes the single source of truth for what the proposal should include.
AI turns those inputs into structured content. OpenAI generates the proposal sections in a predictable format, then n8n extracts the fields it needs (think: title, scope bullets, timeline, pricing, next steps) so they can be placed into a template without manual copying.
Google Slides becomes the “production file.” The workflow duplicates your Slides template, moves it into your “Generated Proposals” Drive folder, and fills in placeholders with the generated content. After that, it creates a matching email draft so you are not writing from scratch every time.
Google Sheets controls approval and sending. A row gets added to your tracker with the Slides link, the email draft, and a WAITING status. When you change status to READY, n8n exports the Slides deck as a PDF, sends it via Gmail, and updates the row to SENT.
You can easily modify the approval rules to include a second reviewer, or change the template selection to match different services. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Form Trigger
Set up the intake form that starts proposal generation when a client submits details.
- Add and open Form Intake Trigger.
- Set Form Title to
Client Proposal Builder. - Set Form Description to
Fill out this form to generate a customized client proposal. The proposal is created automatically based on your inputs, including scope, pricing, and deliverables.. - Confirm all form fields match the workflow (e.g., Client Email, Client Name, Problem, Solution, Scope, timeline, need, Price, payment link, context if any).
Step 2: Connect Google Sheets
Configure the spreadsheet that logs proposals and controls when emails are sent.
- Open Sheet Update Watcher and set Document ID to your spreadsheet ID (replace
[YOUR_ID]). - Set Sheet Name to
Sheet1and keep the poll time ateveryMinute. - Credential Required: Connect your googleSheetsTriggerOAuth2Api credentials in Sheet Update Watcher.
- Open Append Sheet Record and set Document ID to
[YOUR_ID]and Sheet Name toSheet1. - Map columns in Append Sheet Record, including Date to
{{$now}}, Email to{{$('Form Intake Trigger').first().json['Client Email']}}, Body Draft to{{$json.body}}, and Proposall Link to=https://docs.google.com/presentation/d/{{ $('Populate Slide Text').item.json.presentationId }}/edit. - Credential Required: Connect your googleSheetsOAuth2Api credentials in Append Sheet Record and Mark Status Sent.
Project Titile and Proposall Link.Step 3: Set Up Proposal Drafting with AI
Generate a structured proposal JSON from the form input.
- Open Draft Proposal Generator and verify the model is set to
gpt-5.1. - Confirm the system prompt and input mapping reference form fields such as
{{ $json['Client Name'] }},{{ $json.Problem }}, and{{ $json['payment link'] }}. - Credential Required: Connect your openAiApi credentials in Draft Proposal Generator.
- Open Extract Proposal JSON and keep the provided JavaScript that parses
$input.first().json.output[0].content[0].textinto JSON.
Step 4: Configure Slide Creation and File Management
Duplicate the proposal template, move it to the correct folder, and populate slide placeholders.
- Open Duplicate Slide Template and set File ID to your Slides template ID (replace
[YOUR_ID]). - Set Name in Duplicate Slide Template to
{{ $json.Title }}. - Credential Required: Connect your googleDriveOAuth2Api credentials in Duplicate Slide Template and Relocate File.
- In Relocate File, set Folder ID to
[YOUR_ID]and File ID to{{ $json.id }}to move the duplicated file. - Open Populate Slide Text and keep Presentation ID as
{{ $json.id }}. - Verify text replacements such as
{{title}}→{{ $('Extract Proposal JSON').item.json.Title }}and{{payment_link}}→{{ $('Extract Proposal JSON').item.json.PaymentLink }}. - Credential Required: Connect your googleSlidesOAuth2Api credentials in Populate Slide Text.
Step 5: Generate the Email Draft and Log the Proposal
Create an email draft from the proposal content and store it in Google Sheets.
- Open Compose Email Draft and confirm the model is set to
chatgpt-4o-latest. - Keep the input reference
{{ $('Draft Proposal Generator').first().json.output[0].content[0].text }}in the prompt. - Credential Required: Connect your openAiApi credentials in Compose Email Draft.
- Open Extract Email JSON and keep the parsing code to transform AI output into
subjectandbody. - In Append Sheet Record, ensure Send Status is set to
WAITINGso the watcher flow can pick it up later.
Step 6: Configure the Send-When-Ready Flow
Watch the sheet for READY rows, export the proposal PDF, email it, and mark it as SENT.
- Open Filter Ready Entries and confirm the condition:
{{ $json['Send Status'] }}equalsREADY. - In Batch Iterator, keep default settings to process READY rows iteratively.
- Open Export Proposal PDF and set File ID to
{{ $json['Proposall Link'] }}and File Name to{{ $json['Project Titile'] }}.pdf. - Credential Required: Connect your googleDriveOAuth2Api credentials in Export Proposal PDF.
- Open Dispatch Email and map Send To to
{{ $('Sheet Update Watcher').item.json.Email }}, Subject to{{ $('Sheet Update Watcher').item.json['Project Titile'] }}, and Message to{{ $('Sheet Update Watcher').item.json['Body Draft'] }}. - Credential Required: Connect your gmailOAuth2 credentials in Dispatch Email.
- In Mark Status Sent, update Send Status to
SENTwith matching column Email set to{{ $('Batch Iterator').item.json.Email }}.
Proposall Link URL. Ensure Populate Slide Text successfully outputs presentationId before the sheet is marked READY.Final Step: Test and Activate Your Workflow
Run end-to-end tests to confirm proposal creation, sheet logging, and email delivery.
- Use Form Intake Trigger to submit a sample proposal request and confirm Append Sheet Record creates a new row with
Send Statusset toWAITING. - Manually change the new row’s Send Status to
READYand verify Sheet Update Watcher captures the change. - Confirm Export Proposal PDF produces a PDF and Dispatch Email sends it to the client email.
- Verify Mark Status Sent updates the row to
SENT. - When everything works, toggle the workflow to Active for production use.
Common Gotchas
- Google credentials can expire or lack access to a specific Drive folder. If something breaks, check the credential in n8n and confirm the account can open the template and the destination folder.
- If you’re using batch processing (the Split in Batches loop) and exporting PDFs for multiple READY rows, processing times can vary. Increase the wait time or reduce batch size if the PDF export sometimes returns an empty file.
- OpenAI prompts that are too generic create bland proposals. Put your tone, structure, and “must-include” details into the proposal prompt early, or you’ll end up editing every single draft anyway.
Frequently Asked Questions
Plan for about an hour if your Google templates are ready.
No. You’ll mostly connect accounts and paste in a few IDs. The only “technical” part is tweaking the AI prompts, and that’s just editing text.
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 (for many teams, it’s a few dollars a month unless you generate a lot of long proposals).
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 it’s one of the best tweaks to make. You can swap the Slides template by changing the template ID used in the “Duplicate Slide Template” step, and you can add simple rules (like “service type = Template 2”) before that copy happens. Common customizations include separate templates per offer, different email tones per market, and extra approval statuses like NEEDS_EDIT or LEGAL_REVIEW.
Usually it’s the Google OAuth credential, not the Sheet itself. Make sure the same Google credential is selected across Sheets, Drive, Slides, and Gmail nodes, then confirm that Google account can actually open the tracker sheet in the browser. If you recently changed permissions on the Sheet or moved it into a shared drive, re-check access and reauthorize the credential.
A lot. On n8n Cloud, it depends on your plan’s execution limits, but most small teams can run hundreds of proposals a month comfortably. If you self-host, you’re mainly limited by your server and Google/OpenAI rate limits, and batching lets you pace the sends.
For approvals and document generation, n8n is usually the calmer choice because it handles multi-step logic, looping through READY rows, and richer data shaping without feeling bolted together. You also get the self-hosting option, which matters if you send a lot and don’t want per-task pricing surprises. Zapier or Make can still work if your flow is tiny, but Slides templating plus “only send when READY” tends to get complicated fast. Frankly, the review gate is where many simple automations fall apart. If you want help choosing, Talk to an automation expert.
Once this is running, proposals stop being a weekly time sink and become a repeatable, trackable system. The workflow handles the repetitive parts, so you can focus on the actual 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.