/csm-handover
Generate a beautifully formatted CSM account handover document for transitioning a client from one CSM to another. Use when a client account is being reassigned, when onboarding a new CSM, or when anyone says "handover", "transition account", "hand off client", or "CSM handover". Requires company name and the from/to CSM names.
CSM Account Handover Document Generator
Generate a comprehensive, beautifully formatted handover document for transitioning a client account between CSMs. The output is always a PDF uploaded to the CSM Account Handovers Google Drive folder plus a Slack post tagging the new CSM.
Usage
/csm-handover [company name] from [current CSM] to [new CSM]
Examples:
- /csm-handover DarkStar Intelligence from Thomas to Sebastian
- /csm-handover Solo.io from Thomas to Adriana
CSM Slack User IDs (for @mentions)
| CSM | Slack User ID |
|---|---|
| Thomas | U01CBM0K562 |
| Sebastian | U0B0DFAEVF0 |
| Adriana | U06QRH52479 |
| Nick | U07LBVBH8L8 |
Step 0: Prerequisites Check (BLOCKING)
Before generating the document, verify access to ALL four hard requirements. If any are missing, stop and tell the user what's needed:
- Granola MCP (HARD REQUIREMENT) — Must have access to
mcp__claude_ai_Granola__*tools. This is the primary source for call context. - Gmail access (HARD REQUIREMENT) — Must be able to search and read emails via
gws gmail users messages list/get - Attio CRM (HARD REQUIREMENT) — Must have the Attio API key at
~/.claude/.api-keys/attioOR access to Attio MCP tools. Used to pull company, deal, and people records. - tl;dv transcripts (HARD REQUIREMENT) — Must have the tl;dv API key at
~/.claude/.api-keys/tldvOR access to the tl;dv Google Drive folder (ID:1KeSKW4kNt2Ua5jYiyecOzTFcHHn0-3C-)
If any of these are not accessible, respond with:
⛔ Missing required access for handover document:
- [ ] Granola MCP (connect in claude.ai > Settings > Connected Apps)
- [ ] Gmail (install gws CLI: npm install -g @googleworkspace/cli && gws auth login)
- [ ] Attio CRM (save API key to ~/.claude/.api-keys/attio)
- [ ] tl;dv transcripts (save API key to ~/.claude/.api-keys/tldv)
Please configure the missing tools before running this skill.
Soft requirements (use if available, skip gracefully if not):
- Slack MCP (mcp__claude_ai_Slack__*) — for posting the handover summary
- Google Drive MCP (mcp__google-drive__*) — for uploading the PDF
- Notion MCP (mcp__claude_ai_Notion__*) — for searching internal docs
- Stripe MCP or API — for payment history
- Google Calendar MCP or gws calendar — for meeting history
Step 1: Data Collection
Gather data from ALL sources. Granola is the most important source — it has the richest context from actual conversations. Use background agents for parallel research when possible.
1. Granola — Call Transcripts (PRIMARY SOURCE)
Search Granola first. This is where the real account context lives.
mcp__claude_ai_Granola__list_meetings (time_range: "last_30_days")
Search for the company name, contact names, or domain in meeting titles/participants. For each matching meeting:
mcp__claude_ai_Granola__get_meeting_transcript (meeting_id: "...")
Extract from transcripts: - What was discussed and promised - Client pain points and concerns - Pricing conversations - Product feedback - Relationship dynamics (who's happy, who's frustrated) - Action items that may not have been completed
Also check mcp__claude_ai_Granola__list_meetings with time_range: "custom" going back 6 months for older meetings.
2. Gmail — ALL Email Threads
gws gmail users messages list --params '{"userId": "me", "q": "[company name] OR [domain]", "maxResults": 50}'
Read EVERY email. Extract: - All promises/commitments made by the current CSM (with dates) - Client concerns, complaints, or pushback - Pricing discussed (exact numbers) - Products/features discussed - Timeline commitments - Unanswered emails (CRITICAL — these fall through the cracks)
3. Attio CRM — Company + Deal + People
Using the Attio API key at ~/.claude/.api-keys/attio:
ATTIO_KEY=$(cat ~/.claude/.api-keys/attio)
# Search for company
curl -s "https://api.attio.com/v2/objects/companies/records/query" \
-H "Authorization: Bearer $ATTIO_KEY" \
-H "Content-Type: application/json" \
-d '{"filter": {"name": {"$contains": "[company name]"}}, "limit": 5}'
# Search for deal
curl -s "https://api.attio.com/v2/objects/deals/records/query" \
-H "Authorization: Bearer $ATTIO_KEY" \
-H "Content-Type: application/json" \
-d '{"filter": {"name": {"$contains": "[company name]"}}, "limit": 5}'
Get: deal stage, value, close date, HRIS, budget, owner, associated people (names, titles, emails, roles).
4. tl;dv Call Transcripts
Check the tl;dv Google Drive folder:
gws drive files list --params '{"q": "'\''1KeSKW4kNt2Ua5jYiyecOzTFcHHn0-3C-'\'' in parents and name contains '\''[company or contact name]'\''", "pageSize": 10, "orderBy": "modifiedTime desc", "fields": "files(id,name,mimeType,modifiedTime)"}'
If found, read full transcripts using mcp__google-drive__readGoogleDoc.
5. Slack — Channel History (if available)
Search for the company in Slack:
mcp__claude_ai_Slack__slack_search_public_and_private (query: "[company name]")
mcp__claude_ai_Slack__slack_search_channels (query: "perkup-[company]")
Check #customer-success and any Slack Connect channels for recent context.
6. Calendar — Meeting History + Upcoming
gws calendar events list --params '{"calendarId": "primary", "timeMin": "[6 months ago]", "timeMax": "[1 month from now]", "singleEvents": true, "q": "[company name]"}'
7. Stripe — Payment History
Search Gmail for Stripe/ChartMogul notifications, or use Stripe MCP/API if available.
Step 2: Document Structure
Compile ALL data into a 7-section document. Be thorough but concise.
Section 1: Account Overview
Key fields: Company, Industry, HQ, Employees, Website, Subscription status + signed date, Platform Fee (exact amount + discounts), Contract Term, HRIS (system + status), Perk Budget, Currency, Referral source, Sentiment (🟢/🟡/🔴 + 1-sentence explanation), CSM Transition (From → To).
Section 2: Relationship Map
For each key contact: - Name, Title, Email, Phone (if available) - Role badge: Champion / Decision Maker / Admin / Billing / Technical / Departed - Communication Style: 1-2 sentences - Last contacted date
Communication Preference (for the account overall): Analyze email frequency vs Slack Connect activity vs call frequency to determine: - Primary channel: Email / Slack Connect / Calls — which channel does the client use most? - Response time: How quickly do they typically reply? (same day / 2-3 days / slow) - Preferred cadence: Weekly check-ins / bi-weekly / monthly / ad-hoc only? - Hot buttons: Things that specifically annoy or delight this client (extracted from transcripts and email tone). "Don't mention X" / "Always lead with Y" / "They care deeply about Z" - Communication do's and don'ts: E.g., "prefers short emails, no fluff" or "always wants a call, not async" or "CC's their boss on everything"
Section 3: Integrations & Technical Setup
List EVERY integration the client has connected or discussed:
| Integration | Status | Details |
|---|---|---|
| HRIS | [Connected/Discussed/None] | [Which system: Rippling, BambooHR, Workday, Gusto, Finch, etc. + connection status] |
| SSO | [Connected/Discussed/None] | [Which provider: Okta, Azure AD/Entra, Google SAML, WorkOS + status] |
| Slack/Teams | [Connected/Discussed/None] | [Slack Connect channel name if exists, Teams integration status] |
| Shopify | [Connected/Discussed/None] | [Store URL if connected] |
| Stripe | [Connected/Discussed/None] | [Customer ID, subscription status, payment method] |
| Directory Sync | [Connected/Discussed/None] | [WorkOS dsync, Finch sync, CSV manual, etc.] |
| Warehousing | [Active/None] | [Which warehouses: US, UK, EU, India, etc.] |
Also note:
- PerkUp dashboard link: https://my.perkupapp.com/organization/accounts/[orgId]
- Stripe dashboard link: https://dashboard.stripe.com/customers/[stripeCustomerId] (if known)
- Org ID: [Firestore org ID]
- Any custom technical setup: API integrations, custom webhooks, Workday JSON reports, etc.
Section 4: Account History & Context
- Why PerkUp? — What pain were they solving? Who referred them?
- Key milestones — Chronological timeline with dates
- Pricing notes — Exact numbers, any discounts
- Issue history — Past bugs, support escalations, complaints (all resolved + unresolved)
Section 5: Feature Adoption
Checkmark grid: ✅ Active / 🔄 In progress / ⬜ Not yet / ❌ Turned off Features: On-demand swag, Bulk swag, Swag store, Redemption pages, PerkUp Dollars, Gift cards, Amazon, Perk cards, Birthday automation, Anniversary automation, New hire automation, HRIS integration, SSO, Slack/Teams, Events, Custom kitting, Warehousing, Reporting Then: Cross-sell opportunities + Upsell opportunities
Section 6: Open Items & Commitments ⚠️
CRITICAL — things that fall through cracks: 1. Promises made but not delivered (with dates) 2. Unanswered client emails 3. Pending quotes, contracts, proposals 4. Outstanding technical issues 5. Anything the client is waiting on
Section 7: Risk & Opportunity
Side-by-side: Risks (red) vs Opportunities (green)
Section 8: Recommended First Actions
3-5 specific, actionable things the new CSM should do in their first week.
Step 3: Generate PDF
Generate as a beautifully formatted HTML file, then convert to PDF.
Brand Colors
- Primary:
#5C33FF(purple) - Primary Dark:
#3F21D9 - Primary Light:
#7B5CFF - Primary Background:
#F3F0FF
Design Requirements
- Inter font (Google Fonts)
- Purple gradient header with company name, document title, from/to, date
- Card-based layout for contacts with colored role badges
- Timeline with purple dots for history
- Green/yellow/gray feature adoption grid
- Red alert box for critical open items
- Side-by-side risk/opportunity cards
- Purple action cards for first steps
- Print-optimized CSS
File Output — PDF ONLY
CRITICAL: The final deliverable MUST be a PDF. NEVER upload HTML, DOC, or Google Docs to the handover folder.
- Save HTML to
/tmp/[CompanyName]_Handover.html(temporary only) - Convert to PDF:
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
--headless --disable-gpu \
--print-to-pdf="$HOME/Downloads/[CompanyName]_Handover_[From]_to_[To].pdf" \
--no-margins --print-to-pdf-no-header \
"/tmp/[CompanyName]_Handover.html"
- Verify PDF exists and is >50KB:
ls -la "$HOME/Downloads/[CompanyName]_Handover_[From]_to_[To].pdf"
- Upload only the PDF to Drive:
mcp__google-drive__uploadFile
localPath: ~/Downloads/[CompanyName]_Handover_[From]_to_[To].pdf
name: "[Company Name] — Handover ([From] → [To]).pdf"
parentFolderId: "1mJGNYhE4pqF__FQKgzAau_6n5tfqXR58"
- Delete the temporary HTML:
rm /tmp/[CompanyName]_Handover.html - Naming convention:
[Company Name] — Handover ([From] → [To]).pdf
The Drive folder (1mJGNYhE4pqF__FQKgzAau_6n5tfqXR58) is shared with all CSMs. If a new CSM isn't in the sharing list, add them:
mcp__google-drive__shareFile (fileId: "1mJGNYhE4pqF__FQKgzAau_6n5tfqXR58", emailAddress: "[csm]@perkupapp.com", role: "reader")
Step 4: Post to Slack
Post a tight handover summary to #customer-success (channel ID: C01NHGUSQPN).
CRITICAL Slack Rules
- Tag the new CSM using their Slack user ID:
<@U0B0DFAEVF0|Sebastian>(see ID table above) - Do NOT use markdown tables — Slack doesn't render them
- Use bullet points for all structured data
- Keep it tight — this is a summary, not the full document
- Always include the PDF link at the bottom
Slack Post Template
*[Company] — Account Handover: [From] → <@[NEW_CSM_SLACK_ID]|[New CSM Name]>*
• *Customer Since:* [date]
• *MRR:* [amount]
• *Product:* [what they use]
• *Contact:* [primary contact name + email]
• *Sentiment:* :large_green_circle: / :large_yellow_circle: / :red_circle: [one-line]
---
*Contacts:*
• *[Name]* — [Title]. [email]. [1-line context]
---
:fire: *#1 Priority: [most important action]*
[2-3 sentences max]
*Open items:*
1. *[Item]* — [detail]
*First actions:*
1. [action]
:paperclip: *Full handover PDF:* [Google Drive link]
Step 5: Draft Intro Email for New CSM
Create a Missive draft (or Gmail draft if Missive unavailable) for the new CSM to send to the client's primary contact. This is the first email the client receives from their new CSM.
Email structure:
- From: [New CSM]@perkupapp.com
- To: Primary client contact(s)
- CC: Previous CSM (for warm handoff visibility)
- Subject: [Company Name] — Your New Point of Contact at PerkUp
Email template (adapt based on account context):
Hi [Contact First Name],
I'm [New CSM Name] and I'll be your new point of contact at PerkUp going forward. [Previous CSM Name] has brought me fully up to speed on your account.
[1 sentence showing you know their setup — e.g., "I can see you're running your wellness perk program for 53 employees with monthly $50 budgets" or "I know you've got a bulk swag order in production for the Calgary event"]
[1 sentence about any open items — e.g., "I'll be following up on the shipping quote we discussed" or "I'm keeping an eye on your Healthy Planet merchant request with support"]
I'm here for anything you need — feel free to reach out anytime. I'd love to schedule a quick intro call in the next week or two if you're open to it.
[New CSM signature]
Key rules for the draft: - Reference specific details from the handover (proves the new CSM has context) - Mention any open items so the client knows nothing fell through the cracks - Keep it short — 4-5 sentences max - Warm but professional tone - Never mention internal processes (handover docs, skills, Claude, etc.)
If Missive API is available (~/.claude/.api-keys/missive):
MISSIVE_KEY=$(cat ~/.claude/.api-keys/missive)
curl -s -X POST "https://public.missiveapp.com/v1/drafts" \
-H "Authorization: Bearer $MISSIVE_KEY" \
-H "Content-Type: application/json" \
-d '{"drafts": {"subject": "[Company] — Your New Point of Contact at PerkUp", "body": "[HTML body]", "to_fields": [{"address": "[contact email]", "name": "[contact name]"}], "cc_fields": [{"address": "[previous CSM]@perkupapp.com"}], "from_field": {"address": "[new CSM]@perkupapp.com", "name": "[New CSM Name]"}, "organization": "1e3c3485-10b2-4364-8919-2972ecd5fa71"}}'
Step 6: Update Attio CRM
After completing the handover, update the deal in Attio: - Update the deal owner to the new CSM - Add a note to the deal with the handover date and PDF link
ATTIO_KEY=$(cat ~/.claude/.api-keys/attio)
# Add note to the deal
curl -s -X POST "https://api.attio.com/v2/notes" \
-H "Authorization: Bearer $ATTIO_KEY" \
-H "Content-Type: application/json" \
-d '{
"data": {
"parent_object": "deals",
"parent_record_id": "[DEAL_ID]",
"title": "CSM Handover — [From] → [To]",
"format": "plaintext",
"content": "Account handed over from [From] to [To] on [date]. Full handover PDF: [Drive link]"
}
}'
Quality Checklist
Before delivering, verify every item:
- [ ] Granola transcripts read — all relevant meetings found and context extracted
- [ ] Gmail fully searched — all threads read, unanswered emails flagged
- [ ] Attio data pulled — company, deal, and people records
- [ ] tl;dv transcripts checked — Drive folder searched
- [ ] All 7 sections populated with real data (not placeholders)
- [ ] Every contact has name, title, email, and role
- [ ] Pricing includes exact numbers (not ranges)
- [ ] Open items have specific dates and action owners
- [ ] Feature adoption chart is complete
- [ ] At least 3 recommended first actions
- [ ] PDF created and verified (>50KB, renders correctly)
- [ ] PDF uploaded to Drive folder
1mJGNYhE4pqF__FQKgzAau_6n5tfqXR58 - [ ] No HTML/DOC/Google Doc uploaded — PDF only
- [ ] Slack post sent to #customer-success with new CSM tagged
- [ ] Slack post uses bullet points (NOT tables)
- [ ] Attio updated with handover note
- [ ] No PII beyond what's necessary (no SSNs, passwords, etc.)
Source: ~/.claude/skills/csm-handover/SKILL.md