Google Sheets + Gmail: approved outreach that scales
Manual outreach gets messy fast. You copy-paste lead details, tweak the message, second-guess the tone, then lose track of who got what (and when).
Sheets Gmail outreach hits sales teams and agency owners first, honestly. But consultants doing their own prospecting feel it too, because every “quick email” turns into 15 minutes of fiddling.
This workflow turns a Google Sheet of leads into approved, hyper-personalized messages, then sends them via Gmail (and more). You’ll see how it works, what you need, and where teams usually trip up.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Sheets + Gmail: approved outreach that scales
flowchart LR
subgraph sg0["AI Agent (Data Analy Flow"]
direction LR
n0@{ icon: "mdi:database", form: "rounded", label: "Get row(s) in sheet4", pos: "b", h: 48 }
n1@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items4", pos: "b", h: 48 }
n2@{ icon: "mdi:database", form: "rounded", label: "Update row in sheet2", pos: "b", h: 48 }
n3@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields2", pos: "b", h: 48 }
n4@{ icon: "mdi:message-outline", form: "rounded", label: "Send a message5", pos: "b", h: 48 }
n5@{ icon: "mdi:database", form: "rounded", label: "Get row(s) in sheet5", pos: "b", h: 48 }
n6@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items5", pos: "b", h: 48 }
n7@{ icon: "mdi:robot", form: "rounded", label: "AI Agent (Data Analysis & Pe..", pos: "b", h: 48 }
n8["<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/>Cleans up2"]
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/telegram.svg' width='40' height='40' /></div><br/>Send a text message2"]
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/httprequest.dark.svg' width='40' height='40' /></div><br/>LinkedIn Requests3"]
n11@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model3", pos: "b", h: 48 }
n12@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If3", pos: "b", h: 48 }
n13@{ icon: "mdi:message-outline", form: "rounded", label: "Send a message6", pos: "b", h: 48 }
n14["<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/whatsapp.svg' width='40' height='40' /></div><br/>Send message"]
n12 --> n10
n8 --> n2
n3 --> n7
n14 --> n9
n4 --> n12
n13 --> n14
n1 --> n4
n1 --> n3
n6 --> n13
n10 --> n5
n11 -.-> n7
n0 --> n1
n5 --> n6
n9 --> n6
n2 --> n1
n7 --> n8
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 n7 ai
class n11 aiModel
class n12 decision
class n0,n2,n5 database
class n10 api
class n8 code
classDef customIcon fill:none,stroke:none
class n8,n9,n10,n14 customIcon
The Problem: Personalized outreach doesn’t scale manually
Personalization is the whole point of outreach, yet doing it by hand is where good pipelines go to die. You end up staring at a spreadsheet, opening LinkedIn tabs, pulling company context, then rewriting the same email structure for the tenth time. And because you’re rushing, small mistakes sneak in: wrong company names, awkward first lines, or a “quick follow-up” that sounds like a robot. The worst part is the mental load. Every lead becomes a tiny creative project, so you either send fewer messages or you lower the quality to get volume.
The friction compounds. Here’s where it breaks down in real life.
- You spend about 10 minutes per lead just gathering context and deciding what to say.
- Messages drift in tone across channels, so your LinkedIn note feels human but your email reads stiff.
- You avoid delegating because “someone needs to approve it,” which keeps you stuck in the weeds.
- Tracking is scattered across inboxes, DMs, and notes, which makes it hard to learn what actually works.
The Solution: Generate, review, and send outreach from one sheet
This n8n workflow starts with the leads you already have in Google Sheets, then uses an AI agent (powered by OpenAI) to write three messages per prospect: a short LinkedIn connection request, a researched HTML email, and a casual WhatsApp note. It doesn’t just generate text and blast it out. It writes the drafts, saves them back into your sheet, and sends you an approval email so you can review or edit before anything goes live. After you approve, the workflow sends the email via Gmail, triggers your LinkedIn sending via Phantombuster, and can notify you in Telegram as each message is sent. Everything stays tied to the original row, so the sheet becomes your “single place to look” for drafts, approvals, and what went out.
It pulls rows from Google Sheets, prepares each lead in batches, then generates channel-specific copy that actually matches the lead details. After your approval, it executes the sends sequentially to stay within rate limits and keep deliverability clean.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you want to reach out to 20 new leads this week. Manually, if you spend about 10 minutes researching and writing per lead, that’s roughly 3 hours, and you still have to format emails and track what you sent. With this workflow, you drop the 20 rows into Google Sheets, run the automation, and get all drafts written back into the sheet in about 15 minutes (plus some background processing time). You skim, approve, and Gmail sends the approved emails without you doing the repetitive parts.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets to store leads and message drafts
- Gmail to send approved outreach emails
- OpenAI API key (get it from your OpenAI dashboard)
Skill level: Intermediate. You’ll connect accounts, paste a few IDs/keys, and tweak the AI prompt for your offer.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
New leads appear in your Google Sheet. The workflow starts by retrieving lead rows, then moves through them in small batches so your accounts and APIs don’t get hammered.
Each lead gets packaged into a “profile” for the AI. n8n assembles the important fields (name, title, company, industry, website, tech, and any extra context you keep) and sends it to the AI agent that runs on an OpenAI chat model.
The workflow generates three channel-specific drafts. You get a LinkedIn connection request under 300 characters, a professional HTML email, and a WhatsApp message that sounds casual without being sloppy. Then the output is parsed and cleaned so it lands in the right columns.
Approval happens before sending. You receive a Gmail approval email, review the drafts inside the sheet, and approve or reject. Once approved, LinkedIn sending is triggered via an HTTP request to Phantombuster, Gmail sends the emails, and optional Telegram pings confirm progress.
You can easily modify the AI prompt to match your voice, offer, and industry focus based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Trigger
This workflow does not include a built-in trigger node, so you’ll need to decide how it starts before running it in production.
- Add a trigger node of your choice (for example, a manual trigger or schedule) and connect it to Retrieve Sheet Records.
- If you will run it manually, plan to use the Execute Workflow button during testing.
Step 2: Connect Google Sheets
The workflow reads leads and writes AI-generated messages back to Google Sheets.
- Open Retrieve Sheet Records and set Document to
YOUR_GOOGLE_SHEET_IDand Sheet toYOUR_SHEET_GID(from the cached list). - Open Fetch Approved Rows and set the same Document and Sheet values.
- Open Update Sheet Row and confirm Operation is
update, then verify the mapping fields use expressions like{{ $json.emailMessage }},{{ $json.connectionMessage }},{{ $json.whatsappMessage }}, and{{ $('Retrieve Sheet Records').item.json.row_number }}. - Credential Required: Connect your Google Sheets credentials in Retrieve Sheet Records, Fetch Approved Rows, and Update Sheet Row.
Step 3: Set Up the AI Personalization Flow
These nodes assemble lead data and generate personalized messaging with AI.
- In Assemble Full Row, confirm the assignment Fullrow is set to
{{$json}}. - In AI Personalization Engine, keep Prompt Type set to
defineand review the prompt text to replace placeholders like[YOUR_NAME],[YOUR_TITLE],[YOUR_EMAIL], and[YOUR_LINKEDIN_URL]. - Ensure OpenAI Chat Model is connected as the language model for AI Personalization Engine with model set to
gpt-4.1-mini. - Open Parse AI Output and keep the JavaScript Code as provided to parse the JSON output.
- Credential Required: Connect your OpenAI credentials in OpenAI Chat Model (credentials are added to the model, not the AI Personalization Engine node).
Step 4: Configure Approval & Outreach Actions
This section handles approval, LinkedIn API calls, and outbound messages.
- In Dispatch Approval Email, set Send To to
[YOUR_EMAIL], Subject toSeeking your approval to send Linkedin requests, Email & Whatsapp messages, and keep Operation assendAndWait. - In Approval Decision, confirm the condition checks
{{ $json.data.approved }}equalstrue. - In LinkedIn API Launch, set URL to
https://api.phantombuster.com/api/v1/agent/[YOUR_ID]/launch, Method toPOST, and header X-Phantombuster-Key-1 to[CONFIGURE_YOUR_API_KEY]. - In Send Outreach Email, set Message to
{{ $json["AI Email"] }}and Subject toThoughts on boosting {{ $json["Company Name"] }}'s efficiency with AI. - In WhatsApp Message Send, keep Operation as
sendand verify the WhatsApp account is connected. - In Telegram Status Ping, set Chat ID to
[YOUR_ID]and leave Text as{{ $('Iterate Approved Leads').item.json["AI Connection Message"] }}. - Credential Required: Connect your Gmail credentials in Dispatch Approval Email and Send Outreach Email.
- Credential Required: Connect your Telegram credentials in Telegram Status Ping.
- Credential Required: Connect your WhatsApp API credentials in WhatsApp Message Send.
Step 5: Review Iteration and Routing Logic
These nodes control how the workflow loops through leads and approved records.
- In Batch Lead Iterator, confirm you are splitting records to match your desired batch size in Options if needed.
- In Iterate Approved Leads, confirm it receives output from Fetch Approved Rows and sends items to Send Outreach Email.
- Verify the sequence: Dispatch Approval Email → Approval Decision → LinkedIn API Launch → Fetch Approved Rows → Iterate Approved Leads.
$json.data.approved, Approval Decision will block all sends. Confirm the approval email response format.Step 6: Test and Activate Your Workflow
Run a controlled test before turning it on for production use.
- Click Execute Workflow and confirm Retrieve Sheet Records loads your test rows.
- Verify Dispatch Approval Email sends and that Approval Decision routes only when
{{ $json.data.approved }}istrue. - Confirm Parse AI Output produces
connectionMessage,emailMessage, andwhatsappMessage, then check Update Sheet Row writes them back. - Check that Send Outreach Email, WhatsApp Message Send, and Telegram Status Ping fire for approved leads.
- When satisfied, turn on the workflow using the Activate toggle.
Common Gotchas
- Google Sheets credentials can expire or need specific permissions. If things break, check n8n’s Credentials page and confirm the Google account still has access to the sheet.
- 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 you already have the accounts and credentials.
No. You’ll mostly connect accounts and paste a few IDs and API keys. The only “technical” part is editing the AI prompt in plain English.
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 lead depending on prompt 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, but plan to tweak the AI Personalization Engine prompt and the columns you write back to in Google Sheets. Most teams add “Follow-up 1” and “Follow-up 2” columns, then adjust the prompt to reference the original email and include a softer CTA. If you want multiple variations for A/B testing, you can also modify the Parse AI Output step to split two opener options into separate cells. The approval email still works the same, which is the nice part.
Usually it’s expired OAuth or the Google account lost access to the sheet. Reconnect the Google Sheets credential in n8n, then confirm the sheet ID matches the one in your nodes. Also check if the file was moved into a shared drive with stricter permissions, because that can block reads and writes.
Plenty for typical small-team outbound, as long as you batch it.
It depends on how much control you want. n8n is a better fit when you need approvals, batching, and more complex logic without paying extra for every branch, and it’s easier to self-host if volume grows. Zapier and Make can feel quicker for a simple “Sheet row → send email” flow, but they get awkward once you add AI parsing, multiple channels, and an approval loop. Also, this workflow relies on more than Gmail; you’re coordinating Sheets, OpenAI, and a LinkedIn sender. If you’re torn, Talk to an automation expert and get a straight recommendation.
Once this is running, outreach stops being a daily grind and starts looking like a repeatable system. The workflow handles the repetitive parts so you can focus on strategy, targeting, and the calls that actually close.
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.