The health score
Every client gets a health score from 0 to 100, recalculated every night and straight after relevant changes (usage, conversations, meetings, surveys, invoices, tasks or support tickets for that client). It's built from seven factors:
| Factor | Default weight | How it's scored |
|---|---|---|
| Usage trend | 25 | Usage in the last 30 days compared with the 30 days before. Half the usage (or less) scores 0; the same or more scores 100. |
| Engagement | 20 | Days since the last conversation or completed meeting: 14 days or less scores 100, 60 days or more scores 0. Never contacted scores 0. |
| Sentiment | 15 | The last 3 conversations with a sentiment in the past 180 days: Positive 100, Neutral 60, Negative 0, averaged. |
| NPS | 15 | Average NPS score from the last 12 months × 10. |
| Billing | 15 | Nothing overdue scores 100; oldest overdue invoice up to 15 days late scores 50; up to 45 days, 25; more than that, 0. |
| Open work | 10 | Overdue open tasks: none 100, one 60, two 30, three or more 0. |
| Support | 10 | Starts at 100 for the last 90 days: −30 for each Urgent or High ticket open past its target, −15 for each SLA breach, −15 for each escalation, −10 for each reopened ticket, and −15 if tickets in the last 30 days are more than double the usual. Never below 0. Left out if your workspace has no tickets. |
If a factor has no data for a client (for example no NPS responses), it's left out and the other weights count for more. The score is the weighted average, rounded.
Bands: 70 and above is Healthy, 40 to 69 is At Risk, below 40 is Critical.
The Health card on a client
The Health card on a client's page shows the score in the band's colour, the suggested band, the change over the last 30 days, and a bar per factor with its score, weight and a plain explanation (for example "1 overdue, the oldest by 26 days"). "Updated today" tells you when it was last calculated.
The client also has a Health field that your team sets (Healthy, At Risk, Critical). If it differs from what the score suggests, the card shows a Set to … button. Using it saves the change like a normal edit, so playbook rules (such as starting At-risk recovery) run and the change is recorded in History.
Health score settings (administrators)
In Setup → Health score, administrators can:
- change each factor's weight (0 switches a factor off);
- change the band thresholds (At Risk must be lower than Healthy);
- switch on "Update each client's Health automatically". It's off by default. When on, the Health field follows the score's band, changes are recorded as made "by the health score", and they can start playbooks;
- change the alert thresholds (see Alerts);
- see a table of every client's score per factor.
Saving recalculates every client straight away.
Alerts
Alerts point to clients that need attention. Each one shows on My day, on the client's Health card, and in the red count next to My day:
| Alert | When (default) | Level |
|---|---|---|
| Usage down X% in the last 30 days | Usage dropped by 25% or more | Warning |
| No contact for N days | 30 days or more since the last conversation or completed meeting | Warning |
| Invoice INV-… is N days overdue | 15 days or more overdue (one alert per invoice) | Urgent |
| Detractor: <contact> gave NPS N | NPS score 6 or lower in the last 90 days | Urgent |
| Renews in N days and health is … | An open renewal within 90 days and the client isn't Healthy | Urgent |
| Renewal date passed and it isn't closed | An open renewal whose date has already passed | Urgent |
| Health score fell N points in 30 days | A drop of 15 points or more | Warning |
| Urgent ticket TCK-… open past its target | An Urgent ticket not solved by its solve target (one alert per ticket) | Urgent |
| N SLA breaches in the last 30 days | 2 or more tickets missed a target | Warning |
| Ticket volume up X% in 30 days | 100% or more above the usual, with at least 4 tickets | Warning |
| Ticket TCK-… was reopened | Reopened in the last 7 days | Warning |
Urgent alerts come first. Dismiss hides an alert for you for 30 days; it stays visible to your colleagues. Administrators can change the thresholds in Setup → Health score and, for ticket alerts, Setup → Support. Churned clients don't get alerts.
Renewals
A renewal tracks one upcoming contract renewal: client, renewal date, stage, current ARR, renewal ARR, the change, owner and notes. Each stage has a probability, used for the forecast: Upcoming 30%, Proposal sent 50%, Negotiation 75%, Won 100%, Lost 0%.
What happens automatically:
- Closed date is filled with today's date when a renewal becomes Won or Lost, and cleared if it moves back to an open stage.
- When a renewal becomes Won, the client's ARR becomes the renewal ARR and the client's renewal date moves on 12 months. This only happens on the change to Won, never twice, and not if the client's renewal date is already later (for example an old renewal entered afterwards).
- When a renewal becomes Lost, the client's ARR goes down by that renewal's current ARR (never below 0). If it reaches 0, the client becomes Churned with today's date. Losing one add-on renewal while the main contract continues is counted as contraction, not churn.
Use the Board tab on Renewals to move renewals through the stages.
Customer status and churn
Each client has a Customer status: Active or Churned.
- It becomes Churned automatically when a Lost renewal brings its ARR to 0, or when you set it to Churned yourself. Setting it by hand also sets its ARR to 0 and "Churned on" to today, so your totals and reports stay correct.
- If a churned client's ARR goes above 0 again, it becomes Active again (a reactivation). "Churned on" keeps the date of the last churn.
Churned clients don't count as at risk, don't get alerts, and don't start renewal-reminder playbooks.
Expansion
Expansion opportunities track upsell, cross-sell, more seats and services: added ARR, expected close date, stage and owner. Stages and probabilities: Identified 10%, Qualified 30%, Proposal 60%, Won 100%, Lost 0%. The forecast is added ARR × probability.
The Dashboard shows your open expansion pipeline, and won expansion counts towards net retention. Use the Board tab to move opportunities between stages.
Surveys (NPS and CSAT)
A survey response records one answer: NPS (score 0 to 10) or CSAT (score 1 to 5), the contact, the date and a comment.
- If you leave the client empty, it's filled from the contact's client.
- The category is worked out for you. NPS: 9–10 Promoter, 7–8 Passive, 0–6 Detractor. CSAT: 4–5 Satisfied, 3 Neutral, 1–2 Unsatisfied.
- Scores outside these ranges are refused.
You can enter responses by hand, import them from a CSV file (for example an export from your survey tool), or send them through the API. XPI CRM doesn't send survey emails itself.
NPS responses feed the health score, a detractor creates an alert, and the Dashboard shows your NPS and CSAT for the last 12 months.
Goals
Goals (success plans) record what a client wants to achieve: the goal, success measure, starting value, target, current value, target date, owner and "how we get there". Progress is worked out as (current − start) ÷ (target − start), between 0% and 100%; it also works for goals that go down (for example "cut support tickets by half"). Status: Not started, On track, At risk, Achieved, Missed. Use the Board tab to see goals by status.
Support tickets
XPI CRM keeps track of your clients' support tickets, so you can see how support affects each account. It doesn't reply to customers: your team keeps answering in your helpdesk or by email.
A ticket has a number (TCK-00001 and so on), subject, client, contact, owner, type, priority (Low, Normal, High, Urgent), status (New, Open, Pending, On-hold, Solved, Closed), channel, opened, first response and solved times, an Escalated tick box, and an optional helpdesk reference and link.
Add tickets by hand with New Ticket, with Import CSV, or through the API. Imports and the API update the ticket with the same Helpdesk ref. instead of creating a duplicate, so you can import the same export again.
What happens automatically:
- First response is filled with the current time when a ticket first moves on from New, if it's still empty. Solved on is filled when a ticket becomes Solved or Closed, and cleared if it opens again. Tickets imported as already solved without a solved date aren't counted for service targets. A ticket that goes from Solved or Closed back to an open status counts as reopened.
- Each ticket's SLA shows On track, At risk (less than a quarter of the solve time left), Breached or Met, using the service targets in Setup → Support. Defaults: Urgent reply within 1 hour and solve within 8 hours; High 4 hours and 1 day; Normal 8 hours and 3 days; Low 1 day and 5 days. Time counts around the clock.
- A ticket that misses a target counts as one SLA breach.
The client's Support card shows open tickets, SLA breaches in the last 90 days, the average time to solve, and the latest open tickets. Missed targets, escalations and reopened tickets lower the Support factor of the health score, and can raise alerts.
Playbooks
A playbook is a plan for one client: steps in order, each with tasks and due dates. Examples: onboarding, renewal preparation, at-risk recovery.
On a playbook's Plan:
- tick tasks off; progress updates straight away ("3 of 8 tasks done");
- add steps and tasks, and move steps up or down;
- on an empty playbook, Copy from another playbook copies its steps and tasks, all reset to not done. If the playbook has no start date, it's set to today, and due dates keep the same gaps.
View-only members can see playbooks but not tick tasks or change them.
Playbook templates and automatic starts
Playbook templates are reusable plans. Each task is due "N days after the playbook starts", and is assigned to the playbook owner, the client's account owner, or a specific person.
To start one by hand, open the template, pick the client under Start this playbook now for and click Start playbook. The playbook, its steps and tasks are created with real dates, and the target date is the last due date. A client can't have two open playbooks from the same template.
Under Automation, a template can start by itself:
- When a client is created, for example Onboarding.
- When a field changes, for example when Health becomes At Risk.
- When a ticket is escalated, for example Escalation recovery. It starts once per ticket, for that ticket's client.
- Days before a date, for example 90 days before the Renewal date. This is checked every night at 02:00 (Bucharest time) and straight away when the date changes, and starts only once per date.
These rules run however the change happens: in the app, by import, through the API, or by an automation. Loading sample data doesn't start them.
When a playbook starts automatically, a bar at the top of the app tells you ("Started automatically: Renewal for Globex Inc."), and the playbook's Started field explains why ("Automatically: 90 days before Renewal date (Dec 15, 2026)"). The bar shows what started since your last visit until you dismiss it.