Google Sheets + Google Gemini: cold emails drafted fast
Your lead sheet keeps growing, but your “write personalized email” time doesn’t. So you stall. You copy-paste, rewrite the same intro 20 times, and still second-guess the tone before you hit send.
Sales reps feel it first. A marketing manager doing outbound campaigns feels it too. And if you run a small agency, you’re probably juggling this for multiple clients. This Gemini email drafts automation turns new rows in Google Sheets into review-ready cold email drafts.
Below you’ll see how the workflow works, what you get out of it, and what to watch out for when you customize it for your offer and voice.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Sheets + Google Gemini: cold emails drafted fast
flowchart LR
subgraph sg0["Schedule Flow"]
direction LR
n0@{ icon: "mdi:database", form: "rounded", label: "Read Leads from Sheet", pos: "b", h: 48 }
n1@{ icon: "mdi:swap-vertical", form: "rounded", label: "Prepare Data for Sheet", pos: "b", h: 48 }
n2@{ icon: "mdi:database", form: "rounded", label: "Update Sheet with Email", pos: "b", h: 48 }
n3@{ icon: "mdi:robot", form: "rounded", label: "Basic LLM Chain", pos: "b", h: 48 }
n4@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini Chat Model", pos: "b", h: 48 }
n5@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser", pos: "b", h: 48 }
n6@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
n7@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If", pos: "b", h: 48 }
n7 --> n3
n3 --> n1
n6 --> n0
n0 --> n7
n1 --> n2
n4 -.-> n3
n5 -.-> n3
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 n6 trigger
class n3,n5 ai
class n4 aiModel
class n7 decision
class n0,n2 database
The Problem: Cold emails don’t scale when personalization is manual
Personalized outbound sounds simple until you’re staring at 80 leads and a blank page. You try to “just write faster,” but the real drag is the context switching. Look up the company, skim LinkedIn notes, figure out the angle, write a subject line, then do it again for the next row. And because it’s repetitive, mistakes creep in: wrong company names, generic fluff, or a tone that doesn’t match your brand. The worst part is opportunity cost. Time spent drafting is time you’re not following up, building lists, or improving the offer.
It adds up fast. Here’s where it usually breaks down.
- Writing even “lightly personalized” emails for 50 leads can eat an entire morning.
- Your team ends up using templates that look like templates, which means fewer replies.
- Quality control is inconsistent because everyone has their own style and shortcuts.
- Leads sit untouched in Google Sheets because nobody wants to start from scratch.
The Solution: Google Sheets to Google Gemini drafting, written back to the same row
This workflow runs on a schedule you choose, opens your Google Sheet, and pulls in the prospects you’ve listed (name, company, role, industry, notes, pain points). Then it checks a simple condition: has an email already been generated for this row? If yes, it skips it. If not, it sends that lead’s context into a Google Gemini prompt designed for your product and tone. Gemini returns a structured response (subject + body), so the output is predictable instead of messy. Finally, n8n writes the subject line and email body back into the correct spreadsheet row, which leaves you with drafts that are ready to review and send.
The workflow starts with a timed schedule trigger, then reads your sheet and filters for “new” leads only. Gemini drafts the email using your prompt, and n8n maps the response into your chosen columns before updating the sheet. No hunting for text in logs. It all lands where your team already works.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you add 40 new leads to Google Sheets each week. If a rep spends about 8 minutes per lead to research lightly and write a first draft, that’s roughly 5 hours before you even start sending. With this automation, you might spend 10 minutes tightening your Gemini prompt, then the scheduled run generates the drafts in the background and fills your “GeneratedSubject” and “GeneratedEmail” columns. Your “writing time” becomes review time, so you can scan, tweak, and send in one sitting.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets for your lead list and output columns.
- Google Gemini to generate the email subject and body.
- Gemini API key (get it from Google AI Studio).
Skill level: Beginner. You’ll connect accounts, match column names, and adjust one main prompt.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A schedule kicks things off. The workflow runs daily (or however you set it) so your drafts show up consistently, without anyone remembering to “go generate emails.”
Your Google Sheet is read and normalized. n8n fetches the rows from your spreadsheet, then maps the fields into a clean structure so the AI prompt always receives the same inputs, even if your sheet has extra columns.
Only new leads go through. An “If” condition checks your output column (for example, “GeneratedEmail”). If it’s empty, the lead continues. If it’s already filled, the workflow skips it. Honestly, this one check prevents most accidental re-processing.
Gemini writes, then the sheet gets updated. The Gemini chat model generates a subject line and body, the structured parser keeps the response tidy (subject/body in JSON), and n8n writes those values back into the correct row so your team can review in place.
You can easily modify the prompt and output columns to match your offer and workflow. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Timed Schedule Trigger
Set up the schedule that kicks off the workflow to pull new leads and generate outreach emails.
- Add and open Timed Schedule Trigger.
- Set the interval rule to run every 30 minutes by configuring Interval with Field set to
minutesand Minutes Interval set to30.
Step 2: Connect Google Sheets
Pull lead data from your spreadsheet and prepare to write generated emails back to the same sheet.
- Open Fetch Sheet Leads and select your Google spreadsheet in Document with
[YOUR_ID]and your worksheet in Sheet Name withYour_Sheet_GID. - Credential Required: Connect your
googleSheetsOAuth2Apicredentials in Fetch Sheet Leads. - Open Write Email to Sheet and confirm it targets the same Document
[YOUR_ID]and Sheet NameYour_Sheet_GID. - Set Operation to
updatein Write Email to Sheet. - Credential Required: Connect your
googleSheetsOAuth2Apicredentials in Write Email to Sheet.
Step 3: Set Up Email Drafting Chain
Configure the AI prompt, language model, and output parser to generate structured subject lines and email bodies.
- Open Email Drafting Chain and set Prompt Type to
define. - Paste the full prompt into Text (include the dynamic lead fields like
{{ $('Fetch Sheet Leads').item.json.Name }},{{ $('Fetch Sheet Leads').item.json.Company }}, and{{ $('Fetch Sheet Leads').item.json.Title }}). - Ensure Has Output Parser is enabled on Email Drafting Chain so the structured parser is used.
- Open Gemini Chat Engine and set Model Name to
models/gemini-2.5-flash. - Credential Required: Connect your
googlePalmApicredentials in Gemini Chat Engine. - Open Structured Response Parser and confirm the JSON Schema Example matches the two keys
subjectandemail_body. - Note: Structured Response Parser is an AI sub-node—credentials are added on the parent Email Drafting Chain through Gemini Chat Engine, not on the parser itself.
Step 4: Configure Routing and Field Mapping
Route only rows that do not already have an email, then map AI output into fields and write back to the sheet.
- Open Conditional Gate and set two conditions to check emptiness: Left Value
{{ $json.email_body }}with Operationempty, and Left Value{{ $json.subject }}with Operationempty. - Confirm the execution flow: Timed Schedule Trigger → Fetch Sheet Leads → Conditional Gate → Email Drafting Chain → Map Sheet Fields → Write Email to Sheet.
- In Map Sheet Fields, set updated_email to
{{ $input.item.json.text }}. - In Write Email to Sheet, map columns as follows: Email to
{{ $('Fetch Sheet Leads').item.json.Email }}, subject to{{ $json.output.subject }}, and email_body to{{ $json.output.email_body }}.
subject or email_body, Conditional Gate will block the email generation because it only passes empty fields.Step 5: Test and Activate Your Workflow
Run a manual test to verify lead selection, AI output, and sheet updates, then activate the schedule.
- Click Execute Workflow to run a manual test from Timed Schedule Trigger.
- Confirm Fetch Sheet Leads returns rows with empty
subjectandemail_body. - Verify Email Drafting Chain outputs a JSON object with
subjectandemail_bodyand that Write Email to Sheet updates the correct row byEmail. - When the test looks correct, toggle the workflow Active to enable the 30-minute schedule.
Common Gotchas
- Google Sheets permissions can be tricky if the sheet is owned by a different account. If updates fail, check the credential in n8n and confirm the spreadsheet is shared with the connected Google user.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Google Gemini outputs depend heavily on your prompt and variables. If drafts feel generic, tighten your prompt and make sure your column names match exactly (FirstName vs First Name causes silent “missing context”).
Frequently Asked Questions
About 30 minutes if your sheet is ready and you have a Gemini API key.
No. You’ll mostly connect Google credentials and edit the prompt text. The only “technical” part is matching your Google Sheets column names to the variables used in the workflow.
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 Google Gemini API usage, which depends on how long your prompts and drafts are.
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. Update the prompt in the Email Drafting Chain so it includes your offer, your rules (length, style, CTA), and a few examples of “good” emails in your voice. Common customizations include adding a “PainPoint” column, inserting a specific call to action, and generating two subject line options instead of one.
Most of the time it’s the wrong Google account or missing access to the spreadsheet. Reconnect the Google Sheets credential in n8n, then confirm the sheet is shared with that same account. Also check that the workflow is pointing at the right spreadsheet and tab, because copying a sheet often changes IDs behind the scenes.
On n8n Cloud Starter, you can usually run thousands of executions per month, and self-hosting has no execution cap (it mainly depends on your server). In practice, the bottleneck is Gemini request speed and API limits, so large lists are best processed on a schedule or in batches. If you’re generating drafts for a few hundred leads a week, it’s typically fine. If you’re doing tens of thousands, you’ll want throttling and careful prompt sizing.
Often, yes, because n8n handles more complex logic without turning every branch into an extra cost line item. You also get a self-hosting option, which is useful when you’re processing lots of rows on a schedule. Zapier or Make can still be a good fit for very simple “new row → generate text → update row” setups, especially if your team already uses them. But once you add structured outputs, filtering, retries, and brand-voice prompting, n8n tends to stay cleaner. If you’re torn, Talk to an automation expert and get a quick recommendation.
Once this is live, your Google Sheet stops being a graveyard of “leads to email someday.” It becomes a steady stream of drafts you can review and send.
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.