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

# Quote & hand off

> Close and route deals with Thread: build quotes with Sales & Quoting skills, draft SOWs, mine tickets for expansion, and hand off cleanly to delivery.

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 pitch lands the interest; this is how you turn it into a signed, scoped deal — and then get it into delivery without the client ever repeating themselves. The work runs through [Super Magic](/super-magic/meet-super-magic-your-ai-assistant-in-the-inbox): open the ticket that carries the request, press **`⌘K`**, and launch the skill by name. Everything these skills produce is a **draft for the sales owner** — nothing money-facing leaves the building on its own.

## Quote the deal

When a client asks "what would this cost?", don't start from a blank spreadsheet. Run [Quote Preparation](/skill-library/sales-and-quoting/quote-preparation) on the ticket. It:

* reads the request and the client's sizing context (users, sites) from tickets,
* confirms the option axis with you — term (1-year vs 3-year), tiers (good/better/best), or delivery model (managed vs one-off) — capped at two or three options so it reads as a quote, not a menu,
* builds each option with the same structure so they compare cleanly, and
* writes the **assumptions** every price depends on underneath, plus a one-line recommendation.

<Warning>
  Quote Preparation never sets final pricing. It uses the figures you supply, labels any web-sourced number "public list price — replace with cost + margin," and hands off to the sales owner with a checklist of what to verify (pricing, margin, approval) before it reaches the client.
</Warning>

## Scope project-shaped work

If the deal is a project — a migration, an office move, a rollout — price the scope, not a guess. Run [SOW Drafting](/skill-library/sales-and-quoting/sow-drafting) on the ticket describing the work. It drafts five plain-language sections:

<Steps>
  <Step title="Objective">
    One paragraph in the client's own words — the outcome they asked for.
  </Step>

  <Step title="Deliverables">
    Numbered and verifiable ("X configured and tested," not "assist with X").
  </Step>

  <Step title="Assumptions">
    Every unverified fact the effort estimate depends on — access, counts, business-hours work. This list doubles as the sales owner's verification checklist.
  </Step>

  <Step title="Exclusions">
    The adjacent work this SOW does *not* cover — the usual scope-creep vectors (end-user training, legacy cleanup, third-party licensing, out-of-hours cutover).
  </Step>

  <Step title="Engagement model">
    A reasoned T\&M-vs-fixed recommendation: T\&M when discovery is incomplete, fixed when deliverables and counts are verified.
  </Step>
</Steps>

Pricing stays a placeholder unless you supply figures — effort and price belong to the sales owner. Draft the SOW first, then quote from it; that order is why fixed-price projects stop losing money.

## Find the deals already sitting in your tickets

Some of your best pipeline is buried in support work nobody flagged. Before a renewal or QBR, run [Tickets to Opportunities](/skill-library/sales-and-quoting/tickets-to-opportunities) on the client (or a portfolio). It sweeps recent tickets for buying signals:

| Signal                         | What it looks like in the tickets                                                             |
| ------------------------------ | --------------------------------------------------------------------------------------------- |
| **Aging / refresh**            | Repeat hardware failures, slow-machine complaints on the same devices, EOL software mentions. |
| **Growth**                     | New-hire onboarding bursts, new site or office mentions, "we're adding a team."               |
| **Capability gaps**            | Recurring requests the current stack can't serve — backup-restore failures, security asks.    |
| **Absorbed out-of-scope work** | Project-shaped work quietly done under the service agreement.                                 |
| **Stalled trails**             | Tickets where a quote or "we should propose" note exists but nothing progressed.              |

Each candidate comes back with evidence (ticket refs + a quoted line), so you walk into the renewal knowing exactly where the expansion is — not guessing.

<Info>
  Every opportunity is evidence-backed by design: one grumble isn't a signal. The report requires repetition or explicit client language before it lists anything, and a capped sweep is labeled a sample, not a census. Signals from a client's frustration are framed as service improvements, never "upsell targets."
</Info>

## Route the won deal into delivery

A "support" ticket that's really a purchase, renewal, or pricing question shouldn't die on the service board. Run [Sales Handoff Routing](/skill-library/sales-and-quoting/sales-handoff-routing) on it. The skill:

1. confirms the ticket is genuinely a sales conversation (not a support issue with a purchase side-mention — mixed tickets stay in support, with the sales portion flagged),
2. writes a plain-text handoff summary — who's asking, what they want in their own words, environment facts, urgency or renewal dates, and anything already promised to the client,
3. on your confirmation, moves the ticket to the sales board and puts the **account owner** on it, and
4. drafts the heads-up email to that owner (as an Outlook draft if the connector is set up, else as text) for you to send.

The summary note goes on the ticket *before* the move, so context travels with it — the client never has to repeat themselves to the next person. That clean handoff is the whole point: you close the deal and delivery picks it up cold-ready.

<Tip>
  Keep the loop honest end to end. Quote and SOW drafts wait for the sales owner; opportunity reports wait for evidence; handoffs wait for your confirm. The desk's credibility is the long-term asset — every guardrail here protects it.
</Tip>

<MarkComplete id="sales-business-development/quote-and-handoff" />

## Next

That's the full sales cycle in Thread — pitch, quote, scope, and route. Head back to the hub for your starter kit and deal-cycle ritual, or browse every skill built for your role.

<CardGroup cols={2}>
  <Card title="Back to the Sales course" icon="graduation-cap" href="/start-here/roles/sales-business-development">
    Your starter kit, deal-cycle ritual, and FAQ.
  </Card>

  <Card title="All Sales & Quoting skills" icon="tags" href="/skill-library/sales-and-quoting/overview">
    The full Super Magic skill set for quoting and hand-off.
  </Card>
</CardGroup>


## Related topics

- [The AI-service pitch](/start-here/roles/sales-business-development/the-ai-service-pitch.md)
- [Sales & Business Development](/start-here/roles/sales-business-development.md)
- [Escalation Advisor](/skill-library/escalation/escalation-advisor.md)
