🔓 Unlock all 10,000+ workflows & prompts free Join Newsletter →
✅ Full access unlocked — explore all 10,000 AI workflow and prompt templates Browse Templates →
Home n8n Workflow
January 22, 2026

Google Sheets + Gmail: personalized outreach sent fast

Lisa Granqvist Partner Workflow Automation Expert

Your lead list is sitting in Google Sheets, but sending truly personal outreach still turns into a slow grind. You Google. You open LinkedIn. You copy details into a draft. Then you do it again. And again.

This Sheets Gmail outreach automation hits marketing managers first, but founders doing their own sales and agency operators feel it too. You’ll go from “research + writing” to consistent, ready-to-send drafts without losing the personal touches that get replies.

Below you’ll see how the workflow enriches each lead with Apify, generates a tailored email through OpenRouter, and sends it via Gmail. Then you’ll learn what to customize so it matches your offer and tone.

How This Automation Works

Here’s the complete workflow you’ll be setting up:

n8n Workflow Template: Google Sheets + Gmail: personalized outreach sent fast

Why This Matters: Personalization That Doesn’t Eat Your Day

Personalized outreach works, but the manual version is honestly exhausting. One lead turns into five tabs: a quick Google search, a LinkedIn profile scan, a company page check, a notes doc, and finally Gmail. Somewhere in that mess, you misread a job title, paste the wrong company name, or forget what you wanted to say in the first place. The real cost is the context-switching. It drains focus and makes “just send 20 emails today” feel like an all-afternoon project.

The friction compounds. Here’s where it usually breaks down.

  • Researching LinkedIn profiles lead-by-lead can easily burn about 10 minutes per person.
  • Company context gets skipped when you’re in a rush, which makes emails sound generic.
  • Copy-paste personalization creates avoidable mistakes (wrong name, wrong company, wrong role).
  • Your tone drifts over time because every draft is written from scratch.

What You’ll Build: Sheets-to-Gmail Enriched Outreach

This workflow starts with a simple source of truth: your Google Sheet of leads. For each row, it runs a Google-style search through Apify to find likely LinkedIn results for the person, then follows up by fetching the best matching profile for richer details. Next, it pulls company context too. If the person’s current company is already visible on LinkedIn, the workflow uses that URL directly; if not, it does a separate company search to find the right page. Once it has both “person” and “company” context, it sends that info to an LLM via OpenRouter with a prompt built for personalized outreach. Finally, a Gmail node creates and sends the email, so you’re not manually assembling drafts all day.

The workflow begins by retrieving leads from Google Sheets and iterating through them in batches. Apify handles the searching and profile fetching, then OpenRouter generates the email text based on your prompt and company details. Gmail delivers the final message automatically, so you’re not stuck doing the repetitive parts.

What You’re Building

Expected Results

Say you send 25 cold emails a day from a Google Sheet. Manually, if you spend about 10 minutes finding the right LinkedIn profile and another 5 minutes writing a decent draft, that’s about 6 hours of work. With this workflow, you might spend 15 minutes updating your sheet and skimming outputs, then let the enrichment and writing run in the background. You still review what matters, but you get most of that day back.

Before You Start

  • n8n instance (try n8n Cloud free)
  • Self-hosting option if you prefer (Hostinger works well)
  • Google Sheets to store and manage lead rows.
  • Gmail to send messages from your inbox.
  • Apify account + token (get it from Apify Console → Settings → Integrations).
  • OpenRouter API key (get it from OpenRouter dashboard).

Skill level: Intermediate. You’ll connect accounts, paste API keys, and adjust a prompt plus a few mapping fields.

Want someone to build this for you? Talk to an automation expert (free 15-minute consultation).

Step by Step

Leads come from your Google Sheet. The workflow retrieves your lead rows, then uses “split in batches” so you can process 10, 50, or more without overwhelming your connected services.

LinkedIn discovery happens automatically. For each lead, it runs a search request through Apify, filters results down to person links, and fetches the best matching LinkedIn profile for extra detail you can reference in the email.

Company context is added before writing. If the profile already includes a current company URL, the workflow uses it. If not, it searches for the company separately, then fetches the company profile so the email has something real to say.

OpenRouter generates the outreach and Gmail sends it. The “Compose Custom Email” chain uses your prompt and mapped fields, then a Gmail node sends the finished message so you’re not copying text between tools.

You can easily modify the prompt and mapped fields to match your offer, industry, and compliance needs. See the full implementation guide below for customization options.

Step-by-Step Implementation Guide

Step 1: Configure the Manual Trigger

