Google Sheets to Outlook, follow up leads once
Leads land in a Google Sheet… and then they just sit there. Or worse, someone follows up twice because nobody knows what was already sent.
This Sheets Outlook follow-up automation hits marketing ops and sales teams first, but solo consultants and small agencies feel it too. You get consistent outreach, and every lead gets emailed once. Not zero times. Not three.
Below you’ll see exactly how the workflow runs in n8n, what it automates, and the real-world results you can expect when follow-ups stop relying on memory.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Sheets to Outlook, follow up leads once
flowchart LR
subgraph sg0["Schedule Flow"]
direction LR
n0@{ icon: "mdi:cog", form: "rounded", label: "Send a message", pos: "b", h: 48 }
n1@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
n2@{ icon: "mdi:database", form: "rounded", label: "Get row(s) in sheet3", pos: "b", h: 48 }
n3@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter1", pos: "b", h: 48 }
n4@{ icon: "mdi:database", form: "rounded", label: "Append or update row in sheet1", pos: "b", h: 48 }
n3 --> n4
n3 --> n0
n1 --> n2
n2 --> 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 n1 trigger
class n3 decision
class n2,n4 database
The Problem: Lead follow-ups slip, or get duplicated
Google Sheets is where leads go to “wait until later.” Someone exports a list, someone else sends a few emails, and then the tab becomes a guessing game: did we contact this person, or did we just mean to? It’s not only the time. It’s the mental load of re-checking rows, scanning notes, and trying to remember what happened last week. One missed follow-up costs you a conversation. One duplicate follow-up can cost you trust, especially if you’re doing outbound in a tight niche.
None of this feels catastrophic in the moment. Then it repeats daily, and it gets expensive.
- Checking the sheet, filtering “new,” and copying emails into Outlook eats about 20 minutes a day.
- People forget to mark rows as contacted, so the same lead gets hit again later.
- When two teammates share the list, you end up with overlap and awkward double sends.
- Follow-up quality drops because you spend your energy on admin, not writing a better message.
The Solution: Daily Google Sheets → Outlook outreach with dedupe
This n8n workflow sends a templated outreach email to new leads from a Google Sheet on a daily schedule, then marks each lead as contacted so they won’t be emailed twice. It starts at a set time (for example, 9:00 AM), pulls rows from your leads sheet, and keeps only the ones where the Contacted field is empty. For every remaining row, it sends a Microsoft Outlook email using the address in the Email column. After sending, the workflow writes back to the sheet (or a second “CRM-lite” sheet) and sets Contacted = Yes, matching on Email. That one write-back is what makes the system reliable.
The workflow begins with a daily schedule, then reads your Google Sheet. It filters out anyone already contacted, sends the Outlook message, and updates the row so tomorrow’s run skips them automatically.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you add 15 new leads to a sheet each week. Manually, you’ll usually spend about 3 minutes per lead to filter the list, copy the email, paste a template into Outlook, send it, then return to the sheet to mark “Contacted.” That’s roughly 45 minutes a week, and it’s easy to miss a row. With this workflow, you add the lead to Sheets (maybe 1 minute), and the next scheduled run sends the email and updates Contacted = Yes automatically. The work becomes a quick review, not a repetitive task.
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 status field.
- Microsoft Outlook (Graph) to send the outreach email.
- OAuth credentials (create in n8n for Sheets and Outlook)
Skill level: Beginner. You’ll connect accounts, pick the right sheet/tab, and edit a basic email template.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A daily schedule kicks it off. You choose the time (like 09:00), and n8n runs the workflow automatically. No one has to remember to “do follow-ups.”
Your Google Sheet is treated like a queue. The workflow pulls rows from your leads tab and looks for a simple condition: the Contacted cell is empty, which means it’s fair game.
Outlook sends the message to each lead. The “To” field is mapped from the sheet’s Email column, and you can personalize the subject or body with other columns (FirstName, Company, Source). Keep it simple at first, honestly.
The sheet gets updated so it won’t re-send. After each send, the workflow writes back Contacted = Yes (matching on Email), which becomes your dedupe lock for the next run.
You can easily modify the schedule time to match your send window based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Schedule Trigger
Set the workflow to run automatically each day using the schedule trigger.
- Add the Scheduled Automation Trigger node as your trigger.
- Set the schedule rule to run at Trigger At Hour
9in the rule.interval configuration. - Confirm the trigger connects to Retrieve Sheet Rows as the next node.
Step 2: Connect Google Sheets
Pull lead data from Google Sheets and prepare the sheet connection for status updates.
- Open Retrieve Sheet Rows and select the spreadsheet Document ID
[YOUR_ID]and SheetSheet1(valuegid=0). - Credential Required: Connect your googleSheetsOAuth2Api credentials in Retrieve Sheet Rows.
- Open Update Lead Status and select the spreadsheet Document ID
[YOUR_ID]and Sheetleads(valuegid=0). - Credential Required: Connect your googleSheetsOAuth2Api credentials in Update Lead Status.
Step 3: Set Up Lead Filtering Logic
Filter out leads who have already been contacted so outreach only targets new contacts.
- Open Filter Uncontacted Leads and keep the condition where leftValue is
={{ $json.Contacted }}. - Ensure the operator is set to empty to pass only leads with no contact status.
- Confirm the flow connects from Retrieve Sheet Rows to Filter Uncontacted Leads.
Step 4: Configure Output Actions (Parallel)
Send outreach emails and update lead status in parallel for each uncontacted lead.
- In Dispatch Outlook Email, set To Recipients to
={{ $json.Email }}. - Set Subject to
Build AI Agents & Automations with n8nand Body Content to the provided email template. - Credential Required: Connect your microsoftOutlookOAuth2Api credentials in Dispatch Outlook Email.
- In Update Lead Status, set Operation to
appendOrUpdate. - Map Email to
={{ $json.Email }}and set Contacted toYes. - Confirm that Filter Uncontacted Leads outputs to both Update Lead Status and Dispatch Outlook Email in parallel.
Step 5: Test and Activate Your Workflow
Validate the workflow with a manual test, then turn it on for scheduled outreach.
- Click Execute Workflow to run a manual test from Scheduled Automation Trigger.
- Verify that Retrieve Sheet Rows returns lead data and Filter Uncontacted Leads passes only rows with an empty
Contactedfield. - Confirm Dispatch Outlook Email sends emails and Update Lead Status updates the
Contactedcolumn toYes. - Turn on the workflow using the Active toggle to enable the daily scheduled run.
Common Gotchas
- Google Sheets credentials can expire or lose access if the spreadsheet owner changes permissions. If things break, check n8n’s Credentials and the sheet’s sharing settings 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.
- Microsoft Outlook (Graph) sending can fail because of missing scopes like Mail.Send or tenant admin consent. Reconnect the Outlook credential and confirm the permission grant in Azure if you’re self-hosting.
Frequently Asked Questions
About 30 minutes if your Google and Microsoft accounts are ready.
No. You’ll mostly connect credentials and map a few fields like Email and Contacted.
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 Microsoft 365 access (Outlook/Graph) if your account isn’t already licensed.
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 keep it organized. Most people add a “Template” or “LeadType” column in Google Sheets, then use a Switch/If in n8n to choose a different subject/body before the Outlook send. You can also merge in fields like FirstName and Company so it reads like a real email. If you want to get fancy, that’s where an AI step (like an OpenAI Chat Model node) can draft variations, but it’s optional.
Usually it’s expired OAuth or missing Microsoft Graph permissions like Mail.Send. Reconnect the Outlook credential in n8n, then confirm your Azure app (if you self-host) has the right scopes and that admin consent was granted when required. Also check that the sending mailbox is allowed to send mail and isn’t being blocked by org policies. If you’re sending a lot at once, rate limiting can show up as intermittent failures.
On n8n Cloud, it depends on your plan’s monthly executions; self-hosting has no hard execution cap, but your server and email provider limits still apply. In practice, this workflow handles a typical small-business sheet comfortably, and most teams run it daily without issues.
Often, yes. n8n makes the “send, then update the row” logic easy to audit and extend, and self-hosting is a big deal if you don’t want per-task pricing. Zapier or Make can be quicker for a tiny two-step setup, but dedupe and branching can get messy as soon as you add rules. Try the workflow as-is, then decide. Talk to an automation expert if you want a recommendation for your exact volume and stack.
Once this is running, follow-ups stop being a daily chore and start being a default behavior in your funnel. Set it up once, and let the sheet stay clean.
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.