> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zudo.so/llms.txt
> Use this file to discover all available pages before exploring further.

# Health Score Config

> Customize factor weights, tier boundaries, scoring thresholds, and extreme pulse behavior.

Go to **Settings → Health Score Settings** to configure how health scores are calculated. Changes apply to all accounts and take effect on the next daily calculation.

## Factor Weights

Each of the six scoring factors contributes a percentage of the overall 0–100 score. Adjust weights to reflect what matters most to your team. Weights should sum to 100%; setting a factor to 0% disables it.

**Without CSM Pulse:**

| Factor              | Default Weight |
| ------------------- | -------------- |
| Email Response Time | 25%            |
| Open Requests       | 20%            |
| Meeting Frequency   | 20%            |
| Issue Resolution    | 20%            |
| Recent Activity     | 15%            |
| Contact Activity    | 0%             |
| Indicators          | 0%             |

<Note>
  **Contact Activity** and **Indicators** default to 0%. Opt into them once you have the underlying data flowing —
  Vitally / API for contact activity, [Segment](/integrations/segment) or [PostHog](/integrations/posthog) for
  indicators. See [Indicators](#indicators) below for the participation flow.
</Note>

**With CSM Pulse enabled:**

When an account has a CSM Pulse score updated within the last 90 days, it's included at the weight you configure:

| Factor              | Default Weight |
| ------------------- | -------------- |
| Email Response Time | 20%            |
| Open Requests       | 16%            |
| Meeting Frequency   | 16%            |
| Issue Resolution    | 16%            |
| Recent Activity     | 12%            |
| Contact Activity    | 0%             |
| Indicators          | 0%             |
| CSM Pulse           | 20%            |

<Tip>
  If your team regularly sets CSM Pulse scores, give it 15–25% weight so human judgment influences the final score. If
  your team rarely uses it, keep it at 0%.
</Tip>

If an account has no CSM Pulse (or it's older than 90 days), the weight is redistributed proportionally across the other factors — no account is penalized for missing a pulse.

## Tier Configuration

Health tiers map score ranges to labels and colors used throughout the app. Each tier has a `minScore`, a `label`, and a hex `color`.

| Tier            | Score Range | Default Color      |
| --------------- | ----------- | ------------------ |
| Healthy         | 80–100      | Green (`#22c55e`)  |
| Needs Attention | 60–79       | Yellow (`#eab308`) |
| At Risk         | 40–59       | Orange (`#f97316`) |
| Critical        | 0–39        | Red (`#ef4444`)    |

<Tip>
  Rename tiers to match your team's language — "Champion" instead of "Healthy" or "Watch List" instead of "Needs
  Attention".
</Tip>

Tier boundaries also affect [Extreme Pulse](#extreme-pulse-settings) — if you raise the Healthy threshold, the floor for a pulse=10 override rises to match.

## Scoring Thresholds

Thresholds define what counts as excellent, good, fair, or poor for each factor. Tune these to match your team's service level expectations.

| Factor              | Excellent | Good      | Fair       | Poor       |
| ------------------- | --------- | --------- | ---------- | ---------- |
| Email Response Time | \< 4 hrs  | \< 12 hrs | \< 24 hrs  | \< 48 hrs  |
| Open Requests       | 0         | ≤ 2       | ≤ 5        | ≤ 10       |
| Meeting Frequency   | ≥ 4 / 6mo | ≥ 2 / 6mo | ≥ 1 / 6mo  | —          |
| Issue Resolution    | \< 3 days | \< 7 days | \< 14 days | \< 30 days |
| Recent Activity     | \< 3 days | \< 7 days | \< 14 days | \< 30 days |
| Contact Activity    | \< 1 day  | \< 3 days | \< 7 days  | \< 14 days |

<Note>
  **Contact Activity** measures how recently a contact at the account was active. Data comes from
  [Vitally](/integrations/vitally) (`lastSeenTimestamp`) or the [API](/api-reference/accounts#update-account)
  (`contactActivityAt`). When set via API, the API value takes priority over Vitally data.
</Note>

<Tip>
  Enterprise customers with longer sales cycles and less frequent contact may need relaxed Meeting Frequency and Recent
  Activity thresholds.
</Tip>

## Extreme Pulse Settings

When a CSM gives an account a pulse of **1** or **10**, that high-conviction signal overrides automated metrics:

* **Pulse = 1** → account lands in **Critical**, regardless of other metrics
* **Pulse = 10** → account lands in **Healthy**, regardless of other metrics

The tier guarantee derives from your tier configuration — changing the Healthy threshold automatically adjusts the pulse=10 floor.

### Options

| Setting                  | Description                                       | Default |
| ------------------------ | ------------------------------------------------- | ------- |
| Enabled                  | Toggle extreme pulse amplification on or off      | On      |
| Amplifier                | Multiplier applied to CSM Pulse weight (1.0–3.0×) | 1.5×    |
| Extreme Pulse Expiration | Days until a pulse=1 or pulse=10 rating expires   | 30 days |
| Normal Pulse Expiration  | Days until a pulse=2–9 rating expires             | 90 days |

**Amplifier example:** With a base CSM Pulse weight of 20% and a 1.5× amplifier, the effective weight for an extreme score becomes 30%, giving the CSM's signal more pull before the tier guarantee is applied.

**Why extreme pulse expires faster:** Extreme ratings carry more risk of becoming stale. The shorter window (30 days by default) encourages re-evaluation of flagged accounts.

When amplification is active on an account, an indicator appears on the health score gauge:

* **↑ (green)** — boosted by pulse = 10
* **↓ (red)** — reduced by pulse = 1

Hover over the score gauge for details on which override was applied.

## Indicators

The **Indicators** tab lets you fold any of your saved [Indicators](/accounts/indicators) into the health score as a single weighted factor. Useful when product-usage signals like *Power user* or *Active in last 7 days* should drive the health number — not just inform it.

### Setup flow

<Steps>
  <Step title="Set the Indicators weight">
    On the **Weights** tab, set **Indicators** above 0. This unlocks the **Indicators** tab. The slider participates in
    the 100% weight sum just like any other factor.
  </Step>

  <Step title="Pick which indicators participate">
    On the **Indicators** tab, check each indicator you want to include in the composite. Indicators come from **Settings
    → Indicators**.
  </Step>

  <Step title="Set sub-weights">
    Each included indicator gets a **Sub-weight** input. Sub-weights are relative within the composite — they don't sum
    to 1 — they just determine how much each indicator pulls relative to its peers. Equal weights make every indicator
    count the same.
  </Step>

  <Step title="Configure scoring per indicator">
    How each indicator's value maps to a 0–100 component score:

    * **Yes / no indicators** — set the score for `true` (default 100) and the score for `false` (default 0).
    * **Number indicators** — set four thresholds (excellent / good / fair / poor) that map to 100 / 80 / 60 / 40 / 20,
      plus a **Direction** dropdown (`Higher is better` or `Lower is better`).
  </Step>

  <Step title="Save">
    Changes apply on the next health score calculation. Trigger a recalc by saving the modal — the next nightly run picks
    up the new shape.
  </Step>
</Steps>

### How the composite scores

Per indicator:

* Boolean → `value === true ? trueScore : falseScore` (defaults `100 / 0`)
* Number → threshold curve. Example with `direction: higher_is_better` and `excellent: 50, good: 20, fair: 5, poor: 0`:
  * `value ≥ 50` → 100
  * `value ≥ 20` → 80
  * `value ≥ 5` → 60
  * `value ≥ 0` → 40
  * else → 20

The composite is a sub-weighted average of these per-indicator scores. The composite then plugs into the outer health score as the **Indicators** factor.

### Disabled indicators

Indicators that are **disabled** (toggle on the Indicators settings page) or that haven't been computed yet for an account are silently skipped — you don't have to remove them from this config. The composite only averages over indicators that contributed.

### When the Indicators factor is dropped entirely

If no participating indicator has a computed value for an account (common for newly-connected orgs), the **Indicators** factor weight is redistributed across the other factors — same behavior as Contact Activity when no Vitally data exists. Accounts aren't penalized for missing data.
