Opening Problem Statement
Meet Mutasem, a sales development representative at a mid-sized SaaS company using HubSpot as their CRM. Every morning, Mutasem spends nearly two hours manually filtering through HubSpot contacts to identify leads who have never been contacted before. He then crafts personalized outreach emails and sends them one-by-one through Gmail. This tedious routine not only wastes valuable time but also risks human errors—like missing leads or repetitive emails—that could cost potential business opportunities. Without an automated way to find and contact unengaged leads, Mutasem’s outreach process is inefficient and limits the company’s growth potential.
Specifically, the problem Mutasem faces is identifying HubSpot contacts who do not have a recorded “last contacted” date or any engagement notes and reaching out to them systematically with a personalized email. After sending the outreach, it’s crucial to log the interaction in HubSpot so the lead isn’t contacted again unnecessarily. Doing this manually daily is error-prone and time-draining.
What This Automation Does
This n8n workflow automates Mutasem’s daily outreach routine entirely by doing the following:
- Every day at 9 AM, it triggers automatically.
- Searches HubSpot for contacts who have no recorded last contact date (uncontacted leads).
- Prepares a personalized outreach email for each uncontacted contact using their first name and email address.
- Sends the outreach email using Gmail with a custom sender name and subject line.
- Records the engagement in HubSpot under the contact’s profile so that these contacts are marked as contacted.
- Ensures no lead is contacted twice by updating HubSpot engagement notes.
With this automation, Mutasem can save approximately two hours daily, avoid manual errors, reach more leads consistently, and focus on meaningful follow-ups rather than repetitive email tasks.
Prerequisites ⚙️
- HubSpot account with OAuth2 credentials configured in n8n.
(Make sure to include the exact OAuth2 scopes as per n8n HubSpot docs.) - Gmail account linked to n8n configured to send emails.
- Access to an n8n instance—either cloud-hosted or self-hosted ⚙️. For affordable self-hosting, you can consider Hostinger with n8n.
Step-by-Step Guide
1. Schedule the Workflow to Run Daily at 9 AM
On your n8n canvas, add a Schedule Trigger node.
- Navigate to Triggers > Schedule Trigger.
- Set the interval to trigger daily at 9 AM by selecting the hour “9” in the time picker.
- This will initialize the workflow every morning to start the outreach process automatically.
- Common mistake: Forgetting to save or activate the node, so the workflow doesn’t run.
2. Search HubSpot for Uncontacted Leads
Add a HubSpot node configured for a search operation.
- Select the HubSpot OAuth2 credentials you configured.
- Under Filter Groups, add a filter with NOT_HAS_PROPERTY operator on the
notes_last_contacted|datetimeproperty. This filters all contacts lacking a last contact date. - This ensures only unengaged leads are processed.
- Common mistake: Incorrect property name or filter operator can return no contacts.
3. Prepare Email Content with Contact Details
Add a Set node to assign keys and prepare email fields.
- Create fields such as
html,subject,to, andid. - Use expressions like
=Hey {{ $json.properties.firstname }}to personalize the email body. - Set a friendly subject like “Why n8n?” and assign the email property from the HubSpot data.
- This step formats the email content dynamically for every contact.
- Common mistake: Incorrect reference in expressions resulting in empty or wrong email content.
4. Send the Outreach Email via Gmail
Use the Gmail node to send the personalized email.
- Configure the recipient using
{{ $json.properties.email }}. - Insert the subject and the personalized HTML message from prior step.
- Set the sender name to “Mutasem from n8n” and disable attribution append.
- Once executed, emails go out automatically to all uncontacted leads.
- Common mistake: Gmail API rate limits if too many emails are sent quickly.
5. Record Engagement in HubSpot
Add another HubSpot node configured to record an email engagement.
- Set resource to “engagement” and type to “email”.
- Fill metadata with the same email content, subject, recipient, and sender information.
- Associate this engagement with the contact ID retrieved earlier to ensure HubSpot updates the contact’s last contacted date.
- Common mistake: Failing to map the contact IDs properly causes engagement to not be recorded.
Customizations ✏️
1. Modify the Email Content
In the Set keys node, change the html assignment to include your own company messaging, links, or calls to action.
2. Change the Email Sending Time
In the Schedule Trigger node, adjust the hour to send outreach at a different time based on your leads’ time zones or preferences.
3. Add Additional Filters in HubSpot Search
Within the Get uncontacted HubSpot contacts node, add more filters, e.g., filtering by lead status or region, so you contact only targeted segments.
4. Append a Tracking URL
Modify the email body in the Set keys node to include click-tracking URLs or UTM parameters for campaign analytics.
Troubleshooting 🔧
Problem: No contacts found in HubSpot search
Cause: The filter “NOT_HAS_PROPERTY” may be incorrect or no contacts meet the criteria.
Solution: Verify the property name in HubSpot and test filters manually in HubSpot’s UI. Check OAuth2 credentials and permissions.
Problem: Emails not sending via Gmail node
Cause: Gmail API limits, invalid OAuth2 setup, or missing send permissions.
Solution: Confirm credentials in n8n, refresh tokens if expired, and respect Gmail’s daily sending limits.
Problem: Engagements not recorded in HubSpot
Cause: Incorrect contact ID mapping or missing required fields in engagement metadata.
Solution: Ensure contact IDs are passed correctly from the Set node and all required metadata fields are filled.
Pre-Production Checklist ✅
- Confirm OAuth2 credentials for both HubSpot and Gmail are active and properly scoped.
- Run one test contact through the workflow to ensure emails send and engagements record correctly.
- Verify email formatting and personalization tags render as expected.
- Back up existing HubSpot data or work in a test environment to avoid impacting live leads.
- Check time zone settings in the Schedule Trigger node to align with your target audience’s timezone.
Deployment Guide
Once fully tested, activate the workflow in n8n’s UI by toggling the active switch.
Ensure your n8n instance runs 24/7 or during the scheduled time to guarantee workflow execution daily.
Monitor email deliveries via Gmail logs and HubSpot engagement records for auditing.
FAQs
Can I use Outlook instead of Gmail for sending emails?
Yes, you can replace the Gmail node with the Outlook node in n8n. Just configure Outlook OAuth2 credentials and adjust email parameters accordingly.
Does this workflow consume API credits?
HubSpot’s free tier has limits on API calls; consider your volume to avoid hitting limits. Gmail also has daily sending limits that should be respected.
Is my data secure?
All OAuth2 authentications keep your data secure. However, always ensure your n8n instance is secured and access is controlled.
Can this handle large volumes of contacts?
For very large lead lists, consider batching requests or pacing emails to avoid rate limits.
Conclusion
By building this targeted n8n automation, you automated the tedious task of identifying and emailing uncontacted HubSpot leads while recording engagement seamlessly. You just saved hours of manual work and significantly improved outreach consistency.
This workflow can be further enhanced by integrating lead scoring, multi-channel outreach, or detailed reporting.
Next, you might want to automate follow-ups for unresponsive leads or sync new HubSpot contacts to a Google Sheet for easy analysis.
Get started now and empower your sales team with smarter outreach automation!