This workflow starts manually so you can control outreach runs and validate lead data first.

  1. Add or verify the Manual Start Trigger node at the start of the workflow.
  2. Connect Manual Start Trigger to Retrieve Lead Sheet to follow the execution flow.

Step 2: Connect Google Sheets

Pull lead records from your spreadsheet so each row can be processed and emailed.

  1. Open Retrieve Lead Sheet and select your spreadsheet in Document ID.
  2. Set Sheet Name to your target tab (e.g., the list entry labeled Leads Sheet).
  3. Credential Required: Connect your googleSheetsOAuth2Api credentials.
  4. Ensure the output of Retrieve Lead Sheet connects to Iterate Records.

Step 3: Build the Search and LinkedIn Enrichment Pipeline

This section searches Google for LinkedIn profiles, filters results, and enriches leads with LinkedIn data.

  1. In Iterate Records, keep the default batch behavior to process one lead at a time.
  2. Configure Search Person on Google with URL set to https://api.apify.com/v2/acts/apify~rag-web-browser/run-sync-get-dataset-items and the query body {{ `${$json['First Name']} ${$json['Last Name']} ${$json['Company']} site:linkedin.com` }}.
  3. Credential Required: Connect your httpHeaderAuth credentials in Search Person on Google.
  4. In Filter Person Links, keep the regex condition on Left Value set to {{ $json.searchResult.url }} with ^https:\/\/www\.linkedin\.com\/in\/[a-zA-Z0-9\-_%]+\/?$.
  5. In Collect Search Results, set Fields to Include to searchResult and Destination Field Name to results.
  6. Configure Fetch LinkedIn Profile with URL https://api.apify.com/v2/acts/apimaestro~linkedin-profile-detail/run-sync-get-dataset-items and Body Parameter username set to {{ $json.results.first().searchResult.url }}.
  7. Credential Required: Connect your httpHeaderAuth credentials in Fetch LinkedIn Profile.

Check Company Presence splits the flow: if {{ $json.basic_info.current_company_url }} exists, it goes to Map Company URL; otherwise it goes to Search Company on Google to find a company LinkedIn URL.

  1. In Map Company URL, keep JSON Output set to { "company_url": "{{ $json.basic_info.current_company_url }}" }.
  2. Configure Search Company on Google with URL https://api.apify.com/v2/acts/apify~rag-web-browser/run-sync-get-dataset-items and query body {{ `${$json['Company']} site:linkedin.com` }}.
  3. Credential Required: Connect your httpHeaderAuth credentials in Search Company on Google.
  4. In Filter Company Links, keep the regex condition on Left Value set to {{ $json.searchResult.url }} with ^https:\/\/www\.linkedin\.com\/company\/[a-zA-Z0-9\-_%]+\/?$.
  5. In Collect Company Results, set Fields to Include to searchResult and Destination Field Name to results.
  6. In Map Company URL 2, set JSON Output to { "company_url": "{{ $json.results.first().searchResult.url }}" }.
  7. Configure Fetch LinkedIn Company with URL https://api.apify.com/v2/acts/apimaestro~linkedin-company-detail/run-sync-get-dataset-items and Body Parameter identifier set to {{ [$json.company_url] }}.
  8. Credential Required: Connect your httpHeaderAuth credentials in Fetch LinkedIn Company.

Check Company Presence outputs to Map Company URL or Search Company on Google based on whether a company URL exists, then both paths converge on Fetch LinkedIn Company.

⚠️ Common Pitfall: If the regex filters are too strict, no LinkedIn URLs will pass through. Keep the provided regex patterns unchanged unless you need different LinkedIn URL formats.

Step 4: Set Up AI Email Composition

Use the AI chain to craft a personalized subject and body based on enriched LinkedIn data.

  1. In Assign Company Details, set your brand values: company_name to YourCompany, email_address to [YOUR_EMAIL], company_info to your service description, and sender_name to Team at YourCompany.
  2. Open Compose Custom Email and keep the Text input set to INPUT: ... {{ $('Fetch LinkedIn Profile').item.json.toJsonString() }} ... {{ $('Fetch LinkedIn Company').item.json.toJsonString() }}.
  3. Verify the AI prompt in Compose Custom Email includes your company context and the expected JSON output format with subject and body.
  4. Structured Result Parser is connected as the output parser for Compose Custom Email—add credentials to the parent node only if your AI service requires it (none are required on the parser itself).
  5. Credential Required: Connect your openRouterApi credentials in OpenRouter Chat Engine (this is the language model powering Compose Custom Email).

Step 5: Configure Gmail Delivery

