Skip to main content
Lifetime license included with every purchase
n8n workflowscustomer healthchurn preventionSaaS retention

Build a Customer Health Score Workflow in n8n

Build an n8n customer health score with a weighted formula (deal age, sentiment, usage trend) and a threshold-to-Slack escalation, on a Google Sheets stack.

Nn8n Marketplace Team·July 7, 2026·Updated July 7, 2026·7 min read

A customer success team can't watch every account. So they watch the loud ones, the ones already complaining, and miss the quiet account that just stopped logging in. A customer health score fixes that by turning scattered signals into one number you can sort and alert on. An n8n customer health score workflow computes it on a schedule and pings Slack the moment an account crosses into risk.

Most churn templates predict churn with a black-box AI call against Zendesk or HubSpot. They tell you an account is at risk; they don't show you the formula or let you tune it. This builds the transparent version: a weighted score you control, on a Google Sheets stack, with the escalation rule spelled out.

It's distinct from a winback campaign. This catches the account before it churns, while there's still something to do.

What you can automate with a health score

A scoring workflow drives most of the proactive side of customer success:

  • A nightly score for every active account, written back to a sheet
  • Threshold alerts: anything below a cutoff escalates to Slack
  • A trend flag when a score drops sharply week-over-week
  • Auto-assignment of at-risk accounts to a success manager
  • A personalized check-in email for mid-risk accounts
  • A weekly digest of the bottom accounts for the team standup

The score itself is the product. Everything downstream is just routing on a number.

Why a weighted formula beats a black-box prediction

The library templates predict churn with an LLM looking at Zendesk and HubSpot data. That's fine for a vibe, but a success manager can't act on "the model says 73% risk." They can act on "usage dropped 40% and the last two tickets were negative." A weighted health score keeps the signals visible.

Here's the take: for customer health, transparency beats accuracy. A slightly cruder score that a human understands drives more saves than a precise one nobody trusts. When the success manager can see which signal tanked, they know what to say on the call. A probability gives them nothing to open with. Build the formula explicit, in a Code node, where you can read and tune the weights.

The formula is a normalized weighted sum:

score = 0.4 * usage_trend
      + 0.35 * sentiment
      + 0.25 * recency

Each input is scaled to 0–100 first. The weights say usage trend matters most, sentiment next, recency last. Tune them to your product. That's the whole model, and you can read it.

The customer health score pipeline

Schedule Trigger (nightly)
  → Read account events (Google Sheets)
  → Code: normalize each signal to 0-100
  → Code: weighted sum → score
  → Write score back to the sheet
  → Switch: score < threshold? → Slack escalation

No warehouse, no ML service. A Schedule Trigger, two Code nodes, and a Switch. The scoring lives in code you can read and change.

1. Collect the signals

The Schedule Trigger fires nightly and reads an account events sheet: last login date, recent ticket sentiment, this week's usage count, last week's usage count, plan value. If your signals live across tools, a couple of read nodes (HubSpot for deals, a support export for sentiment) feed into a Merge before scoring. Keep the read step boring and the scoring step smart.

2. Normalize each input

A Code node scales every raw signal to 0–100 so the weights mean something. Usage trend becomes a ratio of this week to last; sentiment maps a -1..1 score to 0..100; recency maps days-since-login onto a decay.

// Code node: normalize signals
return items.map(({ json }) => {
  const trend = Math.min(100, (Number(json.usage_now) /
    Math.max(1, Number(json.usage_prev))) * 50);
  const sentiment = (Number(json.sentiment) + 1) * 50; // -1..1 -> 0..100
  const days = Number(json.days_since_login || 0);
  const recency = Math.max(0, 100 - days * 5);
  return { json: { ...json, trend, sentiment, recency } };
});

3. Score it

A second Code node applies the weights and writes a single score. Keep the weights as named constants at the top so tuning is a one-line edit, not a hunt through math.

const W = { trend: 0.4, sentiment: 0.35, recency: 0.25 };
return items.map(({ json }) => ({
  json: { ...json,
    score: Math.round(W.trend * json.trend +
      W.sentiment * json.sentiment + W.recency * json.recency) }
}));

4. Write back and escalate

The score writes back to the account row. A Switch checks it against your threshold (start around 50). Anything below escalates: a Slack message to the success channel naming the account, the score, and above all the weakest signal, so the manager knows whether it's a usage problem or a sentiment problem before they reach out.

