> ## 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.

# Run QBRs with Magic Analytics and the Dashboard Agent

> How a CSM preps a QBR in Thread: Magic Analytics dashboards, Value Realization and Service Performance Review topics, and the Dashboard Agent.

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 />

A quarterly business review lives or dies on one thing: can you show the client, in their terms, what they got? Thread does the number-gathering for you. **Magic Analytics** brings your service metrics and the impact of Thread's AI into one place, the **Dashboard Agent** answers questions on it in plain English, and two governed topics are built specifically for the value story. This lesson is how a CSM turns all of that into a review deck without touching a spreadsheet.

## Where the numbers live: Magic Analytics

Magic Analytics is your reporting experience inside Thread — service desk metrics and AI impact together, scoped to only your organization's data. Get there via **Thread admin → General → Analytics**. See [Getting started with Magic Analytics](/analytics/getting-started-with-magic-analytics) for access and filtering.

It's organized three ways:

* **Dashboards** — pre-built views per product area: ROI Value Realization, Assistive AI Accuracy, Triage Agent Summary, Messenger (Chat), Voice AI Summary, and Service Team Performance & AI Usage. Open one, apply filters (date range, source, board), read the result.
* **Topics** — the curated, governed data areas you can explore beyond the pre-built tiles (more on these below).
* **Dashboard Agent** — plain-English Q\&A on top of both. Available to **AI Pro** members.

<Warning>
  Magic Analytics refreshes on a **daily cycle** — it's about a day behind, not real-time. Every tile shows a **"Query ran…"** timestamp (hover the tile, click the three dots). Check it before you quote any number to a client.
</Warning>

## The two topics built for QBRs

A topic is a governed view of related metrics at a fixed **grain** (aggregate rollups vs. one row per record). The full list is in [Topics you can explore](/analytics/topics-you-can-explore) — but two of them are the ones a CSM reaches for at review time:

| Topic                          | Grain                                             | Use it for                                                                                                                                                                              |
| ------------------------------ | ------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Value Realization**          | Aggregate — per partner × board × feature × month | The **internal** ROI story: dollar savings, FTE equivalents, ROI multiples, time saved, service quality. This is your QBR-prep source of truth.                                         |
| **Service Performance Review** | Detailed — one row per support request            | The **client-facing** readout, written in business-friendly language — support requests, satisfaction scores, channel mix, recurring issues. Built to share with the customer directly. |

<Tip>
  Prep from **Value Realization** to know the story; present from **Service Performance Review** so the language already speaks to the client. One tells you the ROI, the other says it in words a stakeholder cares about.
</Tip>

## Ask the Dashboard Agent instead of building queries

The [Dashboard Agent](/analytics/dashboard-agent) is Magic Analytics' built-in assistant. Ask a question in plain English and it answers — often with a chart or table — drawing on the same governed topics, and only ever on your organization's data. Open it from the chat bubble on a dashboard, or from any tile's **⋮** menu → **Ask a follow up question** to start focused on that chart.

Questions that write a QBR for you:

<CodeGroup>
  ```text Value and ROI theme={null}
  What's my estimated time saved this quarter?
  Show Value Realization ROI this quarter, broken out by feature.
  How much has assistive AI reduced admin time on the Support board?
  ```

  ```text The client-facing story theme={null}
  Summarize support requests and satisfaction for Acme Corp last quarter.
  What were Acme's top recurring issues over the last 90 days?
  Break Acme's channel mix out — chat vs. email vs. phone.
  ```

  ```text Adoption and coverage theme={null}
  How many tickets did the Triage Agent handle last month?
  Which of my customers don't have Messenger enabled yet?
  What's my Voice AI call volume week over week?
  ```
</CodeGroup>

Two habits make its answers sharp: **name the area** (mention Value Realization, Triage Agent, Voice AI) so it scopes correctly, and **give a time frame** ("last quarter", "week over week"). Ask one thing at a time, then refine — "now break that out by customer" works.

<Note>
  The Dashboard Agent answers from the daily refresh, not live data, and only within the topics you have access to. Some topics are pre-aggregated, so it can summarize and re-cut those metrics but can't drill to an individual ticket — see [things to know & gotchas](/analytics/things-to-know-and-gotchas).
</Note>

## Turn the data into the deck

The analytics give you the numbers; two skills turn them into a review your client will remember:

<CardGroup cols={2}>
  <Card title="QBR & SBR Prep" icon="chart-pie" href="/skill-library/account-management/qbr-and-sbr-prep">
    An internal brief before the review — the service record, the risks, and the story to lead with.
  </Card>

  <Card title="Business Value Summary" icon="sack-dollar" href="/skill-library/account-management/business-value-summary">
    The value delivered this period in business terms — the "what you got" story, in outcome language.
  </Card>
</CardGroup>

When you present, translate every internal metric into a customer outcome — "96% triage accuracy" becomes "your issue goes to the right expert the first time." The full translation table lives in the [customer value messaging playbook](/get-started/talking-to-customers-about-ai-powered-support-thread-customer-value-messaging), which you'll put to work in the next lesson.

<MarkComplete id="csm-account-manager/qbrs-and-reporting" />

## Next

You can prove the value. Now use it to keep accounts and grow them.

<Card title="Retention and expansion" icon="arrow-trend-up" href="/start-here/roles/csm-account-manager/retention-and-expansion">
  The health, renewal, and expansion playbooks — and the customer value story that lands them.
</Card>


## Related topics

- [Dashboard Agent: query Magic Analytics in plain English](/analytics/dashboard-agent.md)
- [Read client health with Client Intelligence](/start-here/roles/csm-account-manager/client-intelligence-and-health.md)
- [CSM / Account Manager](/start-here/roles/csm-account-manager.md)
