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

# Read client health with Client Intelligence

> How a CSM reads an account in Thread: the Client Intelligence dashboard, Magic Sentiment scoring, and company notes that hold context between chats.

export const MarkComplete = ({id, signalDone = false}) => {
  const KEY = "thread-onboarding-completed";
  const read = () => {
    try {
      return JSON.parse(localStorage.getItem(KEY) || "[]");
    } catch (e) {
      return [];
    }
  };
  const [localDone, setLocalDone] = useState(false);
  const done = signalDone || localDone;
  useEffect(() => {
    const sync = () => setLocalDone(read().includes(id));
    sync();
    window.addEventListener("thread-onboarding-updated", sync);
    return () => window.removeEventListener("thread-onboarding-updated", sync);
  }, [id]);
  const toggle = () => {
    if (signalDone) return;
    const list = read();
    const next = list.includes(id) ? list.filter(x => x !== id) : [...list, id];
    try {
      localStorage.setItem(KEY, JSON.stringify(next));
    } catch (e) {}
    setLocalDone(next.includes(id));
    window.dispatchEvent(new Event("thread-onboarding-updated"));
  };
  return <button onClick={toggle} style={{
    width: "100%",
    padding: "0.7rem 1rem",
    marginTop: "1.5rem",
    borderRadius: "8px",
    border: "1px solid " + (done ? "#00B398" : "rgba(128,128,128,0.35)"),
    background: done ? "rgba(0,179,152,0.12)" : "transparent",
    color: done ? "#00B398" : "inherit",
    fontWeight: 600,
    fontSize: "0.95rem",
    cursor: "pointer",
    display: "flex",
    alignItems: "center",
    justifyContent: "center",
    gap: "0.5rem"
  }}>
      <span aria-hidden="true">{done ? "✓" : "○"}</span>
      {done ? "Completed" : "Mark as complete"}
    </button>;
};

