Google Sheets + HubSpot: leads logged and followed up
Leads land in a Google Sheet, and then… nothing. Or worse, someone notices two days later, the prospect has already moved on, and you’re left wondering how many “hot” leads went cold because of a missed row.
This Sheets HubSpot leads automation hits small business owners first, honestly, because there’s no buffer. Marketing managers feel it when campaign volume spikes. And agencies juggling multiple clients usually end up building messy workarounds that still rely on someone “checking the sheet.”
This workflow turns every new spreadsheet entry into a real HubSpot contact, pings your team in Slack, and follows up if nobody responds in time. You’ll see exactly how the flow 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 + HubSpot: leads logged and followed up
flowchart LR
subgraph sg0["Spreadsheet Update Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Spreadsheet Update Trigger", pos: "b", h: 48 }
n1["<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/slack.svg' width='40' height='40' /></div><br/>Post Slack Alert"]
n2@{ icon: "mdi:message-outline", form: "rounded", label: "Send Email Notice", pos: "b", h: 48 }
n3["<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/hubspot.svg' width='40' height='40' /></div><br/>Create CRM Contact"]
n4@{ icon: "mdi:cog", form: "rounded", label: "Delay Interval", pos: "b", h: 48 }
n5@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Lead Follow-up Check", pos: "b", h: 48 }
n6@{ icon: "mdi:message-outline", form: "rounded", label: "Send Follow-up Email", pos: "b", h: 48 }
n7@{ icon: "mdi:cog", form: "rounded", label: "End Without Action", pos: "b", h: 48 }
n5 --> n6
n5 --> n7
n4 --> n5
n0 --> n1
n0 --> n2
n0 --> n3
n0 --> n4
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 n0 trigger
class n5 decision
classDef customIcon fill:none,stroke:none
class n1,n3 customIcon
The Problem: Leads Get Logged, Then Forgotten
Google Sheets is a great “catch-all” for lead capture, especially when your form tool drops responses straight into a spreadsheet. The problem is what happens after. Someone has to notice the row, copy details into HubSpot, tell the team, and then remember to follow up if the lead sits untouched. That’s a lot of mental load for something that should be automatic. And every manual handoff adds small mistakes: wrong phone number, missing company name, duplicate contacts that clutter your CRM, and awkward follow-ups that happen too late.
The friction compounds. Here’s where it usually breaks down in real life.
- New rows get buried because “checking the sheet” is nobody’s favorite daily task.
- Copy-pasting from Sheets into HubSpot creates duplicates, typos, and inconsistent properties.
- Teams rely on ad-hoc Slack messages, so the right person doesn’t see the lead in time.
- Follow-up timing is random, which means good leads cool off for no good reason.
The Solution: Log the Lead, Create the Contact, Nudge the Team
This workflow watches your lead intake sheet for new rows, then turns those rows into action automatically. The moment a lead lands in Google Sheets, n8n triggers, sends a Slack alert to your team (so someone actually sees it), and sends an email notification through Gmail (useful when Slack is optional or you want a paper trail). In parallel, it creates a contact in HubSpot, so the CRM stays current without manual entry. After that, it waits a set amount of time, checks whether the lead needs follow-up, and sends a follow-up email if they’re still sitting there untouched. If everything looks good, the workflow ends quietly.
It starts with a spreadsheet update trigger in Google Sheets. From there, the workflow notifies your team in Slack and Gmail while also creating the HubSpot contact. Finally, a timed delay and a simple check decide whether a follow-up email should go out or not.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you get 15 leads a week from a web form that writes to Google Sheets. Manually, it’s often about 10 minutes per lead to copy data into HubSpot, post a Slack note, and send a quick “got it” email. That’s around 2.5 hours weekly, plus the inevitable “did anyone reply yet?” checking. With this workflow, you spend maybe 2 minutes confirming the sheet columns and HubSpot fields once, then new leads trigger alerts and contact creation automatically while the follow-up check runs in the background.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets for storing incoming lead rows
- HubSpot to create and manage CRM contacts
- Slack for instant team notifications (optional)
- Gmail to send lead notices and follow-ups
Skill level: Beginner. You’ll connect accounts, map a few fields, and choose your follow-up delay.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A new lead hits your sheet. The workflow triggers when Google Sheets receives a new row (typically from Google Forms or another web form).
The lead gets shared immediately. n8n posts a Slack alert and sends a Gmail notice so the right people see the lead without anyone “checking the spreadsheet.”
Your CRM updates in the background. The same lead data is used to create a contact in HubSpot, which keeps your pipeline reporting accurate and your follow-up history in one place.
A delay, then a follow-up decision. After a wait period, an IF check decides whether the lead needs a follow-up email or can be left alone, then the workflow ends without noise.
You can easily modify the wait time to match your response SLA based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Spreadsheet Update Trigger
Start by configuring the Google Sheets trigger that detects new lead submissions in your spreadsheet.
- Add and open Spreadsheet Update Trigger.
- Set Document to
[YOUR_ID](Spreadsheet name:Simple Lead Tracker (Responses)). - Set Sheet Name to
[YOUR_ID](Sheet name:Form Responses 1). - Under Poll Times, keep
everyMinuteto check for updates every minute. - Credential Required: Connect your googleSheetsTriggerOAuth2Api credentials.
Step 2: Connect Google Sheets
Ensure your spreadsheet data fields match the workflow’s expected column names for proper data mapping downstream.
- Verify your sheet contains the columns used in expressions, such as
Name Surname,E-Mail,Phone,Interest Level,Lead Source,Notes, andFollowed Up?. - Keep the exact spacing in column headers (e.g.,
Interest Levelincludes leading and trailing spaces). - Optionally keep Flowpast Branding as a non-functional note for reference in the canvas.
{{$json[' Interest Level ']}} will return empty values.Step 3: Configure Output Notifications and CRM (Parallel Branches)
These actions run simultaneously when a new lead is detected.
Spreadsheet Update Trigger outputs to both Post Slack Alert, Send Email Notice, Create CRM Contact, and Delay Interval in parallel.
- Open Post Slack Alert and set Channel to
[YOUR_ID](channel:test-automation-workflow). - Set Text to
=🎯 *New Lead Alert!*\n\n*Name:* {{ $json['Name Surname'] }}\n*Email:* {{ $json['E-Mail'] }}\n*Phone:* {{$json["Phone"]}}\n*Interest Level:* {{ $json[' Interest Level '] }}\n*Source:* {{ $json[' Lead Source '] }}\n\n📝 Notes:\n{{ $json['Notes '] }}. - Credential Required: Connect your slackOAuth2Api credentials.
- Open Send Email Notice and set Send To to
[YOUR_EMAIL]. - Set Subject to
=📩 New Lead Received: {{ $json['Name Surname'] }}and Message to=<h3>New Lead Received!</h3> \n<ul> \n<li><strong>Name:</strong> {{ $json['Name Surname'] }}</li> \n<li><strong>Email:</strong> {{ $json['E-Mail'] }}</li> \n<li><strong>Phone:</strong> {{$json["Phone"]}}</li> \n<li><strong>Interest Level:</strong> {{ $json[' Interest Level '] }}</li> \n<li><strong>Source:</strong> {{ $json[' Lead Source '] }}</li> \n</ul> \n<p><strong>Notes:</strong> {{ $json['Notes '] }}</p>. - Credential Required: Connect your gmailOAuth2 credentials.
- Open Create CRM Contact and set Email to
={{ $json['E-Mail'] }}. - Set Additional Fields: Message to
={{ $json['Notes '] }}, Salutation to={{ $json[' Lead Source '] }}, Phone Number to={{ $json.Phone }}, and Relationship Status to={{ $json[' Interest Level '] }}. - Credential Required: Connect your hubspotOAuth2Api credentials.
Step 4: Configure the Follow-up Delay and Conditional Reminder
After a short delay, the workflow checks whether the lead has been followed up and sends a reminder if needed.
- Open Delay Interval and set Unit to
minutesand Amount to3. - In Lead Follow-up Check, confirm the conditions are: Followed Up? exists (
={{ $json['Followed Up?'] }}) AND Interest Level containsHot(={{ $json[' Interest Level '] }}). - For the “true” path, configure Send Follow-up Email with Send To set to
[YOUR_EMAIL]. - Set Subject to
⏰ *Follow-up Reminder!*and Message to=<h3>🔔 The following lead has not been followed up yet! 🔥 Interest level is hot </h3>\n<ul>\n <li><strong>Name:</strong> {{ $json['Name Surname'] }}</li>\n <li><strong>Email:</strong> {{ $json['E-Mail'] }}</li>\n <li><strong>Interest Level:</strong> {{ $json[' Interest Level '] }}</li>\n</ul>\n<p><strong>Please follow up and update the spreadsheet ✅</p>\n\n. - Credential Required: Connect your gmailOAuth2 credentials.
- For the “false” path, leave End Without Action as the terminal node.
Step 5: Test and Activate Your Workflow
Validate the workflow end-to-end before turning it on for production use.
- Click Execute Workflow and add a new row in your Google Sheet with valid data.
- Confirm the lead triggers Slack and email alerts, a HubSpot contact is created, and the delay starts.
- After 3 minutes, verify Lead Follow-up Check evaluates correctly and sends a reminder when the lead is hot and not followed up.
- Once testing succeeds, toggle the workflow to Active for ongoing automated lead intake tracking.
Common Gotchas
- Google Sheets permissions can be tricky in shared drives. If the trigger stops firing, check the connected Google account access and the exact spreadsheet/tab selection in n8n.
- If you’re using Wait nodes or external timing, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- HubSpot contact creation can fail if required properties aren’t mapped. Check the HubSpot node’s field mappings and your HubSpot account permissions before you chase “random” errors.
Frequently Asked Questions
About 30 minutes if your accounts are already connected.
No. You’ll mostly map fields and choose where alerts go. If you can handle a spreadsheet, you can handle this.
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 any HubSpot plan limits and your email sending limits in Gmail.
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 it’s straightforward. You can disable or remove the Gmail notice node while keeping the Slack alert node active. Common tweaks include changing the Slack channel based on lead source, adjusting the wait time before the follow-up check, and adding extra HubSpot fields like lifecycle stage.
Most of the time it’s expired authorization or missing permissions on the HubSpot account. Reconnect HubSpot inside n8n credentials, then double-check the HubSpot node is allowed to create contacts in that portal. If failures happen only when leads spike, you may also be hitting rate limits or sending invalid data (like an empty email field), so your IF filters should block incomplete rows.
Practically, a lot. On n8n Cloud, the limit is based on your monthly executions, and each lead usually consumes a handful of executions depending on follow-up paths. If you self-host, there’s no hard execution cap, but your server resources and HubSpot/Gmail limits still apply.
Yes, if you care about follow-up logic and keeping costs predictable as volume grows. n8n is comfortable with multi-step flows like “notify, create contact, wait, then check and follow up,” and you’re not forced into a linear two-step zap. It’s also easier to add guardrails, like filtering incomplete rows or handling duplicates, without turning your automation into five separate paid workflows. Zapier or Make can be simpler for a basic “new row → create contact” connection, though. Talk to an automation expert if you want help choosing.
Once this is running, new leads stop being a “hope someone saw it” problem. The workflow handles the repetitive chasing so your team can focus on 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.