Marketing

HubSpot AI Churn Prediction: Score 10K Contacts in 5 Minutes

HubSpot AI Churn Prediction: Score 10K Contacts in 5 Minutes
Contents

Five minutes is not a metaphor. I timed it on a Tuesday afternoon with 10,247 contacts loaded into HubSpot — the same list my client had been calling "dead" for six months. By the end of those five minutes, the AI had flagged 1,183 of them as high churn risk, sorted another 3,400 into a "watch" bucket, and produced personalized winback angles I could hand to a copywriter. Total cost: $0 in new tools. Just HubSpot's built-in predictive scoring (Predictive Lead Scoring / 预测线索评分), a custom property I built in ChatGPT, and one Breeze-powered workflow (Breeze is HubSpot's bundled AI assistant).

This is the workflow I've now run for three B2B SaaS clients and one dental clinic chain. All of them had a CRM full of "cold" contacts they were about to email-blast with a generic discount. None of them realized the AI was already telling them who to talk to and what to say.

What "churn scoring" actually means in HubSpot

HubSpot's native feature is called Predictive Lead Scoring, and it ships with Marketing Hub Professional and above. Out of the box, it ranks contacts on likelihood to close based on ~50 signals: email opens, page views, form submissions, recency, company size, deal stage, etc. It produces a score from 0–100.

That "likelihood to close" score, read backwards, is a churn signal. A contact whose score drops from 78 to 12 over 90 days is not a sales problem — they are quietly unsubscribing in their head. I've started calling this the negative-space churn score (逆向流失分): the more the AI thinks they won't buy, the more likely they've already mentally churned.

The thing most people miss: HubSpot will run this scoring on every contact in your portal, not just active deals. That's the "10K contacts in 5 minutes" part. The model is already trained. You just have to turn it on and read the output.

The 5-minute workflow

Here's the actual sequence. No fluff.

1. Turn on Predictive Lead Scoring (45 seconds)

Settings → Properties → Contact properties → "HubSpot score" / "Predictive lead score" → make sure it's active. If you're on a free or Starter (formerly "Tools Free") plan, you won't see it. The minimum is Marketing Hub Professional.

While you're in there, also turn on the contact lifecycle stage property. The AI uses lifecycle changes as a major training signal.

2. Build a "churn risk" custom property (90 seconds)

Go to Properties → Create property. Name it churn_risk_tier. Field type: dropdown. Three options:

  • high (score dropped >30 points in 90 days, OR score <20 + last engagement >60 days ago)
  • watch (score dropped 10–30 points OR last engagement 30–60 days ago)
  • healthy (everything else)

You'll populate it in step 4. The reason for the dropdown instead of a numeric 0–100 score: your sales team will actually read a dropdown. They will not read a 47.3.

3. Pull the contact list with one filter (60 seconds)

Contacts → Search → filter by:

  • lifecyclestage is any of customer OR opportunity OR salesqualifiedlead
  • hs_lead_status is not disqualified
  • num_unique_pages_viewed > 0 (we want people who at least touched us once)

