with one click
client-success
// Client health scoring, churn prediction, retention playbooks, NPS framework, and expansion signals. Keeps OASIS AI clients healthy, growing, and referring.
// Client health scoring, churn prediction, retention playbooks, NPS framework, and expansion signals. Keeps OASIS AI clients healthy, growing, and referring.
[HINT] Download the complete skill directory including SKILL.md and all related files
| name | client-success |
| description | Client health scoring, churn prediction, retention playbooks, NPS framework, and expansion signals. Keeps OASIS AI clients healthy, growing, and referring. |
| tags | ["skill","client-success","retention"] |
| triggers | ["client success","use client success","run client success","client health scoring"] |
Lost clients cost twice what new ones earn. This skill gives CC a repeatable system to measure every client relationship as a live number, predict churn before it happens, and take the right action at the right time.
Primary tool: python scripts/client_health.py
Data source: Supabase leads table (project: bravo), filtered to status = client
Each client is scored across five weighted dimensions every time the report runs.
| Dimension | Weight | What It Measures |
|---|---|---|
| Payment Timeliness | 25% | Days between due date and receipt |
| Engagement Frequency | 25% | Messages and calls vs. expected baseline |
| Scope Satisfaction | 20% | Deliverables on track vs. delayed |
| Revenue Trajectory | 15% | MRR growing, stable, or declining |
| Relationship Signals | 15% | Referrals given, upsell interest, response speed |
Payment Timeliness (25 pts max)
Engagement Frequency (25 pts max)
Scope Satisfaction (20 pts max)
Revenue Trajectory (15 pts max)
Relationship Signals (15 pts max)
health_score = (payment ร 0.25) + (engagement ร 0.25) + (scope ร 0.20) + (revenue ร 0.15) + (relationship ร 0.15)
Scores are normalized to 0โ100. No rounding โ show one decimal.
| Tier | Score | Color Code | Meaning |
|---|---|---|---|
| GREEN | 80โ100 | โ | Healthy. Expansion opportunity window. |
| YELLOW | 60โ79 | โ ๏ธ | Friction present. Proactive contact required. |
| ORANGE | 40โ59 | ๐ถ | At-risk. Intervention within 48 hours. |
| RED | 0โ39 | ๐จ | Critical. Executive-level save attempt required now. |
Any single trigger moves a client one tier toward RED. Two or more triggers = immediate ORANGE minimum.
When a churn trigger fires: log it immediately under the client's Supabase record and recompute health score.
Goal: Deepen the relationship before complacency sets in.
Goal: Surface friction before it becomes a decision to leave.
Goal: Identify the specific issue and address it directly.
Goal: Make one final, genuine attempt. If it fails, exit cleanly.
memory/MISTAKES.md โ what early signal was missed?churned and log the final health scoreSend a single-question message (email or text, matching the client's preferred channel):
"Quick question โ on a scale of 0-10, how likely are you to recommend OASIS AI to another business owner? No wrong answer."
Follow up with: "What's the main reason for that score?"
| NPS Score | Classification | Action |
|---|---|---|
| 9โ10 | Promoter | Ask for referral within 72 hours |
| 7โ8 | Passive | Ask: "What would make this a 10?" |
| 0โ6 | Detractor | Treat as ORANGE tier โ immediate outreach |
A client is ready for an upsell conversation when at least three of these are true:
| Current Service | Natural Cross-Sell |
|---|---|
| n8n automation retainer | CRM build-out in Supabase |
| Lead generation automation | Email nurture sequences |
| Social content scheduling | Full content strategy retainer |
| One-time project | Monthly maintenance retainer |
| OASIS AI retainer | PropFlow for real-estate clients |
Only ask when health score is GREEN and at a natural conversation break:
"We've been getting some great results together. Do you know one or two other business owners โ doesn't have to be in your industry โ who are still doing things manually that they could be automating? I'd love an introduction. I'll make sure they're taken care of."
Every client exists in exactly one stage. Stage transitions are logged in Supabase.
| Stage | Definition | Primary Action |
|---|---|---|
| Onboarding | Contract signed, setup in progress (days 1โ30) | Complete setup checklist, first win delivery |
| Ramp | Systems live, client learning the value (days 31โ60) | Weekly check-ins, remove friction, document wins |
| Steady State | Delivering consistently, client engaged | Monthly updates, QBR, upsell exploration |
| Growth | Client expanding scope or referring others | Prioritize, reward loyalty, increase touchpoints |
| Renewal | 60 days before contract end | QBR, renewal proposal, upsell packaging |
| At-Risk | Health score YELLOW or below | Retention playbook triggered |
| Churned | Contract cancelled | Root cause analysis, 90-day win-back check |
| Win-Back | Previously churned, re-engaged | Treat as new client, address original issue first |
Run every Friday before the week ends. Output format:
## Client Health Report โ Week of [YYYY-MM-DD]
| Client | MRR | Health Score | Tier | Last Contact | Days Since Contact | Next Action |
|--------|-----|-------------|------|-------------|-------------------|-------------|
| [Name] | $X,XXX | XX.X | ๐ข GREEN | [date] | X days | [action] |
| [Name] | $X,XXX | XX.X | โ ๏ธ YELLOW | [date] | X days | [action] |
**Portfolio MRR:** $X,XXX | **Average Health:** XX.X | **At-Risk Revenue:** $X,XXX
### Alerts This Week
- ๐จ [Client]: [specific trigger fired]
- โ ๏ธ [Client]: [specific risk signal]
### Actions Required This Week
1. [Priority action โ client โ deadline]
2. [Priority action โ client โ deadline]
The /briefing skill calls python scripts/client_health.py report --json in Section 3.
Any ORANGE or RED clients surface as blocked items in Section 5 (Blocked Items).
Run python scripts/client_health.py score <client_name> to compute a fresh score from raw inputs. The formula is:
# Input variables (update per client each week)
payment_score = compute_payment(days_late, consecutive_late_count)
engagement_score = compute_engagement(touchpoints_per_month)
scope_score = compute_scope(deliverables_on_time, disputes)
revenue_score = compute_revenue(mrr_trend, upsell_recency_days)
relationship_score = compute_relationship(referral_given, avg_response_hours)
health = (
payment_score * 0.25 +
engagement_score * 0.25 +
scope_score * 0.20 +
revenue_score * 0.15 +
relationship_score * 0.15
)
# Result: 0.0โ100.0, one decimal place
Quick data-entry format (paste into CLI or session notes):
CLIENT: [name]
payment_days_late: 0 # 0 = on time, positive = days late
consecutive_late: 0 # how many months in a row late
touchpoints_month: 4 # calls + replies + check-ins this month
deliverables_on_track: true # bool
scope_disputes: 0 # active disputes
mrr_trend: stable # growing | stable | declining | at_risk
upsell_days_ago: null # null if no recent upsell
referral_given: false # gave referral in last 90 days
avg_response_hours: 18 # average hours to reply
Three warning signals. Any one moves the client toward RED. Two or more = immediate intervention.
Definition: Touchpoint frequency has dropped by 20%+ vs the prior 4-week average.
Engagement drop % = (prior_avg_touchpoints - current_touchpoints) / prior_avg_touchpoints ร 100
If result โฅ 20% โ SIGNAL FIRED
Action: Send a warm, non-salesy check-in within 24 hours. Do not mention the metric. Ask one open question about their business.
Definition: Two consecutive payments received more than 7 days after due date.
Action: Call (not email) within 48 hours. Do not discuss payment on the call โ lead with value. Assess whether the lateness is cash-flow (temporary) or satisfaction-based (deeper problem).
Definition: Average response time has increased by 2x over the trailing 30 days (e.g., was 12 hours, now 24+ hours) AND the client has not proactively initiated contact in 14+ days.
Action: Treat as YELLOW minimum. Initiate a "how can I make this easier for you?" message. Short, low-pressure.
| Active Signals | Minimum Tier |
|---|---|
| 0 | Current tier |
| 1 | YELLOW |
| 2 | ORANGE |
| 3 | RED |
Schedule at weeks 12, 24, 36 of each client relationship. This is not an internal report โ it's a client-facing meeting.
Agenda (30 minutes):
Prep checklist:
Monthly, between QBRs, send one value-proof artifact. Rotate through:
| Month | Artifact Type | Example |
|---|---|---|
| Month 1 | Automation report | "Your lead capture automation ran 47 times this month, saving ~6 hours" |
| Month 2 | Benchmark | "Your response time is now 4 minutes vs industry average of 3 hours" |
| Month 3 | Opportunity flag | "I noticed X pattern in your data โ we could automate this next" |
Rules: Never send a generic update. Every message should reference something specific to that client.
When 3+ of these are true, schedule an expansion conversation (not an email):
Expansion conversation structure: "Based on everything we've built together, I think there's an opportunity to [specific next thing]. The way I'd approach it is [brief plan]. Would it make sense to explore that?"
Client LTV = Monthly MRR ร Gross Margin % ร Expected Lifespan (months)
Expected lifespan = 1 รท Monthly Churn Rate (for the portfolio)
Example: $1,500/mo ร 94% margin ร 24 months = $33,840 LTV
| LTV Range | Classification | Priority Level |
|---|---|---|
| >$30,000 | Enterprise | White-glove. Weekly touchpoints. Never miss a signal. |
| $15,000โ$30,000 | Strategic | Bi-weekly touchpoints. Full QBR. Top of expansion list. |
| $5,000โ$15,000 | Growth | Monthly touchpoints. QBR every 6 months. |
| <$5,000 | Standard | Async relationship. Monthly report. QBR annually. |
# Pull LTV estimates for all active clients
python scripts/client_health.py ltv --all
# Update expected lifespan after churn event
python scripts/client_health.py ltv update <client_id> --lifespan 18
Store fields: client_id, mrr, start_date, ltv_estimate, ltv_actual_to_date, ltv_tier.
Run quarterly. Answer three questions: