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

# Dispatcher

> The dispatcher's course for Thread: read the board, assign with Planner and auto-dispatch, and run triage with the Triage Agent and Super Magic.

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

You own the board. Every request that lands has to get to the right tech, at the right priority, before an XLA turns red — and you're the one holding that whole picture in your head. Thread changes the starting point: the Triage Agent works the intake 24/7, so most threads reach you already responded-to, scoped, categorized, and prioritized. Your job shifts from chasing details to orchestrating capacity. This is your course — four short lessons that take you from reading a live board to running triage with AI, plus the skills and ritual built for your day.

## The course

Work these in order — each ends with a link to the next. Twenty minutes gets you dispatching from a clean, correctly-prioritized board.

<Steps>
  <Step title="Why dispatch is different in Thread">
    The Triage Agent pre-scopes intake, the board is real-time, and you orchestrate from there. [Start here →](/start-here/roles/dispatcher/why-dispatch-in-thread)
  </Step>

  <Step title="Read the board">
    Views, display modes, Beast Mode, and the triage queue you dispatch from. [Read →](/start-here/roles/dispatcher/read-the-board)
  </Step>

  <Step title="Assign and schedule">
    Availability, auto-dispatch profiles, Planner swimlanes, and XLA timers. [Read →](/start-here/roles/dispatcher/assign-and-schedule)
  </Step>

  <Step title="AI for dispatch">
    Tune the Triage Agent, drive triage with Super Magic, and report on the board. [Read →](/start-here/roles/dispatcher/ai-for-dispatch)
  </Step>
</Steps>

## Your starter kit

The [Skill Library](/skill-library/overview) has dozens of triage and dispatch skills. Start with these — then press **`⌘K`** and search for any task ("route this", "who's free", "duplicate") to find the rest.

<CardGroup cols={2}>
  <Card title="Ticket Triage" icon="arrows-split-up-and-left" href="/skill-library/triage-and-routing/ticket-triage">
    Classify, gauge severity, catch duplicates, and route to the right board.
  </Card>

  <Card title="Queue-Scoring Triage" icon="list-ol" href="/skill-library/triage-and-routing/queue-scoring-triage">
    Always know which ticket to work — or dispatch — next.
  </Card>

  <Card title="Smart Dispatch" icon="wand-magic-sparkles" href="/skill-library/scheduling-and-dispatch/smart-dispatch">
    Classify, consult a routing matrix, then assign and schedule in one pass.
  </Card>

  <Card title="Dispatch Control Tower" icon="tower-observation" href="/skill-library/scheduling-and-dispatch/dispatch-control-tower">
    The whole board at a glance — load, risk, and what needs a decision now.
  </Card>

  <Card title="Workload-Balancing Assignment" icon="scale-balanced" href="/skill-library/scheduling-and-dispatch/workload-balancing-assignment">
    Assign to the lightest-loaded tech who has the right skills.
  </Card>

  <Card title="Duplicate Hunter" icon="clone" href="/skill-library/triage-and-routing/duplicate-hunter">
    Catch tickets that duplicate an open one, and merge on an exact match.
  </Card>
</CardGroup>

<Card title="Browse all Dispatcher skills" icon="route" href="/skill-library/by-role/dispatcher">
  Every Super Magic skill tagged for the Dispatcher role — triage, routing, dedup, priority, and queue hygiene.
</Card>

## Your ritual

<Card title="Dispatcher morning ritual" icon="sun" href="/skill-library/role-rituals/dispatcher-morning-ritual">
  Open the day with a clean, correctly-prioritized, well-routed board — overnight arrivals triaged, XLAs checked, and work matched to who's available.
</Card>

Run it first thing, before you assign a single ticket. Check the **triage queue** for unassigned overnight arrivals, scan **XLA steppers** for anything at risk, then balance the day's work against who's marked **Available for dispatch**.

## Your first 30 days: the adoption ramp