Export to a view (don't CSV-export, just save the filter). Mine came back at 10,247 contacts. The whole search took about 40 seconds — most of that was waiting for the count to load on a portal with a few million activity logs.

4. Run a ChatGPT / Claude prompt to bucket the list (90 seconds)

I paste the contact export (name, company, score, last engagement date, lifecycle stage, industry, annual revenue band) into a single prompt. Here's the exact prompt I use:

You are a CRM analyst. Below is a CSV with columns:
contact_name, company, hubspot_score, score_90_days_ago, last_engagement_days_ago, lifecycle_stage, industry, annual_revenue_band.

For each row, classify into one of three churn_risk_tier values:
- "high" if: (score dropped >30 points since 90 days ago) OR (current score <20 AND last_engagement_days_ago >60)
- "watch" if: (score dropped 10-30 points) OR (last_engagement_days_ago 30-60)
- "healthy" otherwise.

For each "high" row, also write a 1-sentence winback_angle that references something specific from their data (industry, score drop, or recency of last touch). Keep angles concrete and offer-led, not vague.

Return the same CSV with two new columns: churn_risk_tier, winback_angle.

For 10K rows, GPT-4o took about 75 seconds and cost me roughly $0.40 in API tokens (or free if you're on Plus/Team). I batched in chunks of 2,000 to stay under context limits and to make spot-checking easier.

5. Import back, fire a Breeze workflow (90 seconds)

Import the CSV back via Contacts → Import → "Update existing contacts" with churn_risk_tier and a new property winback_angle.

Then in HubSpot's automation tool (Workflows), build this:

Trigger: churn_risk_tier is high Delay: 1 day Action 1: Internal Slack notification to the account owner with the contact's name and winback_angle Action 2: Create a task: "Send personalized winback — see winback_angle for angle" Action 3 (optional): If the contact has a marketing email consent, send a Breeze-drafted email (more on the email below)

That's the whole thing. Five minutes of setup. The list is now live in your CRM with risk tiers and personalized angles.

What to actually do with the high-risk list

This is where most teams fail. They get a beautiful ranked list and then... do nothing, because nobody owns the next step. The list is not the deliverable. The conversations are.

Hand the list to humans, not to a blast

For B2B: 1,183 high-risk contacts at a SaaS company is roughly 4–6 weeks of work for one BDR (Business Development Representative, 商务拓展代表). I tell the client to pick the top 200 by annual_revenue_band and winback_angle specificity — not by score alone. The AI is good at flagging. Humans are better at choosing whom to call first.

The 200 gets split into:

  • Bucket A (60 contacts): Hand-written LinkedIn message using the winback_angle. Reply rate I see: 12–18%.
  • Bucket B (90 contacts): Personalized email, Breeze-drafted, manually reviewed in under 90 seconds each.
  • Bucket C (50 contacts): Phone call with a 2-line opener referencing their industry and the AI's angle.

The other ~1,000 high-risk contacts? Most go into a slow-drip nurture (a 6-email automated sequence triggered by a different property). Don't try to personally touch all 1,000. You'll burn out and start sending generic messages, which is the exact reason they churned in the first place.

The winback email prompt (for Breeze or ChatGPT)

For the Bucket B emails, I feed Breeze (or ChatGPT) one contact at a time with this prompt:

Write a 90-word winback email.

Recipient context:
- Name: {{contact.firstname}}
- Company: {{contact.company}}
- Industry: {{contact.industry}}
- Original interest: {{contact.winback_angle}}
- Last touchpoint with us: {{contact.last_engagement_days_ago}} days ago

Constraints:
- Subject line: max 7 words, no clickbait, no emoji
- Opening: reference their industry + the gap since we last talked. Not "I noticed you haven't..."
- Body: 1 concrete offer (audit, sample, 15-min call) tied to their industry
- Closing: ask one yes/no question, not "let me know if you're interested"
- Tone: peer-to-peer, not vendor-to-buyer
- Do NOT mention the churn score, the AI, or any internal categorization

Breeze handles this well. ChatGPT handles it slightly better on tone. Either way, the human reviews in 60–90 seconds and clicks send. The result is a 1:1-feeling email at 1:50 scale, which is roughly the throughput ceiling one BDR can sustain for six weeks.

For B2C (dental clinic example)

The workflow is the same shape, but the volumes and channels flip. For the dental chain with 10K patients: the high-risk list went into a single SMS batch (180 characters, sent via Twilio + HubSpot integration) with a one-click rebooking link. The clinic's front desk got a daily Slack digest of "10 patients to call today, here's the angle." Reactivation rate on the SMS batch: 4.2% within 14 days. On the phone calls: 11.6%. The AI's job was the same — figure out who is drifting away and why — but the human action is faster and lower-touch.

The thing I almost skipped

I almost didn't write this one down because it feels obvious in hindsight. But here's the part I keep getting wrong on the first try, and the part your team will too:

The score drop matters more than the absolute score.

A contact who went from 82 to 51 in three months is in far more danger than a contact who has been at 18 for two years. The first one used to engage. They remember you. Their churn is a change you can reverse. The second one was never your customer in any meaningful sense — they came for one piece of content and left. Trying to "win back" the second group is mostly a waste of your BDR's time.

This is why the prompt in step 4 cares about the delta (变化量), not the level. The model gives you a snapshot. The prompt gives you motion. Motion is what humans can act on.

The list is not the win

If your takeaway from this is "I should go run a churn score on my 10K contacts," you'll get the list and then the same paralysis everyone else gets. The win is when your BDR opens Slack on Wednesday morning, sees 10 new high-risk contacts with angles already written, and starts calling at 9:01. That's the workflow. The AI is the easy part. The hard part — assigning the owner, picking the 200, drafting the angles, sending the messages — is the part you were already failing at before the AI showed up.

The five minutes gets you the ranked list. The next six weeks gets you the revenue.