

Catch churn signals in support chats and loop in the CSM with full context
Aura scans every closed support conversation for churn signals (frustration, comparison shopping, downgrade intent). When she finds one, she pings the CSM in Slack with the conversation summary and opens a renewal at risk task in HubSpot, before the rep has logged off.
Customers rarely churn on the day they cancel. They churn three months earlier, inside a support chat where they say "we are evaluating alternatives" or "this is not working for our team anymore." Those signals get missed because the support rep is focused on solving the immediate ticket, not flagging account risk. By the time finance sees the cancellation, it is too late.
Every time a support conversation closes, Aura silently reads it for churn signals. If she spots one, she fires a Slack message to the account's CSM with the summary plus a direct conversation link, opens a "Renewal at risk" task in HubSpot on the company record, and tags the Customerly contact so future conversations route to the CSM directly. Zero relying on the rep to flag it. Zero alerts when nothing is wrong.
The Flow you'll build
This is the exact Flow as it appears in the Customerly editor. Drag it around, then follow the steps below to build it.
Step by step
- 1
Create a Flow that runs every time a conversation closes
FlowIn Customerly, go to AI Studio → Flows → New Flow. Name it
Churn signal watcher. Set the trigger to Conversation Closed. This way the Flow runs in the background on every conversation, without any extra work for the support team.Conversation Closed is the right trigger here (not "every message") because we want the full context of the resolved interaction, including how the customer felt by the end of it.
textFlow nameChurn signal watcher - 2
Add an AI Mission that classifies the conversation for churn risk
AI MissionAdd an AI Mission step. This Mission does not write to the customer. It reads the full conversation history and outputs a structured churn risk classification, which the next step branches on.
Paste the prompt below into the Mission's instructions. Aura will return a single JSON object you can route on.
promptAI Mission promptYou are a senior Customer Success analyst reviewing a closed support conversation for renewal risk signals. Read the full conversation. Decide whether any of these churn risk signals are present: 1. The customer says they are "evaluating alternatives", "looking at other tools", or names a competitor 2. The customer asks about cancellation, downgrade, or "pausing" their account 3. The customer expresses sustained frustration across multiple messages (not a one off complaint) 4. The customer says the product "is not working for our team" or "doesn't fit our use case anymore" 5. The customer mentions a budget cut, layoff, or "we have to consolidate tools" 6. The customer's tone shifts from positive to flatly transactional across the conversation If two or more signals are present, severity is "high". If exactly one strong signal is present, severity is "medium". If none, severity is "none". Output exactly this JSON and nothing else: { "severity": "none | medium | high", "signals_found": ["<short label of each signal you saw>"], "summary": "<two sentence summary of why this customer is at risk, or 'No risk detected.'>", "suggested_action": "<one sentence: what the CSM should do this week>" } - 3
Branch the Flow on the severity score
FlowAdd a Conditional step right after the Mission. Read the Mission's
severityoutput and:- If
severity == "none"→ end the Flow. Nothing to do. - If
severity == "medium" || severity == "high"→ continue to the next steps.
This is the rule that keeps your team from getting paged on every conversation. Only the ones that actually matter fire the rest of the Flow.
textConditional rule{{mission.output.severity}} != "none" - If
- 4
Send a Slack alert to the account's CSM with full context
REST API blockAdd a REST API step. Post to a Slack incoming webhook (one webhook per CSM team channel, or use Slack's routing to direct messages by account owner). The message should include the severity, the AI summary, the suggested action, and a direct link back to the Customerly conversation so the CSM can read it in context.
You'll need:
- A Slack incoming webhook URL for the CS channel (Slack → Apps → Incoming Webhooks → Add to channel)
httpHTTP method + endpointPOST https://hooks.slack.com/services/T0000/B0000/XXXXXXXXXjsonRequest body{ "text": "Churn signal detected on {{contact.email}}", "blocks": [ { "type": "header", "text": { "type": "plain_text", "text": "Churn risk: {{mission.output.severity | upper}}" } }, { "type": "section", "fields": [ { "type": "mrkdwn", "text": "*Customer*\n{{contact.name}} ({{contact.email}})" }, { "type": "mrkdwn", "text": "*Company*\n{{company.name}}" } ] }, { "type": "section", "text": { "type": "mrkdwn", "text": "*What we saw*\n{{mission.output.summary}}\n\n*Suggested next step*\n{{mission.output.suggested_action}}" } }, { "type": "actions", "elements": [ { "type": "button", "text": { "type": "plain_text", "text": "Open conversation" }, "url": "{{conversation._url}}" } ] } ] } - 5
Open a "Renewal at risk" task in HubSpot on the company record
REST API blockAdd a second REST API step. Create a HubSpot task on the customer's company record so the risk shows up inside the CRM the CSM uses daily, not just in Slack.
You'll need:
- A HubSpot private app token with
crm.objects.tasks.writescope - The HubSpot owner ID of the CSM (or use a Mission that looks up the right owner by company)
httpHTTP method + endpointPOST https://api.hubapi.com/crm/v3/objects/taskshttpRequest headersAuthorization: Bearer pat-eu1-XXXXXXXXX Content-Type: application/jsonjsonRequest body{ "properties": { "hs_task_subject": "Renewal at risk: {{company.name}}", "hs_task_body": "{{mission.output.summary}}\n\nSuggested next step: {{mission.output.suggested_action}}\n\nSource conversation: {{conversation._url}}", "hs_task_priority": "HIGH", "hs_task_status": "NOT_STARTED", "hs_timestamp": "{{now}}", "hubspot_owner_id": "12345678" }, "associations": [ { "to": { "id": "{{company.hubspot_company_id}}" }, "types": [{ "associationCategory": "HUBSPOT_DEFINED", "associationTypeId": 192 }] } ] } - A HubSpot private app token with
- 6
Tag the contact so future conversations auto route to the CSM
FlowAdd a final Set Attribute step (or Tag step) on the Customerly contact. Setting a
risk_statusattribute means every future conversation from this customer can be auto routed to the CSM via a separate routing Flow, not the support queue. The CSM sees every word the customer says from this point on.textContact attribute to setrisk_status = "at_risk"
FAQ
How is this different from running NPS surveys?
NPS catches the customers who chose to fill in your survey. This Flow catches risk signals from the customers who didn't say anything publicly but quietly told a support rep "we are evaluating alternatives." That signal is invisible to NPS but visible to Aura.
Will Aura flag every grumpy customer as a churn risk?
No. The Mission prompt requires two or more signals for "high" severity, and one strong signal for "medium". One off complaints with no comparison shopping, no cancellation intent, and no budget signals come back as "none" and the Flow ends.
Can I trigger this when a conversation includes a specific tag instead of every closed conversation?
Yes. Keep the Conversation Closed trigger and narrow its audience filter to contacts with a tag like "renewal_window" that you apply 60 days before renewal. The rest of the Flow stays the same.
Does this work with Salesforce, Pipedrive, or Hubspot Service Hub instead of HubSpot CRM?
Yes. Swap the second REST API block's endpoint and body to the target CRM's create task API. The Mission output and Slack step don't change.
SaaS teams running this in production
Ready to ship this recipe in your workspace?
Book a 1:1 demo and we'll build this Flow live in your Customerly account.
More AI Recipes
Auto create bug tickets in ClickUp from a Customerly conversation
Stop spending 5 minutes per bug copy pasting from chat to ClickUp. Fire one Flow and Aura collects the missing info, files the ticket, and replies in the conversation with the link.
Read the recipeQualify inbound demo requests with AI and create HubSpot deals only for in target leads
Stop letting your SDRs spend hours qualifying out wrong fit leads. Aura asks the right questions, decides if the lead is in target, and only then creates a HubSpot deal and notifies the AE.
Read the recipeSend every new Messenger conversation to Slack in real time
Your team lives in Slack, not in another inbox tab. A two block Flow posts every new Messenger conversation to your support channel the second it starts, with a one click link back to reply.
Read the recipe