| Week       | Focus                                                                                                                                                         | You've got it when…                                                 |
| ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------- |
| **Week 1** | Live on the board. Build (or inherit) a triage View, learn display modes and Beast Mode, dispatch by dragging in Planner.                                     | You run the whole board from Inbox without opening the PSA.         |
| **Week 2** | Speed layer: XLA steppers scanned at a glance, Beast Mode shortcuts (`⌘K`/`⌘J`, `⌘A`) to move through the queue, member swimlanes to balance load in seconds. | Nothing breaches on your watch that you didn't already see coming.  |
| **Week 3** | AI layer: trust the Triage Agent's pre-scoping, drive triage and routing with Super Magic, dedup before you dispatch.                                         | "Ask Super Magic to route it" is your reflex on catch-all tickets.  |
| **Week 4** | Power moves: auto-dispatch profiles tuned, Triage Agent escalation words dialed in, a morning report you skim in a minute.                                    | The board self-sorts and you spend your time on the judgment calls. |

<Note>
  Thread gets smarter the more your desk uses it. Every ticket the Triage Agent scopes and every route you confirm sharpens the next pass — so a well-run board compounds into a board that increasingly runs itself.
</Note>

## Pro tips & FAQ

<AccordionGroup>
  <Accordion title="Dispatch moves experienced dispatchers swear by">
    * **Beast Mode** shortcuts move you through the board: **`⌘K`**/**`⌘J`** next/previous conversation, **`⌘A`** toggle Active/Done (full list in the account menu).
    * Dispatch from **Planner** — drag a thread out of the **Triage swimlane** into a member's lane to assign, then into a **day space** to schedule it.
    * Scan the **XLA stepper** on every at-risk ticket; hover it to see which XLA profile is driving the deadline.
    * Toggle yourself **Offline** for dispatch when you step into a meeting so push auto-dispatch skips you.
    * Let Super Magic dedup a suspected repeat before you route it — merging is cleaner than two techs on the same fire.
  </Accordion>

  <Accordion title="A thread reached me un-triaged — why didn't the Triage Agent scope it?">
    The agent only acts on the **clients, sources, boards, and contacts** it's scoped to, and it skips senders caught by request blocking (out-of-office replies, alert noise, no-reply mailers). If a whole board's threads are arriving raw, check the agent's client access in **Triage Agent settings**. See [the setup guide](/ai-agents/setting-up-your-triage-agent-user-guide).
  </Accordion>

  <Accordion title="I don't see the Available for dispatch toggle">
    That toggle only appears when your workspace has **push auto-dispatch** enabled. Workspaces on pull-only auto-dispatch use the "Get next thread" button instead. See [Set your availability for auto-dispatch](/inbox/available-for-dispatch).
  </Accordion>

  <Accordion title="Auto-assign is overriding my Flows">
    Auto-assign can override any Flow that assigns tickets to specific members. Review and scope those Flows before turning on Auto-assign in production — Thread warns you with a banner when you enter Auto-assign mode. See [Auto-dispatch profiles](/inbox/auto-dispatch-profiles).
  </Accordion>

  <Accordion title="Does Auto-assign consider shift schedules (e.g. nightshift vs dayshift)?">
    No. Auto-assign only looks at whether a tech is set as **Available for dispatch** and whether they have work capacity (based on their currently assigned tickets against the profile's **Max threads** limit). It doesn't read shift schedules. If someone shouldn't receive work outside their shift, have them toggle themselves **Offline** for dispatch — or flip it for them from [Team Home](/inbox/team-home). See [Set your availability for auto-dispatch](/inbox/available-for-dispatch).
  </Accordion>

  <Accordion title="Who do I ask when I'm stuck?">
    Your team's Thread admin first, then these docs. Your company's Thread Customer Success Manager is also working with your admins throughout onboarding.
  </Accordion>
</AccordionGroup>


## Related topics

- [Dispatcher](/skill-library/by-role/dispatcher.md)
- [Dispatcher Intake](/skill-library/triage-and-routing/dispatcher-intake.md)
- [Tier Dispatcher](/skill-library/scheduling-and-dispatch/tier-dispatcher.md)
