Weekly
Get a weekly list of customers at risk of leaving
Each Monday you get a ranked list of customers who look likely to churn, with a reason for each.
- Runs
- Weekly
- Apps
- HubSpot
- AI
- Yes, uses the built-in AI allowance
- Access
- crm.objects.contacts.read, crm.objects.deals.read
Send this to your assistant
Create a ClickRuntime automation: every Monday at 8am, look at my HubSpot customers' recent activity and deals, flag the ones at risk of leaving with a one-line reason, and email me the list.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
A customer success manager covering 120 accounts cannot read every contact timeline each week. An account that went quiet after a pricing dispute looks fine in HubSpot because its deal is still open and the last logged note is two months old. The warning signs, such as no emails, no meetings and a stalled renewal deal, are all there, but they are spread across records no one has time to cross-check.
Once a week, ClickRuntime pulls each customer's last activity date and deal data from HubSpot and has built-in AI read them together. It gives every account a risk score with a short reason, such as "no contact in 60 days, renewal deal stuck in negotiation", then emails you the list ranked from highest risk down.
Teams with a book of customers too large to review by hand will get the most from it.
What you get out of it
Save accounts while there is still time
Churn is usually visible weeks before a cancellation email. A ranked list on Monday morning points you at the accounts to call that week, when a conversation can still change the outcome.
Attention goes to the right accounts
Without a ranking, success managers tend to contact the loudest customers. A score with a stated reason directs effort toward quiet accounts that are actually drifting, which is where revenue is lost.
Reasons you can act on
A bare score is easy to ignore. Because each line states why the account was flagged, such as a stalled deal or long silence, you know what to ask in the call instead of starting from scratch.
Renewal forecasts get more honest
Seeing which renewals are at risk lets finance and leadership discount them in forecasts. You avoid the surprise of a renewal quarter that looks strong on paper and collapses at the end.
A weekly habit with no spreadsheet work
The report arrives on its own each week, so the review actually happens. Nobody has to export contacts and deals, merge them and eyeball dates, which is the step teams skip when busy.
How it works
What happens, step by step
Every Monday, ClickRuntime gathers your HubSpot customers with their last activity and open deals.
AI looks at each one and gives it a churn risk score with a short reason, like "no contact in 47 days".
You get an email with the customers ranked from highest risk to lowest.
Before it runs live
- 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
- Change what the AI looks for, or how it writes the result
- Add another app, for example also send it to Slack
- Combine it with other HubSpot steps into one automation
Under the hood
The code that runs this automation
from clickruntime import on_trigger, credentials, http, ai, notify
API = "https://api.hubapi.com/crm/v3/objects"
@on_trigger
def run(event):
headers = {"Authorization": f"Bearer {credentials.connection('hubspot', 'work')}"}
customers = http.post(f"{API}/contacts/search", headers=headers, json={"limit": 100,
"properties": ["email", "company", "notes_last_contacted", "hs_last_sales_activity_timestamp", "num_associated_deals"],
"filterGroups": [{"filters": [{"propertyName": "lifecyclestage", "operator": "EQ", "value": "customer"}]}]}).json()["results"]
deals = http.post(f"{API}/deals/search", headers=headers, json={"limit": 100,
"properties": ["dealname", "dealstage", "amount", "closedate"]}).json()["results"]
lines = [f"{c['properties'].get('company')} | last contacted {c['properties'].get('notes_last_contacted')} | "
f"last activity {c['properties'].get('hs_last_sales_activity_timestamp')}" for c in customers]
deal_lines = [f"{d['properties']['dealname']} | {d['properties']['dealstage']} | {d['properties'].get('amount')}" for d in deals]
report = ai.generate("Customers:\n" + "\n".join(lines) + "\n\nDeals:\n" + "\n".join(deal_lines),
system="List the customers most at risk of leaving, highest risk first, one line each with a short reason.",
max_output_tokens=600).text
notify.email_me("At-risk customers this week", report)
return {"customers_checked": len(customers)}FAQ
Common questions
How does the AI decide an account is at risk?
Do I need my own OpenAI or Anthropic key for the AI step?
Can it include fields from my own HubSpot properties?
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
Get a morning summary of yesterday's deals
Each morning you see which deals were created or changed, grouped by stage with totals.
See how it worksGet a weekly CSV of your HubSpot contacts
A full export of your contacts arrives in your inbox every week, ready to open in a spreadsheet.
See how it worksFind deals stuck in one stage too long
Each morning you see the open deals that haven't moved in two weeks, before they go cold.
See how it worksKeep exploring
Set up “Get a weekly list of customers at risk of leaving” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.