Google Sheets to Gmail, proposal drafts ready to send
Your “proposal process” probably isn’t a process. It’s a scramble. Someone copies deal notes from Google Sheets, pastes them into an email, rewrites the same sections again, then spends too long making it look professional.
This is where Sheets Gmail proposals automation pays off. Sales managers feel it first, because pipeline speed is their scoreboard. But agency leads and founders end up stuck in the same loop, too, especially when multiple deals hit “Proposal” at once.
This n8n workflow turns rows in Google Sheets into polished Gmail drafts using Azure OpenAI, so you can review, tweak a line or two, and send with confidence. Below, you’ll see how it works, what you need, and the real-world time you get back.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Sheets to Gmail, proposal drafts ready to send
flowchart LR
subgraph sg0["Manual Launch Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Manual Launch Trigger", pos: "b", h: 48 }
n1@{ icon: "mdi:database", form: "rounded", label: "Retrieve Sheet Rows", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Validate Proposal State", pos: "b", h: 48 }
n3@{ icon: "mdi:swap-vertical", form: "rounded", label: "Iterate Batch Items", pos: "b", h: 48 }
n4@{ icon: "mdi:robot", form: "rounded", label: "Language Agent", pos: "b", h: 48 }
n5["<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/>Transform Script"]
n6@{ icon: "mdi:message-outline", form: "rounded", label: "Compose Draft Email", pos: "b", h: 48 }
n7@{ icon: "mdi:brain", form: "rounded", label: "Azure Chat Model", pos: "b", h: 48 }
n5 --> n6
n4 --> n5
n3 --> n4
n1 --> n2
n2 --> n3
n7 -.-> n4
n0 --> n1
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 trigger
class n4 ai
class n7 aiModel
class n2 decision
class n1 database
class n5 code
classDef customIcon fill:none,stroke:none
class n5 customIcon
The Problem: Proposals Get Stuck in Draft Hell
When proposals are built manually, speed and quality fight each other. You either send something fast that feels rushed, or you polish it so much the lead goes cold. The worst part is the mental load: every proposal starts with “What do we include again?” then turns into a formatting session inside Gmail. And if two people write proposals differently, your company voice shifts from deal to deal, which quietly erodes trust.
It adds up fast. Here’s where it breaks down in day-to-day work.
- Copying fields like scope, pricing, and timelines from Google Sheets into Gmail burns about 20 minutes per proposal, even when you “already have a template.”
- People forget sections, so you end up with back-and-forth like “Can you add deliverables?” after the proposal is already sent.
- Formatting gets inconsistent, which makes the proposal feel less credible than it should.
- When leads move to “Proposal” in batches, your pipeline slows because drafting can’t keep up.
The Solution: Google Sheets → AI Proposal → Gmail Draft
This workflow watches your deal list in Google Sheets and turns the right rows into ready-to-review Gmail drafts. You pull client and deal data (name, email, scope, pricing, stage), then the workflow checks the stage so only “Proposal” deals get processed. For each qualifying row, Azure OpenAI generates a structured proposal with the required sections (scope, deliverables, pricing, timeline, conclusion) using only the data you provided. Then n8n cleans and formats the output into professional HTML so it reads like a real business email, not a pasted document. Finally, it saves the proposal as a Gmail draft with a subject line and formatted body, ready for you to send.
The workflow starts when you run it in n8n (manual trigger for control). It fetches Google Sheets rows, filters for Proposal-stage deals, loops through them in batches, generates the proposal with Azure OpenAI, and creates a Gmail draft per deal. If something fails, the error path can notify you in Slack so nothing silently disappears.
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 from a Google Sheet. Manually, you might spend about 20 minutes copying details and another 10 minutes cleaning up the email, so roughly 5 hours weekly. With this workflow, you run it once, wait a few minutes for AI generation, and your drafts are sitting in Gmail ready to review. If you spend 2 minutes per draft on a quick sanity check, that’s closer to 20 minutes total, not half a day.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets to store deal and client fields.
- Gmail to create drafts in your sales inbox.
- Azure OpenAI API access (get it from your Azure portal under OpenAI resource keys).
Skill level: Intermediate. You’ll connect accounts, map fields from your sheet, and adjust the AI prompt to match your offer.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
You trigger the run from n8n. It uses a manual launch, which means you can generate drafts when you’re ready (for example, right after your pipeline review).
Deal rows are pulled from Google Sheets and filtered. The workflow retrieves rows, then checks the stage so only “Proposal” items move forward. No wasted tokens on leads that aren’t qualified yet.
AI drafts the proposal using your deal context. The workflow loops through each qualifying row in batches, sends the relevant fields to an Azure OpenAI chat model, and asks it for a structured proposal with specific sections. Honestly, that “required sections” constraint is what keeps the output usable.
The proposal is transformed into clean HTML and saved as a Gmail draft. A code/transform step tidies the text, then Gmail creates a draft email with the subject and formatted body so you can review, adjust, and send.
You can easily modify the proposal sections to match your service packages based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Manual Trigger
Set up the manual trigger so you can run the workflow on demand while testing and refining the proposal draft process.
- Add the Manual Launch Trigger node at the start of your workflow.
- Leave default settings as-is, since this trigger fires when you click Execute Workflow.
- Connect Manual Launch Trigger to Retrieve Sheet Rows.
Step 2: Connect Google Sheets
Pull proposal data from your spreadsheet so the workflow can filter and process eligible rows.
- Add the Retrieve Sheet Rows node.
- Credential Required: Connect your Google Sheets credentials.
- Configure the spreadsheet and sheet settings to match your proposal data layout.
- Connect Retrieve Sheet Rows to Validate Proposal State.
Step 3: Set Up Filtering, Batching, and AI Drafting
Filter eligible rows, process them in batches, and generate proposal drafts using the AI agent.
- Add the Validate Proposal State node to decide which proposals should be drafted.
- Connect Validate Proposal State to Iterate Batch Items so only valid rows proceed.
- In Iterate Batch Items, set your batch size based on how many proposals you want to process per run.
- Add the Language Agent node after Iterate Batch Items to generate draft content.
- Attach Azure Chat Model as the language model for Language Agent.
- Credential Required: Connect your Azure OpenAI credentials in Azure Chat Model (credentials are configured on the model, not the agent).
- Connect Language Agent to Transform Script for post-processing.
Step 4: Configure Draft Email Output
Transform the AI output into a draft and send it to Gmail as a draft message.
- In Transform Script, format the AI output into the final subject and body fields you want to use.
- Connect Transform Script to Compose Draft Email.
- Credential Required: Connect your Gmail credentials in Compose Draft Email.
- Configure Compose Draft Email to create a draft rather than send immediately.
Step 5: Test and Activate Your Workflow
Run a manual test to confirm that eligible proposals are drafted and sent to Gmail correctly.
- Click Execute Workflow on Manual Launch Trigger to run a test.
- Verify that Validate Proposal State routes only eligible rows and that Iterate Batch Items processes each item.
- Confirm that Compose Draft Email creates draft emails in Gmail with the expected content.
- When everything looks correct, switch the workflow to Active for production use.
Common Gotchas
- Google Sheets credentials can expire or need specific permissions. If things break, check the n8n Credentials page and the Google account’s access to the spreadsheet 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 an hour if your sheet columns are already clean.
No. You’ll mostly map fields and connect accounts. The only “technical” part is tweaking the proposal prompt to match your offer.
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 Azure OpenAI usage costs per request.
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 sections in the Language Agent prompt (for example, swap “Timeline” for “Milestones” or add “Assumptions”). If your pricing lives in multiple columns, map them into the AI input in the Edit Fields (Set) step so the model sees the full context. Many teams also change the HTML styling in the Transform Script node to match their brand.
Usually it’s expired OAuth access or missing Gmail permissions in your n8n credential. Reconnect the Gmail credential, then re-run a single test row to confirm drafts are being created. If it still fails, check whether the Google Workspace admin has restricted third-party app access, because that can block draft creation.
On a typical setup, dozens in one run is normal.
Sometimes. If you want AI drafting plus formatting logic, n8n is easier to control because you can shape the prompt, transform the HTML, and batch-process rows without paying extra for every branch. It also has a self-hosting option, which is handy when you generate a lot of drafts. Zapier or Make can still work, but you’ll often hit limits once you add “only Proposal-stage rows,” batching, and cleanup steps. If you’re on the fence, Talk to an automation expert and sanity-check the best path before you build.
You still get the final say before anything goes out. But the repetitive drafting and formatting work is handled for you, which means proposals stop piling up in “later.”
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.