🔓 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: CRM follow ups that run

Lisa Granqvist Partner Workflow Automation Expert

Your “CRM” is probably a Google Sheet that’s doing way too much. Someone changes a lead stage, someone else forgets to follow up, and now you’re digging through old threads trying to remember what you promised and when.

This is where Sheets Gmail CRM automation earns its keep. Sales ops people feel it first, but agency owners and marketing managers running lead pipelines in spreadsheets live in the same chaos. You get consistent follow-ups, cleaner client records, and delivery time tracking without buying a heavyweight CRM.

This workflow turns simple sheet edits into actions. You’ll see what triggers it, what it updates, what it emails, and how it keeps your pipeline honest.

How This Automation Works

See how this solves the problem:

n8n Workflow Template: Google Sheets + Gmail: CRM follow ups that run

The Challenge: Spreadsheet CRMs Fall Apart in Follow-Up

A Google Sheet is great at storing lead info. It’s terrible at making sure the next step actually happens. The moment your pipeline depends on “someone remembering,” you get gaps: no proposal heads-up, no booking link, no clean handoff when a deal is won. Then the “Clients” tab becomes a graveyard of half-filled rows, missing dates, and delivery timelines that nobody trusts. And honestly, it’s the mental load that stings most. You’re running the business while also trying to be the workflow engine.

It adds up fast. Here’s where it breaks down in real life.

  • Stage changes happen in the sheet, but the follow-up email never gets sent because it wasn’t tied to the change.
  • Won deals don’t get copied into a separate “Clients” tracker, so delivery status lives in random places.
  • Start and end timestamps are missing or inconsistent, which makes “time to deliver” more like a guess.
  • Even when someone does everything right, it still takes constant checking and nudging to keep the pipeline moving.

The Fix: Turn Sheet Edits Into Automatic Follow Ups

This n8n workflow watches your Google Sheet like a lightweight CRM assistant. When someone edits a lead’s stage or marks them as qualified, a small Google Apps Script sends that change to n8n instantly via webhook. n8n then decides what to do based on the exact update: send the right Gmail follow-up, append a won lead into a proper Clients tab, or stamp end dates when a project is delivered. It also calculates “Time to Deliver” so you stop doing date math in your head. The end result is a pipeline that moves forward because actions happen as soon as the sheet changes, not when you remember later.

The workflow begins when your sheet is edited and the Apps Script posts JSON to n8n. From there, n8n branches based on the field that changed (Qualified, Stage, Project Status). Finally, Gmail and Google Sheets updates happen automatically so your Leads and Clients tabs stay in sync.

What Changes: Before vs. After

Real-World Impact

Say you handle 20 active leads a week and you usually do 3 manual steps when they move stages: send an email (about 5 minutes), update another tab (about 3 minutes), and add timestamps (about 2 minutes). That’s roughly 10 minutes per lead update, which turns into about 3 hours of fiddly work weekly. With this workflow, the “work” is changing a cell in Google Sheets, then waiting for the email and updates to complete in the background. You still decide the stage, but you stop doing the admin.

Requirements

  • n8n instance (try n8n Cloud free)
  • Self-hosting option if you prefer (Hostinger works well)
  • Google Sheets to store Leads and Clients tabs
  • Gmail to send follow-up emails automatically
  • Google Apps Script access (Extensions → Apps Script in Sheets)

Skill level: Intermediate. You’ll paste an Apps Script, connect Google credentials in n8n, and replace a few placeholders.

Need help implementing this? Talk to an automation expert (free 15-minute consultation).

The Workflow Flow

A sheet edit triggers the automation. A small Google Apps Script listens for edits in your Leads or Clients tabs and posts the changed row data to the right n8n webhook.

n8n checks what changed and routes it. If the update is “Qualified? = true,” it goes down the qualification branch. If it’s a stage change, n8n checks for “Awaiting Proposal” or “Won.” If it’s a client status change, it checks for “Delivered.”

Emails and timestamps happen automatically. Gmail sends your booking email (with your Cal.com link) or a proposal heads-up message. When a lead becomes “Won,” n8n formats the start time and appends a new row to the Clients tab so fulfillment starts with a clean record.

