Client Analytics & Health Score

Client Analytics & Health Score

NexusRMS calculates a comprehensive health score for every client and provides detailed analytics through the client detail page and the CRM dashboard. These tools help you identify your most valuable relationships, spot clients at risk of churning, and make data-driven decisions about where to focus your attention.

Health Score

Every client has a health_score field rated from 0 to 100. New clients start at a default score of 70. The score is recalculated automatically by the ClientRepository.updateHealthScore() method whenever invoices are paid, projects are completed, or other significant events occur.

Five weighted factors

The health score is a weighted average of five individual factor scores, each rated 0 to 100:

  1. Payment History Score (weight: 0.30) — Measures the ratio of on-time payments to total invoices over the last 12 months. Recent invoices are weighted more heavily than older ones. A client who pays every invoice on time scores close to 100; a client with multiple overdue invoices scores near 0.
  2. Project Activity Score (weight: 0.25) — Evaluates the number and frequency of confirmed, in-progress, and completed projects over the last 12 months. Regular booking activity drives a higher score. Clients with no recent projects score lower.
  3. Revenue Stability Score (weight: 0.20) — Compares revenue in the first six months of the lookback period to the most recent six months. Consistent or growing revenue scores highly; a sharp decline reduces the score.
  4. Relationship Age Score (weight: 0.15) — Awards loyalty points based on how long the client has been in the system. Clients under 30 days score 30, clients at one year score approximately 70, and clients at two years or more score 100.
  5. Credit Utilisation Score (weight: 0.10) — Measures how much of the client's credit limit is currently in use. Lower utilisation scores higher. Clients with no credit limit set receive a neutral score of 70.

Risk level

The risk_level field is derived directly from the health score:

  • low — Health score of 70 or above. Healthy relationship with no concerns.
  • medium — Health score between 40 and 69. Some warning signs present.
  • high — Health score below 40. Significant risk of churn or payment default. The isHighRisk() method returns true for these clients.

Health score display

On the client list page, the health score appears as a colour-coded progress bar alongside the numeric value. Green indicates low risk, amber indicates medium risk, and red indicates high risk. The same visualisation appears on the client detail page header.

Satisfaction score

The satisfaction_score field (1 to 5) is derived from client feedback submissions. This is separate from the health score but feeds into it indirectly — low satisfaction correlates with reduced project activity and thus a lower health score over time.

Churn probability

The churn_probability field is an AI-predicted value between 0 and 1 representing how likely the client is to stop doing business with you. A value above 0.7 triggers an At Risk badge on the client card in the list view. This prediction uses historical patterns across payment behaviour, booking frequency, and communication engagement.

Analytics Tab

The client detail page includes an Analytics tab powered by the ClientAnalyticsController. This provides deep insight into each client's commercial relationship with your business.

Single client analytics

The show() endpoint returns comprehensive analytics for a specific client, including:

  • Project history and booking trends over time
  • Revenue analysis — total revenue, average per project, growth trends
  • Payment behaviour analysis — on-time payment rate, average payment delay
  • Booking patterns — seasonal trends, preferred equipment categories
  • Communication history summary — emails, calls, meetings
  • Portal usage statistics (if portal is enabled)
  • Predictive insights — churn risk and revenue forecast

Profitability analysis

The profitability() endpoint provides margin analysis for a single client, including revenue breakdown by project type and equipment category, cost analysis (equipment costs, crew costs, overhead allocation), gross profit and margin calculations, comparison to company average margins, identification of most and least profitable project types, and discount impact analysis. This endpoint is restricted to Power Users as it contains sensitive financial data.

Lifetime Value (LTV)

The lifetimeValue() endpoint calculates enhanced customer lifetime value using multiple methods: historical average, linear regression on revenue trends, cohort-based prediction, and AI model prediction. It also returns revenue forecasts for the next 12 months, acquisition cost recovery analysis, and expansion revenue potential. The getLifetimeValue() method on the Client model returns the simpler historical LTV — the sum of all paid invoice totals.

Dashboard Statistics

The ClientSearchController.statistics() endpoint returns aggregated metrics for the CRM dashboard:

  • Total clients — Count of all client records
  • Clients by status — Breakdown by active, inactive, and archived
  • Clients by type — Breakdown by individual, company, and venue
  • Clients by risk level — Distribution across low, medium, and high
  • Average health score — Mean health score across all active clients
  • Financial totals — Aggregate LTV, total outstanding balance

Overall client analytics

The ClientAnalyticsController.index() endpoint returns organisation-wide analytics, filterable by date range, client type, industry, and pricing tier. This includes client acquisition trends, revenue analytics, segmentation breakdowns, retention metrics, health score distribution, and risk analysis.

Clients Needing Attention

The needs-attention endpoint identifies clients requiring follow-up. A client needs attention if any of the following conditions are met:

  • Risk level is high
  • Client has overdue invoices (total_outstanding greater than zero)
  • Client has not been contacted recently — checked via getDaysSinceLastContact(), which compares the last_contact_date field to the current date
  • Client has no recent projects — checked via getDaysSinceLastProject(), which compares the last_project_date field to the current date

Denormalised metrics on the Client model

For performance, the following fields are stored directly on the client record and updated automatically when related data changes:

  • total_projects — Total number of projects for this client
  • total_revenue — Total revenue generated
  • total_invoices — Total number of invoices issued
  • total_paid — Total amount paid
  • total_outstanding — Total amount still owed
  • average_project_value — Average value per project
  • first_project_date — Date of the client's first project
  • last_project_date — Date of the client's most recent project
  • last_contact_date — Date of the most recent communication

Tips

  • Review the Clients Needing Attention list weekly to catch at-risk relationships before they deteriorate further.
  • Use the profitability analysis to identify clients where you are undercharging — then adjust pricing tiers or discount percentages accordingly.
  • Monitor churn probability alongside health score for the most accurate risk picture. A high churn probability with a medium health score still warrants action.
  • Export analytics data for quarterly business reviews by filtering the overall analytics endpoint by date range.
  • Compare individual client LTV against your average revenue per client to identify your most and least valuable relationships.

Was this article helpful?