Send the AI-generated email to each lead from the sheet.

  1. In Send Email via Gmail, set Send To to {{ $('Retrieve Lead Sheet').item.json.Email }}.
  2. Set Subject to {{ $json.output.subject }} and Message to {{ $json.output.body }}.
  3. Set Reply To to {{ $('Assign Company Details').item.json.email_address }} and Sender Name to {{ $('Assign Company Details').item.json.sender_name }}.
  4. Credential Required: Connect your gmailOAuth2 credentials in Send Email via Gmail.
  5. Ensure Compose Custom Email connects to Send Email via Gmail, and Send Email via Gmail connects back to Iterate Records to continue batching.

⚠️ Common Pitfall: If Email is missing from the Google Sheet, Send Email via Gmail will fail. Confirm your sheet has an Email column with valid addresses.

Step 6: Test and Activate Your Workflow

Run a full manual test with a small batch before enabling production outreach.

  1. Click Execute Workflow from Manual Start Trigger to run the full pipeline.
  2. Confirm that Retrieve Lead Sheet outputs rows and Iterate Records starts the batch loop.
  3. Verify that Compose Custom Email produces output.subject and output.body in the expected JSON format.
  4. Check your inbox to confirm Send Email via Gmail sends a formatted email to the lead.
  5. Once validated, switch the workflow to Active for production use.
🔒

Unlock Full Step-by-Step Guide

Get the complete implementation guide + downloadable template

Troubleshooting Tips

  • Google Sheets credentials can expire or lack access to the right spreadsheet. If leads don’t load, check the n8n credential, then confirm the sheet is shared with that Google account.
  • If you’re using Wait nodes or external enrichment, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
  • OpenRouter prompts ship generic by default, and generic emails get ignored. Add your positioning and examples in the “Compose Custom Email” prompt so the output actually sounds like you.

Quick Answers

What’s the setup time for this Sheets Gmail outreach automation?

About 45 minutes if your accounts and keys are ready.

Is coding required for this Sheets Gmail outreach automation?

No. You’ll connect services, map a few fields, and tweak the email prompt.

Is n8n free to use for this Sheets Gmail outreach 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 Apify usage plus OpenRouter model costs (usually a few cents per email, depending on the model and prompt length).

Where can I host n8n to run this Sheets Gmail outreach automation?

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.

Can I modify this Sheets Gmail outreach workflow for different use cases?

Yes, and you probably should. Most people start by updating the “Set My Data” node (your company, offer, and positioning), then adjusting the “Compose Custom Email / Generate Personalized Email” prompt. You can also swap the sending step: keep Gmail for 1:1 outreach, or route the generated copy into a review step before sending. If your leads are already enriched, you can skip parts of the Apify lookup and generate emails straight from the sheet.

Why is my Google Sheets connection failing in this workflow?

Usually it’s the wrong Google account or the sheet isn’t shared with the account tied to your n8n credential. Reconnect Google Sheets in n8n, then double-check the spreadsheet ID and tab name in the “Retrieve Lead Sheet” node. If it still fails, look for Google security prompts (some workspaces require admin approval) and confirm you didn’t hit quota limits by pulling huge ranges repeatedly.

What volume can this Sheets Gmail outreach workflow process?

It depends on your n8n plan and how aggressive your batching is. On n8n Cloud Starter, many teams comfortably run a few thousand executions per month; self-hosting removes execution caps and shifts the limit to your server. Practically, Apify and Gmail become the bottlenecks, so start with small batches (like 10–25 leads), confirm quality, then scale up gradually. If you send too fast, Gmail can throttle you.

Is this Sheets Gmail outreach automation better than using Zapier or Make?

Often, yes, because this workflow isn’t just “move data.” You’re doing multi-step enrichment, filtering, branching (like the company URL check), and structured AI output parsing, which tends to get messy and expensive on simpler automation tools. n8n also gives you more control over batching, retries, and how you handle partial failures, which matters when one bad LinkedIn lookup shouldn’t stop the whole run. Zapier or Make can still work if you only want a lightweight version, like “Sheet row → AI draft → Gmail draft.” But for end-to-end enrichment plus sending, n8n is usually the calmer option. If you want a second opinion before you build, Talk to an automation expert.

Once this is running, outreach stops being a daily research project. You’ll still steer the message, but the workflow handles the repetitive digging and drafting so you can focus on replies and real conversations.

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.

Lisa Granqvist

Workflow Automation Expert

Expert in workflow automation and no-code tools.

×

Use template

Get instant access to this n8n workflow Json file

💬
Get a free quote today!
Get a free quote today!

Tell us what you need and we'll get back to you within one working day.

Get a free quote today!
Get a free quote today!

Tell us what you need and we'll get back to you within one working day.

Launch login modal Launch register modal