Delivery duration gets calculated and written back. When a project status becomes Delivered, the workflow looks up the client row by email, stamps an end time, computes the time-to-deliver, and updates the sheet.

You can easily modify Gmail copy to match your voice, or switch the notification step to Slack based on your needs. See the full implementation guide below for customization options.

Step-by-Step Implementation Guide

Step 1: Configure the Webhook Trigger

This workflow uses three webhook entry points for different CRM events. Set each webhook path and method exactly as shown so your external systems can call them.

  1. Add the Incoming Lead Stage Hook node and set HTTP Method to POST with Path set to lead-stage-changed.
  2. Add the Lead Qualified Webhook node and set HTTP Method to POST with Path set to lead-qualified.
  3. Add the Meeting Booked Webhook node and set HTTP Method to POST with Path set to cal-booked.
  4. Add the Client Status Webhook node and set HTTP Method to POST with Path set to client-status-changed.

Copy each webhook’s production URL from n8n and use it in your CRM or scheduling tool so events reach the correct trigger.

Step 2: Connect Google Sheets

Several nodes read and write to your CRM spreadsheet for leads and clients. Connect Google Sheets once and configure each node to the correct document and sheet.

  1. Open Append Won Client Row and select the spreadsheet in Document using {{GOOGLE_SHEETS_DOC_ID}}, then set Sheet to {{CLIENTS_GID}} and keep Operation as append.
  2. Set the Append Won Client Row column mappings: Name{{ $json.body.name }}, Client Email{{ $json.body.email }}, Start Date & Time{{ $json.data }}.
  3. Open Lookup Client by Email and set the filter Client Email to {{ $json.body.email }}, with Document {{GOOGLE_SHEETS_DOC_ID}} and Sheet {{CLIENTS_GID}}.
  4. Open Update Lead to Meeting Booked, set Operation to update, Document to {{GOOGLE_SHEETS_DOC_ID}}, Sheet to gid={{LEADS_GID}}, and match on Client Email.
  5. Map Update Lead to Meeting Booked values: StageMeeting Booked, Client Email{{ $json.body.payload.attendees[0].email }}.
  6. Open Update Client End Duration and set Operation to update, with Document {{GOOGLE_SHEETS_DOC_ID}} and Sheet {{CLIENTS_GID}}, matching on Client Email.
  7. Map Update Client End Duration values: Client Email{{ $json["Client Email"] }}, End Date & Time{{ $json.endStr }}, Time to Deliver{{ $json.duration }}.
  8. Credential Required: Connect your googleSheetsOAuth2Api credentials to Append Won Client Row, Lookup Client by Email, Update Lead to Meeting Booked, and Update Client End Duration.

⚠️ Common Pitfall: The update nodes rely on matching Client Email. Ensure that column exists and the email in incoming payloads matches the sheet values exactly.

Step 3: Set Up Lead Stage Processing

This branch handles stage-change notifications, sends proposal emails, and appends “Won” clients to the spreadsheet.

  1. In Assemble Email Fields, add fields with these expressions: firstName{{ $json.body.name ? $json.body.name.trim().split(' ')[0] : 'there' }}, sourcePlatform {{ $json.body.source_text || 'Unknown' }}, stage{{ $json.body.stage }}, previousStage{{ $json.body.previous_stage || '' }}.
  2. In Check Awaiting Proposal, set the condition to compare Left Value {{ $json.stage }} equals Awaiting Proposal.
  3. Configure Gmail Send Stage Update with Send To {{ $('Assemble Email Fields').item.json.body.email }}, Subject Next Steps, and the provided HTML in Message.
  4. In Check Stage Won, set the condition Left Value {{ $json.stage }} equals Won.
  5. Configure Format Start Time with Value {{ $now }} and To Format DD/MM/YYYY 'at' HH:mm.
  6. Credential Required: Connect your gmailOAuth2 credentials to Gmail Send Stage Update.

The execution flow is linear: Incoming Lead Stage HookAssemble Email FieldsCheck Awaiting ProposalGmail Send Stage UpdateCheck Stage WonFormat Start TimeAppend Won Client Row.

Step 4: Configure Lead Qualification Emailing