export const ByRoleProgress = () => {
  useEffect(() => {
    const KEY = "thread-onboarding-completed";
    const TEAL = "#00B398";
    const BASE = "/start-here/roles/";
    const DONE_ICON = '<svg class="thread-rc-doneicon size-4" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="#00B398" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">' + '<path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"/>' + '<polyline points="22 4 12 14.01 9 11.01"/></svg>';
    const COURSES = [{
      slug: "technician",
      steps: ["why-thread", "get-around-inbox", "day-one-setup", "daily-workflows", "ai-toolkit", "notifications-and-customers"]
    }, {
      slug: "dispatcher",
      steps: ["why-dispatch-in-thread", "read-the-board", "assign-and-schedule", "ai-for-dispatch"]
    }, {
      slug: "service-ops-manager",
      steps: ["set-up-the-desk", "sla-and-dispatch", "analytics-and-qa", "roll-out-and-adopt"]
    }, {
      slug: "csm-account-manager",
      steps: ["client-intelligence-and-health", "qbrs-and-reporting", "retention-and-expansion"]
    }, {
      slug: "security-compliance-owner",
      steps: ["security-work-in-thread", "data-and-compliance", "security-runbooks"]
    }, {
      slug: "sales-business-development",
      steps: ["the-ai-service-pitch", "quote-and-handoff"]
    }, {
      slug: "msp-owner-leadership",
      steps: ["the-rollout", "outcomes-and-analytics", "scale-ai-service"]
    }, {
      slug: "automation-engineer",
      steps: ["flows-and-intents", "thread-mcp-and-api", "build-with-super-magic"]
    }];
    const COURSE_SLUGS = new Set(COURSES.map(c => c.slug));
    const readLocal = () => {
      try {
        return JSON.parse(localStorage.getItem(KEY) || "[]");
      } catch (e) {
        return [];
      }
    };
    const isDone = (done, id) => done.includes(id);
    const decorate = () => {
      const done = readLocal();
      const scope = document.getElementById("sidebar-content") || document;
      const links = [...scope.querySelectorAll('a[href*="' + BASE + '"]')].filter(a => !a.closest("main"));
      links.forEach(a => {
        const m = (a.getAttribute("href") || "").match(/\/start-here\/roles\/([^/?#]+)\/([^/?#]+)/);
        if (!m) return;
        if (!COURSE_SLUGS.has(m[1])) return;
        const id = m[1] + "/" + m[2];
        const d = isDone(done, id);
        const has = a.querySelector(".thread-rc-check");
        if (d && !has) {
          const s = document.createElement("span");
          s.className = "thread-rc-check";
          s.textContent = "✓ ";
          s.style.color = TEAL;
          s.style.fontWeight = "700";
          a.insertBefore(s, a.firstChild);
        } else if (!d && has) {
          has.remove();
        }
      });
      COURSES.forEach(course => {
        const li = scope.querySelector('li[id="' + BASE + course.slug + '"]');
        if (!li) return;
        const row = li.querySelector(":scope > button") || li.querySelector(":scope > a") || li.firstElementChild;
        if (!row) return;
        const nameSpan = [...row.querySelectorAll("span")].find(s => s.textContent.trim() && !s.classList.contains("thread-rc-coursecheck"));
        if (!nameSpan) return;
        const allDone = course.steps.length > 0 && course.steps.every(s => isDone(done, course.slug + "/" + s));
        const has = nameSpan.querySelector(".thread-rc-coursecheck");
        if (allDone && !has) {
          const s = document.createElement("span");
          s.className = "thread-rc-coursecheck";
          s.setAttribute("aria-hidden", "true");
          s.style.display = "inline-flex";
          s.style.alignItems = "center";
          s.style.verticalAlign = "-0.2em";
          s.style.marginRight = "0.35em";
          s.innerHTML = DONE_ICON;
          nameSpan.insertBefore(s, nameSpan.firstChild);
        } else if (!allDone && has) {
          has.remove();
        }
      });
    };
    decorate();
    const iv = setInterval(decorate, 600);
    window.addEventListener("thread-onboarding-updated", decorate);
    window.addEventListener("storage", decorate);
    return () => {
      clearInterval(iv);
      window.removeEventListener("thread-onboarding-updated", decorate);
      window.removeEventListener("storage", decorate);
    };
  }, []);
  return null;
};

<ByRoleProgress />

Before you can defend or grow an account, you have to be able to read it — and read it faster than the client can. Thread gives you three lenses on every client: **Client Intelligence** (the per-client dashboard and knowledge base), **Magic Sentiment** (how each conversation actually feels), and the **notes and applications** that keep an account's context in one place. This lesson is how a CSM uses all three.

## The Client Intelligence dashboard

**Client Intelligence** is Thread's per-client knowledge product, under the Service Intelligence umbrella. Every time a thread is resolved, Thread analyzes it and either writes a new knowledge article or updates an existing one — so an account's dashboard is a living picture of what that client actually needs help with. See [Getting started with Client Intelligence](/ai-agents/getting-started-with-knowledge) for the full manager walkthrough.

For a CSM, the dashboard is your account-health cockpit. Drill into a client and you get:

| Lens                              | What it tells you                                                                                       |
| --------------------------------- | ------------------------------------------------------------------------------------------------------- |
| **Sentiment**                     | An AI-analyzed read on how the client is feeling right now — your earliest churn signal.                |
| **Volume**                        | Thread volume over a period — is this account getting louder or quieter?                                |
| **Top issues**                    | The most frequent problems (e.g. "NordVPN connection issues") — the recurring pain to raise at the QBR. |
| **Open seconds**                  | Total time this client's threads have stayed open — effort you're spending on them.                     |
| **Knowledge articles**            | How much institutional memory Thread has built for this account.                                        |
| **Points of contact & approvers** | Who matters on the account, plus a "contact of the month" view of who's opening the most tickets.       |

<Tip>
  Read the dashboard before every client call. "Your top three issues this quarter were password resets, VPN, and printer setup — here's how we're getting ahead of them" is a better opener than any slide.
</Tip>

The technician-facing side of the same product is worth knowing too: the [Client Intelligence service tech guide](/ai-agents/knowledge-intelligence-service-tech-guide) shows how your desk gets in-conversation article suggestions from the same knowledge base. When you tell a client "our techs already know your setup," this is the mechanism behind it.

## Magic Sentiment — your earliest warning

**Magic Sentiment** scores customer satisfaction in real time so you catch a souring relationship weeks before it shows up in a renewal conversation. It runs quietly in the background: it watches every thread for customer replies, analyzes the last three messages from the end user, and scores sentiment live. See [Configure Magic Sentiment](/assistive-ai/configure-sentiment) for setup and the escalation workflows.

How to read the score:

* Every thread starts at a **neutral 50**, and each message can **raise or lower** it, on a **0 (very negative) to 100 (very positive)** scale.
* Scoring starts only after the customer's **third message** — early frustration is common in IT support, so the first message is excluded from the overall score.
* Thread-level scores roll up to a **company average** you can watch on the Client Intelligence dashboard.

<Note>
  A dip in a company's sentiment average is the signal to act — not to wait. Pair it with the [Sentiment Decline Watch](/skill-library/account-management/sentiment-decline-watch) skill to surface which accounts are trending down and why, with the ticket references to back it up.
</Note>

Sentiment is most useful as a trend, not a snapshot. One tense thread means someone had a bad Tuesday; a two-week slide across an account's average means you have a relationship problem to get in front of.

## Notes and applications — hold the context

The best CSMs never let an account's context live only in their own head. Client Intelligence gives you two places to write it down so the whole desk — and Super Magic — can use it:

* **Client Notes** capture what tickets can't: executive sponsors, approved hardware lists, the change-request process, SOPs pulled from IT Glue or Hudu. Paste static text into the Notes tab and it's immediately indexed and searchable via Super Magic. When a tech asks Super Magic "who's the approver at Acme?", your note is the answer.
* **Applications** show which software each client actually uses, built from conversation history — so a resolution matches their real environment (their VPN client, their line-of-business app) instead of a generic fix.

<Tip>
  After every QBR or stakeholder change, drop a Client Note: new sponsor, new priorities, renewal date, anything the next person to touch the account needs. It's the cheapest insurance against a dropped relationship.
</Tip>

Between the dashboard, sentiment, and notes, you can answer the only question that matters walking into any account conversation: **is this relationship getting healthier or not, and what's the evidence?**

<MarkComplete id="csm-account-manager/client-intelligence-and-health" />

## Next

You can read an account. Now turn a whole quarter of it into a story a stakeholder will act on.

<Card title="QBRs and reporting" icon="chart-line" href="/start-here/roles/csm-account-manager/qbrs-and-reporting">
  Magic Analytics, the Dashboard Agent, and the client-facing QBR dataset — the value story, already written.
</Card>


## Related topics

- [Client Health Report](/skill-library/account-management/client-health-report.md)
- [Getting Started with Client Intelligence](/ai-agents/getting-started-with-knowledge.md)
- [CSM / Account Manager](/start-here/roles/csm-account-manager.md)
