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

# AI for dispatch

> Put Thread's AI to work on the board: tune Triage Agent scoping and escalation, drive triage and routing with Super Magic, and report in a minute.

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

The board runs best when AI carries the routine and you carry the judgment. You've already seen the Triage Agent scope intake and the assistive AI set category and priority. This lesson is about *steering* that AI — tuning what reaches you, and using Super Magic to triage, route, dedup, and report faster than you can click.

## Tune the Triage Agent so the board arrives clean

The quality of your board is downstream of how the [Triage Agent](/ai-agents/setting-up-your-triage-agent-user-guide) is set up. When threads arrive under- or over-scoped, the fix is usually a setting, not more manual triage. The levers worth knowing as a dispatcher:

| Lever                      | What it controls                                                                                             | Dispatcher payoff                                      |
| -------------------------- | ------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------ |
| **Information to collect** | Which details the agent pins down before handoff — scope, symptoms, impact, access, environment, recency.    | Route with confidence; fewer "need more info" bounces. |
| **Response length**        | *Short*, *Medium*, or *Long* back-and-forth.                                                                 | Match how much probing your clients tolerate.          |
| **Troubleshooting mode**   | Whether the agent troubleshoots, offers steps, or only collects info before escalating.                      | Decides how much the agent resolves vs. hands to you.  |
| **Escalation words**       | Phrases ("it's urgent", "system down", "talk to a technician") that trigger an immediate handoff to a human. | The board flags true urgency for you automatically.    |
| **Client access**          | Which clients, sources, boards, and contacts the agent acts on, plus excluded/blocked senders.               | Explains any thread that arrived un-triaged.           |

<Tip>
  When a thread reaches you raw or mis-scoped, don't just fix that ticket — ask *why the agent didn't handle it.* Nine times out of ten it's client access, request blocking, or an information-collection setting, and fixing the setting cleans up every future thread instead of one.
</Tip>

## Super Magic — your dispatch co-pilot

[Super Magic](/super-magic/meet-super-magic-your-ai-assistant-in-the-inbox) is an AI assistant built into Inbox. Ask it anything in plain language — about the board, a ticket, a tech's load — and it finds the answer or does the work. Two rules it always follows:

* **It reads freely.** Searching, scanning the queue, and looking things up never change anything. Ask away.
* **It acts only with your confirmation.** Before any change — an assignment, a status move, a merge — a **Confirm action** card shows exactly what will happen, line by line. Nothing happens until you click **Confirm**, and confirmed changes are recorded under your name.

Reach it from the **Magic** button in navigation (full-page chat) or the launcher in the top-right of Inbox. It's context-aware — open it on a thread and it already knows that ticket.

### Prompts to steal

<CodeGroup>
  ```text Read the board theme={null}
  Show me all unassigned tickets on the Support board, oldest first
  Which tickets are within an hour of an XLA breach?
  Who has the lightest active load on the T1 team right now?
  Are there any open tickets that look like duplicates of each other?
  ```

  ```text Route and assign (you'll confirm each one) theme={null}
  Assign this ticket to the lightest-loaded available T2 tech and set it In Progress
  Route this catch-all ticket to the right board based on its category
  This is a duplicate of the open Acme outage — merge them
  Escalate this to Tier 2, add a note with what's been tried, and reprioritize it
  ```

  ```text Balance and schedule (one message) theme={null}
  Find the three oldest unassigned tickets, route each to the right pod,
  and schedule them on the owner's Planner for tomorrow morning.
  ```
</CodeGroup>

<Info>
  **Good to know.** Mass actions are bounded — roughly 30 steps per request, across the newest \~500 tickets — so work large rebalances in chunks. Super Magic only offers tools you're allowed to use: write actions, intents, and Flows are gated by your admin, and merging tickets is ConnectWise-only.
</Info>

## Report on the desk in a minute

Dispatch isn't only routing — it's answering "how's the board doing?" without building a spreadsheet. Two fast paths:

* **Insights**, on any View, gives you an instant status/priority/owner breakdown for that slice of the board (see [Read the board](/start-here/roles/dispatcher/read-the-board)).
* **Super Magic** answers ad-hoc questions live — "how many tickets did we take overnight and how many are still unassigned?", "which techs are over their max threads?" — and the [Morning Dispatch Report](/skill-library/scheduling-and-dispatch/morning-dispatch-report) skill assembles the whole start-of-day picture for you.

<CardGroup cols={2}>
  <Card title="Morning Dispatch Report" icon="clipboard-list" href="/skill-library/scheduling-and-dispatch/morning-dispatch-report">
    The overnight board, aging, and load — assembled and skimmable.
  </Card>

  <Card title="Triage Agent Tuning" icon="sliders" href="/skill-library/automation-and-flows/triage-agent-tuning">
    Tune the agent's behavior against your real tickets.
  </Card>
</CardGroup>

<MarkComplete id="dispatcher/ai-for-dispatch" />

## Next

That's the course — you can read, route, schedule, protect XLAs, and steer the AI. Head back to the hub for your starter kit and morning ritual, or dive into the full Skill Library.

<CardGroup cols={2}>
  <Card title="Back to the Dispatcher hub" icon="route" href="/start-here/roles/dispatcher">
    Your starter kit, morning ritual, and 30-day ramp.
  </Card>

  <Card title="Browse the Skill Library" icon="sparkles" href="/skill-library/overview">
    Hundreds of Super Magic skills — search for any task.
  </Card>
</CardGroup>


## Related topics

- [Assign and schedule](/start-here/roles/dispatcher/assign-and-schedule.md)
- [Dispatcher](/start-here/roles/dispatcher.md)
- [Why dispatch is different in Thread](/start-here/roles/dispatcher/why-dispatch-in-thread.md)
