diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index b279f696..d9df719b 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -65,7 +65,7 @@ { "name": "apollo", "source": "./partner-built/apollo", - "description": "Prospect, enrich leads, and load outreach sequences with Apollo.io — one-click MCP server integration for Claude Code and Cowork.", + "description": "Prospect, enrich leads, and load outreach sequences with Apollo.io \u2014 one-click MCP server integration for Claude Code and Cowork.", "author": { "name": "Apollo.io" } @@ -81,22 +81,22 @@ { "name": "engineering", "source": "./engineering", - "description": "Streamline engineering workflows — standups, code review, architecture decisions, incident response, and technical documentation. Works with your existing tools or standalone." + "description": "Streamline engineering workflows \u2014 standups, code review, architecture decisions, incident response, and technical documentation. Works with your existing tools or standalone." }, { "name": "human-resources", "source": "./human-resources", - "description": "Streamline people operations — recruiting, onboarding, performance reviews, compensation analysis, and policy guidance. Maintain compliance and keep your team running smoothly." + "description": "Streamline people operations \u2014 recruiting, onboarding, performance reviews, compensation analysis, and policy guidance. Maintain compliance and keep your team running smoothly." }, { "name": "design", "source": "./design", - "description": "Accelerate design workflows — critique, design system management, UX writing, accessibility audits, research synthesis, and dev handoff. From exploration to pixel-perfect specs." + "description": "Accelerate design workflows \u2014 critique, design system management, UX writing, accessibility audits, research synthesis, and dev handoff. From exploration to pixel-perfect specs." }, { "name": "operations", "source": "./operations", - "description": "Optimize business operations — vendor management, process documentation, change management, capacity planning, and compliance tracking. Keep your organization running efficiently." + "description": "Optimize business operations \u2014 vendor management, process documentation, change management, capacity planning, and compliance tracking. Keep your organization running efficiently." }, { "name": "brand-voice", @@ -105,6 +105,14 @@ "author": { "name": "Tribe AI" } + }, + { + "name": "quandri-customer-support", + "source": "./partner-built/quandri-customer-support", + "description": "Customer support skills for the Quandri CS team \u2014 daily triage briefs, pre-call prep, renewal strategy, response drafting, handoffs, knowledge base management, and weekly reporting across HubSpot, Linear, Slack, Granola, and Asana.", + "author": { + "name": "Quandri" + } } ] } diff --git a/partner-built/quandri-customer-support/.claude-plugin/plugin.json b/partner-built/quandri-customer-support/.claude-plugin/plugin.json new file mode 100644 index 00000000..2aa4a28d --- /dev/null +++ b/partner-built/quandri-customer-support/.claude-plugin/plugin.json @@ -0,0 +1,9 @@ +{ + "name": "quandri-customer-support", + "version": "0.2.0", + "description": "Customer Support skills for the Quandri CS team — ticket triage, response drafting, escalations, knowledge base management, and weekly incident reporting across HubSpot, Linear, Slack, and Notion.", + "author": { + "name": "Quandri Customer Support" + }, + "keywords": ["customer-support", "triage", "hubspot", "linear", "escalation", "knowledge-base"] +} diff --git a/partner-built/quandri-customer-support/README.md b/partner-built/quandri-customer-support/README.md new file mode 100644 index 00000000..c5520584 --- /dev/null +++ b/partner-built/quandri-customer-support/README.md @@ -0,0 +1,51 @@ +# Quandri Customer Support Plugin + +A Cowork plugin for the Quandri Customer Support team. Provides four skills that cover the core CS workflow — from the moment a ticket comes in to resolving it, documenting it, and escalating it when needed. + +## Skills + +### Ticket Triage +Look up a customer in HubSpot, classify the issue by type and priority (P1–P4), and create the corresponding Linear issue. Includes a priority matrix and routing guide. + +**Say things like:** *"Triage this ticket from Acme Corp"*, *"What priority is this issue?"*, *"Log this to Linear"* + +--- + +### Response Drafting +Draft a professional, empathetic reply to a customer tailored to their plan tier and the situation. Pulls context from HubSpot. Includes tone guidelines and response templates for common scenarios. + +**Say things like:** *"Draft a response to this customer"*, *"Help me reply to this ticket"*, *"Write a follow-up email"* + +--- + +### Knowledge Management +Turn a resolved ticket into a structured KB article and save it to Notion. Supports how-to guides, troubleshooting docs, FAQ entries, and reference articles. + +**Say things like:** *"Write a KB article for this fix"*, *"Add this to the knowledge base"*, *"Document this solution in Notion"* + +--- + +### Escalation +Package an issue for engineering, product, or leadership with full context and business impact, and post it to the right Slack channel. Includes an escalation brief template. + +**Say things like:** *"Escalate this to engineering"*, *"Write an escalation brief"*, *"This needs to go to the product team"* + +--- + +## Connected Tools + +This plugin works with the following tools already connected in Cowork: + +| Tool | Used for | +|----------|-----------------------------------------------| +| HubSpot | Customer context, account lookup, ticket history | +| Linear | Issue creation and tracking | +| Slack | Escalation posting, team notifications | +| Notion | Knowledge base article storage | +| Gmail | Customer email drafts (as needed) | + +--- + +## Maintained by + +Quandri Customer Support team. To add new skills or update reference guides, edit the skill files in this plugin and re-package. diff --git a/partner-built/quandri-customer-support/config.example.yaml b/partner-built/quandri-customer-support/config.example.yaml new file mode 100644 index 00000000..86cf50d4 --- /dev/null +++ b/partner-built/quandri-customer-support/config.example.yaml @@ -0,0 +1,15 @@ +# quandri-customer-support plugin configuration +# This plugin works through MCP integrations — no API keys or secrets required here. +# Connect the following tools in Cowork before using these skills: + +# Required MCP integrations: +# - HubSpot (customer context, ticket history, account lookup) +# - Linear (issue creation, triage, tracking) +# - Slack (escalations, team notifications, Slack search) +# - Granola (meeting notes and history) +# - Gmail (customer email drafts) +# - Google Calendar (upcoming meetings, scheduling) +# - Asana (task tracking, team output) + +# No additional configuration needed. +# Team roster and workspace URLs are baked into the skills for the Quandri CS team. diff --git a/partner-built/quandri-customer-support/skills/daily-triage-brief/SKILL.md b/partner-built/quandri-customer-support/skills/daily-triage-brief/SKILL.md new file mode 100644 index 00000000..08931175 --- /dev/null +++ b/partner-built/quandri-customer-support/skills/daily-triage-brief/SKILL.md @@ -0,0 +1,191 @@ +--- +name: daily-triage-brief +description: > + Generates a prioritized morning triage brief for the Quandri support team — surfaces new Linear + tickets since yesterday, overnight bot run failures, HubSpot tickets needing a response, and any + escalations or urgent flags from Slack. Produces a clear "work through this today" priority list + so Alma and Syed can hit the ground running. Use when: morning triage, daily triage, triage brief, + start of day, what do I work on today, what came in overnight, what's in the queue, morning brief, + daily queue, what needs attention today, triage queue. +--- + +# Daily Triage Brief + +## Purpose +Give the support team a prioritized starting point every morning. This is an operational brief — not a summary of what happened, but a concrete answer to "what do I work on right now?" Covers new tickets, bot run failures, customer escalations, and anything that came in since the previous working day. + +## When to Use +- "Morning triage" / "Daily triage brief" +- "What do I work on today?" +- "What came in overnight?" +- "What's in the queue?" +- "Start of day brief" +- Any time a support team member is beginning their workday and needs to orient quickly + +--- + +## Core Workflow + +### Step 1 — Establish the Lookback Window + +- Default to **since end of previous business day** (i.e., after 5pm the prior weekday) +- If today is Monday, look back to **Friday EOD** — capture the full weekend +- Use today's date to anchor all time calculations + +--- + +### Step 2 — Scan for Overnight Bot Run Failures + +This is the first thing to check — failed bot runs are time-sensitive because customers may be waiting on results and the support team is often the first to catch them. + +**Search two sources:** + +1. **Linear ONC team** — Use `Linear:list_issues` filtered to the ONC team, created after the lookback window. ONC tickets are often auto-created when a bot run fails. Look for tickets with titles containing terms like "failed", "stuck", "0%", "processing rate", or "exception". + +2. **#support-team Slack** — Use `Slack:slack_read_channel` on **#support-team** to catch any run failures or monitoring flags posted since EOD yesterday. + +For each failed run identified, collect: +- Customer name +- Product line (RR = Renewal Rounds, RQ = Renewal Queue, EE = another product line) +- What failed and when +- Whether a Linear ticket already exists (link it) or needs to be created +- Suggested first action (e.g., "check if re-run is possible", "investigate config", "escalate to ONC") + +--- + +### Step 3 — Pull New Linear Tickets in the Triage Queue + +Use `Linear:list_issues` to find tickets created since the lookback window that are unassigned or in a **Triage** / **Todo** state. Focus on the ONC team and any other teams the support team covers. + +For each new ticket: +- Ticket ID, title, team, priority +- 1-sentence description of the issue (from the ticket description) +- Suggested owner (Alma or Syed based on product/customer familiarity if determinable, otherwise "Unassigned") +- Suggested first action (investigate, reach out to customer, escalate to engineering, etc.) + +Also flag any **existing tickets** that have jumped to **Urgent** priority since yesterday — these may have been escalated overnight. + +--- + +### Step 4 — Check HubSpot for Customer Replies Needing a Response + +Use `HubSpot:search_crm_objects` (object type: `tickets`) to find open tickets where the customer has sent a message that hasn't been replied to yet. + +Prioritize: +- **Tickets with a customer reply > 24 hours old** and no Quandri response — flag as overdue +- **New tickets opened since EOD yesterday** — need an acknowledgement or first response +- **Any ticket marked Urgent or High priority** in HubSpot + +For each, note: +- Ticket ID, company name, subject +- What the customer is asking or reporting (1 sentence) +- How long since their last message +- Suggested response type (acknowledgement, investigation needed, quick answer) + +--- + +### Step 5 — Scan #support-team for Overnight Context + +Use `Slack:slack_read_channel` on **#support-team** for messages since the lookback window. + +Look for: +- Any escalations or urgent flags posted by teammates +- Customer mentions with unresolved questions +- Any context from Nick about priorities for today +- Anything from the previous evening that needs a follow-up action today + +Surface only what's actionable — skip informational messages that don't require a response. + +--- + +### Step 6 — Check for Sev-1 Tickets Needing Cleanup + +The support team periodically does Sev-1 cleanup — reviewing severity-1 tickets that may be resolved or stale. Use `Linear:list_issues` to surface any **Sev-1 / Urgent** tickets that: +- Have had **no update in 7+ days** +- Are marked as resolved in practice but not yet closed in Linear +- Have a status mismatch (e.g., still "In Progress" but last comment says issue is fixed) + +Flag these as a secondary cleanup task if the queue is otherwise manageable. + +--- + +### Step 7 — Build the Prioritized Work List + +Using everything gathered, produce a synthesized priority list following the structure in `references/triage-template.md`. + +**Priority order logic:** +1. 🔴 **P1 — Do first**: Overnight bot run failures, overdue customer responses (>24h), Urgent tickets with no owner +2. 🟠 **P2 — Do today**: New unassigned tickets needing triage, new HubSpot tickets needing acknowledgement, escalated tickets +3. 🟡 **P3 — Do when P1/P2 are clear**: Sev-1 cleanup, stale tickets, monitoring runs that haven't failed but are scheduled today +4. ⚪ **On radar**: Things to be aware of but no action needed yet + +The list should be **concrete and actionable** — not "review open tickets" but "ONC-712: Go Insurance run failed overnight — check if manual re-run is needed." + +--- + +### Step 8 — Offer to Assign and Post + +After generating the brief, offer: + +1. **Assign tickets in Linear** — Use `Linear:save_issue` to assign unowned tickets to Alma or Syed based on the suggested owners in the brief +2. **Post to #support-team** — Draft a short Slack summary of today's top priorities using `Slack:slack_send_message_draft` +3. **Create Asana tasks** for any follow-ups that don't belong in Linear (customer outreach, internal coordination tasks) + +**Always create drafts — never post or assign without user confirmation.** + +--- + +## Smart Defaults & Judgment Calls + +| Situation | Default Behavior | +|-----------|-----------------| +| No new tickets or failures overnight | "Clean queue — nothing new since EOD. Here's what's already open to work through." Then surface top existing open tickets | +| Monday morning | Automatically extends lookback to Friday EOD — note "covering Friday EOD through Monday morning" | +| Heavy overnight queue (10+ items) | Lead with P1 items only, summarize P2/P3 as counts with a note to review after clearing P1 | +| User is Nick (not Alma/Syed) | Frame the brief as a team overview — "here's what Alma and Syed are walking into today" | +| Ticket already assigned | Skip assigning, just list it | +| Bot run failure with an existing ONC ticket | Link the ticket, don't create a duplicate | + +--- + +## Tool Reference + +| Tool | Use | +|------|-----| +| `Linear:list_issues` | Pull new and triage-queue tickets; ONC overnight failures | +| `Linear:get_issue` | Get details on specific tickets | +| `Linear:list_comments` | Check latest activity on existing tickets | +| `Linear:save_issue` | Assign tickets to team members (with confirmation) | +| `Linear:list_teams` | Confirm ONC and other team IDs | +| `HubSpot:search_crm_objects` | Find customer replies and new HubSpot tickets | +| `HubSpot:get_crm_objects` | Get ticket details | +| `Slack:slack_read_channel` | Scan #support-team for overnight context and run flags | +| `Slack:slack_send_message_draft` | Draft the Slack summary post for #support-team | +| `Asana:asana_create_task` | Create follow-up tasks for non-Linear items | + +--- + +## Team Context (Quandri CX) + +- **Primary users**: Alma St. Hilaire and Syed (this brief is built for them) +- **Manager**: Nick (uses it as a team overview) +- **Linear team for incidents**: ONC — this is where bot run failures live +- **Product lines to know**: + - **RR** = Renewal Rounds (most common) + - **RQ** = Renewal Queue + - **EE** = another product line +- **Bot run failures** are time-sensitive — customers run scheduled renewal processing and failures can block their workflows +- **Sev-1 tickets** = highest severity, map to Urgent priority in Linear +- **Triage channel**: #support-team + +--- + +## Example Invocations + +- "Morning triage" +- "What do I work on today?" +- "What came in overnight?" +- "Daily triage brief" +- "What's in the queue this morning?" +- "Start of day brief for the support team" +- "Alma, what does your queue look like today?" diff --git a/partner-built/quandri-customer-support/skills/daily-triage-brief/references/triage-template.md b/partner-built/quandri-customer-support/skills/daily-triage-brief/references/triage-template.md new file mode 100644 index 00000000..22ac5eb1 --- /dev/null +++ b/partner-built/quandri-customer-support/skills/daily-triage-brief/references/triage-template.md @@ -0,0 +1,116 @@ +# Daily Triage Brief Output Template + +Use this structure exactly. Keep it scannable and action-first — every item should tell the reader exactly what to do, not just what exists. + +--- + +**Daily Triage Brief** — *[Today's Date, Day of Week]* +*Queue window: [e.g., "Friday EOD → Monday morning" or "Yesterday EOD → This morning"]* +*Prepared for: [Alma / Syed / Support Team]* + +--- + +## 🔴 P1 — Do First + +*(Bot run failures, overdue customer responses, Urgent unowned tickets. If none: "✅ Nothing urgent — no P1 items this morning.")* + +**🤖 Bot Run Failures** + +- **[Customer] — [Product Line: RR / RQ / EE]** + - What happened: [1 sentence — e.g., "Go Insurance RR run failed overnight with 0% processing rate"] + - Linear ticket: [[ONC-XXX]](link) *(or "No ticket yet — create one")* + - Action: [e.g., "Check if manual re-run is possible via admin panel; if not, tag engineering on the ticket"] + +*(Repeat for each failure. If none: "No overnight bot run failures.")* + +**📬 Overdue Customer Responses** + +- **[HubSpot Ticket ID] [Company] — [Subject]** + - Customer last replied: [Date/time — N hours ago] + - Waiting on: [What they asked or reported, 1 sentence] + - Action: [e.g., "Reply with an update — see ONC-XXX for status", "Acknowledge receipt and set expectations"] + +*(Repeat for each. If none: "No overdue customer responses.")* + +**🚨 Urgent Unowned Tickets** + +- **[[TICKET-ID]] [Title]** — *[Team] | Created [Date]* + - [1 sentence description] + - Action: [e.g., "Assign to Alma — RR issue, her area", "Investigate processing config"] + +*(Repeat for each. If none: "No urgent unowned tickets.")* + +--- + +## 🟠 P2 — Do Today + +*(New unassigned tickets needing triage, new HubSpot tickets needing acknowledgement, escalated tickets.)* + +**🎫 New Linear Tickets to Triage** + +- **[[TICKET-ID]] [Title]** — *[Team] | [Priority] | Created [Date]* + - [1 sentence description] + - Suggested owner: [Alma / Syed / Unassigned] + - Action: [e.g., "Investigate extraction failure — check customer config", "Reach out to customer for more details"] + +*(Repeat for each. If none: "No new tickets to triage.")* + +**📩 New HubSpot Tickets Needing Acknowledgement** + +- **[Ticket ID] [Company] — [Subject]** — *opened [Date]* + - [1 sentence on what the customer is reporting] + - Action: [e.g., "Send acknowledgement + create a Linear ticket", "Quick answer — see KB article X"] + +*(Repeat for each. If none: "No new HubSpot tickets.")* + +--- + +## 🟡 P3 — When P1/P2 Are Clear + +*(Sev-1 cleanup, stale tickets, scheduled runs to monitor today.)* + +**🧹 Sev-1 / Urgent Cleanup** + +*(Stale or potentially resolved Urgent tickets that need a status check.)* + +- **[[TICKET-ID]] [Title]** — *No update in [N] days* + - Action: [e.g., "Check if this is resolved and close it", "Ping engineering for an update"] + +*(If none: "No Sev-1 tickets flagged for cleanup.")* + +**👀 Runs to Monitor Today** + +*(Scheduled bot runs happening today that should be checked on — not failures yet, just on radar.)* + +- **[Customer] — [Product Line]** — run scheduled [time if known] + - Context: [e.g., "Had issues last week — keep an eye on this one"] + - If it fails: [e.g., "Create an ONC ticket and tag Alma", "Try manual re-run first"] + +*(If none: "No specific runs flagged for monitoring today.")* + +--- + +## ⚪ On Radar + +*(Things to be aware of but no action needed yet.)* + +- [Item — 1 sentence, e.g., "Wawanesa renewal run is scheduled for Thursday — monitor Wednesday EOD"] +- [Item] + +*(If none, omit this section.)* + +--- + +## 📊 Queue Snapshot + +| | Count | +|---|---| +| 🔴 P1 items | [N] | +| 🟠 P2 items | [N] | +| 🟡 P3 items | [N] | +| Total open Linear tickets (ONC) | [N] | +| Open HubSpot tickets | [N] | + +--- + +*Quandri CX — Daily Triage Brief | [Today's Date]* diff --git a/partner-built/quandri-customer-support/skills/eod-cx-wrapup/SKILL.md b/partner-built/quandri-customer-support/skills/eod-cx-wrapup/SKILL.md new file mode 100644 index 00000000..a4e20ea2 --- /dev/null +++ b/partner-built/quandri-customer-support/skills/eod-cx-wrapup/SKILL.md @@ -0,0 +1,184 @@ +--- +name: eod-cx-wrapup +description: Generates a concise end-of-day wrap-up for the Quandri CX team by reviewing today's HubSpot tickets, Asana tasks, Slack activity, and calendar events. Summarizes what was accomplished, what's still open, and what needs attention tomorrow. Use this skill whenever the user says "end of day", "EOD summary", "wrap up my day", "what did I accomplish today", "daily wrap-up", "close out my day", "end of day report", or "what's left for today". Also trigger when the user asks to summarize the day's customer support activity or prepare a team update at the end of the workday. Ideal for CX managers and team leads who want a quick daily pulse before signing off. +--- + +# End of Day CX Wrap-Up + +## Purpose +A quick daily close-out for the Quandri CX team — summarizes what was accomplished today, what's still open, any customer flags, and sets up tomorrow's priorities. Should take under 2 minutes to read. + +## When to Use +- "EOD summary" / "end of day wrap-up" +- "Wrap up my day" +- "What did I accomplish today?" +- "What's still open before I sign off?" +- "Daily wrap-up" / "Close out my day" +- Any time the user is wrapping up their workday + +--- + +## Core Workflow + +### Step 1 — Establish Today's Date +- Default to **today** as the reporting period +- Use today's date to filter all data pulls + +--- + +### Step 2 — Review Today's HubSpot Tickets +Use HubSpot to get a snapshot of today's ticket activity: + +**Collect:** +- Tickets opened today +- Tickets resolved/closed today +- Tickets updated today (responses sent, status changes) +- Any new escalations or high-priority tickets +- Tickets that went unanswered today (opened but no response) + +Use `HubSpot:search_crm_objects` filtered to today's date range. + +--- + +### Step 3 — Check Task Completion in Asana +- Use `Asana:asana_get_tasks` to find tasks completed today by Nick, Alma, and Syed +- Pull tasks that were due today but not completed (carry-forwards) +- Pull any new tasks created today +- Use `Asana:asana_search_tasks` with today's date filter + +--- + +### Step 4 — Scan Key Slack Channels +- Use `Slack:slack_read_channel` to scan today's activity in: + - **#cx-team** + - **#cx-leaders** + - **#support-team** +- Surface: any unresolved threads, action items mentioned, customer mentions, or open questions that still need a response + +--- + +### Step 5 — Review Today's Calendar & Meetings +- Use `Google Calendar:gcal_list_events` to pull today's meetings +- Cross-reference with `Granola:list_meetings` to check for notes +- Note: meetings that happened, any follow-ups generated, and meetings missed or rescheduled + +--- + +### Step 6 — Identify Carry-Forwards & Tomorrow's Setup +Based on all data, identify: +- **Unfinished tasks** that should move to tomorrow +- **Open tickets** that need a response first thing tomorrow +- **Slack threads** still needing a reply +- **Any customer commitments** made today that need follow-through + +--- + +### Step 7 — Compile the Wrap-Up +Keep it tight and scannable — this is an EOD check, not a full report. + +``` +# End of Day Wrap-Up — [Today's Date] + +## ✅ Accomplished Today +**Tickets:** +- X opened | X resolved | X updated + +**Tasks completed:** +- [Name]: [Task 1], [Task 2] +- [Name]: [Task 1] + +**Meetings held:** X +- [Meeting name / account] — [one-line outcome] + +--- + +## 🔁 Still Open +**Tickets needing attention:** +- [Ticket / account] — [issue, time open] + +**Tasks not completed today:** +- [Task] — [Owner] — suggest moving to [tomorrow/date] + +**Slack threads needing reply:** +- [Thread summary] in [#channel] + +--- + +## 🔥 Flags & Escalations +- [Account / issue] — [urgency / next step] + +--- + +## 🗓️ Tomorrow's Top 3 +1. [Priority 1] +2. [Priority 2] +3. [Priority 3] + +--- +*Quandri CX — End of Day Wrap-Up* +``` + +--- + +### Step 8 — Offer to Share +After generating the wrap-up, offer: + +**A) Post to Slack** +- Draft a brief EOD update to **#cx-team** or **#cx-leaders** +- Keep it to 3–5 bullet points — just the headlines +- Use `Slack:slack_send_message_draft` to save as draft + +**B) Update Notion** +- Save the full wrap-up to Notion under CX Team > Daily Logs +- Use `Notion:notion-create-pages` + +**Always save as draft — never post without user review.** + +--- + +## Tool Reference + +| Tool | Use | +|------|-----| +| `HubSpot:search_crm_objects` | Today's ticket activity | +| `HubSpot:get_crm_objects` | Ticket details | +| `Asana:asana_get_tasks` | Tasks completed and outstanding today | +| `Asana:asana_search_tasks` | Filter by today's date and assignee | +| `Slack:slack_read_channel` | Scan key CX channels for open threads | +| `Google Calendar:gcal_list_events` | Today's meetings | +| `Granola:list_meetings` | Meeting notes and outcomes | +| `Slack:slack_send_message_draft` | Draft EOD Slack update | +| `Notion:notion-create-pages` | Save wrap-up to Notion daily log | + +--- + +## Smart Defaults & Judgment Calls + +| Situation | Default Behavior | +|-----------|-----------------| +| No tickets opened today | Note positively — "Quiet day on tickets" | +| All tasks completed | Celebrate it — "Clean slate for tomorrow" | +| No meetings today | Note it, still check Slack for async activity | +| Heavy escalation day | Lead the report with the Flags section | +| User asks for yesterday's wrap-up | Adjust date range to previous workday | + +--- + +## Team Context (Quandri CX) + +- **Team members**: Nick (Manager), Alma (direct report), Syed (direct report) +- **Key Slack channels**: #cx-team, #cx-leaders, #support-team +- **Tone**: Concise and action-oriented — this is a 2-minute read, not a report +- **Notion**: Save to CX Team > Daily Logs +- **Audience**: Primarily for Nick to close out his day and prep for tomorrow + +--- + +## Example Invocations +- "EOD summary" +- "Wrap up my day" +- "End of day wrap-up" +- "What did I accomplish today?" +- "What's still open before I sign off?" +- "Close out my day" +- "Daily wrap-up for the CX team" diff --git a/partner-built/quandri-customer-support/skills/knowledge-management/SKILL.md b/partner-built/quandri-customer-support/skills/knowledge-management/SKILL.md new file mode 100644 index 00000000..b2decbd2 --- /dev/null +++ b/partner-built/quandri-customer-support/skills/knowledge-management/SKILL.md @@ -0,0 +1,69 @@ +--- +name: knowledge-management +description: > + Write and publish knowledge base articles for the Quandri CS team from resolved support tickets. + Drafts structured how-to guides, troubleshooting docs, and FAQ entries and adds them to the + Quandri Knowledge Hub (knowledge.quandri.io) via the Asana backlog process. + Use when: write a KB article, document this solution, turn this ticket into a KB entry, + add this to the knowledge base, create a how-to guide, document this fix, update the KB, + add this to the Knowledge Hub. +--- + +# Knowledge Management + +Turn a resolved support ticket or common question into a polished knowledge base article for the Quandri Knowledge Hub at knowledge.quandri.io. + +## Background + +The Quandri Knowledge Hub (knowledge.quandri.io) is the go-to place for all product knowledge — for customers, prospects, and internal staff alike. Articles are managed through an Asana backlog board and published via HelpJuice. Support owns the process: managing the Asana board, drafting articles, and working with Product and Marketing for review before publishing. + +## Workflow + +### Step 1 — Identify the source material + +Gather (from context or by asking): +- What was the issue or question? +- What was the resolution or answer? +- Is there a Linear issue or HubSpot ticket to reference? +- Has this come up before? (recurring issue signals high-value KB candidate) + +### Step 2 — Determine article type + +Choose the appropriate format based on the content: + +| Type | When to use | +|-----------------------|--------------------------------------------------------------| +| `how-to` | Step-by-step instructions for completing a task | +| `troubleshooting` | Diagnosing and resolving a specific error or problem | +| `faq` | Short Q&A format for common questions | +| `reference` | Factual information (limits, supported formats, config options) | +| `release-note` | Document a change that's causing support questions | + +### Step 3 — Draft the article + +Write the article following the structure in `references/article-template.md`. + +**Quality checklist:** +- Title is searchable — use terms customers would actually type +- Intro explains who this article is for and what problem it solves +- Steps are numbered, clear, and tested +- Screenshots or examples are noted where helpful (add placeholders if not available) +- Includes a "Still need help?" section pointing back to CS + +### Step 4 — Add to the Knowledge Hub Asana Backlog + +Add the drafted article to the Asana Knowledge Hub Backlog board so it can be reviewed and published: +- Asana board: https://app.asana.com/0/1207315850003741/1207316091410726 +- Use `Asana:asana_create_task` to create a task in the backlog +- Include the article draft in the task description +- Assign to the appropriate Product Manager if product-specific, or leave for Support to handle +- Add a category tag matching the Knowledge Hub section it belongs to (e.g., Platform Settings, Product, Support) + +**Note:** Articles move through stages: Backlog → In Progress → To be reviewed by Marketing → Published. Once in the backlog, the article has a two-week target to reach "In Progress." + +### Step 5 — Confirm and share + +Present the Asana task link. Ask if the article should be: +- Shared directly with the customer who raised the original ticket (send the knowledge.quandri.io link once published) +- Announced in Slack #support-team for team awareness +- Added to any onboarding flows or email sequences diff --git a/partner-built/quandri-customer-support/skills/knowledge-management/references/article-template.md b/partner-built/quandri-customer-support/skills/knowledge-management/references/article-template.md new file mode 100644 index 00000000..e78dd548 --- /dev/null +++ b/partner-built/quandri-customer-support/skills/knowledge-management/references/article-template.md @@ -0,0 +1,80 @@ +# KB Article Template + +Use this structure for all knowledge base articles. Adapt sections as needed based on article type. + +--- + +## [Article Title — use searchable, customer-friendly language] + +**Last updated:** [Date] +**Article type:** How-to / Troubleshooting / FAQ / Reference +**Audience:** Customers / Internal CS / Both + +--- + +### Overview + +One or two sentences explaining: +- What this article covers +- Who it's for +- What problem it solves + +--- + +### Prerequisites (if applicable) + +List anything the reader needs before starting: +- Required permissions or roles +- Tools or integrations that must be set up +- Prior steps or context + +--- + +### Steps / Solution + +**For How-To articles:** + +1. Step one — short, clear action with outcome +2. Step two +3. Step three + - Sub-step if needed + - Sub-step if needed +4. Continue as needed + +> **Note:** Add callouts for important warnings, tips, or edge cases. + +**For Troubleshooting articles:** + +**Symptom:** What the customer sees or experiences + +**Cause:** What is causing the issue (if known) + +**Resolution:** +1. First, try this... +2. If that doesn't work, try this... +3. Final escalation path if self-serve fails + +**For FAQ articles:** + +**Q: [Question exactly as a customer would ask it]** + +A: [Clear, direct answer in 1–3 sentences. Link out for more detail if needed.] + +--- + +### Related Articles + +- [Link to related KB article 1] +- [Link to related KB article 2] + +--- + +### Still need help? + +If you're still experiencing issues after following the steps above, contact our support team: +- **Email:** support@quandri.io +- **In-app:** Use the Help button in the bottom-right corner + +--- + +*This article was created from support ticket [#LINEAR-ID or HubSpot link]. Last reviewed by [CS rep name].* diff --git a/partner-built/quandri-customer-support/skills/meeting-follow-up-automator/SKILL.md b/partner-built/quandri-customer-support/skills/meeting-follow-up-automator/SKILL.md new file mode 100644 index 00000000..f4175875 --- /dev/null +++ b/partner-built/quandri-customer-support/skills/meeting-follow-up-automator/SKILL.md @@ -0,0 +1,172 @@ +--- +name: meeting-follow-up-automator +description: Automatically processes meeting notes from Granola to extract action items, create tasks in Asana or Linear, and draft follow-up messages in Slack or email. Use this skill whenever the user mentions following up after a meeting, capturing action items, post-meeting tasks, or anything like "what came out of my meeting", "create tasks from my meeting", "send a follow-up", "meeting recap", or "what do I need to do after my call". Also trigger when the user finishes describing a meeting and asks what to do next. This skill is especially valuable for Customer Experience team members who frequently run customer calls, internal syncs, and onboarding sessions. +--- + +# Meeting Follow-Up Automator + +## Purpose +Automatically turns meeting notes (from Granola) into action items, tasks, and follow-up communications — eliminating manual post-meeting work for the CX team. + +## When to Use +- "Follow up from my meeting" / "post-meeting actions" +- "What came out of my [meeting/call/sync]?" +- "Create tasks from my meeting notes" +- "Send a recap to the team" +- "Draft a follow-up to [customer/person]" +- Any time a meeting just ended and there's work to capture +- After customer calls, onboarding sessions, internal syncs, escalation reviews + +--- + +## Core Workflow + +### Step 1 — Identify the Meeting +- Use `Granola:list_meetings` to fetch recent meetings (last 24–48 hours) +- If multiple meetings exist, show a brief list and ask which one to process +- If the user names a meeting, use `Granola:query_granola_meetings` to find it +- Once identified, use `Granola:get_meeting_transcript` to pull the full transcript + +### Step 2 — Extract Action Items +Analyze the transcript for: +- **Action items**: Explicit tasks, commitments, promises made ("I'll send you...", "We need to...", "Can you follow up on...") +- **Owners**: Who is responsible for each action (assign to self if unclear and user is CX team member) +- **Deadlines**: Any mentioned dates or urgency signals ("by EOW", "before the next call", "urgent") +- **Decisions made**: Key outcomes or agreements reached +- **Open questions**: Things that were flagged but not resolved +- **Customer sentiment** (if customer-facing): Note any frustration, satisfaction, or risk signals + +Format extracted items clearly before proceeding: +``` +📋 Action Items Found: +1. [Action] — Owner: [Name] — Due: [Date or ASAP] +2. ... + +✅ Decisions Made: +- ... + +❓ Open Questions: +- ... +``` + +**Always show this summary to the user and confirm before creating tasks or sending messages.** + +### Step 3 — Create Tasks (with user confirmation) +Based on confirmed action items: + +#### Asana Tasks +- Use `Asana:asana_create_task` for each action item +- Set due dates where specified +- Assign to the correct team member +- Add meeting name and date as context in the task description +- Group related tasks under the relevant Asana project if identifiable + +#### Linear Tickets (for product/bug-related items) +- Use `Linear:save_issue` for any action items that are bugs, feature requests, or product feedback surfaced in the meeting +- Tag with appropriate labels (e.g., "customer-feedback", "cx-request") +- Link to customer name or HubSpot contact if relevant + +**Default behavior**: Create in Asana unless the action item is clearly product/engineering-related, in which case use Linear. + +### Step 4 — Draft Follow-Up Communication +After tasks are created, offer to draft one or more of the following: + +#### Option A: Internal Slack Summary +- Post to the relevant team channel (e.g., #cx-team, #support-team) +- Format: + ``` + 📝 *Meeting Recap: [Meeting Name] — [Date]* + + *Key Decisions:* + - ... + + *Action Items:* + - [ ] [Task] → @owner (due: [date]) + + *Open Questions:* + - ... + ``` +- Use `Slack:slack_send_message_draft` to save as draft for review before sending + +#### Option B: Customer Follow-Up Email +- Draft a professional follow-up to the customer/attendees +- Summarize what was discussed, decisions made, and next steps +- Use `Gmail:gmail_create_draft` to save as a draft +- Keep tone warm and action-oriented; avoid internal jargon + +#### Option C: Both +- Create both the internal Slack summary and the external email draft simultaneously + +**Always create drafts — never send directly without user review.** + +--- + +## Smart Defaults & Judgment Calls + +| Situation | Default Behavior | +|-----------|-----------------| +| No explicit owner on action item | Assign to the user running the skill | +| No deadline mentioned | Leave due date blank, note "no deadline set" | +| Customer name mentioned | Flag for potential HubSpot follow-up | +| Recurring meeting | Note it's recurring, still create tasks for this meeting's items | +| Very short meeting (<15 min) | Still process, may have few items | +| Meeting with no action items | Report this clearly, offer to send a quick "no actions" summary | + +--- + +## Output Format + +After completing the workflow, provide a clean summary: + +``` +✅ Meeting Follow-Up Complete: [Meeting Name] + +📋 Tasks Created: +- [X] tasks in Asana +- [X] tickets in Linear (if any) + +📨 Drafts Ready: +- Slack draft in [#channel] +- Email draft to [recipient] in Gmail + +🔔 Reminders: +- Review and send drafts when ready +- [Any open questions that still need answers] +``` + +--- + +## Tool Reference + +| Tool | Use | +|------|-----| +| `Granola:list_meetings` | Find recent meetings | +| `Granola:get_meeting_transcript` | Pull full transcript | +| `Granola:query_granola_meetings` | Search for specific meeting | +| `Asana:asana_create_task` | Create action item tasks | +| `Asana:asana_get_projects` | Find relevant project to attach tasks | +| `Linear:save_issue` | Create product/bug tickets | +| `Slack:slack_send_message_draft` | Save internal recap as Slack draft | +| `Gmail:gmail_create_draft` | Save customer follow-up as email draft | +| `Google Calendar:gcal_get_event` | Cross-reference meeting details if needed | + +--- + +## Team Context (Quandri CX) + +- **Team channels**: #cx-team, #cx-leaders, #support-team +- **Key roles**: Nick (Manager), Alma (direct report), Syed (direct report) +- **Meeting types to expect**: Customer onboarding calls, escalation reviews, 1:1s, team syncs, product feedback sessions +- **Customer-facing follow-ups**: Keep professional, concise, and action-oriented +- **Internal follow-ups**: Can be more casual, use Slack-friendly formatting + +--- + +## Example Invocations + +- "Follow up from my meeting with BrokerLink this morning" +- "What are the action items from my 2pm call?" +- "Create tasks from today's onboarding session" +- "Draft a recap for the team from my escalation review" +- "Post-meeting actions from my Granola notes" +- "Send a follow-up to the customer from this morning's call" diff --git a/partner-built/quandri-customer-support/skills/pre-call-brief/SKILL.md b/partner-built/quandri-customer-support/skills/pre-call-brief/SKILL.md new file mode 100644 index 00000000..e7ab7d94 --- /dev/null +++ b/partner-built/quandri-customer-support/skills/pre-call-brief/SKILL.md @@ -0,0 +1,172 @@ +--- +name: pre-call-brief +description: > + Generates a concise pre-call brief for an upcoming customer meeting — pulls account context from + HubSpot, top open tickets from Linear, recent meeting history from Granola, and recent Slack + mentions. Produces a 60-second read so you walk into every call fully prepared. + Use when: pre-call brief, brief for my call, prep for my meeting, what do I need to know before + my call, call prep, brief on [customer], prepare for my call with, what's the situation with [customer]. +--- + +# Pre-Call Brief + +## Purpose +Give the user everything they need to know before a customer call — in a format that takes under 60 seconds to read. This is a forward-looking snapshot, not a deep audit. The goal is confident, informed preparation. + +## When to Use +- "Pre-call brief for [Customer]" +- "Prep me for my call with [Customer]" +- "What do I need to know before my meeting with [Customer]?" +- "Brief on [Customer] — I have a call in 10 minutes" +- "Call prep for [Customer]" +- Any time a calendar event with a customer is coming up soon + +--- + +## Core Workflow + +### Step 1 — Identify the Customer and Meeting + +**If the user names the customer directly**: use that name throughout. + +**If the user says "my next call" or "upcoming meeting"**: +- Call `Google Calendar:gcal_list_events` for the next 4 hours +- Find the next customer-facing event (exclude internal meetings like 1:1s, standups, or Quandri team syncs) +- Confirm the customer name with the user before proceeding + +Once confirmed, note: +- Meeting title, time, and duration +- Attendees (if available from the calendar invite) +- Any agenda or description in the invite + +--- + +### Step 2 — Pull HubSpot Account Context + +Look up the company in HubSpot using `HubSpot:search_crm_objects` (object type: `companies`). + +Collect: +- **Full company name** (use this exact name when searching Linear) +- **Plan tier and ARR** +- **Named CSM** and account owner +- **Renewal date** — flag if within 90 days +- **HubSpot health/status** — any risk flags, NPS scores, or health ratings if present +- **Recent HubSpot ticket activity** — any open tickets, especially high-priority or unresolved ones opened in the last 30 days (use `HubSpot:search_crm_objects` filtered to object type `tickets`) +- **Last interaction date** — when was the last logged activity or email? + +If the company is not found in HubSpot, note this clearly and continue with what's available. + +--- + +### Step 3 — Pull Top Open Linear Tickets + +Use the Linear Customers API to find tickets linked to this customer (same approach as the ticket-breakdown skill — use `list_customers` with `includeNeeds: true`). + +**For this brief, do not pull every ticket.** Focus only on: +- All **Urgent** and **High** priority open tickets +- Any ticket in **Blocked** status +- Any tickets that have had **no updates in 14+ days** (stale) + +Cap at **8 tickets maximum** for the brief. If the account has more, note the total count and indicate that the top issues are shown. Direct the user to the ticket breakdown skill for a full audit. + +For each ticket, collect: +- Ticket ID, title, status, priority, assignee +- Most recent comment or update (date + one-line summary) + +--- + +### Step 4 — Review Recent Meeting History + +Use `Granola:query_granola_meetings` to find past meetings with this customer. + +Pull the **3 most recent meetings**. For each: +- Date and meeting title +- 2–3 sentence summary of what was discussed and what was committed to +- Any open action items that were assigned to Quandri + +If no past meetings are found in Granola, note it — this may be a first call or early-stage relationship. + +--- + +### Step 5 — Check Recent Slack Mentions + +Use `Slack:slack_search_public_and_private` to search for the customer name in the last 14 days. + +Look for: +- Any escalations or urgent flags raised about this account +- Internal discussions about known issues or commitments +- Sentiment signals (positive or negative chatter) + +Keep this light — flag only what's notable. If nothing relevant, skip this section in the output. + +--- + +### Step 6 — Compose the Brief + +Follow the structure in `references/brief-template.md` exactly. The output must be **short and scannable** — this is not a report. Aim for something readable in under 60 seconds. + +**Health signal guidance** (use in the header): +- 🟢 **Healthy** — Renewing far out, low ticket volume, positive sentiment, no escalations +- 🟡 **Watch** — Renewal within 90 days, elevated ticket volume, or one open escalation +- 🔴 **At Risk** — Renewal within 30 days + open issues, active escalation, or explicit churn signals + +If there is insufficient data to judge, use ⚪ **Unknown**. + +--- + +### Step 7 — Offer Next Steps + +After presenting the brief, offer: + +1. **Full ticket audit** — "Want the full ticket breakdown for [Customer]?" (triggers the ticket-breakdown skill) +2. **Draft a talking points doc** — Expand the suggested talking points into a structured agenda +3. **Post-call follow-up** — Remind the user to run the meeting follow-up automator after the call + +--- + +## Smart Defaults & Judgment Calls + +| Situation | Default Behavior | +|-----------|-----------------| +| Customer has no open Linear tickets | Note positively — "No open tickets" | +| No past Granola meetings found | Flag as first call or no recorded history | +| Renewal date not in HubSpot | Note "Renewal date not on file" | +| Multiple HubSpot companies match | Show the top 2 matches and ask the user to confirm | +| Call is in < 5 minutes | Lead with the header and top tickets only — skip Slack search to save time | +| User says "quick brief" | Output header + top 3 tickets + last meeting only | + +--- + +## Tool Reference + +| Tool | Use | +|------|-----| +| `Google Calendar:gcal_list_events` | Find upcoming customer meetings | +| `HubSpot:search_crm_objects` | Look up company and recent tickets | +| `HubSpot:get_crm_objects` | Retrieve detailed account or ticket records | +| `Linear:list_customers` | Find all Linear tickets linked to this customer | +| `Linear:get_issue` | Pull ticket details, status, and latest comments | +| `Linear:list_comments` | Get most recent comment on a ticket | +| `Granola:query_granola_meetings` | Find past meetings with this customer | +| `Granola:get_meeting_transcript` | Pull summary/notes from a specific meeting | +| `Slack:slack_search_public_and_private` | Check recent Slack mentions of the customer | + +--- + +## Team Context (Quandri CX) + +- **Support team**: Nick (Manager), Alma St. Hilaire, Syed +- **CSM team**: Jenel McKenney (CSM Manager), Andrew Millar, Jonathan Cox +- **Support email**: support@quandri.io +- **Linear workspace**: linear.app/quandriio +- **Tone**: Crisp and factual — this brief is for internal use only + +--- + +## Example Invocations + +- "Pre-call brief for BrokerLink" +- "Prep me for my call with Acera" +- "What do I need to know before my 2pm with First America?" +- "Quick brief on Go Insurance — call in 10 minutes" +- "What's the situation with Wawanesa before my call?" diff --git a/partner-built/quandri-customer-support/skills/pre-call-brief/references/brief-template.md b/partner-built/quandri-customer-support/skills/pre-call-brief/references/brief-template.md new file mode 100644 index 00000000..3948d5cb --- /dev/null +++ b/partner-built/quandri-customer-support/skills/pre-call-brief/references/brief-template.md @@ -0,0 +1,66 @@ +# Pre-Call Brief Output Template + +Use this structure exactly. Keep every section tight — this is a 60-second read, not a report. + +--- + +**Pre-Call Brief — [Company Name]** [🟢 / 🟡 / 🔴 / ⚪] +*[Meeting Title] — [Date] at [Time] ([Duration])* +*Plan: [Tier] | ARR: [Value] | CSM: [Name] | Renewal: [Date or "Not on file"] | HubSpot: [Link]* + +--- + +## 🏢 Account Snapshot + +[2–3 sentences covering the relationship: how long they've been a customer, what they use, any notable context like recent growth, a known issue, or an upcoming renewal. Keep it factual.] + +**Last interaction:** [Date — what it was, e.g. "Email from Alma re: extraction failure, Oct 3"] +**Open HubSpot tickets:** [N] *(link to HubSpot if available)* + +--- + +## 🔥 Top Open Tickets ([N] total open) + +*(Show up to 8 — Urgent/High/Blocked only. If more exist, note "X additional tickets in backlog — run a full ticket breakdown for details.")* + +**[[TICKET-ID]] [Title]** — *[Status] | [Priority] | [Assignee or "Unassigned"]* +[1 sentence: what the issue is and where it stands.] +*Last update: [Date — one-line note]* + +*(Repeat for each ticket)* + +*(If no open tickets: "✅ No open tickets — clean slate going into this call.")* + +--- + +## 📅 Recent Meeting History + +*(Last 3 meetings. If none: "No recorded meetings found in Granola.")* + +**[Date] — [Meeting Title]** +[2–3 sentences: what was discussed, what was decided, any Quandri commitments made.] + +*(Repeat for each meeting)* + +--- + +## 💬 Recent Slack Signals + +*(Only include if something notable was found. Otherwise omit this section entirely.)* + +- [Date] — [Channel] — [1-sentence summary of what was flagged or discussed] + +--- + +## 🎯 Suggested Talking Points + +1. [Most pressing open ticket or issue — brief framing] +2. [Renewal or relationship topic if relevant] +3. [Follow-up on a commitment from the last meeting, if applicable] +4. [Any positive win or release to mention] + +*(Tailor based on actual data above — remove points that don't apply.)* + +--- + +*Quandri CX — Pre-Call Brief | [Today's Date]* diff --git a/partner-built/quandri-customer-support/skills/renewal-prep-brief/SKILL.md b/partner-built/quandri-customer-support/skills/renewal-prep-brief/SKILL.md new file mode 100644 index 00000000..a9466a48 --- /dev/null +++ b/partner-built/quandri-customer-support/skills/renewal-prep-brief/SKILL.md @@ -0,0 +1,215 @@ +--- +name: renewal-prep-brief +description: > + Generates a comprehensive renewal preparation brief for an upcoming customer renewal — pulls + account health from HubSpot, open ticket analysis from Linear, relationship history from Granola, + sentiment signals from Slack, and produces a structured renewal strategy with risk assessment + and talking points. Use when: renewal prep, prepare for renewal, renewal brief, renewal strategy, + account up for renewal, renewing soon, renewal conversation, QBR prep, renewal risk, at-risk renewal, + accounts coming up for renewal, who is renewing soon. +--- + +# Renewal Prep Brief + +## Purpose +Produce a structured renewal preparation brief for a specific customer account — covering account health, ticket load, relationship history, risk signals, and a recommended renewal strategy. This is deeper than a pre-call brief: it's meant to be used in advance (days, not minutes) to inform how the CSM should approach the renewal conversation. + +## When to Use +- "Renewal prep for [Customer]" +- "Prepare for my renewal with [Customer]" +- "Who is renewing in the next 60 days?" +- "Renewal brief for [Customer]" +- "What's the risk on [Customer]'s renewal?" +- "Run a renewal strategy for [Customer]" +- Any time a CSM or manager wants to get ahead of an upcoming renewal + +--- + +## Core Workflow + +### Step 1 — Identify the Account(s) + +**If the user names a specific customer**: proceed with that account. + +**If the user asks "who is renewing soon" or similar**: +- Use `HubSpot:search_crm_objects` (object type: `companies`) filtered by renewal date +- Surface all accounts renewing within the next **90 days**, sorted by soonest first +- Present the list with: Company name | Renewal date | ARR | CSM +- Ask the user which account(s) to prepare a brief for before proceeding + +--- + +### Step 2 — Pull HubSpot Account Context + +Look up the company using `HubSpot:search_crm_objects` (object type: `companies`). + +Collect: +- **Full company name**, plan tier, ARR +- **Renewal date** — calculate days remaining from today +- **Named CSM** and account owner +- **HubSpot health score or status** (Green / Yellow / Red), NPS if available +- **Customer since** (original close date if available — calculate tenure) +- **Contact history**: last logged activity, last email, last call note +- **Open HubSpot support tickets** — count and any high-priority ones (use `HubSpot:search_crm_objects` filtered to `tickets` linked to this company) +- **Any HubSpot notes or deal properties** relevant to renewal (expansion opportunities, known concerns, competitor mentions) + +If the company is not found in HubSpot, note this and continue with what's available from other sources. + +--- + +### Step 3 — Analyze Linear Ticket Health + +Use the Linear Customers API to pull all tickets linked to this account: +- Call `list_customers` with `query: [company name]`, `includeNeeds: true`, `limit: 250` +- Paginate with `cursor` until all tickets are retrieved + +**Categorize tickets by renewal impact:** + +| Category | What to flag | +|----------|-------------| +| 🔴 Blocking | Urgent/High tickets open > 30 days, or any Blocked ticket | +| 🟡 Watch | Medium tickets open > 14 days, or no recent updates | +| ✅ Resolved recently | Tickets moved to Done/Released in last 30 days — these are wins to highlight | +| 📋 Backlog burden | Count of low-priority backlog items (signals accumulated debt) | + +Summarize: +- Total open tickets (by status) +- Blocking and Watch tickets (list them individually) +- Recent wins (count + top 2–3 titles) +- Overall ticket health signal: 🔴 / 🟡 / 🟢 + +--- + +### Step 4 — Review Relationship History in Granola + +Use `Granola:query_granola_meetings` to find all past meetings with this customer. + +Pull the **5 most recent meetings**. For each: +- Date, meeting type (QBR, onboarding, sync, escalation review, etc.) +- 2–3 sentence summary of what was discussed and committed to +- Any unresolved Quandri commitments or outstanding promises + +Also note: +- **Last QBR date** — flag if no QBR in the last 6 months +- **Overall meeting cadence** — regular check-ins signal healthy engagement; long gaps are a risk signal +- **Sentiment trend** — have recent meetings been positive, neutral, or escalation-heavy? + +If no meeting history is found, flag this explicitly — it may indicate low engagement. + +--- + +### Step 5 — Scan Slack for Sentiment Signals + +Use `Slack:slack_search_public_and_private` to search for the customer name, looking back **60 days**. + +Look for: +- Escalations or urgent flags raised internally about this account +- Positive signals — expansion interest, praise from the customer, success stories shared +- Competitive mentions — any signals the customer is evaluating alternatives +- Internal concerns raised by the CSM or implementation team +- Any commitments made informally in Slack that aren't reflected elsewhere + +Summarize any notable signals. If nothing relevant is found, note "No notable Slack activity in the last 60 days." + +--- + +### Step 6 — Assess Renewal Risk + +Based on everything gathered, assign an overall **Renewal Risk Rating**: + +| Rating | Criteria | +|--------|----------| +| 🟢 **Low Risk** | Renewing 60+ days out, healthy ticket load, positive meeting history, strong CSM relationship, no escalations | +| 🟡 **Medium Risk** | Renewing within 60 days, or elevated ticket count, or irregular meeting cadence, or one unresolved escalation | +| 🔴 **High Risk** | Renewing within 30 days AND open issues, or active escalation, or long gap since last QBR, or competitive signals | +| ⚫ **Unknown** | Insufficient data to assess — flag what's missing | + +Write a **2–3 sentence risk narrative** explaining the rating — not just the label. + +--- + +### Step 7 — Build the Renewal Strategy + +Based on the full picture, produce: + +**Recommended approach** (choose one): +- **Standard renewal** — relationship is healthy, focus on value recap and contract execution +- **Value reinforcement needed** — relationship is okay but the customer may not see enough ROI; lead with wins and usage data +- **Issue resolution first** — open tickets or escalations must be addressed before the renewal conversation can go well; prioritize closing them +- **Executive escalation** — risk is high enough that the CSM alone may not be sufficient; recommend involving Nick or leadership + +**Talking points for the renewal conversation** (5–7 specific, evidence-based points): +- Lead with measurable wins from the past year (resolved tickets, product improvements, usage milestones) +- Address known concerns head-on — don't avoid the elephant in the room +- Frame open issues with a clear resolution timeline +- Anchor to value delivered vs. original goals +- If expansion is appropriate, suggest a natural moment to introduce it + +--- + +### Step 8 — Compose the Brief + +Follow the structure in `references/renewal-brief-template.md` exactly. + +--- + +### Step 9 — Offer Next Steps + +After presenting the brief, offer: + +1. **Pre-call brief** — "Want a quick pre-call brief when you have the renewal meeting on the calendar?" +2. **Ticket breakdown** — "Want the full ticket audit for [Customer] to see everything in detail?" +3. **Draft renewal email** — Offer to draft an outreach email to open the renewal conversation +4. **Create a task in Asana** — Offer to create a renewal prep task so nothing falls through the cracks + +--- + +## Smart Defaults & Judgment Calls + +| Situation | Default Behavior | +|-----------|-----------------| +| Renewal date not in HubSpot | Note "Renewal date not on file" — flag this as a data quality issue | +| No meeting history in Granola | Flag as a risk signal — low engagement | +| No open Linear tickets | Treat as a positive health signal | +| Multiple HubSpot companies match | Show top matches and ask the user to confirm | +| User asks for all renewing accounts | List all within 90 days, sorted soonest first, with a one-line health signal for each | +| Customer has no CSM assigned | Flag as a gap — note "No CSM assigned in HubSpot" | + +--- + +## Tool Reference + +| Tool | Use | +|------|-----| +| `HubSpot:search_crm_objects` | Look up company, renewal date, open tickets | +| `HubSpot:get_crm_objects` | Retrieve detailed account, contact, or deal records | +| `Linear:list_customers` | Find all Linear tickets linked to this customer | +| `Linear:get_issue` | Pull individual ticket details and latest activity | +| `Linear:list_comments` | Get most recent comment on a ticket | +| `Linear:list_issue_statuses` | Confirm exact status names for this workspace | +| `Granola:query_granola_meetings` | Find past meetings with this customer | +| `Granola:get_meeting_transcript` | Pull notes and action items from specific meetings | +| `Slack:slack_search_public_and_private` | Check 60-day Slack history for this customer | +| `Asana:asana_create_task` | Create a renewal prep task if requested | +| `Gmail:gmail_create_draft` | Draft a renewal outreach email if requested | + +--- + +## Team Context (Quandri CX) + +- **CSM team**: Jenel McKenney (CSM Manager), Andrew Millar, Jonathan Cox +- **Support team**: Nick (Manager), Alma St. Hilaire, Syed +- **Renewal owner**: Named CSM on the account, with Jenel as escalation point +- **Linear workspace**: linear.app/quandriio +- **Tone**: Strategic and direct — this brief is for internal planning, not customer-facing + +--- + +## Example Invocations + +- "Renewal prep for BrokerLink" +- "Who's renewing in the next 60 days?" +- "Renewal brief for Acera — they're up in 3 weeks" +- "What's the renewal risk on First America?" +- "Prepare a renewal strategy for Wawanesa" +- "Which accounts are at risk of not renewing?" diff --git a/partner-built/quandri-customer-support/skills/renewal-prep-brief/references/renewal-brief-template.md b/partner-built/quandri-customer-support/skills/renewal-prep-brief/references/renewal-brief-template.md new file mode 100644 index 00000000..d3800c33 --- /dev/null +++ b/partner-built/quandri-customer-support/skills/renewal-prep-brief/references/renewal-brief-template.md @@ -0,0 +1,95 @@ +# Renewal Prep Brief Output Template + +Use this structure exactly, in this order. Every section must appear even if data is limited. + +--- + +**Renewal Prep Brief — [Company Name]** [🟢 Low Risk / 🟡 Medium Risk / 🔴 High Risk / ⚫ Unknown] +*Prepared: [Today's Date] | Renewal: [Date] ([N] days) | ARR: [Value] | Plan: [Tier] | CSM: [Name]* +*HubSpot: [Link] | Customer since: [Date or "Unknown"]* + +--- + +## 🏢 Account Overview + +[2–3 sentences covering who this customer is, what they use Quandri for, how long they've been a customer, and any notable context (size, key contacts, history with the account).] + +**Last interaction:** [Date — type and brief note, e.g. "Sync call with Andrew, Feb 12 — discussed renewal timeline"] +**Last QBR:** [Date or "No QBR on record"] +**Meeting cadence:** [Regular / Irregular / No recorded history] + +--- + +## ⚠️ Renewal Risk Assessment + +**Rating:** [🟢 Low / 🟡 Medium / 🔴 High / ⚫ Unknown] + +[2–3 sentences explaining the rating. Be specific — cite the actual signals (e.g., "Two Urgent tickets have been open for 45 days with no recent updates, and there has been no QBR since August. However, the account is not renewing for another 72 days, leaving time to address these gaps.")] + +--- + +## 🎫 Ticket Health + +**Overall:** [🟢 Healthy / 🟡 Watch / 🔴 Blocking] +**Total open:** [N] tickets ([N] Todo | [N] In Progress | [N] Blocked | [N] Backlog) +**Resolved in last 30 days:** [N] tickets *(wins to reference in renewal conversation)* + +### Blocking & Watch Tickets + +*(List only Urgent/High/Blocked or stale tickets here. If none: "✅ No blocking or watch tickets.")* + +**[[TICKET-ID]] [Title]** — *[Status] | [Priority] | [Assignee or "Unassigned"]* +[1 sentence: what the issue is and why it matters for renewal.] +*Open for: [N] days | Last update: [Date — one-line note]* + +*(Repeat for each blocking/watch ticket)* + +### Recent Wins *(to highlight in the renewal conversation)* + +*(List up to 3 tickets resolved in the last 30 days. If none: "No tickets resolved in the last 30 days.")* + +- [[TICKET-ID]] [Title] — resolved [Date] + +--- + +## 📅 Relationship History + +*(Last 5 meetings. If none: "No meeting history found in Granola — low engagement signal.")* + +**[Date] — [Meeting Type] (e.g. QBR / Sync / Onboarding / Escalation Review)** +[2–3 sentences: what was discussed, decisions made, Quandri commitments. Flag any open commitments still unresolved.] + +*(Repeat for each meeting)* + +**Outstanding Quandri commitments:** *(items promised to this customer that haven't been closed)* +- [Commitment — from meeting on Date] +*(If none: "No open commitments identified.")* + +--- + +## 💬 Slack Signals *(last 60 days)* + +*(Only include if something notable was found. Otherwise: "No notable Slack activity in the last 60 days.")* + +- [Date] — [🔴 Escalation / 🟡 Concern / 🟢 Positive / 🔵 Competitive signal] — [1-sentence summary] + +--- + +## 🎯 Renewal Strategy + +**Recommended approach:** [Standard renewal / Value reinforcement needed / Issue resolution first / Executive escalation] + +[2–3 sentences explaining why this approach is right for this account and what the CSM should prioritize going into the conversation.] + +### Talking Points + +1. **[Win / Value delivered]** — [Evidence-based point, e.g. "X tickets resolved in the past 6 months, including the critical extraction failure in October"] +2. **[Open issue acknowledgment]** — [Address head-on with resolution timeline, e.g. "ONC-660 has been open 45 days — confirm status and ETA before the call"] +3. **[Renewal framing]** — [Value vs. original goals, e.g. "Since onboarding, they've processed X renewals through the platform — anchor the conversation here"] +4. **[Relationship point]** — [e.g. "Last QBR was 7 months ago — opening the renewal conversation as a mini-QBR would rebuild engagement"] +5. **[Risk mitigation]** — [e.g. "If they raise concerns about ticket volume, lead with the 8 resolved issues and the new triage process"] +6. **[Expansion opportunity]** — *(only if appropriate)* [e.g. "They mentioned interest in RQ during the February sync — if renewal goes well, this is a natural moment to revisit"] + +--- + +*Quandri CX — Renewal Prep Brief | [Today's Date]* diff --git a/partner-built/quandri-customer-support/skills/response-drafting/SKILL.md b/partner-built/quandri-customer-support/skills/response-drafting/SKILL.md new file mode 100644 index 00000000..d9291088 --- /dev/null +++ b/partner-built/quandri-customer-support/skills/response-drafting/SKILL.md @@ -0,0 +1,60 @@ +--- +name: response-drafting +description: > + Draft professional, empathetic customer-facing responses for the Quandri CS team. + Pulls account context from HubSpot and tailors tone and content to the situation. + Use when: draft a response to this customer, write a reply, respond to this ticket, + help me reply, write an email to the customer, draft a follow-up, how do I respond to this. +--- + +# Response Drafting + +Draft a customer-facing response tailored to the situation, the customer's plan tier, and the appropriate tone for the channel. + +## Workflow + +### Step 1 — Understand the situation + +Gather (from context or by asking): +- What is the customer's issue or question? +- What is the current status? (investigating, resolved, needs more info, etc.) +- Is there a Linear issue or HubSpot ticket already open? +- Has the customer reached out before about this? + +### Step 2 — Pull customer context from HubSpot + +Look up the customer in HubSpot to retrieve: +- Company name and plan tier +- Account owner / named CSM +- Tone signals: are they a new customer, longtime client, renewal risk? +- Any previous correspondence on this issue + +Use this to calibrate tone — Enterprise customers and renewal risks warrant extra care. + +### Step 3 — Draft the response + +Write a response following the tone and structure guidelines in `references/tone-guide.md`. + +**Core principles:** +- Lead with empathy — acknowledge the impact before jumping to solutions +- Be specific — reference what you know about their situation +- Be clear on next steps — what happens next and by when +- Avoid jargon — write like a human, not a support bot +- Match urgency to priority — P1/P2 responses should feel urgent; P4 can be warmer and more casual + +**Response types** (see `references/response-templates.md` for examples): +- `acknowledgement` — Issue received, being investigated +- `update` — Status update while work is in progress +- `resolution` — Issue resolved, here's what happened and what was fixed +- `needs-info` — You need more details to proceed +- `feature-request-received` — Thank them and set expectations +- `billing` — Handle with extra care; loop in CS lead if in doubt + +### Step 4 — Review and send + +Present the draft to the agent. Offer to adjust: +- Tone (more formal / more warm) +- Length (shorter / more detailed) +- Channel (HubSpot ticket reply vs. direct email) + +Once approved, the response can be sent via HubSpot or drafted as a Gmail email. diff --git a/partner-built/quandri-customer-support/skills/response-drafting/references/response-templates.md b/partner-built/quandri-customer-support/skills/response-drafting/references/response-templates.md new file mode 100644 index 00000000..e8afce71 --- /dev/null +++ b/partner-built/quandri-customer-support/skills/response-drafting/references/response-templates.md @@ -0,0 +1,85 @@ +# Response Templates + +These are starting points. Always personalize with the customer's name, their specific situation, and current context. + +--- + +## Acknowledgement (Issue received, investigating) + +> Hi [Name], +> +> Thanks for getting in touch — I'm sorry to hear you're experiencing [brief description of issue]. I've logged this on our end and our team is looking into it now. +> +> I'll follow up with an update by [time/date]. In the meantime, if anything changes on your end or you have additional context to share, feel free to reply here. +> +> [Your name] + +--- + +## Status Update (In progress) + +> Hi [Name], +> +> I wanted to give you a quick update on [issue]. Our team has identified the cause and is actively working on a fix. We're targeting [estimated resolution time]. +> +> We'll keep you posted as things progress. Thank you for your patience — we know this is impacting your workflow and we're treating it as a priority. +> +> [Your name] + +--- + +## Resolution + +> Hi [Name], +> +> Great news — we've resolved the issue with [brief description]. [One sentence on what the root cause was and what was done to fix it.] +> +> Everything should be working as expected now. Please give it a try and let us know if you notice anything out of the ordinary. +> +> Thanks again for flagging this — it helps us make the product better. +> +> [Your name] + +--- + +## Needs More Information + +> Hi [Name], +> +> Thanks for reaching out about [issue]. To help us investigate, could you share a bit more detail? +> +> - [Specific question 1] +> - [Specific question 2] +> - [Specific question 3 — e.g., steps to reproduce, error message, screenshot] +> +> Once we have that, we'll be able to dig in right away. +> +> [Your name] + +--- + +## Feature Request Received + +> Hi [Name], +> +> Thanks for this suggestion — [brief restatement of the request] is a great idea and I can see how it would make a real difference for your workflow. +> +> I've passed this along to our product team. While I can't make any promises on timeline, requests like yours directly inform our roadmap. +> +> We'll reach out if and when this makes it onto our development schedule. Thanks again for taking the time to share it. +> +> [Your name] + +--- + +## Billing (General — loop in CS lead for anything complex) + +> Hi [Name], +> +> Thanks for reaching out about your invoice/subscription. I've looked into your account and want to make sure we get this sorted for you. +> +> [Explanation of the situation or next step.] +> +> If it would be helpful to hop on a quick call to walk through this together, I'm happy to find a time that works. +> +> [Your name] diff --git a/partner-built/quandri-customer-support/skills/response-drafting/references/tone-guide.md b/partner-built/quandri-customer-support/skills/response-drafting/references/tone-guide.md new file mode 100644 index 00000000..771adfd0 --- /dev/null +++ b/partner-built/quandri-customer-support/skills/response-drafting/references/tone-guide.md @@ -0,0 +1,42 @@ +# Response Tone Guide + +## General Principles + +- **Empathy first**: Always acknowledge the customer's experience before providing information or solutions. +- **Human voice**: Avoid robotic or templated language. Write like a knowledgeable colleague, not a script. +- **Clarity over cleverness**: Simple, direct sentences. No jargon. +- **Ownership**: Use "we" and take responsibility — avoid passive constructions like "the issue was caused by..." +- **Positive framing**: Focus on what you can do, not what you can't. + +## Tone by Situation + +| Situation | Tone | Notes | +|------------------------|-------------------------------|----------------------------------------------| +| P1 Critical outage | Urgent, direct, reassuring | No fluff — customer needs confidence fast | +| P2 Major bug | Professional, empathetic | Acknowledge impact; give a clear timeline | +| P3 Minor issue | Warm, helpful | Can be conversational | +| P4 Feature request | Appreciative, honest | Don't over-promise; set clear expectations | +| Billing issue | Calm, careful, professional | Loop in CS lead before discussing changes | +| Renewal at risk | Extra attentive, proactive | Escalate to CSM/CS lead if needed | + +## Tone by Plan Tier + +| Plan | Tone adjustment | +|------------|---------------------------------------------------------------| +| Enterprise | Formal, personal, named contact preferred | +| Growth | Professional but warm | +| Starter | Friendly, self-serve nudges where appropriate | + +## Openings to Use + +- "Thanks for reaching out — I'm sorry to hear you're running into this." +- "I wanted to follow up personally on the issue you flagged." +- "We've looked into this and want to share where things stand." +- "We appreciate you taking the time to share this with us." + +## Openings to Avoid + +- "As per my previous email..." +- "Unfortunately we are unable to..." +- "Please be advised that..." +- "Per our policy..." diff --git a/partner-built/quandri-customer-support/skills/support-handoff/SKILL.md b/partner-built/quandri-customer-support/skills/support-handoff/SKILL.md new file mode 100644 index 00000000..04380bb5 --- /dev/null +++ b/partner-built/quandri-customer-support/skills/support-handoff/SKILL.md @@ -0,0 +1,177 @@ +--- +name: support-handoff +description: > + Generates a clean coverage handoff doc for the support team when a team member is out — + pulls active Linear investigations, open HubSpot tickets, pending customer responses, + bot runs to monitor, and any open Slack threads needing attention. Produces a handoff + ready to post in #support-team. Use when: handoff, coverage doc, I'm going out of office, + OOO handoff, coverage for [person], I'm off tomorrow, create a handoff, leaving for [time], + who's covering, support coverage, out of office handoff, going on vacation. +--- + +# Support Handoff + +## Purpose +Generate a structured coverage handoff when a support team member is going out. The output should give whoever is covering full context on what's active, what needs monitoring, and what can wait — without having to dig through Linear, HubSpot, or Slack themselves. + +## When to Use +- "I'm off tomorrow, create a handoff" +- "Coverage doc for [person] while they're out" +- "OOO handoff — I'm out [dates]" +- "Create a handoff for Alma before her vacation" +- "What does Syed need to know while I'm gone?" +- Any time someone on the support team is going out and needs to brief their coverage + +--- + +## Core Workflow + +### Step 1 — Establish the Handoff Details + +Collect from the user's message or ask if not provided: +- **Who is going out** (default: the user running the skill) +- **Dates out** (start and end) +- **Who is covering** (if known — otherwise leave as "TBD" and note it) +- **Any specific context** the user wants to highlight upfront (e.g., "there's a big run happening Friday", "we have an angry customer at Acera") + +If the dates span a weekend, note that only business days are covered. + +--- + +### Step 2 — Pull Active Linear Investigations + +Find all open tickets currently assigned to the person going out. + +Use `Linear:list_issues` filtered by assignee. Focus on: +- All tickets in **In Progress** or **Todo** status assigned to this person +- Any **Blocked** tickets they own +- Any **Urgent or High** priority tickets assigned to them regardless of status + +For each ticket, collect: +- Ticket ID, title, status, priority +- 1–2 sentence summary of where things stand +- Most recent comment or update (date + content) via `Linear:list_comments` +- Specific next action needed from the coverage person (e.g., "check if the run completes", "follow up with customer if no response by Thursday", "waiting on engineering — just monitor") + +**Flag separately** any tickets that have a time-sensitive deadline or a customer waiting on a response — these need prominent placement in the handoff doc. + +--- + +### Step 3 — Pull Open HubSpot Tickets + +Use `HubSpot:search_crm_objects` (object type: `tickets`) to find open tickets currently owned by or involving the person going out. + +Focus on: +- **Tickets awaiting a customer response** — these can probably wait, but note them +- **Tickets where the customer has responded and is waiting on Quandri** — these are time-sensitive +- **Any ticket open > 5 days with no recent activity** — flag as at-risk of going stale + +For each, note: +- Ticket ID, company name, subject +- Current status and last activity date +- What action is needed and by when + +--- + +### Step 4 — Check for Bot Runs and Scheduled Events to Monitor + +This is Quandri-specific. The support team monitors automated renewal bot runs for customers. Use `Slack:slack_search_public_and_private` to search **#support-team** for the past 7 days for any mentions of: +- Scheduled runs, bot runs, or processing schedules +- Customer names paired with run-related terms ("run", "bot", "processing", "stuck", "failed", "schedule") +- Any customers the person flagged as needing monitoring + +Also check `Slack:slack_read_channel` on **#support-team** for the last few days to catch any recent context. + +Produce a "Runs to Watch" list: for each flagged customer, note what to look for and what to do if a run fails (e.g., "re-run manually", "create a Linear ticket", "tag Alma in Slack"). + +If no specific runs are identified, note this clearly — it's not always applicable. + +--- + +### Step 5 — Scan for Open Slack Threads Needing a Response + +Use `Slack:slack_read_channel` on **#support-team** and **#cx-team** for the last 3 days. Look for: +- Threads with a question or request that the person going out hasn't responded to yet +- Any thread where the person is the last responder and something is still pending +- DMs or mentions that haven't been addressed (search `to:<@user>` or `from:<@user>` if helpful) + +List each open thread with a one-line summary and the channel it's in. + +--- + +### Step 6 — Note Outstanding Customer Commitments + +Cross-reference recent Granola meetings using `Granola:query_granola_meetings` for any customer-facing commitments the person made that fall due during their absence: +- "I'll follow up by end of week" +- "We'll send you the update next Tuesday" +- Any promises to check on a run or investigate an issue + +Flag these explicitly — they're the things most likely to fall through the cracks during OOO. + +--- + +### Step 7 — Compose the Handoff Doc + +Follow the structure in `references/handoff-template.md` exactly. + +Keep the tone practical and direct — this is a working doc for the coverage person, not a report. It should be pasteable directly into **#support-team**. + +--- + +### Step 8 — Offer to Post to Slack + +After generating the handoff, offer to: +- **Draft a Slack post** for #support-team using `Slack:slack_send_message_draft` — formatted for Slack (shorter, with key sections only) +- **Save the full doc to Notion** under CX Team for reference + +**Always save as draft — never post without user review.** + +--- + +## Smart Defaults & Judgment Calls + +| Situation | Default Behavior | +|-----------|-----------------| +| No active Linear tickets | "No active investigations — clean handoff on tickets" | +| No open HubSpot tickets | "No open HubSpot tickets requiring coverage" | +| Coverage person not named | Note "Coverage: TBD — assign before going out" | +| Out for one day only | Trim to urgent items only — skip the full ticket list | +| Out over a weekend | Note "Weekend gap — flag anything time-sensitive for Monday" | +| Multiple people sharing coverage | List each person and what they're covering | +| User is Nick handing off to both Alma and Syed | Address the handoff to both and split responsibilities if logical | + +--- + +## Tool Reference + +| Tool | Use | +|------|-----| +| `Linear:list_issues` | Pull open tickets assigned to the person going out | +| `Linear:get_issue` | Get ticket details and current status | +| `Linear:list_comments` | Get the most recent activity on a ticket | +| `HubSpot:search_crm_objects` | Find open support tickets owned by this person | +| `HubSpot:get_crm_objects` | Get ticket details | +| `Slack:slack_read_channel` | Check recent #support-team and #cx-team activity | +| `Slack:slack_search_public_and_private` | Find bot run mentions and open threads | +| `Granola:query_granola_meetings` | Check for outstanding customer commitments | +| `Slack:slack_send_message_draft` | Draft the Slack handoff post for #support-team | +| `Notion:notion-create-pages` | Save the full handoff to Notion | + +--- + +## Team Context (Quandri CX) + +- **Support team**: Nick (Manager), Alma St. Hilaire, Syed +- **Primary handoff channel**: #support-team +- **Bot runs**: A core part of the support team's daily monitoring — scheduled bot runs for customer renewal processing. Failures typically require a Linear ticket (ONC team) or a manual re-run. +- **Tone**: Practical and thorough — the coverage person should be able to hit the ground running with zero follow-up questions + +--- + +## Example Invocations + +- "I'm off Thursday and Friday — create a handoff for Syed" +- "Alma's on vacation next week, what does she need to hand off?" +- "OOO handoff — I'm out Dec 23–27, Syed is covering" +- "Create a coverage doc before I go" +- "What should I hand off before my long weekend?" diff --git a/partner-built/quandri-customer-support/skills/support-handoff/references/handoff-template.md b/partner-built/quandri-customer-support/skills/support-handoff/references/handoff-template.md new file mode 100644 index 00000000..2fd9edb4 --- /dev/null +++ b/partner-built/quandri-customer-support/skills/support-handoff/references/handoff-template.md @@ -0,0 +1,90 @@ +# Support Handoff Output Template + +Use this structure exactly. The full doc is for Notion. The Slack version (Step 8) should be a trimmed version — urgent items and runs to watch only. + +--- + +**Support Handoff — [Name Going Out]** +*Out: [Start Date] – [End Date] | Coverage: [Name(s) or "TBD"]* +*Prepared: [Today's Date]* + +--- + +## 🔥 Time-Sensitive — Action Required + +*(Tickets, threads, or commitments that need attention within 24–48 hours of the absence starting. If none: "Nothing urgent — no immediate action required.")* + +- **[Customer / Ticket ID]** — [What needs to happen and by when] +- **[Customer / Ticket ID]** — [What needs to happen and by when] + +--- + +## 🔄 Active Investigations + +*(All In Progress / Todo / Blocked Linear tickets owned by the person going out. If none: "No active investigations.")* + +**[[TICKET-ID]] [Title]** — *[Status] | [Priority]* +- **Where things stand:** [1–2 sentences on current state of the investigation] +- **Next action needed:** [Specific thing the coverage person should do, e.g. "Check if the run completes Friday morning and update the ticket", "Follow up with customer if no reply by [date]", "No action needed — waiting on engineering"] +- **Last update:** [Date — one-line note] + +*(Repeat for each active ticket)* + +--- + +## 📬 Open HubSpot Tickets + +*(Tickets where customer action or a Quandri response is pending. Sorted by urgency.)* + +**Waiting on Quandri (respond during coverage):** + +- **[Ticket ID] [Company] — [Subject]** + - Customer responded [Date] — needs a reply. [1 sentence on what they're asking / what to say.] + +*(If none: "No HubSpot tickets waiting on a Quandri response.")* + +**Waiting on Customer (can monitor, no action needed unless they respond):** + +- **[Ticket ID] [Company] — [Subject]** — Quandri last responded [Date]. Flag if customer replies. + +*(If none: "No tickets currently waiting on a customer response.")* + +--- + +## 🤖 Runs to Watch + +*(Bot runs or scheduled processing events happening during the absence that may need monitoring. If none: "No specific runs flagged for this period.")* + +- **[Customer]** — [What's scheduled, when, and what to do if it fails] + - *If it fails:* [Action — e.g., "Re-run manually via the admin panel", "Create an ONC Linear ticket and tag Alma on Slack", "Notify [CSM name]"] + +*(Repeat for each flagged run)* + +--- + +## 💬 Open Slack Threads + +*(Threads in #support-team or #cx-team that still need a response. If none: "No open Slack threads requiring a response.")* + +- **[#channel] — [Thread summary]** — [What response or action is needed] + +--- + +## 📋 Outstanding Customer Commitments + +*(Things promised to customers that fall due during the absence. If none: "No outstanding commitments identified.")* + +- **[Customer]** — "[What was promised]" — due by [Date] + - *Suggested action:* [e.g., "Send a quick update email", "Check the ticket and reply", "Delegate to CSM"] + +--- + +## 📝 Other Notes + +*(Anything else the coverage person should know — customer context, quirks, things to be aware of. Optional section — only include if there's genuinely useful context.)* + +- [Note] + +--- + +*Quandri CX — Support Handoff | Prepared [Today's Date]* diff --git a/partner-built/quandri-customer-support/skills/ticket-breakdown/SKILL.md b/partner-built/quandri-customer-support/skills/ticket-breakdown/SKILL.md new file mode 100644 index 00000000..a3dfb0bf --- /dev/null +++ b/partner-built/quandri-customer-support/skills/ticket-breakdown/SKILL.md @@ -0,0 +1,123 @@ +--- +name: ticket-breakdown +description: > + Generate a full Linear ticket breakdown for a specific customer — covering top priority tickets, + all in-progress work, backlog count, and recent releases — formatted for both internal CS/CSM use + and as a clean customer-facing audit summary. + Use when: ticket audit, ticket audit for a customer, run a ticket audit, do a ticket audit. +--- + +# Customer Ticket Breakdown + +Produce a structured audit of all open Linear tickets for a specific customer. The output is an internal brief for the CS rep or CSM, organized by ticket status to match exactly what is visible in Linear. + +**Accuracy is the top priority.** Every ticket count and every ticket listed must exactly match what is in Linear. Do not summarize, skip, or infer — pull the real data. + +--- + +## Workflow + +### Step 1 — Identify the customer + +Get the customer name from the user's prompt or the conversation context. If it's ambiguous (e.g., a nickname or partial name), clarify before proceeding. + +Then look up the customer in HubSpot to retrieve: +- Full company name (use this exact name when searching Linear) +- Plan tier / ARR +- Named CSM and account owner +- Renewal date (flag if within 90 days) +- Any open HubSpot tickets associated with this account — note their IDs and URLs, as these will be linked inline throughout the output + +### Step 2 — Pull ALL Linear tickets for this customer via the Customers API + +Tickets are linked to customers in Linear through the **Customers feature** — the same one visible at linear.app/quandriio/customers. This is the only reliable way to get all tickets for a customer. Do not use `list_issues` with `query` or `label` to find customer tickets — those approaches miss tickets and are not how Linear associates issues with customers. + +**Fetch the customer and all their linked issues:** + +1. Call `list_customers` with: + - `query`: the customer name (e.g., `"Blue Ridge"`) + - `includeNeeds: true` — this returns all issues linked to this customer + - `limit: 250` + +2. From the response, locate the matching customer record and extract every issue linked via their needs. Each need contains an associated issue ID. + +3. **Paginate if needed.** If a `cursor` is returned, call `list_customers` again with that cursor and `includeNeeds: true` until no cursor is returned. Collect all linked issue IDs across every page. + +4. Once you have the full list of issue IDs, call `get_issue` on each one to retrieve: + - Ticket ID, title, current status (exact label from Linear), priority, assignee + - Creation date and last updated date + - Description (first 2–3 sentences) + - Most recent comment or activity (date + content) — call `list_comments` if needed + - Any linked HubSpot ticket URL (check attachments or external link fields) + +5. Also call `list_issue_statuses` to confirm the exact status names in this workspace before bucketing in Step 3. + +**After collecting all issues, record the total count.** This number must match what is shown in the customer's record in Linear. If anything seems off, re-check before proceeding. + +If the customer is not found or has no linked issues, tell the user and stop. + +### Step 3 — Compose the output + +Follow the structure in `references/breakdown-template.md` exactly. Produce the sections in this order: + +1. **Executive Summary** +2. **Todo** +3. **In Progress** +4. **Blocked** +5. **Backlog** (count only) +6. **Feature Intake** +7. **Released (last 30 days)** (count only) + +Details for each section: + +**1. Executive Summary** +Identify the 3 highest-impact open tickets across all statuses (prioritize by: Urgent > High > Medium, then recency as tiebreaker). For each, write 2–3 sentences covering: what the issue is, what work has been done, and what the current status or next step is. If a HubSpot ticket is linked to any of these, include the HubSpot link inline. + +**2. Todo** +List every ticket in the Todo bucket — do not skip any. For each: +- Ticket ID and title +- Priority and assignee (or "Unassigned") +- 1–2 sentence summary of what the ticket is about +- Most recent update or comment (date + brief note), or "No updates since creation" if none +- HubSpot ticket link if one is associated + +**3. In Progress** +List every ticket in the In Progress bucket — do not skip any. For each: +- Ticket ID and title +- Priority and assignee (or "Unassigned") +- 1–2 sentence summary of what's being worked on +- Most recent update or comment (date + brief note) +- HubSpot ticket link if one is associated + +**4. Blocked** +List every ticket in the Blocked bucket — do not skip any. For each: +- Ticket ID and title +- Priority and assignee (or "Unassigned") +- 1–2 sentence summary of the issue +- What is blocking it, based on description or most recent comment +- Most recent update or comment (date + brief note) + +**5. Backlog** +Report the count only. Do not list individual tickets or summaries. + +**6. Feature Intake** +List every ticket in the Feature Intake bucket — do not skip any. For each: +- Ticket ID and title +- 1–2 sentence summary of what is being requested +- Most recent update or comment (date + brief note), or "No updates" if none + +**7. Released (last 30 days)** +Report the count only of tickets moved to a Released/Done/Completed status within the past 30 days from today. Do not list individual tickets. + +--- + +## Important notes + +- **Never fabricate or infer.** If a field is blank (no assignee, no comments, no description), say so explicitly — do not fill it in with assumptions. +- **Every count must be exact.** The number in each section heading must equal the number of tickets listed below it. Count them before outputting. +- **Always use `list_customers` with `includeNeeds: true` to find a customer's tickets.** This is the only method that matches what Linear's Customers view shows. Never use `list_issues` with `query` or `label` as a substitute — those miss tickets. +- **Always set `limit: 250` and always paginate with `cursor`.** Never rely on a single API response. +- **Every count must be exact.** The number in each section heading must equal the number of tickets listed below it. +- **Use Linear's exact status names** from `list_issue_statuses` — do not rename or reinterpret them. +- If a customer has tickets across multiple Linear teams, pull from all teams and note the team name alongside each ticket. +- Be precise about dates — "last 30 days" means exactly that, calculated from today's date. diff --git a/partner-built/quandri-customer-support/skills/ticket-breakdown/references/breakdown-template.md b/partner-built/quandri-customer-support/skills/ticket-breakdown/references/breakdown-template.md new file mode 100644 index 00000000..ee750a9f --- /dev/null +++ b/partner-built/quandri-customer-support/skills/ticket-breakdown/references/breakdown-template.md @@ -0,0 +1,101 @@ +# Ticket Breakdown Output Template + +Use this structure exactly, in this order. Every section must appear even if the count is zero. + +--- + +**Ticket Breakdown — [Company Name]** +*Prepared: [Today's Date] | Plan: [Tier] | ARR: [Value] | CSM: [Name] | Renewal: [Date or "N/A"]* +*HubSpot: [Link if available]* + +--- + +## 🔎 Executive Summary + +The 3 highest-impact open tickets across this account: + +**1. [[TICKET-ID]] [Title]** *(Priority: [Urgent/High/Medium/Low] | Status: [Status])* +[2–3 sentences: what the issue is, what work has been done, current status or next step.] +*HubSpot: [Link] — or omit line if no linked HubSpot ticket* + +**2. [[TICKET-ID]] [Title]** *(Priority: [Urgent/High/Medium/Low] | Status: [Status])* +[2–3 sentences.] +*HubSpot: [Link] — or omit line if no linked HubSpot ticket* + +**3. [[TICKET-ID]] [Title]** *(Priority: [Urgent/High/Medium/Low] | Status: [Status])* +[2–3 sentences.] +*HubSpot: [Link] — or omit line if no linked HubSpot ticket* + +--- + +## 📝 Todo ([N] tickets) + +*(If 0 tickets: "No tickets currently in Todo.")* + +--- + +**[[TICKET-ID]] [Title]** +- **Priority:** [Urgent / High / Medium / Low / None] | **Assignee:** [Name or "Unassigned"] +- **Summary:** [1–2 sentences describing what this ticket is about] +- **Latest update:** [Date — brief note from most recent comment or activity, or "No updates since creation"] +- **HubSpot:** [Link — or omit line if none] + +*(Repeat for every Todo ticket — do not skip any)* + +--- + +## 🔄 In Progress ([N] tickets) + +*(If 0 tickets: "No tickets currently In Progress.")* + +--- + +**[[TICKET-ID]] [Title]** +- **Priority:** [Urgent / High / Medium / Low / None] | **Assignee:** [Name or "Unassigned"] +- **Summary:** [1–2 sentences describing what is being worked on] +- **Latest update:** [Date — brief note from most recent comment or activity] +- **HubSpot:** [Link — or omit line if none] + +*(Repeat for every In Progress ticket — do not skip any)* + +--- + +## 🚫 Blocked ([N] tickets) + +*(If 0 tickets: "No tickets currently Blocked.")* + +--- + +**[[TICKET-ID]] [Title]** +- **Priority:** [Urgent / High / Medium / Low / None] | **Assignee:** [Name or "Unassigned"] +- **Summary:** [1–2 sentences describing the issue] +- **Blocker:** [What is blocking this ticket, based on description or most recent comment] +- **Latest update:** [Date — brief note from most recent comment or activity] + +*(Repeat for every Blocked ticket — do not skip any)* + +--- + +## 📋 Backlog + +**Total: [N] tickets** *(no individual summaries)* + +--- + +## 💡 Feature Intake ([N] tickets) + +*(If 0 tickets: "No tickets currently in Feature Intake.")* + +--- + +**[[TICKET-ID]] [Title]** +- **Summary:** [1–2 sentences describing what is being requested] +- **Latest update:** [Date — brief note, or "No updates"] + +*(Repeat for every Feature Intake ticket — do not skip any)* + +--- + +## ✅ Released (last 30 days) + +**Total: [N] tickets** *(tickets moved to Released/Done/Completed in the past 30 days — no individual summaries)* diff --git a/partner-built/quandri-customer-support/skills/weekly-cx-report/SKILL.md b/partner-built/quandri-customer-support/skills/weekly-cx-report/SKILL.md new file mode 100644 index 00000000..8ad8b42d --- /dev/null +++ b/partner-built/quandri-customer-support/skills/weekly-cx-report/SKILL.md @@ -0,0 +1,231 @@ +--- +name: weekly-cx-report +description: Generates a comprehensive weekly Customer Experience report by pulling data from HubSpot, Asana, Linear, Granola, and Google Calendar. Aggregates ticket metrics, team output, meeting highlights, and open items into a formatted summary ready to share with leadership. Use this skill whenever the user asks for a weekly report, weekly summary, CX report, weekly wrap-up, end of week report, "what did the team accomplish this week", or "generate my weekly report". Also trigger when the user wants to summarize the week's customer support activity, team performance, or prepare a stakeholder update. This skill saves hours of manual reporting every week for CX managers and team leads. +--- + +# Weekly CX Report + +## Purpose +Automatically compiles a complete weekly Customer Experience report for the Quandri CX team — pulling ticket data, team output, meeting highlights, and key themes into a ready-to-share summary for leadership. + +## When to Use +- "Generate my weekly report" / "weekly CX report" +- "What did the team accomplish this week?" +- "Prepare my weekly summary" +- "End of week wrap-up" +- "Weekly stakeholder update" +- Every Friday afternoon or Monday morning review + +--- + +## Core Workflow + +### Step 1 — Establish the Reporting Period +- Default to the **current week** (Monday–Friday) +- If user specifies a different week, use that range +- Confirm the date range with the user before pulling data: + > "I'll pull data for [Monday date] – [Friday date]. Does that look right?" + +--- + +### Step 2 — Pull HubSpot Ticket Data +Use HubSpot to gather customer support metrics for the week: + +**Metrics to collect:** +- Total tickets opened this week +- Total tickets closed/resolved this week +- Tickets still open (backlog) +- Any tickets escalated or marked high priority +- Average response time (if available) +- Customer names or accounts with the most activity +- Any tickets open > 7 days (at-risk/stale) + +Use `HubSpot:get_crm_objects` and `HubSpot:search_crm_objects` filtered by date range. + +--- + +### Step 3 — Pull Team Task Output from Asana & Linear + +#### Asana +- Use `Asana:asana_get_tasks` to retrieve tasks completed this week by Nick, Alma, and Syed +- Also pull tasks that are overdue or carry over into next week +- Group by project/initiative where possible + +#### Linear +- Use `Linear:list_issues` filtered to the current week +- Focus on: tickets closed, tickets opened by customer feedback, any bugs or product issues surfaced by CX team +- Flag any issues that are blocking or stale + +--- + +### Step 4 — Review Meetings & Key Themes from Granola +- Use `Granola:list_meetings` to pull all meetings from the reporting week +- Use `Granola:get_meeting_transcript` for key customer-facing meetings +- Extract: + - Customer calls held (list by account name) + - Key themes or recurring issues mentioned across calls + - Any commitments made to customers + - Internal syncs and decisions made + +--- + +### Step 5 — Check Calendar for Context +- Use `Google Calendar:gcal_list_events` to confirm meetings held +- Cross-reference with Granola to ensure no meetings were missed +- Note any significant events: QBRs, onboarding sessions, escalation calls + +--- + +### Step 6 — Identify Key Themes & Insights +Based on all data gathered, synthesize: +- **Top customer issues this week** (patterns across tickets and calls) +- **What went well** (resolved escalations, positive feedback, milestones hit) +- **What needs attention** (open escalations, at-risk accounts, overdue tasks) +- **Upcoming priorities** (next week's key tasks, meetings, deadlines) + +--- + +### Step 7 — Compile & Format the Report +Produce the report in the following format: + +``` +# Weekly CX Report — [Week of Date] +Prepared by: [User Name] | [Date Generated] + +--- + +## 📊 Ticket Summary +| Metric | This Week | +|--------|-----------| +| Tickets Opened | X | +| Tickets Resolved | X | +| Open Backlog | X | +| Escalated | X | +| Stale (>7 days) | X | + +**Accounts with most activity:** [List] + +--- + +## ✅ Team Output + +**[Name] — [X tasks completed]** +- [Task 1] +- [Task 2] + +**[Name] — [X tasks completed]** +- ... + +**Carried over to next week:** +- [Overdue or incomplete tasks] + +--- + +## 📞 Customer Interactions +**Meetings held:** X calls across X accounts + +| Account | Meeting Type | Key Outcome | +|---------|-------------|-------------| +| [Name] | Onboarding | ... | +| [Name] | Escalation | ... | + +**Recurring themes across calls:** +- [Theme 1] +- [Theme 2] + +--- + +## 🔥 Escalations & At-Risk Accounts +- [Account]: [Issue summary, status, next step] + +--- + +## 💡 What Went Well +- [Highlight 1] +- [Highlight 2] + +--- + +## ⚠️ Needs Attention +- [Item 1] +- [Item 2] + +--- + +## 🗓️ Next Week Priorities +1. [Priority 1] +2. [Priority 2] +3. [Priority 3] + +--- +*Generated by Claude — Quandri CX Weekly Report Skill* +``` + +--- + +### Step 8 — Deliver & Offer to Share +After generating the report, offer the following options: + +**A) Save to Notion** +- Use `Notion:notion-create-pages` to save the report to a CX team Notion page +- Suggested location: CX Team > Weekly Reports + +**B) Post to Slack** +- Use `Slack:slack_send_message_draft` to draft a summary version for #cx-leaders or #cx-team +- Keep the Slack version concise — headline metrics + top 3 highlights + needs attention + +**C) Email to Leadership** +- Use `Gmail:gmail_create_draft` to draft an email version +- Subject line: "CX Weekly Report — Week of [Date]" + +**Always create drafts — never send directly without user review.** + +--- + +## Tool Reference + +| Tool | Use | +|------|-----| +| `HubSpot:search_crm_objects` | Pull ticket data by date range | +| `HubSpot:get_crm_objects` | Get ticket details and metrics | +| `Asana:asana_get_tasks` | Team task completion data | +| `Asana:asana_search_tasks` | Filter tasks by date and assignee | +| `Linear:list_issues` | Product/bug tickets for the week | +| `Granola:list_meetings` | All meetings in the reporting period | +| `Granola:get_meeting_transcript` | Key themes from customer calls | +| `Google Calendar:gcal_list_events` | Confirm meetings and events | +| `Notion:notion-create-pages` | Save report to Notion | +| `Slack:slack_send_message_draft` | Draft Slack summary | +| `Gmail:gmail_create_draft` | Draft email for leadership | + +--- + +## Smart Defaults & Judgment Calls + +| Situation | Default Behavior | +|-----------|-----------------| +| No HubSpot ticket data found | Note it and continue with other sections | +| Team member has no completed tasks | List as "no tasks completed — check in recommended" | +| No customer meetings this week | Note it positively ("no escalation calls needed") | +| Sparse data for a section | Keep the section, note data was limited | +| User asks for previous week | Adjust date range accordingly | + +--- + +## Team Context (Quandri CX) + +- **Team members**: Nick (Manager), Alma (direct report), Syed (direct report) +- **Key Slack channels**: #cx-leaders (for leadership updates), #cx-team (for team posts) +- **Notion**: Save reports to CX Team > Weekly Reports section +- **Tone**: Professional but concise — leadership wants the headlines, not the details +- **Report audience**: Internal leadership / stakeholders at Quandri + +--- + +## Example Invocations +- "Generate my weekly CX report" +- "Weekly report for this week" +- "Summarize the week for the CX team" +- "Prepare my Friday wrap-up" +- "What did the team accomplish this week?" +- "Weekly stakeholder update" diff --git a/partner-built/quandri-customer-support/skills/weekly-incident-report/SKILL.md b/partner-built/quandri-customer-support/skills/weekly-incident-report/SKILL.md new file mode 100644 index 00000000..76eb4342 --- /dev/null +++ b/partner-built/quandri-customer-support/skills/weekly-incident-report/SKILL.md @@ -0,0 +1,85 @@ +--- +name: weekly-incident-report +description: > + Generate a weekly incident and ticket report for the Quandri ONC team by pulling data from + the Linear triage view, analyzing tickets by severity and status, identifying patterns, and + producing a structured report with root cause analysis. + Use when: weekly report, incident report, weekly incident report, generate the weekly report, + ONC report, weekly ticket summary, triage report, incident summary, run the weekly report. +--- + +# Weekly Incident Report + +Generate a structured weekly incident and ticket report by connecting to Linear, analyzing the ONC triage view, and producing a full report with severity breakdowns, root cause analysis, and actionable recommendations. + +**Accuracy is the top priority.** Every ticket count, severity label, and status must exactly match what is in Linear. Do not summarize, skip, or infer — pull the real data. + +--- + +## Configuration + +- **Linear view to analyze:** `https://linear.app/quandriio/team/ONC/triage` +- **Time window:** The previous 7 full calendar days from today +- **Prepared by:** Nick Roach + +--- + +## Workflow + +### Step 1 — Determine the date range + +Calculate the reporting window: today's full date minus 7 calendar days. For example, if today is March 16, 2026, the report covers March 9–15, 2026 (inclusive). Use this window to filter tickets by creation date. + +### Step 2 — Pull tickets from the Linear ONC triage view + +Fetch all issues from the ONC team's triage view. Use the following approach: + +1. Call `list_teams` to find the ONC team ID. +2. Call `list_issue_statuses` for the ONC team to get the exact status names (e.g., "In Progress", "In QA", "Released", "Blocked"). Use these exact strings throughout the report — do not rename or reinterpret them. +3. Call `list_issues` with: + - `teamId`: ONC team ID + - Filter to tickets created within the 7-day reporting window + - `limit: 250` + - Paginate using `cursor` if needed — collect every page before proceeding +4. For each issue, collect: + - Ticket ID and title + - Severity label (Sev 0, Sev 1, Sev 2, Sev 3, No Severity — check labels) + - Current status (exact value from `list_issue_statuses`) + - Component/area tags + - Whether it's a feature request (check labels or title conventions) + - Whether it's a duplicate or closed + - Creation date and resolution/updated date + - Description (first 2–3 sentences for context) + - Any root cause or incident notes (from description or comments — call `list_comments` if useful) +5. Call `list_issue_labels` for the ONC team to understand what severity labels look like (e.g., "Sev 0", "Sev 1", etc.) before categorizing tickets. + +**Record the total ticket count before proceeding.** This is your ground truth — all counts in the report must sum to this total. + +### Step 3 — Do your analysis (scratchpad) + +Before writing the report, work through this analysis privately: + +1. List all tickets found with their IDs, titles, severities, and statuses +2. Categorize them: bucket by severity (Sev 0–3, No Severity) and by status (In Progress, In QA, Released, Blocked) +3. Count feature requests and closed/duplicate tickets separately +4. Identify the top 3 contributing components or areas by ticket volume (look at labels and titles) +5. Identify patterns: are there 2–4 recurring themes or Sev 0/1 incidents that share a root cause? +6. Flag tickets with high customer impact, systemic risk, cross-team dependencies, or needing leadership visibility +7. Note any data quality gaps: tickets missing severity labels, incomplete descriptions, ambiguous status +8. Plan your root cause analysis sections (aim for 2–4 patterns max) + +### Step 4 — Generate the report + +Follow the structure in `references/report-template.md` exactly. Produce all sections in order, preserving all markdown tables and formatting. + +--- + +## Important notes + +- **Never fabricate or infer.** If a field is missing (no severity label, no description), say so explicitly — do not fill it in. +- **Every count must be exact.** The totals in the Summary Table must sum to the total tickets pulled from Linear. +- **Use Linear's exact status names** from `list_issue_statuses` — do not rename them. +- **Paginate with cursor.** Always set `limit: 250` and paginate until no cursor is returned. +- For the Root Cause Analysis, aim for 2–4 patterns maximum — quality over quantity. +- If you cannot access previous week data for the "Open Items from Previous Weeks" section, note "No historical data available in provided view." +- Wrap your analysis in `` tags and your final report in `` tags. diff --git a/partner-built/quandri-customer-support/skills/weekly-incident-report/references/report-template.md b/partner-built/quandri-customer-support/skills/weekly-incident-report/references/report-template.md new file mode 100644 index 00000000..7462165d --- /dev/null +++ b/partner-built/quandri-customer-support/skills/weekly-incident-report/references/report-template.md @@ -0,0 +1,154 @@ +# Weekly Incident & Ticket Report — Template + +Use this exact structure for every report. Preserve all table formats, headers, and section order. + +--- + +## Header Section + +``` +# Weekly Incident & Ticket Report +**Week:** [Start Date] – [End Date] +**Prepared by:** Nick Roach +**Generated:** [Today's date] +``` + +--- + +## Summary Table + +```markdown +## Summary + +| Metric | Total | In Progress | In QA | Released | Blocked | +|----------------------|-------|-------------|-------|----------|---------| +| Sev 0 | | | | | | +| Sev 1 | | | | | | +| Sev 2 | | | | | | +| Sev 3 | | | | | | +| No Severity | | | | | | +| Feature Requests | | — | — | — | — | +| Duplicates (closed) | | — | — | — | — | + +**Top 3 contributing components/areas:** +1. [Component/area] — X tickets +2. [Component/area] — X tickets +3. [Component/area] — X tickets +``` + +Rules for the Summary Table: +- Feature Requests and Duplicates (closed) rows use "—" in all status columns — they are counted separately, not by status. +- Every number in the Sev 0–No Severity rows must sum to the total ticket count minus feature requests and duplicates. +- If a severity/status combination has zero tickets, write `0` (not blank). + +--- + +## Evidence of Analysis Section + +```markdown +## Evidence of Analysis + +**Tickets analyzed:** +- [QND-XXX] Title +- [QND-XXX] Title +- (list every ticket) + +**Summary statistics:** +- Total tickets reviewed: X +- Date range: [Start] – [End] +- Filters applied: Created within reporting window, ONC team triage view +- Team: ONC + +**Data quality notes:** +- [Note any tickets missing severity labels] +- [Note any tickets with incomplete descriptions or ambiguous status] +- [Note "None" if data is clean] + +**Assumptions:** +- [Any assumptions made during analysis, e.g., how duplicates were identified] +``` + +--- + +## Root Cause Analysis Section + +Aim for 2–4 patterns maximum. Only include patterns with at least 2 related tickets, or any single Sev 0 or Sev 1 incident. + +```markdown +## Root Cause Analysis + +### [Pattern/Incident Title] + +**Tickets:** [QND-XXX], [QND-XXX] +**Root cause:** [Single sentence describing the underlying cause] +**Contributing factors:** +- [Factor 1] +- [Factor 2] +**Resolution status:** [In Progress / Released / Blocked / Open] +**Recommended action:** [Specific next step] +**Owner:** [Name or team] +**Target date:** [Date or "TBD"] + +--- + +### [Next Pattern/Incident Title] +... +``` + +--- + +## Tickets Worth Highlighting Table + +```markdown +## Tickets Worth Highlighting + +| Ticket | Why it matters | Recommended action | +|--------|----------------|--------------------| +| [QND-XXX] Title | [Customer impact, systemic risk, cross-team dep, or leadership visibility] | [Action] | +``` + +Include tickets that are: high customer impact, systemic risk, cross-team dependencies, or require leadership visibility. If no tickets qualify, write "No tickets require highlighting this week." + +--- + +## Open Items from Previous Weeks Table + +```markdown +## Open Items from Previous Weeks + +| Item | Status | Blocker (if any) | +|------|--------|------------------| +| [Item] | [Status] | [Blocker or "None"] | +``` + +If no historical data is available from the Linear view: write "No historical data available in provided view." + +--- + +## Questions for EM/PM Triage + +```markdown +## Questions for EM/PM Triage + +- [Routing ambiguity, severity dispute, or capacity concern] +- [Another question if applicable] +``` + +If no open questions: write "No open questions this week." + +--- + +## Output wrapper + +Always wrap your output like this: + +``` + +[Your full analysis here: list all tickets, categorize by severity and status, identify patterns, +flag highlights, plan root cause sections. This is your working space — be thorough.] + + + +[Your complete formatted report here, following the exact template above] + +```