Qualified leads receive an invitation email to book a discovery call.

  1. In Verify Qualification, set the condition to check Left Value {{ $json.body.qualified }} is true.
  2. Configure Send Cal Invite Email with Send To {{ $json.body.email }}, Subject Book Your Discovery Call, and the provided HTML in Message.
  3. Credential Required: Connect your gmailOAuth2 credentials to Send Cal Invite Email.

Step 5: Track Client Delivery Status and Duration

This branch updates the client’s end date and delivery duration once the project is marked as delivered.

  1. In Check Delivered Status, set the condition Left Value {{ $json.body.project_status }} equals Delivered.
  2. Configure Format End Time with Value {{ $now }} and To Format DD/MM/YYYY 'at' HH:mm.
  3. Keep Compute Delivery Duration as-is, ensuring it runs after Lookup Client by Email and Format End Time to compute endStr and duration.
  4. Confirm Compute Delivery Duration outputs to Update Client End Duration to write the computed values back to the spreadsheet.

⚠️ Common Pitfall: The code expects a “Start Date & Time” column format like DD/MM/YYYY at HH:mm. If your sheet uses a different format, adjust the parser in Compute Delivery Duration.

Step 6: Test and Activate Your Workflow

Run manual tests for each webhook path to confirm emails and spreadsheet updates occur as expected.

  1. Use the Test button on Incoming Lead Stage Hook, send a sample payload, and confirm Gmail Send Stage Update sends an email when stage is Awaiting Proposal.
  2. Trigger Lead Qualified Webhook with qualified: true and verify Send Cal Invite Email sends the booking invite.
  3. Trigger Meeting Booked Webhook and confirm Update Lead to Meeting Booked updates the Stage in your Leads sheet.
  4. Trigger Client Status Webhook with project_status: Delivered and verify Update Client End Duration updates End Date & Time and Time to Deliver.
  5. When all tests pass, toggle the workflow to Active to enable production automation.
🔒

Unlock Full Step-by-Step Guide

Get the complete implementation guide + downloadable template

Watch Out For

  • Google Sheets credentials can expire or need specific permissions. If things break, check the n8n credential status and re-authorize the Google account 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.

Common Questions

How quickly can I implement this Sheets Gmail CRM automation?

About an hour if your Google Sheet is already set up.

Can non-technical teams implement this Sheets Gmail CRM?

Yes, but you will need someone comfortable pasting a Google Apps Script. No “real coding,” yet you do have to connect Google credentials and replace webhook URLs.

Is n8n free to use for this Sheets Gmail CRM 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 Workspace limits if your account is heavily restricted.

Where can I host n8n to run this 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.

How do I adapt this Sheets Gmail CRM solution to my specific challenges?

You can swap Gmail for Slack by replacing the “Gmail Send Stage Update” and “Send Cal Invite Email” nodes with Slack message nodes. Common tweaks include adding a “Stage = Lost” branch in the stage-check logic, changing the email copy in the “Assemble Email Fields” step, and adding a duplicate-check before “Append Won Client Row” so you don’t create two client records for the same email.

Why is my Google Sheets connection failing in this workflow?

Usually it’s an expired OAuth authorization in n8n. Reconnect your Google Sheets credential, then confirm the workflow is pointing at the correct document ID and tab GIDs, because the wrong gid can look like a “connection” issue when it’s really a target mismatch.

What’s the capacity of this Sheets Gmail CRM solution?

For most small teams, it’s effectively “as many sheet edits as you make.” On n8n Cloud Starter you can run thousands of executions per month, and each stage change or qualification can be one execution. If you self-host, there’s no execution cap, but Google Sheets and Gmail still have API quotas, so bursts of edits can get throttled. If you expect lots of updates at once (importing hundreds of rows), run it in batches and test during low-traffic hours. Day-to-day pipeline updates are usually fine.

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

Often, yes. This setup relies on branching logic (Qualified vs Awaiting Proposal vs Won vs Delivered), and n8n handles that without turning every “if” into another paid step. You also get the option to self-host, which matters when your pipeline grows and you don’t want pricing surprises. Zapier and Make can still be simpler if you only need one trigger and one email. If you’re unsure, Talk to an automation expert and we’ll help you pick the right approach.

Your sheet stays simple, but it starts behaving like a real system. Set this up once, then let follow-ups, client logging, and delivery tracking run in the background.

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