Google Sheets to Gmail, personalized drafts ready
You’ve got a lead list in Google Sheets. You know you should follow up. But turning rows into decent emails means copy-paste, tab-switching, and that low-level fear you’ll send the wrong name to the wrong company.
Marketing managers feel it when outreach needs to scale without wrecking quality. A small business owner feels it when “I’ll do it later” becomes “it’s been two weeks.” Even an agency lead running campaigns for clients hits the same wall. This Sheets Gmail drafts automation gives you ready-to-review Gmail drafts, personalized from your sheet.
You’ll see exactly how the workflow moves from “unsent row” to “Gmail draft created,” and how it keeps your spreadsheet clean so you’re not guessing what happened.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Sheets to Gmail, personalized drafts ready
flowchart LR
subgraph sg0["Manual Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Manual Trigger", pos: "b", h: 48 }
n1@{ icon: "mdi:database", form: "rounded", label: "Read Business Data", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter Unsent Emails", pos: "b", h: 48 }
n3@{ icon: "mdi:swap-vertical", form: "rounded", label: "Prepare Sheet Update", pos: "b", h: 48 }
n4@{ icon: "mdi:database", form: "rounded", label: "Update Google Sheet", pos: "b", h: 48 }
n5@{ icon: "mdi:cog", form: "rounded", label: "Rate Limit Wait", pos: "b", h: 48 }
n6["<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/httprequest.dark.svg' width='40' height='40' /></div><br/>Personalize Email (ChatGPT)"]
n7["<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/httprequest.dark.svg' width='40' height='40' /></div><br/>Generate Subject (ChatGPT)"]
n8@{ icon: "mdi:swap-vertical", form: "rounded", label: "Prepare Email Draft", pos: "b", h: 48 }
n9@{ icon: "mdi:message-outline", form: "rounded", label: "Create Email Draft", pos: "b", h: 48 }
n10["<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/merge.svg' width='40' height='40' /></div><br/>Merge Subject and Body"]
n0 --> n1
n9 --> n3
n1 --> n2
n8 --> n9
n2 --> n6
n2 --> n7
n3 --> n4
n3 --> n5
n10 --> n8
n7 --> n10
n6 --> n10
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 n2 decision
class n1,n4 database
class n6,n7 api
classDef customIcon fill:none,stroke:none
class n6,n7,n10 customIcon
The Problem: Turning a Lead Sheet Into Real Outreach
Google Sheets is a great place to collect leads. It’s a frustrating place to do outreach from. You end up selecting a row, copying a business name, hunting for the right contact, then writing a “personalized” email that’s mostly the same as yesterday’s. Do that across a list of 50 leads and you’ve burned an afternoon, and the last 10 emails are always the weakest because you’re tired. Worse, the spreadsheet rarely reflects reality, so you don’t know which leads are untouched, drafted, or accidentally emailed twice.
The friction compounds. Here’s where it usually breaks down.
- Copy-paste mistakes creep in when you’re moving between Sheets and Gmail for every single lead.
- Personalization gets inconsistent because you’re writing under time pressure and reusing old templates.
- Your “email sent” column falls out of date, so follow-ups turn into guesswork instead of a process.
- You spend time drafting instead of doing the higher-value work, like deciding who to target and what offer to lead with.
The Solution: AI-Personalized Gmail Drafts From Your Sheet
This n8n workflow reads your Google Sheets lead list, finds the rows that still need outreach, then uses AI to write a personalized email body and a subject line for each lead. After the AI generates those two pieces, the workflow merges them back together with the original row data (like business name, contact name, and city) and creates a Gmail draft instead of sending anything automatically. That part matters because you stay in control. Finally, it updates the same spreadsheet row with the generated content and a timestamp (and your “sent” or “drafted” markers), so your list stays accurate as you work through it.
The workflow starts with a manual launch, which is great for testing and for “drafting bursts” before you review. It pulls your rows, filters out anyone already marked as emailed, generates the body and subject in parallel, then creates a draft in Gmail and writes results back to the sheet.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you want to draft outreach for 40 leads every Monday. Manually, you might spend about 6 minutes per lead pulling details, writing a subject, and saving a draft, which is roughly 4 hours. With this workflow, you kick off the run (a minute), then let AI generate content and n8n create drafts while it updates the sheet with a short 3-second throttle between rows. In practice, you’ll usually be reviewing drafts in Gmail within about 30–40 minutes, and the spreadsheet is already updated when you’re done.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets for storing and tracking lead rows.
- Gmail to create drafts for review and sending.
- OpenAI API key (get it from your OpenAI dashboard).
Skill level: Beginner. You’ll connect accounts, confirm your sheet columns, and tweak a prompt if you want a different tone.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
You run it on demand. The workflow starts with a manual trigger, so you can test safely and batch-generate drafts when you’re ready.
Your sheet becomes the queue. n8n retrieves company records from Google Sheets and checks a status field (like email_sent) so only pending leads move forward.
AI writes the pieces you usually dread writing. Two AI calls happen via HTTP request: one for the email body and one for the subject line. The workflow merges those outputs with fields such as business_name, contact_name, city, and business_type, so the draft reads like it was written for that specific lead.
Drafts are created, then your sheet updates. Gmail receives a new draft (not a sent email), and the workflow writes the generated subject/body plus a date back into the same row. A short wait is included to avoid hammering APIs.
You can easily modify the AI prompt to match your brand voice based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Manual Trigger
Start the workflow manually to test your outreach drafting flow on demand.
- Add and open Manual Launch Trigger.
- Leave the default settings as-is to allow manual execution.
- Connect Manual Launch Trigger to Retrieve Company Records.
Step 2: Connect Google Sheets
Load your lead list and later write back the sent status and subject used.
- Open Retrieve Company Records and select your spreadsheet.
- Set Document to your file (example shown:
ColdEmail). - Set Sheet to your tab (example shown:
Sheet (All info)). - Credential Required: Connect your
googleSheetsOAuth2Apicredentials. - Open Modify Spreadsheet Row and set Operation to
update. - Match the same Document and Sheet as above.
- Credential Required: Connect your
googleSheetsOAuth2Apicredentials.
business_name, email, subject_used, and date_sent.Step 3: Filter rows that need emails
Only records without a sent status and with a valid email should continue.
- Open Filter Pending Emails and confirm the conditions:
- Set the first condition to Value 1
={{$json["email_sent"]}}with OperationnotEqualand Value 2yes. - Set the second condition to Value 1
={{$json["email"]}}with OperationisNotEmpty. - Connect Retrieve Company Records to Filter Pending Emails.
- Filter Pending Emails outputs to both Compose Email Body (AI) and Create Subject Line (AI) in parallel.
email_sent is blank or uses values other than yes, adjust the filter to match your sheet’s conventions.Step 4: Set Up AI Content Generation
Generate a personalized email body and subject line via OpenAI, then combine the outputs.
- Open Compose Email Body (AI) and set URL to
=https://api.openai.com/v1/chat/completions. - Set Method to
POSTand Body to the provided JSON prompt (keep the personalization expressions like{{$json["business_name"]}}). - Credential Required: Connect your
openAiApicredentials (configured as nodeCredentialType). - Open Create Subject Line (AI) and set URL to
=https://api.openai.com/v1/chat/completionswith the provided JSON prompt. - Credential Required: Connect your
openAiApicredentials (configured as nodeCredentialType). - Connect both AI nodes into Combine AI Outputs with Mode set to
combineand Combine By set tocombineByPosition.
gpt-4o-mini. If you change models, keep token limits and prompt structure consistent to avoid empty responses.Step 5: Assemble Draft Fields and Create the Gmail Draft
Map the AI output and lead data into clean draft fields, then create the Gmail draft.
- Open Assemble Draft Fields and confirm the assignments:
- Set email_subject to
={{ $('Create Subject Line (AI)').item.json.choices[0].message.content }}. - Set email_body to
={{ $('Compose Email Body (AI)').item.json.choices[0].message.content }}. - Map business_name, email, contact_name, city, and business_type from Filter Pending Emails.
- Open Generate Gmail Draft and set Resource to
draft. - Set Subject to
={{ $('Create Subject Line (AI)').item.json.choices[0].message.content }}. - Set Message to
={{$json["email_body"].replace(/\n/g, '<br>')}}and Email Type tohtml. - Credential Required: Connect your
gmailOAuth2credentials.
choices[0].message.content is present in both AI nodes.Step 6: Update the Sheet and Throttle Requests
Record the sent status and subject used, then apply a brief delay to avoid rate limits.
- Connect Generate Gmail Draft to Map Sheet Update.
- Map Sheet Update outputs to both Modify Spreadsheet Row and Throttle Delay in parallel.
- In Modify Spreadsheet Row, confirm the column mappings, including:
- date_sent set to
={{$now.format("dd/MM/yyyy")}}. - subject_used set to
={{ $('Combine AI Outputs').item.json.choices[0].message.content }}. - In Throttle Delay, set Unit to
secondsand Amount to3.
business_name. Ensure this column is unique to avoid mismatched updates.Step 7: Test and Activate Your Workflow
Verify the draft creation and sheet updates, then enable the workflow for ongoing use.
- Click Execute Workflow on Manual Launch Trigger to run a test.
- Confirm a new draft appears in Gmail with a subject and HTML-formatted body.
- Check the spreadsheet to ensure
email_sent,date_sent, andsubject_usedare updated. - If everything looks correct, toggle the workflow to Active for production use.
Common Gotchas
- Gmail credentials can expire or need specific permissions. If things break, check your Google OAuth scopes and the connected Gmail account in n8n credentials 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 sheet columns are already in place.
No. You’ll connect Google and Gmail, then paste your AI prompt and map a few fields.
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 usage, which is usually a few cents per batch of drafts.
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. Swap the prompt text inside the two HTTP Request AI calls (the ones generating the email body and the subject line), then test on one row. Common tweaks include making the tone more direct, adding a short PS line, or forcing a specific structure like “pain point, quick proof, call to action.” If you want tighter tracking, add a unique ID column in Sheets so updates always hit the correct row.
Usually it’s expired OAuth access or missing Gmail scopes for creating drafts. Reconnect the Gmail credential in n8n and confirm the account has permission to create drafts. If it works in tests but fails in real runs, check Google security alerts and make sure the right mailbox is selected (people often connect a personal Gmail by accident). Also, if your workspace admin restricts third-party access, you may need approval.
Dozens to hundreds in a run is normal, and the built-in 3-second wait helps avoid Google Sheets write limits.
Often, yes, if you care about control and cost. n8n makes it easier to filter “only rows not sent,” run two AI generations in parallel, merge outputs, and then update the exact row that started it, all in one workflow. Zapier and Make can do it, but you may end up stitching multiple zaps/scenarios together and paying more as volume grows. The big deciding factor is comfort: if you want a little more flexibility and don’t mind a slightly more hands-on setup, n8n wins here. Talk to an automation expert if you want someone to recommend the cleanest approach for your exact lead process.
You get clean drafts, a clean sheet, and a process you can repeat every week without burning a morning on admin work. Honestly, once it’s running, it’s hard to go back.
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.