AI for Customer SuccessIntermediate20 minutesCustomer SuccessChurn preventionSlackHubSpot

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.

The problem

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.

The outcome

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.

Tools you'll use
AuraFlowAI MissionREST API blockSlack webhookHubSpot API

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. 1

    Create a Flow that runs every time a conversation closes

    Flow

    In 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 name
    Churn signal watcher
    
  2. 2

    Add an AI Mission that classifies the conversation for churn risk

    AI Mission

    Add 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 prompt
    You 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. 3

    Branch the Flow on the severity score

    Flow

    Add a Conditional step right after the Mission. Read the Mission's severity output 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"
    
  4. 4

    Send a Slack alert to the account's CSM with full context

    REST API block

    Add 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 + endpoint
    POST https://hooks.slack.com/services/T0000/B0000/XXXXXXXXX
    
    jsonRequest 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. 5

    Open a "Renewal at risk" task in HubSpot on the company record

    REST API block

    Add 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.write scope
    • The HubSpot owner ID of the CSM (or use a Mission that looks up the right owner by company)
    httpHTTP method + endpoint
    POST https://api.hubapi.com/crm/v3/objects/tasks
    
    httpRequest headers
    Authorization: Bearer pat-eu1-XXXXXXXXX
    Content-Type: application/json
    
    jsonRequest 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 }]
        }
      ]
    }
    
  6. 6

    Tag the contact so future conversations auto route to the CSM

    Flow

    Add a final Set Attribute step (or Tag step) on the Customerly contact. Setting a risk_status attribute 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 set
    risk_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.

Ready to ship this recipe in your workspace?

Book a 1:1 demo and we'll build this Flow live in your Customerly account.