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

# Your daily workflows

> The technician's muscle memory in Thread: reply vs. note, the send-by-email checkbox, slash commands, Time Pad, Planner scheduling, approvals, and bundle/merge.

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

Replying, noting, tracking time, scheduling, and approvals — the muscle memory of working in Thread. Master the first distinction below and the rest follows.

## Reply vs. Note — the one that matters most

The chat box at the bottom of every thread has two primary modes:

* **Reply** — a customer-facing message sent to all contacts on the thread. This is your voice to the end user.
* **Note** — an internal-only message visible to workspace members. Troubleshooting logs, escalation context, teammate questions.

<Warning>
  **Always check which tab is selected before you send.** Posting an internal note as a customer reply is the most common mistake new Thread users make. The tabs are color-differentiated — build the habit of glancing before sending.
</Warning>

### The "Send by email" checkbox

Below the composer, this controls whether your reply *also* goes out as email. It's **on by default on non-live threads** (email-sourced) and **off by default on live threads** (Messenger, Slack, Teams — the customer is already getting it in chat).

<Info>
  The Send-by-email checkbox is available on **ConnectWise and HaloPSA** workspaces. **Autotask** shops handle outbound email through a configured [email communication workflow](/integrations/setting-up-an-email-communication-workflow-in-autotask) — ask your admin how yours is set up.
</Info>

## Slash commands — keep your hands on the keyboard

| Command                 | What it does                                                                       |
| ----------------------- | ---------------------------------------------------------------------------------- |
| `/reply` · `/note`      | Switch the composer between Reply and Note.                                        |
| `/assign`               | Change the assigned member.                                                        |
| `/status` · `/priority` | Update the thread's status or priority.                                            |
| `/snip`                 | Insert a Snippet.                                                                  |
| `/time`                 | Add a time entry.                                                                  |
| `/connectwise`          | Perform PSA actions. (Named "connectwise" but works for Autotask and HaloPSA too.) |
| `/copilot`              | Run Magic AI actions — including Generate Recap.                                   |
| `/approval`             | Open the approval request modal.                                                   |
| `/timezest`             | Generate a TimeZest scheduling link (if your workspace has the integration).       |

The composer also has **Snippets**, **Time**, and **Actions** tabs — the Actions tab is where PSA actions and Magic AI tools live if you prefer clicking.

## Time tracking with Time Pad

Time Pad lives in the Control Panel. Start/stop the timer (or key in start/end times), attach notes, and save the entry straight to your PSA. Two things make it painless:

* **Magic AI can write your time-entry notes** from the conversation — no reconstructing what you did an hour later.
* **Your Preferences automate the start/stop/remind cycle** around replies and closures (you set these in [day-one setup](/start-here/roles/technician/day-one-setup)).

Entries can be **internal** (team-only) or **external** (visible to the contact, without emailing them). Your workspace sets a default for the primary button — ask your admin which.

## Scheduling with Planner

[Planner](/inbox/using-planner) (left rail) is a drag-and-drop board of active threads in swimlanes:

* **Triage swimlane** — all unassigned active threads. Drag one into a member's lane to assign it.
* **Member swimlanes** — each member's threads, in spaces: *Overdue*, *Backlog* (assigned, no plan yet), and *Day* spaces (Today plus the next two days).

Drag a thread into a day space to plan it; hover a card and click the calendar icon for exact start/end times. You can also create plans from the Planner card in any thread's Control Panel.

<Info>
  **PSA sync behavior.** Planner is available for **ConnectWise** and **Autotask**. ConnectWise plans sync **both directions in real time**. Autotask: Thread→PSA is real-time; **PSA→Thread updates every five minutes** (or force it with the sync icon, top-right of Planner). Autotask requires times — a day-only plan syncs with a 12:00 AM start. TimeZest, if connected, sends a booking link tied to your real calendar; see [Planner + Outlook calendar](/inbox/planner-outlook-calendar-integration).
</Info>

## Requesting approvals

Need a client sign-off — a server upgrade, a purchase, after-hours work? Type `/approval` or use **Action → Request Approval**. See [approvals in Inbox](/inbox/approvals-in-inbox).

<Steps>
  <Step title="Select approvers">
    By Contact Type or specific contacts (ConnectWise/Autotask), or individual contacts (Halo).
  </Step>

  <Step title="Preview the standardized message">
    Approver names are filled in automatically.
  </Step>

  <Step title="Send">
    Approvers join the conversation and are notified via Teams, Messenger, or email, with one-click **Approve / Decline**.
  </Step>
</Steps>

Requests stay pending until someone acts — no timeout. Track everything under **Inbox → Apps → Approvals**. Every action is logged in Thread and your PSA for auditing.

## Bundle & merge related tickets

Three tickets about the same outage? Open **Link Threads** from the thread header (or press **`⌘⇧L`**): **Bundle** groups them under a parent while each stays open and handled separately; **Merge** closes the child threads — you set a closing status — and moves their conversation into the parent. Link Threads is available on **ConnectWise** workspaces.

<Tip>
  **If something looks stale,** hit the thread's **PSA Sync** icon first. For workspace-wide gaps, an admin can run a manual sync (**Admin → Integrations → PSA → PSA Sync**) — allow up to an hour.
</Tip>

<MarkComplete id="technician/daily-workflows" />

## Next

You've got the manual workflows. Now let the AI carry the routine.

<Card title="Your AI toolkit" icon="wand-magic-sparkles" href="/start-here/roles/technician/ai-toolkit">
  Triage Agent, Magic AI, Intelligence, and Super Magic — with prompts to steal.
</Card>


## Related topics

- [Day-one setup](/start-here/roles/technician/day-one-setup.md)
- [Technician](/start-here/roles/technician.md)
- [Thread Partner Change Management Guide](/get-started/thread-partner-change-management-guide.md)
