Daily
Email new HubSpot contacts nobody has contacted yet
New contacts who haven't heard from you get an introduction email from your Gmail each day, and HubSpot records that they've been contacted.
- Runs
- Daily
- Apps
- Gmail, HubSpot
- AI
- Not needed
- Access
- HubSpot contacts read+write; Gmail gmail.send
Send this to your assistant
Create a ClickRuntime automation: every day, email new HubSpot contacts who haven't been contacted yet from my Gmail and mark them as contacted.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
Contacts arrive in HubSpot from imports, events, partner referrals and the website. Many of them never get a first email because each salesperson assumes someone else has sent it, and a month later the list is stale.
This sends one introduction email a day to each new, untouched contact from your own address and marks them in HubSpot, so every new name gets a first touch and your team can see who still needs one.
What you get out of it
Every new contact hears from you
Nobody falls through the gap between import and outreach.
Status is visible in HubSpot
Each contact is marked as contacted with the date, so the team can filter and follow up.
It comes from a real person
Emails are sent from your Gmail, so they look like normal email and replies come to you.
Sending stays within limits
A daily cap keeps volume reasonable for your Gmail account.
How it works
What happens, step by step
Once a day, ClickRuntime looks in HubSpot for contacts with no lead status yet.
It sends each one your introduction email from your Gmail address, up to your daily cap.
It sets their lead status to Attempted to contact and records the date in HubSpot.
Contacts already marked are skipped next time, so nobody gets the email twice.
Before it runs live
- Connect Google through your own Google app (a one-time, 10-minute setup), so it works with your own Gmail
- Connect HubSpot
What you get
Build your own
Need it to work differently?
Your own rules
Conditions, thresholds, filters and exceptions, written the way you'd explain them to a colleague.
Any number of apps
One automation can read from one app and update several others. Over 248 apps are ready, and anything with an API works too.
AI where it helps
Summaries, classification, extraction and drafts use ClickRuntime's built-in AI, with no extra key.
On a schedule or on each event
Runs as often as every 5 minutes, or the moment an app sends an event, and keeps track of what it already handled.
Changes you can ask for
- Run it at a different time, more or less often, or only on weekdays
- Add an AI step, for example to summarize, sort or draft a reply
- Add another app, for example also send it to Slack
- Combine it with other Gmail and HubSpot steps into one automation
Under the hood
The code that runs this automation
import base64
from email.message import EmailMessage
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
from datetime import date
from clickruntime import on_trigger, credentials, http
DAILY_CAP = 50
def hs(method, path, **kw):
r = http.request(method, f"https://api.hubapi.com{path}", headers={"Authorization": f"Bearer {credentials.connection('hubspot', 'work')}"}, **kw)
return r.raise_for_status() or (r.json() if r.content else {})
def send(to, subject, body):
msg = EmailMessage(); msg["To"] = to; msg["Subject"] = subject; msg.set_content(body)
build("gmail", "v1", credentials=Credentials(credentials.connection("google", "work")), cache_discovery=False).users().messages().send(userId="me", body={"raw": base64.urlsafe_b64encode(msg.as_bytes()).decode()}).execute()
@on_trigger
def run(event):
found = hs("POST", "/crm/v3/objects/contacts/search", json={"filterGroups": [{"filters": [{"propertyName": "hs_lead_status", "operator": "NOT_HAS_PROPERTY"}]}],
"properties": ["email", "firstname", "company"], "limit": DAILY_CAP})["results"]
sent = 0
for c in (c for c in found if c["properties"].get("email")):
p = c["properties"]
send(p["email"], "Quick hello from Contoso", f"Hi {p.get('firstname') or 'there'},\n\nI saw {p.get('company') or 'your team'} "
"recently connected with us. Would a 15-minute call next week be useful?")
hs("PATCH", f"/crm/v3/objects/contacts/{c['id']}", json={"properties": {"hs_lead_status": "ATTEMPTED_TO_CONTACT", "first_outreach_date": date.today().isoformat()}})
sent += 1
return {"sent": sent}FAQ
Common questions
How does it know who hasn't been contacted?
Can I personalise the email?
How many emails go out per day?
What permissions does it need?
Does it need AI?
How many runs does it use?
Can I change how it works?
Related
You might also like
Follow up with HubSpot contacts who haven't replied
Contacts who didn't answer your first email get a polite follow-up from Gmail a few days later, and HubSpot shows it was sent.
See how it worksClose cold HubSpot deals and ask for feedback
Deals with no activity for three weeks are marked Closed Lost, the contact gets a short feedback email from Gmail, and the team sees a summary in Slack.
See how it worksDraft personal outreach emails for a HubSpot list
Each contact in your HubSpot outreach list gets a tailored email waiting in your Gmail drafts, ready for you to check and send.
See how it worksKeep exploring
Set up “Email new HubSpot contacts nobody has contacted yet” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.