HubSpot + Gmail: follow ups sent and logged for you
Your follow-up process is probably “good” until it isn’t. A lead replies late, you miss it. Or you forget to circle back after that first email, and the deal quietly dies in your CRM timeline.
Sales reps feel it in their pipeline. Marketing ops feels it when attribution gets messy. And founders doing sales themselves? Honestly, they just run out of hours. This HubSpot Gmail followups automation keeps leads warm without turning your day into a reminder app.
In this guide, you’ll see exactly how the workflow decides who to follow up with, sends the email from Gmail, and logs the engagement back to HubSpot so your timeline stays clean.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: HubSpot + Gmail: follow ups sent and logged for you
flowchart LR
subgraph sg0["Every day at 9 am Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Every day at 9 am", pos: "b", h: 48 }
n1@{ icon: "mdi:message-outline", form: "rounded", label: "Send outreach email", pos: "b", h: 48 }
n2["<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/>Record engagement in HubSpot"]
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/>Get previously HubSpot conta.."]
n4@{ icon: "mdi:swap-horizontal", form: "rounded", label: "if last contacted before a m..", pos: "b", h: 48 }
n5["<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/>Get Hubspot Contact to engag.."]
n6@{ icon: "mdi:swap-horizontal", form: "rounded", label: "if there has been only one e..", pos: "b", h: 48 }
n7@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set email keys", pos: "b", h: 48 }
n7 --> n2
n7 --> n1
n0 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
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 n4,n6 decision
class n5 api
classDef customIcon fill:none,stroke:none
class n2,n3,n5 customIcon
The Problem: Follow-ups slip, and your CRM lies about it
Following up sounds simple until you’re dealing with real life. You send a first email, then the week gets busy, and suddenly it’s been “about a month” and you can’t remember who needs a nudge. HubSpot might show a contact as “touched,” but the timeline doesn’t always reflect what happened in Gmail, especially when you’re moving fast. The result is awkward double-emails, stale leads, and a pipeline that looks healthier than it really is.
It adds up fast. Here’s where it usually breaks down.
- You spend about 10 minutes per lead searching HubSpot, checking dates, then writing a follow-up.
- Some leads get over-contacted because there’s no reliable “last touch” rule you trust.
- Other leads get ignored because they don’t scream for attention, which means money quietly leaks out of the funnel.
- Your HubSpot activity history becomes incomplete, so reporting and handoffs turn into guesswork.
The Solution: HubSpot-driven follow-ups that send via Gmail and log automatically
This workflow runs every day on a schedule and looks for HubSpot contacts that meet a very specific condition: they’ve been contacted exactly once, and that contact happened more than 30 days ago. When it finds someone who matches, it pulls the engagement details (so it can verify the “single engagement” rule), maps the email fields you want to use, and then sends a follow-up email through Gmail. Right after sending, it logs that outreach back into HubSpot as an engagement, so your CRM timeline reflects reality. No copy-pasting. No “did I already email them?” spiral.
The workflow starts with a daily 9AM trigger. It retrieves contacts from HubSpot, checks the “over 30 days” rule, then confirms there’s only one prior engagement before it sends. Finally, it dispatches the Gmail follow-up and logs the engagement back to HubSpot in the same run.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you have a small sales team and about 40 “first-touch” leads a week that need a second nudge after a month. Manually, checking HubSpot, verifying the last engagement, sending from Gmail, and logging the activity might take about 10 minutes per lead, or roughly 6–7 hours weekly. With this workflow, the daily 9AM run handles the checks and the logging automatically, and you only spend time reviewing edge cases. Most teams get those 6 hours back, and the CRM stays accurate.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- HubSpot to retrieve contacts and log engagements
- Gmail to send the follow-up emails
- HubSpot OAuth2 credentials (create in n8n, verify scopes in HubSpot)
Skill level: Intermediate. You’ll connect accounts, confirm HubSpot scopes, and edit a few email variables in a Set node.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A daily schedule kicks things off. The workflow runs at 9AM and immediately pulls a batch of relevant contacts from HubSpot, so you’re not relying on someone’s memory (or a half-maintained task list).
Contacts get filtered using simple rules. An If check looks for people contacted over 30 days ago, and another check confirms the contact has only been engaged once. That “single engagement” verification uses an HTTP request to fetch engagement links before deciding who qualifies.
Follow-up email details are mapped once. The workflow uses a Set (Edit Fields) step to map things like recipient address, subject line, and body variables, so the Gmail send step has clean, predictable inputs.
Gmail sends, HubSpot records. Qualified contacts receive the follow-up email, and the workflow logs the outreach back into HubSpot as an engagement, keeping the timeline and reporting consistent.
You can easily modify the follow-up timing from “30 days” to a shorter 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 every day at 9AM using the scheduler node.
- Add the Daily 9AM Scheduler node.
- Set Rule to trigger daily at
9using triggerAtHour. - Connect Daily 9AM Scheduler to Retrieve Past HubSpot Contacts.
Step 2: Connect HubSpot and Filter Contact Timing
Pull contacts from HubSpot, then filter to only those last contacted over 30 days ago.
- Configure Retrieve Past HubSpot Contacts with Operation set to
searchand Authentication set tooAuth2. - In filterGroupsUi, add a filter with Operator
HAS_PROPERTYand Property Namenotes_last_contacted|datetime. - In Additional Fields, set Sort By to
notes_last_contacted, Direction toASCENDING, and include propertiesfirstname,lastname,email,notes_last_contacted. - Credential Required: Connect your hubspotOAuth2Api credentials to Retrieve Past HubSpot Contacts.
- Configure Check Contacted Over 30 Days with Left Value
{{ $json.properties.notes_last_contacted }}and Right Value{{ DateTime.now().minus({days: 30}) }}using the before date operator.
⚠️ Common Pitfall: If notes_last_contacted is missing, the date comparison will fail—ensure the property exists in HubSpot or adjust the filter.
Step 3: Validate Engagement Links and Map Email Fields
Check a single engagement link exists, then build the follow‑up email content.
- Configure Fetch Contact Engagement Links with URL set to
=https://api.hubapi.com/crm-associations/v1/associations/{{ $json.id }}/HUBSPOT_DEFINED/9. - Set Authentication to
predefinedCredentialTypeand nodeCredentialType tohubspotOAuth2Api. - Credential Required: Connect your hubspotOAuth2Api credentials to Fetch Contact Engagement Links.
- Configure Verify Single Engagement to check Left Value
{{ $json.results.length }}equals1. - In Map Email Fields, add assignments for html, subject, to, and id.
- Set html to
=Hey {{ $json.properties.firstname }},\n\nJust want to follow up on my previous email, since I have not \n heard from you. Have you had the chance to consider n8n? \n\nCheers,\n\nTeam. - Set subject to
Follow up on n8n. - Set to to
={{ $('Retrieve Past HubSpot Contacts').item.json.properties.email }}and id to={{ $('Retrieve Past HubSpot Contacts').item.json.id }}.
Step 4: Configure Output Actions (Parallel Email + HubSpot Log)
Send the follow‑up email and log the engagement in HubSpot simultaneously.
- Connect Map Email Fields to both Log HubSpot Engagement and Dispatch Follow‑up Email so they run in parallel.
- Confirm Map Email Fields outputs to both nodes in parallel as: Map Email Fields outputs to both Log HubSpot Engagement and Dispatch Follow‑up Email in parallel.
- Configure Dispatch Follow‑up Email with Send To
={{ $json.to }}, Message={{ $json.html }}, and Subject={{ $json.subject }}. - Set Sender Name to
Automation Teamand disable Append Attribution if required. - Credential Required: Connect your gmailOAuth2 credentials to Dispatch Follow‑up Email.
- Configure Log HubSpot Engagement with Type
email, Resourceengagement, and AuthenticationoAuth2. - Set metadata.html to
={{ $json.html }}, metadata.subject to={{ $json.subject }}, metadata.toEmail to={{ $json.to }}, and associations.contactIds to={{ $json.id }}. - Credential Required: Connect your hubspotOAuth2Api credentials to Log HubSpot Engagement.
⚠️ Common Pitfall: If you leave [YOUR_EMAIL] in fromEmail, HubSpot may reject the engagement—replace it with a verified sender address.
Step 5: Test and Activate Your Workflow
Run a manual test to confirm emails send and engagements are logged, then activate for daily use.
- Click Execute Workflow to run a test from Daily 9AM Scheduler.
- Verify that Retrieve Past HubSpot Contacts returns contacts and that Check Contacted Over 30 Days passes only older contacts.
- Confirm Dispatch Follow‑up Email sends an email and Log HubSpot Engagement creates an engagement record for the same contact.
- Turn on the workflow using the Active toggle to enable daily runs at 9AM.
Common Gotchas
- HubSpot OAuth scopes have to be exact for this workflow. If the “Retrieve Past HubSpot Contacts” or “Log HubSpot Engagement” step fails, check the credential scopes in n8n 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.
- Gmail sending can fail silently when you hit limits or permissions change. Confirm the Gmail credential is still connected in n8n, then send a test email from the “Dispatch Follow-up Email” node.
Frequently Asked Questions
About 30 minutes if your HubSpot scopes are already sorted.
No. You’ll connect HubSpot and Gmail, then edit a few fields in the Set node.
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 HubSpot and Gmail plan limits, but this workflow does not require a paid AI API.
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 you’ll want to be intentional. Update the filter logic in the “Check Contacted Over 30 Days” If node to match your timing, and keep the “Verify Single Engagement” rule if you only want to target first-touch leads. Many teams also tweak the “Retrieve Past HubSpot Contacts” search criteria so they’re not pulling unnecessary records every morning. And don’t forget the actual email copy in the Set keys/Map Email Fields step, because the default text is rarely right for your brand.
Most of the time it’s OAuth scopes or expired credentials. Reconnect HubSpot in n8n, then verify the scopes match what the HubSpot nodes require (missing or extra scopes can break it). Also check if your HubSpot account permissions changed, because that can block reading contacts or writing engagements. If failures happen only on larger batches, rate limiting can be the culprit, especially around the HTTP request that fetches engagement links.
On n8n Cloud Starter, you can run thousands of executions per month, which is plenty for most small teams doing daily follow-ups. If you self-host, there’s no execution cap, and the real limit is your server and HubSpot/Gmail rate limits. Practically, it’s fine to process a few hundred contacts in a morning run if your filtering is tight.
Often, yes. This workflow relies on multi-step filtering (over-30-days plus “only one engagement”) and an HTTP request to verify engagement links, which is the kind of logic that gets clunky and expensive in simpler automation tools. n8n also gives you a clean path to self-hosting when volume grows, so you’re not paying per tiny step forever. Zapier or Make can still be a fit if you want a very simple two-action zap and you never plan to evolve the rules. If you’re unsure, Talk to an automation expert and get a quick recommendation.
Once this is running, follow-ups happen on time and get logged where they belong. That’s a few hours back each week, plus a CRM you can actually trust.
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.