Computes composite health scores (0-100) for CRM clients from 5 weighted metrics. Activates when the user wants to check client health, find at-risk clients, score relationships, or asks 'which clients need attention?' Covers Last Contact, Response Time, Open Tasks, Payment Status, and Sentiment with RAG classification and risk flagging.
From founder-osnpx claudepluginhub thecloudtips/founder-os --plugin founder-osThis skill uses the workspace's default tool permissions.
references/scoring-formulas.mdDesigns and optimizes AI agent action spaces, tool definitions, observation formats, error recovery, and context for higher task completion rates.
Enables AI agents to execute x402 payments with per-task budgets, spending controls, and non-custodial wallets via MCP tools. Use when agents pay for APIs, services, or other agents.
Compares coding agents like Claude Code and Aider on custom YAML-defined codebase tasks using git worktrees, measuring pass rate, cost, time, and consistency.
Compute a composite health score (0-100) for each client in the Notion CRM by aggregating five weighted metrics: Last Contact, Response Time, Open Tasks, Payment Status, and Sentiment. Classify each client into a RAG tier (Green, Yellow, Red) based on the composite score. Detect risk flags that signal declining engagement or operational issues. Output a ranked dashboard of all scored clients, ordered by composite score ascending (worst-health-first) so the user can prioritize attention on at-risk relationships.
This skill handles the scoring algorithm and data aggregation layer only. Sentiment computation is delegated to the sentiment-analysis skill. Dashboard formatting and report generation are handled by the command layer.
Process all clients through these steps in order:
Last Scanned property exists with a timestamp less than 24 hours old and the --refresh flag is not set, use the cached score and skip recomputation.| # | Metric | Weight | Source |
|---|---|---|---|
| 1 | Last Contact | 0.25 | Gmail sent/received, Google Calendar meetings |
| 2 | Response Time | 0.20 | Gmail thread response intervals |
| 3 | Open Tasks | 0.20 | Notion CRM tasks, P20 dossier "Open Items" |
| 4 | Payment Status | 0.20 | P11 Invoice Processor DB |
| 5 | Sentiment | 0.15 | sentiment-analysis skill output |
All weights sum to 1.00. For the composite formula, exponential decay curves, quick-reference tables, and per-metric edge case handling, see ${CLAUDE_PLUGIN_ROOT}/skills/health/client-health-scoring/references/scoring-formulas.md.
Classify each client based on their composite score:
| Tier | Range | Label | Meaning |
|---|---|---|---|
| Green | 80-100 | Healthy | Relationship is strong, no action needed |
| Yellow | 50-79 | Needs Attention | One or more metrics declining, monitor closely |
| Red | 0-49 | At Risk | Immediate attention required, risk of churn |
When presenting the dashboard, group clients by tier and display the tier label alongside the composite score. Within each tier, sort by composite score ascending (lowest score first within the tier).
Search for the Companies database by title. For each company record, extract:
--all.Use email addresses from linked Contacts as the key for Gmail and Calendar lookups.
Search for threads involving the client's contact email addresses over the last 90 days.
days_since_contact as the number of calendar days between that email's date and today.Search the "Client Dossiers" Notion DB (from Plugin #20 Client Context Loader) for a matching client name. When a dossier exists:
false, check the Generated At timestamp. If within 24 hours, treat the dossier as fresh.Search for a Notion database named "[FOS] Finance" first, then "Founder OS HQ - Finance", then fall back to "Invoice Processor - Invoices" (legacy). When found:
Type = "Invoice" (when using HQ Finance DB) and vendor/client name matching the current client.When neither database is found (plugin not installed), assign the Payment Status metric a neutral score of 75 and append the note "Invoice data unavailable -- using neutral default."
Search for events with client attendees over the last 90 days.
When gws CLI is unavailable for Calendar, rely on Gmail data alone for Last Contact. Do not flag the absence as an error.
Search for the Companies database using this priority order:
When using the HQ or standalone Companies database (paths 1 or 2), health scores are written directly onto the Company page as property updates — no separate Health Scores database is needed. The Companies database must have (or will be enriched with) these health properties: Health Score (number), Health Status (select), Risk Flags (multi_select), Last Scanned (date), Sources Used (multi_select), Notes (rich_text).
When using the fallback standalone Health Scores DB (path 3), create separate pages per client as before.
Last Scanned property on each Company page serves as the cache timestamp. Health scores are read directly from the Company page properties.Last Scanned property on the standalone Health Scores DB record serves as the cache timestamp.--refresh flag: Bypass cache entirely. Recompute all scores from source data regardless of age.Evaluate these risk conditions after scoring. Attach matching flags to the client's record.
| Flag | Condition |
|---|---|
| No Recent Contact | Last Contact score < 20 (roughly 30+ days since contact) |
| Slow Response | Response Time score < 30 (average reply time > 40 hours) |
| Overdue Tasks | Open Tasks score < 50 (more than half of active tasks overdue) |
| Payment Issues | Payment score < 40 (2+ overdue invoices or poor payment history) |
| Negative Sentiment | Sentiment score < 40 |
| Meeting Cancellations | 2+ cancelled meetings with this client in the last 30 days |
| Escalation Language | Detected escalation phrases in recent emails ("disappointed", "concerned about timeline", "need to discuss", "considering alternatives", "not satisfied", "escalating") |
| New Client | Client has been in the CRM for less than 30 days |
A client may have zero, one, or multiple risk flags simultaneously. Display all active flags in the dashboard output.
Handle the following situations using the rules outlined below. For detailed scoring formulas, decay curves, and per-metric edge case handling, see ${CLAUDE_PLUGIN_ROOT}/skills/health/client-health-scoring/references/scoring-formulas.md.
When no Gmail threads exist for a client, set Last Contact score to 0 and Response Time score to 50 (neutral). Add the "No Recent Contact" risk flag.
When a client has been in the CRM for less than 30 days, apply a minimum Last Contact score of 40 to avoid penalizing new relationships. Add the "New Client" risk flag for visibility.
When no invoice records exist in the P11 database for a client, set Payment score to 75 (neutral assumption). Do not add a risk flag -- absence of invoices is not a risk signal.
When no tasks exist in the CRM or P20 dossier for a client, set Open Tasks score to 100 (no tasks = no overdue tasks).
When only the CRM record exists and all other sources return no data, compute the score using available data with neutral defaults for missing metrics. Set the completeness flag to "partial" and warn: "Limited data available -- score based on CRM record only."
When neither the "[FOS] Finance", "Founder OS HQ - Finance", nor the "Invoice Processor - Invoices" database is found, set Payment score to 75 and note "Invoice data unavailable" in Sources Used.
When the sentiment-analysis skill returns no data for a client, set Sentiment score to 50 (neutral default).
Never fail the entire health scan because a single optional source is unavailable. Degrade gracefully per source and note which sources contributed in the Sources Used field.