5. Route by tier

Optionally, branch the mid-band into an automated check-in email and reserve Slack for the critical accounts. The Stalled Lead Rescue template handles that warm re-engagement step, detecting quiet contacts and firing a personalized AI email, which slots right onto the mid-risk tier here.

Alert on the signal, not just the score

A Slack alert that says "Acme dropped to 42" makes the success manager go digging. One that says "Acme dropped to 42, weakest signal: usage trend down 60% this week" makes the call easy. Always escalate the weakest contributing signal alongside the score. It's one extra field in the Code node and it's the difference between an alert that prompts action and one that prompts a sigh.

Implementation patterns

Pattern 1: transparent weighted scoring. Named weights, normalized inputs, a single Code node. Readable and tunable.

normalize(signals) → weighted_sum(W) → score

Pattern 2: threshold-with-context escalation. Branch on the score, but carry the weakest signal into the alert so it's actionable.

Switch(score < 50) → Slack(account, score, weakest_signal)

Pattern 3: trend escalation. Compare this run's score to the stored previous one; a sharp drop escalates even if the absolute score is still mid-band. Catches the fast decliners early.

n8n nodes you'll use most

NodePurpose
Schedule TriggerNightly run over the accounts sheet
Google SheetsRead account events, write scores back
CodeNormalize signals and compute the weighted score
MergeCombine signals if they come from several sources
SwitchBranch on the score threshold
SlackEscalate at-risk accounts with the weakest signal

Getting started

  1. Build an accounts sheet: account, usage_now, usage_prev, sentiment, days_since_login, plan_value, score.
  2. Add a Schedule Trigger on a nightly Cron.
  3. Read the sheet and add the normalization Code node.
  4. Add the scoring Code node with named weights you can tune.
  5. Write the score back to each row.
  6. Add a Switch on the threshold and a Slack alert that names the weakest signal.
  7. Run it for a week and tune the weights against accounts you know are healthy or at risk.
Browse retention templates
Skip the build

The Customer Health Score & Retention Engine ships this end-to-end: it scores every customer event in real time, escalates critical accounts to Slack, and sends AI-personalised retention emails to at-risk subscribers, all logged to Google Sheets. It's part of The Complete n8n Templates Bundle, a one-time lifetime license to the whole catalog plus every template added later, worth it if you run more than one of these automations.

Get the Customer Health Score & Retention Engine

A health score tells you who's slipping; the winback work is what saves them. For the campaign side once an account does churn, see the n8n SaaS churn-prevention build, and for the broader retention picture there's churn prevention automation in n8n. Build the formula transparent, alert on the weakest signal, and the team acts on numbers they actually trust.

FAQ

Common questions

What goes into a customer health score?
A weighted blend of signals: deal or account age, recent sentiment from support and emails, and a usage trend (is activity rising or falling). Each is normalized to 0-100, multiplied by a weight, and summed. The weights encode what actually predicts churn for your product.
Do I need a data warehouse to score customer health in n8n?
No. A Schedule Trigger reading a Google Sheet of account events is enough to compute a weighted score and escalate the low ones. Warehouses help at scale, but the scoring logic itself is a Code node and a threshold.
How is a health score different from churn prediction?
Churn prediction outputs a probability the account leaves. A health score is a transparent, weighted number you control, so a success manager can see why an account dropped and act on the specific signal that fell.
Stop reading. Start running.

Get the workflow templates this guide is built on

Import-ready n8n JSON, step-by-step setup, and tested end-to-end. One-time payment, own it forever.

Free — $40 value

Get 3 tested n8n templates, free

The full customer package for three real catalog templates — workflow JSON, step-by-step setup guide, credential checklist. Built through the same live-instance release process as everything we sell. Plus new templates and automation guides in your inbox. No spam, unsubscribe anytime.

  • 01Smart To-Do List ManagerPre-built n8n workflow template that automates productivity with OpenAI. Live in about 10 minutes.$14
  • 02Email Follow-Up AutomatorPre-built n8n workflow template that automates crm with OpenAI. Live in about 15 minutes.$12
  • 03Market Trend AnalyzerPre-built n8n workflow template that automates data processing with OpenAI. Live in about 10 minutes.$14