Churn Risk Detector
Churn risk detector

Scan support tickets, Slack channels, NPS scores, and usage patterns to flag accounts showing early churn indicators. Produces a weekly risk scorecard with severity tiers, root cause hypotheses, and suggested save plays per account.
--- name: churn-risk-detector description: > Scan support tickets, Slack channels, NPS scores, and usage patterns to flag accounts showing early churn indicators. Produces a weekly risk scorecard with severity tiers, root cause hypotheses, and suggested save plays per account. Designed for seed/Series A teams where the founder or a single CSM manages all accounts manually. tags: [research] --- # Churn Risk Detector Surface accounts at risk of churning before it's too late. Aggregates signals from support, communication, and usage patterns into a scored risk report with specific save actions. **Built for:** Early-stage teams with no CS platform (no Gainsight, no ChurnZero). You have a spreadsheet of customers, a Slack channel, and a support inbox. This skill turns those raw signals into an actionable churn risk list. ## When to Use
Overview
Surface accounts at risk of churning before it's too late. Aggregates signals from support, communication, and usage patterns into a scored risk report with specific save actions.
Manual install (npx, ZIP)
npx skills add gooseworks-ai/goose-skills --skill churn-risk-detector -g -a claude-codemkdir -p ~/.claude/skills && curl -sL https://codeload.github.com/gooseworks-ai/goose-skills/tar.gz/615c685f34f8 \
| tar -xz -C ~/.claude/skills --strip-components=4 goose-skills-615c685f34f8/skills/research/composites/churn-risk-detectorNew-Item -ItemType Directory -Force "$HOME\.claude\skills" | Out-Null; Invoke-WebRequest "https://m.agentalley.io/zip/15111b523222d57d76f0/churn-risk-detector.zip" -OutFile "$env:TEMP\churn-risk-detector.zip"; Expand-Archive "$env:TEMP\churn-risk-detector.zip" -DestinationPath "$HOME\.claude\skills" -ForceConnects with Agent Alley MCP · agentalley.io/mcp
Files included
SKILL.md8.4 KBskill.meta.json259 B
Read the files here
gooseworks-ai/
Show the full text261 lines
Churn Risk Detector
Surface accounts at risk of churning before it's too late. Aggregates signals from support, communication, and usage patterns into a scored risk report with specific save actions.
Built for: Early-stage teams with no CS platform (no Gainsight, no ChurnZero). You have a spreadsheet of customers, a Slack channel, and a support inbox. This skill turns those raw signals into an actionable churn risk list.
When to Use
- "Which customers are at risk of churning?"
- "Run the weekly churn risk scan"
- "Flag accounts I should worry about"
- "Who haven't we heard from in a while?"
- "Produce a customer health report"
Phase 0: Intake
Account Data
- Customer list — CSV or sheet with: company name, primary contact email, contract value (MRR/ARR), contract start date, renewal date (if known)
- Product/service type — What are they paying for? (Helps calibrate expected engagement)
Signal Sources (provide what you have)
- Support tickets — Export from Intercom, Zendesk, or email (CSV with: customer, date, subject, status, resolution time)
- Slack channel history — Customer Slack channel or shared channel messages
- NPS/CSAT scores — Recent survey results with scores and comments
- Usage data — Any metrics you track: logins, API calls, features used, active users (CSV export)
- Email/communication log — Last touchpoints per account (dates + context)
- Billing data — Payment failures, downgrades, discount requests
Calibration
- What does "healthy" look like? — Describe a healthy customer (e.g., "logs in daily, uses 3+ features, responds to emails within 24h")
- Known churn reasons — Why have customers churned in the past? (helps weight signals)
Phase 1: Signal Extraction
1A: Support Signal Analysis
From support ticket data, calculate per account:
| Signal | Calculation | Risk Weight |
|---|---|---|
| Ticket volume spike | >2x their average in last 30 days | High |
| Unresolved tickets | Open tickets older than 7 days | High |
| Escalation language | Keywords: "cancel", "frustrated", "alternative", "not working", "disappointed" | Critical |
| Response time degradation | Your avg response time to this customer trending up | Medium |
| Repeat issues | Same problem reported 2+ times | High |
1B: Communication Signal Analysis
From Slack/email history:
| Signal | Calculation | Risk Weight |
|---|---|---|
| Gone silent | No messages in 30+ days (was previously active) | High |
| Decreasing frequency | Message frequency dropped >50% vs prior 90 days | Medium |
| Negative sentiment shift | Tone changed from positive to neutral/negative | Medium |
| Champion disengagement | Primary contact stopped responding | Critical |
| New stakeholder questions | New person asking basic "what does this do?" questions | Medium (potential reorg) |
1C: Usage Signal Analysis (if data available)
| Signal | Calculation | Risk Weight |
|---|---|---|
| Login drop | Active users down >30% vs prior month | High |
| Feature abandonment | Stopped using a key feature they previously used regularly | High |
| Shallow usage | Only using 1 feature when they're paying for many | Medium |
| No growth | Same number of seats/users for 6+ months | Low |
| Export spike | Sudden increase in data exports | Critical (may be migrating) |
1D: Commercial Signal Analysis
| Signal | Calculation | Risk Weight |
|---|---|---|
| Discount request | Asked for pricing reduction | High |
| Downgrade inquiry | Asked about lower tier | Critical |
| Payment failure | Failed payment not resolved in 7+ days | High |
| Contract approaching renewal | <60 days to renewal with no renewal discussion | Medium |
| Competitor mention | Mentioned a competitor in any channel | High |
Phase 2: Risk Scoring
Scoring Model
Each account gets a composite risk score (0-100):
Risk Score = Σ (signal_weight × signal_present)
Weights:
Critical signal = 25 points each
High signal = 15 points each
Medium signal = 8 points each
Low signal = 3 points each
Score cap: 100
Risk Tiers
| Tier | Score | Label | Action Urgency |
|---|---|---|---|
| Red | 70-100 | Critical risk — likely to churn | This week |
| Orange | 40-69 | Elevated risk — needs attention | Within 2 weeks |
| Yellow | 20-39 | Early warning — monitor closely | Within 30 days |
| Green | 0-19 | Healthy — no action needed | Routine check-in |
Phase 3: Save Play Generation
For each Red and Orange account, generate a specific save play:
Save Play Template
ACCOUNT: [Company Name]
RISK TIER: [Red/Orange]
RISK SCORE: [X/100]
MRR/ARR: $[X]
SIGNALS DETECTED:
- [Signal 1] — [Evidence: specific data point]
- [Signal 2] — [Evidence]
- [Signal 3] — [Evidence]
ROOT CAUSE HYPOTHESIS:
[1-2 sentences: What do you think is actually going wrong?
E.g., "Champion left the company and new stakeholder hasn't been onboarded"
or "They hit a technical limitation with [feature] that's blocking their primary use case"]
RECOMMENDED SAVE PLAY:
1. [Immediate action — e.g., "Schedule a call with [contact] this week"]
2. [Follow-up — e.g., "Send a personalized Loom showing how to solve [specific issue]"]
3. [Structural fix — e.g., "Assign a dedicated onboarding session for new stakeholder"]
TALK TRACK:
"[2-3 sentences the CSM/founder can use to open the conversation naturally,
without saying 'we noticed you might be churning']"
ESCALATION TRIGGER:
If [specific condition] by [date], escalate to [founder/CEO call].
Phase 4: Output Format
# Churn Risk Report — Week of [DATE]
Total accounts scanned: [N]
Data sources: [list what was available]
---
## Risk Summary
| Tier | Count | Total MRR at Risk |
|------|-------|-------------------|
| 🔴 Red (Critical) | [N] | $[X] |
| 🟠 Orange (Elevated) | [N] | $[X] |
| 🟡 Yellow (Early Warning) | [N] | $[X] |
| 🟢 Green (Healthy) | [N] | $[X] |
**Total MRR at risk (Red + Orange):** $[X] ([Y]% of total MRR)
---
## 🔴 Critical Risk Accounts
### [Company Name 1] — Score: [X]/100 | MRR: $[X]
**Signals:** [bullet list]
**Root cause:** [hypothesis]
**Save play:** [specific actions]
**Owner:** [who should act]
**Deadline:** [date]
### [Company Name 2] — ...
---
## 🟠 Elevated Risk Accounts
### [Company Name] — Score: [X]/100 | MRR: $[X]
**Signals:** [bullet list]
**Recommended action:** [1-2 sentences]
---
## 🟡 Early Warning Accounts
| Account | Score | Key Signal | Suggested Action |
|---------|-------|------------|-----------------|
| [Name] | [X] | [Signal] | [Action] |
| [Name] | [X] | [Signal] | [Action] |
---
## Trends vs Last Week
- Accounts moved Red → Green: [list — wins!]
- Accounts moved Green → Yellow/Orange: [list — new risks]
- Accounts churned since last report: [list]
---
## Signal Distribution
| Signal Type | Accounts Affected |
|------------|-------------------|
| Support ticket spike | [N] |
| Gone silent | [N] |
| Usage decline | [N] |
| Competitor mention | [N] |
| Payment issue | [N] |
| Champion disengagement | [N] |
---
## Recommended Focus This Week
1. **[Account]** — [Why + what to do]
2. **[Account]** — [Why + what to do]
3. **[Account]** — [Why + what to do]
Save to risk-report-[YYYY-MM-DD].md in the current working directory.
Scheduling
Run weekly:
0 8 * * 1 python3 run_skill.py churn-risk-detector --client <client-name>
Cost
| Component | Cost |
|---|---|
| All signal analysis | Free (LLM reasoning) |
| Slack/email parsing | Free |
| Total | Free |
Tools Required
- Input data from CSV/sheets (support tickets, usage, NPS)
- Optional: Slack channel reading for communication signals
- No external API costs — pure analysis
Trigger Phrases
- "Which customers are at risk?"
- "Run the churn risk scan"
- "Weekly customer health report"
- "Flag at-risk accounts"
| 1 | |
| 2 | name churn-risk-detector |
| 3 | description > |
| 4 | Scan support tickets, Slack channels, NPS scores, and usage patterns to flag accounts |
| 5 | showing early churn indicators. Produces a weekly risk scorecard with severity tiers, |
| 6 | root cause hypotheses, and suggested save plays per account. Designed for seed/Series A |
| 7 | teams where the founder or a single CSM manages all accounts manually. |
| 8 | tags [research] |
| 9 | |
| 10 | |
| 11 | # Churn Risk Detector |
| 12 | |
| 13 | Surface accounts at risk of churning before it's too late. Aggregates signals from support, communication, and usage patterns into a scored risk report with specific save actions. |
| 14 | |
| 15 | **Built for:** Early-stage teams with no CS platform (no Gainsight, no ChurnZero). You have a spreadsheet of customers, a Slack channel, and a support inbox. This skill turns those raw signals into an actionable churn risk list. |
| 16 | |
| 17 | ## When to Use |
| 18 | |
| 19 | "Which customers are at risk of churning?" |
| 20 | "Run the weekly churn risk scan" |
| 21 | "Flag accounts I should worry about" |
| 22 | "Who haven't we heard from in a while?" |
| 23 | "Produce a customer health report" |
| 24 | |
| 25 | ## Phase 0: Intake |
| 26 | |
| 27 | ### Account Data |
| 28 | **Customer list** — CSV or sheet with: company name, primary contact email, contract value (MRR/ARR), contract start date, renewal date (if known) |
| 29 | **Product/service type** — What are they paying for? (Helps calibrate expected engagement) |
| 30 | |
| 31 | ### Signal Sources (provide what you have) |
| 32 | **Support tickets** — Export from Intercom, Zendesk, or email (CSV with: customer, date, subject, status, resolution time) |
| 33 | **Slack channel history** — Customer Slack channel or shared channel messages |
| 34 | **NPS/CSAT scores** — Recent survey results with scores and comments |
| 35 | **Usage data** — Any metrics you track: logins, API calls, features used, active users (CSV export) |
| 36 | **Email/communication log** — Last touchpoints per account (dates + context) |
| 37 | **Billing data** — Payment failures, downgrades, discount requests |
| 38 | |
| 39 | ### Calibration |
| 40 | **What does "healthy" look like?** — Describe a healthy customer (e.g., "logs in daily, uses 3+ features, responds to emails within 24h") |
| 41 | **Known churn reasons** — Why have customers churned in the past? (helps weight signals) |
| 42 | |
| 43 | ## Phase 1: Signal Extraction |
| 44 | |
| 45 | ### 1A: Support Signal Analysis |
| 46 | |
| 47 | From support ticket data, calculate per account: |
| 48 | |
| 49 | | Signal | Calculation | Risk Weight | |
| 50 | |--------|-------------|-------------| |
| 51 | | **Ticket volume spike** | >2x their average in last 30 days | High | |
| 52 | | **Unresolved tickets** | Open tickets older than 7 days | High | |
| 53 | | **Escalation language** | Keywords: "cancel", "frustrated", "alternative", "not working", "disappointed" | Critical | |
| 54 | | **Response time degradation** | Your avg response time to this customer trending up | Medium | |
| 55 | | **Repeat issues** | Same problem reported 2+ times | High | |
| 56 | |
| 57 | ### 1B: Communication Signal Analysis |
| 58 | |
| 59 | From Slack/email history: |
| 60 | |
| 61 | | Signal | Calculation | Risk Weight | |
| 62 | |--------|-------------|-------------| |
| 63 | | **Gone silent** | No messages in 30+ days (was previously active) | High | |
| 64 | | **Decreasing frequency** | Message frequency dropped >50% vs prior 90 days | Medium | |
| 65 | | **Negative sentiment shift** | Tone changed from positive to neutral/negative | Medium | |
| 66 | | **Champion disengagement** | Primary contact stopped responding | Critical | |
| 67 | | **New stakeholder questions** | New person asking basic "what does this do?" questions | Medium (potential reorg) | |
| 68 | |
| 69 | ### 1C: Usage Signal Analysis (if data available) |
| 70 | |
| 71 | | Signal | Calculation | Risk Weight | |
| 72 | |--------|-------------|-------------| |
| 73 | | **Login drop** | Active users down >30% vs prior month | High | |
| 74 | | **Feature abandonment** | Stopped using a key feature they previously used regularly | High | |
| 75 | | **Shallow usage** | Only using 1 feature when they're paying for many | Medium | |
| 76 | | **No growth** | Same number of seats/users for 6+ months | Low | |
| 77 | | **Export spike** | Sudden increase in data exports | Critical (may be migrating) | |
| 78 | |
| 79 | ### 1D: Commercial Signal Analysis |
| 80 | |
| 81 | | Signal | Calculation | Risk Weight | |
| 82 | |--------|-------------|-------------| |
| 83 | | **Discount request** | Asked for pricing reduction | High | |
| 84 | | **Downgrade inquiry** | Asked about lower tier | Critical | |
| 85 | | **Payment failure** | Failed payment not resolved in 7+ days | High | |
| 86 | | **Contract approaching renewal** | <60 days to renewal with no renewal discussion | Medium | |
| 87 | | **Competitor mention** | Mentioned a competitor in any channel | High | |
| 88 | |
| 89 | ## Phase 2: Risk Scoring |
| 90 | |
| 91 | ### Scoring Model |
| 92 | |
| 93 | Each account gets a composite risk score (0-100): |
| 94 | |
| 95 | |
| 96 | Risk Score = Σ (signal_weight × signal_present) |
| 97 | |
| 98 | Weights: |
| 99 | Critical signal = 25 points each |
| 100 | High signal = 15 points each |
| 101 | Medium signal = 8 points each |
| 102 | Low signal = 3 points each |
| 103 | |
| 104 | Score cap: 100 |
| 105 | |
| 106 | |
| 107 | ### Risk Tiers |
| 108 | |
| 109 | | Tier | Score | Label | Action Urgency | |
| 110 | |------|-------|-------|---------------| |
| 111 | | **Red** | 70-100 | Critical risk — likely to churn | This week | |
| 112 | | **Orange** | 40-69 | Elevated risk — needs attention | Within 2 weeks | |
| 113 | | **Yellow** | 20-39 | Early warning — monitor closely | Within 30 days | |
| 114 | | **Green** | 0-19 | Healthy — no action needed | Routine check-in | |
| 115 | |
| 116 | ## Phase 3: Save Play Generation |
| 117 | |
| 118 | For each Red and Orange account, generate a specific save play: |
| 119 | |
| 120 | ### Save Play Template |
| 121 | |
| 122 | |
| 123 | ACCOUNT: [Company Name] |
| 124 | RISK TIER: [Red/Orange] |
| 125 | RISK SCORE: [X/100] |
| 126 | MRR/ARR: $[X] |
| 127 | |
| 128 | SIGNALS DETECTED: |
| 129 | - [Signal 1] — [Evidence: specific data point] |
| 130 | - [Signal 2] — [Evidence] |
| 131 | - [Signal 3] — [Evidence] |
| 132 | |
| 133 | ROOT CAUSE HYPOTHESIS: |
| 134 | [1-2 sentences: What do you think is actually going wrong? |
| 135 | E.g., "Champion left the company and new stakeholder hasn't been onboarded" |
| 136 | or "They hit a technical limitation with [feature] that's blocking their primary use case"] |
| 137 | |
| 138 | RECOMMENDED SAVE PLAY: |
| 139 | 1. [Immediate action — e.g., "Schedule a call with [contact] this week"] |
| 140 | 2. [Follow-up — e.g., "Send a personalized Loom showing how to solve [specific issue]"] |
| 141 | 3. [Structural fix — e.g., "Assign a dedicated onboarding session for new stakeholder"] |
| 142 | |
| 143 | TALK TRACK: |
| 144 | "[2-3 sentences the CSM/founder can use to open the conversation naturally, |
| 145 | without saying 'we noticed you might be churning']" |
| 146 | |
| 147 | ESCALATION TRIGGER: |
| 148 | If [specific condition] by [date], escalate to [founder/CEO call]. |
| 149 | |
| 150 | |
| 151 | ## Phase 4: Output Format |
| 152 | |
| 153 | |
| 154 | # Churn Risk Report — Week of [DATE] |
| 155 | Total accounts scanned: [N] |
| 156 | Data sources: [list what was available] |
| 157 | |
| 158 | |
| 159 | |
| 160 | ## Risk Summary |
| 161 | |
| 162 | | Tier | Count | Total MRR at Risk | |
| 163 | |------|-------|-------------------| |
| 164 | | 🔴 Red (Critical) | [N] | $[X] | |
| 165 | | 🟠 Orange (Elevated) | [N] | $[X] | |
| 166 | | 🟡 Yellow (Early Warning) | [N] | $[X] | |
| 167 | | 🟢 Green (Healthy) | [N] | $[X] | |
| 168 | |
| 169 | **Total MRR at risk (Red + Orange):** $[X] ([Y]% of total MRR) |
| 170 | |
| 171 | |
| 172 | |
| 173 | ## 🔴 Critical Risk Accounts |
| 174 | |
| 175 | ### [Company Name 1] — Score: [X]/100 | MRR: $[X] |
| 176 | **Signals:** [bullet list] |
| 177 | **Root cause:** [hypothesis] |
| 178 | **Save play:** [specific actions] |
| 179 | **Owner:** [who should act] |
| 180 | **Deadline:** [date] |
| 181 | |
| 182 | ### [Company Name 2] — ... |
| 183 | |
| 184 | |
| 185 | |
| 186 | ## 🟠 Elevated Risk Accounts |
| 187 | |
| 188 | ### [Company Name] — Score: [X]/100 | MRR: $[X] |
| 189 | **Signals:** [bullet list] |
| 190 | **Recommended action:** [1-2 sentences] |
| 191 | |
| 192 | |
| 193 | |
| 194 | ## 🟡 Early Warning Accounts |
| 195 | |
| 196 | | Account | Score | Key Signal | Suggested Action | |
| 197 | |---------|-------|------------|-----------------| |
| 198 | | [Name] | [X] | [Signal] | [Action] | |
| 199 | | [Name] | [X] | [Signal] | [Action] | |
| 200 | |
| 201 | |
| 202 | |
| 203 | ## Trends vs Last Week |
| 204 | |
| 205 | - Accounts moved Red → Green: [list — wins!] |
| 206 | - Accounts moved Green → Yellow/Orange: [list — new risks] |
| 207 | - Accounts churned since last report: [list] |
| 208 | |
| 209 | |
| 210 | |
| 211 | ## Signal Distribution |
| 212 | |
| 213 | | Signal Type | Accounts Affected | |
| 214 | |------------|-------------------| |
| 215 | | Support ticket spike | [N] | |
| 216 | | Gone silent | [N] | |
| 217 | | Usage decline | [N] | |
| 218 | | Competitor mention | [N] | |
| 219 | | Payment issue | [N] | |
| 220 | | Champion disengagement | [N] | |
| 221 | |
| 222 | |
| 223 | |
| 224 | ## Recommended Focus This Week |
| 225 | |
| 226 | 1. **[Account]** — [Why + what to do] |
| 227 | 2. **[Account]** — [Why + what to do] |
| 228 | 3. **[Account]** — [Why + what to do] |
| 229 | |
| 230 | |
| 231 | Save to `risk-report-[YYYY-MM-DD].md` in the current working directory. |
| 232 | |
| 233 | ## Scheduling |
| 234 | |
| 235 | Run weekly: |
| 236 | |
| 237 | |
| 238 | 0 8 * * 1 python3 run_skill.py churn-risk-detector --client <client-name> |
| 239 | |
| 240 | |
| 241 | ## Cost |
| 242 | |
| 243 | | Component | Cost | |
| 244 | |-----------|------| |
| 245 | | All signal analysis | Free (LLM reasoning) | |
| 246 | | Slack/email parsing | Free | |
| 247 | | **Total** | **Free** | |
| 248 | |
| 249 | ## Tools Required |
| 250 | |
| 251 | Input data from CSV/sheets (support tickets, usage, NPS) |
| 252 | **Optional:** Slack channel reading for communication signals |
| 253 | No external API costs — pure analysis |
| 254 | |
| 255 | ## Trigger Phrases |
| 256 | |
| 257 | "Which customers are at risk?" |
| 258 | "Run the churn risk scan" |
| 259 | "Weekly customer health report" |
| 260 | "Flag at-risk accounts" |
| 261 |
Details
- Updated
- Sep 21, 2026
- License
- MIT
- Stars on the repo
- ★ 1,220
- Checked
- Source
- gooseworks-ai/goose-skills ↗
- Creator
- gooseworks-ai · 205 listings
Similar skills
See all →
SkillSubscription Lifecycle Manager
SkillChurn Prevention Suite
AgentRetention Strategy Developer
SkillCCO Plan Review
SkillChurn Prevention Playbook
SkillCustomer Health MonitorMore from gooseworks-ai
SkillAd Angle Miner
SkillAd Campaign Analyzer
SkillLead Quality Analyzer
SkillMessage Match Auditor
SkillAI Search Visibility
SkillAmazon Product Search