Every 15 minutes
Copy new HubSpot deals into Airtable
Every new HubSpot deal appears in your Airtable Deals table within 15 minutes, with a heads-up in Slack.
- Runs
- Every 15 minutes
- Apps
- Airtable, HubSpot
- AI
- Not needed
- Access
- crm.objects.deals.read; Airtable write
Send this to your assistant
Create a ClickRuntime automation: every 15 minutes, copy new HubSpot deals into my Airtable 'Deals' table and post each one to Slack.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
Sales lives in HubSpot, but delivery, finance and operations plan their work in Airtable. They need to know what's coming before it closes, so someone regularly copies new deals across, or the ops team asks for HubSpot seats they'll barely use.
This adds each new HubSpot deal to an Airtable table with its name, amount, stage and close date, and posts a short note to Slack. The people planning capacity see the pipeline in the tool they already use.
What you get out of it
Ops sees the pipeline early
Delivery and finance can plan around deals as soon as they're created.
No extra HubSpot seats
People who only need to see deals can read them in Airtable.
Each deal copied once
Deals already copied are remembered, so the table doesn't fill with duplicates.
The team hears about new deals
A one-line Slack post marks each new deal as it arrives.
How it works
What happens, step by step
Every 15 minutes, ClickRuntime asks HubSpot for deals created since the last check.
It skips any deal it has already copied.
Each new deal is added to your Airtable Deals table with its name, amount, stage and close date.
A short message about each new deal is posted to your Slack channel.
Before it runs live
- Connect Airtable
- 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
- Act only on the items that match your own rules, and skip the rest
- 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 Airtable and HubSpot steps into one automation
Under the hood
The code that runs this automation
import time
from clickruntime import on_trigger, credentials, http, state, notify, report_fetched
BASE_ID = "appXXXXXXXXXXXXXX"
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 at(method, path="", **kw):
r = http.request(method, f"https://api.airtable.com/v0/{BASE_ID}/{path}", headers={"Authorization": f"Bearer {credentials.connection('airtable', 'work')}"}, **kw)
return r.raise_for_status() or r.json()
@on_trigger
def run(event):
since = state.get("since") or int((time.time() - 3600) * 1000)
now = int(time.time() * 1000)
deals = hs("POST", "/crm/v3/objects/deals/search", json={"filterGroups": [{"filters": [{"propertyName": "createdate", "operator": "GTE", "value": str(since)}]}],
"properties": ["dealname", "amount", "dealstage", "closedate"], "limit": 100})["results"]
copied = set(state.get("copied") or [])
deals = [d for d in deals if d["id"] not in copied]
report_fetched(len(deals))
if not deals:
return {"copied": 0}
for d in deals:
p = d["properties"]
at("POST", "Deals", json={"typecast": True, "records": [{"fields": {"Deal": p["dealname"], "Amount": float(p.get("amount") or 0),
"Stage": p["dealstage"], "Close date": (p.get("closedate") or "")[:10] or None, "HubSpot ID": d["id"]}}]})
notify.slack(f"New deal: {p['dealname']} ({p.get('amount') or 'no amount'})", channel="#deals")
copied.add(d["id"])
state.set("copied", list(copied)[-1000:])
state.set("since", now)
return {"copied": len(deals)}FAQ
Common questions
Which deal details are copied?
Does it update the Airtable record when the deal changes?
Can I skip the Slack message?
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
Turn people in your Airtable engagement table into HubSpot contacts
People added to your Airtable engagement table, such as those who comment on your LinkedIn posts, become HubSpot contacts and are marked as synced.
See how it worksStart an Airtable onboarding record when a HubSpot deal is won
When a deal is won, an onboarding record is created in your Airtable tracker and the contact becomes a Customer in HubSpot.
See how it worksKeep contacts in sync between Airtable and HubSpot
Contacts stay the same in Airtable and HubSpot whichever side you edit, with the most recent change winning.
See how it worksKeep exploring
Set up “Copy new HubSpot deals into Airtable” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.