operations-meeting-prep
One job: walk into every sales call fully prepared. That means deep LinkedIn enrichment + 30-day web research on the person, a personalized 12-step sales script, and a value-driven pitch deck tailored to that specific person — all stored in Notion under "Meeting Prep Report & Sales Script".
Automation level: AUTONOMOUS — runs end-to-end without pausing. When inputs come from a calendar booking (via /morning), the LinkedIn URL and meeting time are auto-extracted. Offer fit is auto-picked using the scoring rubric below, with ambiguity flagged in the output rather than gated on user confirmation.
Routine position: /morning step 7. Auto-runs once per Discovery Call booked for today. Also runs standalone when called directly with a name + LinkedIn URL.
Setup Required
Replace these placeholders before running:
| Placeholder |
What to replace it with |
YOUR_MEETING_PREP_NOTION_DB_ID |
Your "Meeting Prep" Notion database ID |
[YOUR_PROJECT_PATH] |
Your local project root path (e.g. /Users/yourname/Documents/my-claude-os) |
Context to read before running
- Read
context/offers.md — know all your offers, their ideal clients, pricing, and positioning angles.
- Read
context/icp.md — know the ICP profile so you can spot fit or misfit quickly.
- Read
references/sales-script-template.md — the 12-step framework you'll personalize.
Steps
Part 1 — Get the person's name, LinkedIn URL, and conversation history
Routine mode (called by /morning step 7): Inputs are pre-extracted from a calendar booking. The orchestrator passes:
name (attendee full name)
linkedin_url (from the booking form's LinkedIn URL field)
scheduled_time (today's call time)
dm_conversation (full DM history with this lead, if available via your LinkedIn outreach tool)
If dm_conversation is non-empty, treat it as primary context — the lead's own words from DMs are the strongest signal for "why did they book the call".
Standalone mode (user calls skill directly):
- Take the name (and LinkedIn URL if provided) from the user.
- If no name: ask "Who are you meeting with? Give me their name — and their LinkedIn URL if you have it."
- If LinkedIn URL is provided: skip Part 2, go straight to Part 3.
Part 2 — Find their LinkedIn profile (only if no URL given)
Try Playwright first:
- Tool:
mcp__playwright__browser_navigate
- URL:
https://www.linkedin.com/search/results/people/?keywords=[FirstName LastName]
- Tool:
mcp__playwright__browser_snapshot
- Extract the most likely profile URL by name match.
If Playwright fails: use Relay as fallback:
- Tool:
mcp__claude_ai_Relay_APP_Claude_Code__search_linkedin_for_profile
- firstName, lastName, company (if known)
- Extract the profile URL from the result.
If no profile found: note "LinkedIn profile not found — enrichment limited" and continue with name-only context.
Part 3 — Enrich the person (LinkedIn enrichment tool)
Get their full LinkedIn profile using your LinkedIn enrichment tool (e.g. Trigify CLI: trigify profile enrich --profile-url <linkedin_url>).
- Extract: current role, company, headline, about/summary, experience, education, certifications.
- If this returns empty or errors: note the failure and continue with whatever partial data is available.
Get their company profile:
- Extract from the enrichment output above. If company fields are missing: note "Company profile unavailable" and continue.
Get their recent LinkedIn posts:
- Use your enrichment tool (e.g.
trigify profile posts --profile-url <linkedin_url> --page 0)
- Get last 3–5 posts. Extract: topics, themes, language used, pain points mentioned.
- If this returns empty: note "No posts available" and continue.
Part 4 — 30-day research (web search)
- Run targeted web searches to find anything notable about this person or their company in the last 30 days:
- Tool:
WebSearch
- Searches to run:
"[Full Name]" podcast OR interview OR keynote 2026
"[Company Name]" funding OR acquisition OR launch OR news 2026
"[Full Name]" site:linkedin.com
"[Company Name]" [industry keyword] 2026
- Extract: podcast appearances, published articles, funding rounds, product launches, company news.
- If nothing found in last 30 days: note "No recent news found" and skip this section in the brief.
Part 5 — Build the research brief
Read context/offers.md and identify which 1–2 offers fit this person best based on their role, company size, industry, and pain signals.
Write the Research Brief (concise — short bullets, no paragraphs):
- Who they are: Role at Company — 1–2 lines max
- Company: What it does, size, industry — 1 line
- Right now: What they're focused on (from posts/activity/news) — 1–2 bullets max, skip if no data
- Recent signal: Anything notable from the last 30 days — 1 bullet, skip if nothing found
- Pain signal: Visible problem or frustration based on profile + company context — 1 line
- Best offer fit: Offer name + one-sentence reasoning
- Call type flag: e.g., "Employee, not a founder — confirm budget authority early" or "Warm inbound — likely already sold"
Part 6 — Build the personalized sales script
Run a silent profile analysis before writing. Think through:
- Most relevant aspects of their background (industry, title, experience, seniority)
- Specific signals from LinkedIn + research that can inform the script
- Conversation analysis (if present): What resonated in DMs? What problem did they articulate? Why did they accept the call?
- Likely pain points based on their role and industry
- Which offer maps most naturally and why
- Likely objections (price, timing, DIY)
Generate the Personalized Sales Script following the 12-step framework from references/sales-script-template.md:
- Step 1 (Preparation): 3–5 specific prep items drawn from their profile and research.
- Step 2 (Micro Rapport): 2 rapport questions drawn from their background or career path. Never reference LinkedIn directly — use the insight, not the source.
- Step 3 (Agenda & Alpha Frame): Copy from template — no personalization needed.
- Step 4 (Primary Motive): 2–3 pain-discovery questions tailored to their specific role and situation.
- Steps 5–6 (Discovery + Pain): Adapt questions to their business type, team structure, acquisition/growth context.
- Steps 7–9 (Goal, Defeat, Conviction): Copy from template — no personalization needed.
- Steps 10–11 (Pitch): Name the offer to lead with. Write a 1-sentence positioning line using their own language and context.
- Step 12 (Pricing): State full price, offer same-day decision bonus, stay silent. If they say "too expensive": "Sorry that my price exceeds your value." — then stay silent.
Part 7 — Generate the pitch deck
Auto-pick the best-fit offer using a scoring rubric. Score every offer in context/offers.md against the lead on:
- Role fit (0–3): how well the prospect's title matches the offer's ICP role
- Company fit (0–3): company stage/size fit relative to offer's target
- Pain signal match (0–3): explicit pain in their posts/profile/recent news that the offer solves
- Budget fit (0–2): seniority + company stage suggest they can afford this offer
- Recent intent signal (0–2): bookings, podcasts, posts hinting at the offer's space
- Total possible = 13 per offer. Highest score wins.
Ambiguity rule: if the top two offers are within 1 point of each other, pick the highest-scoring one and add a banner:
⚠ Offer fit ambiguous between [Top Offer] and [Second Offer] (scores X vs Y). Glance before the call and override the deck if the second one feels closer.
Run offer-build-pitch-deck with these inputs:
- Person: full name, role, company
- Enriched profile summary (from Part 3)
- Research brief (from Part 5)
- Sales script (from Part 6)
- Confirmed offer (name, pricing, deliverables from
context/offers.md)
- Deck requirements:
- 8–15 pages max
- Value and outcome driven — sell what they GET and HOW they achieve it with you, not features
- Personalized with their name and company context throughout
- Structure: Problem they have → Cost of not fixing it → The outcome they want → How we get there together → Offer details → Pricing → Next step
- Save pitch deck to:
inbox/outputs/pdf/YYYY-MM-DD-operations-meeting-prep-[firstname-lastname].pdf
Note: offer-build-pitch-deck is included in this starter pack under skills/offer-build-pitch-deck/. Install and configure it first.
Pitch Deck files: After the PDF is generated, note both outputs:
- PDF path:
inbox/outputs/pdf/YYYY-MM-DD-operations-meeting-prep-[firstname-lastname].pdf
- HTML URL:
file:///[YOUR_PROJECT_PATH]/inbox/outputs/html/YYYY-MM-DD-operations-meeting-prep-[firstname-lastname].html
Part 8 — Save and push to Notion
Save the full output to:
inbox/outputs/md/YYYY-MM-DD-operations-meeting-prep-[firstname-lastname].md
Contents:
- Research brief
- Full personalized sales script
- Reference to pitch deck PDF path
Push to the Meeting Prep Report & Sales Script database:
- Tool:
mcp__claude_ai_Notion__notion-create-pages
- parent:
{"type": "data_source_id", "data_source_id": "YOUR_MEETING_PREP_NOTION_DB_ID"}
- Properties:
Day & Date: YYYY-MM-DD — [First Last] call
date:Date:start: today's date in YYYY-MM-DD format
Research Report: the concise research brief text
Pitch Deck: file:///[YOUR_PROJECT_PATH]/inbox/outputs/html/YYYY-MM-DD-operations-meeting-prep-[firstname-lastname].html
- Page body content: the full personalized 12-step sales script
Print one-line summary: "Meeting prep ready for [Name]. Research brief + sales script + pitch deck saved to inbox and Notion."
Output Format
# Meeting Prep — [First Last] — YYYY-MM-DD
> ⚠️ [Call type flag — e.g., "Employee, not a founder — confirm budget authority early"]
---
## Research Brief
- **Who they are:** [Role at Company — 1–2 lines]
- **Company:** [What it does, size, industry]
- **Right now:** [What they're focused on — skip if no data]
- **Recent signal:** [Podcast/funding/news from last 30 days — skip if none]
- **Pain signal:** [Visible problem or gap]
- **Best offer fit:** [Offer name] — [1-sentence why]
---
## Personalized Sales Script
### Step 1: Preparation
...
### Step 12: Pricing
...
---
## Pitch Deck
PDF: `inbox/outputs/pdf/YYYY-MM-DD-operations-meeting-prep-[firstname-lastname].pdf`
HTML (interactive): [Open deck](file:///[YOUR_PROJECT_PATH]/inbox/outputs/html/YYYY-MM-DD-operations-meeting-prep-[firstname-lastname].html)
Edge Cases
- LinkedIn URL provided directly: Skip Part 2 — go straight to enrichment.
- Enrichment returns empty profile: Use whatever partial data is available. Still generate the full script with role/company-informed questions. Note "Enrichment partial" at top.
- No recent posts: Skip "right now" bullet in brief.
- No recent news found (WebSearch): Skip "recent signal" bullet.
- Offer fit ambiguous (top two within 1 point): Pick the highest-scoring offer, generate the deck for it, AND add the ambiguity banner. Never pause.
- Internal meeting (team call, known client check-in): Output "Internal meeting — no prep needed." Skip all enrichment.
- offer-build-pitch-deck skill not available: Note the failure, save the research brief + script only.
- Notion push fails: Save to
inbox/outputs/ only. Tell user: "Notion push failed — output saved locally."
1---2name: operations-meeting-prep3description: Researches a meeting attendee, builds a personalized 12-step sales script, and generates a value-driven pitch deck as PDF. Use this skill when the user says "prep for my meeting", "research [name]", "meeting prep", "get ready for my call with [name]", or provides a name after the morning routine asks about meetings. Triggered as optional last step in /morning after the user confirms a meeting.4---56# operations-meeting-prep78One job: walk into every sales call fully prepared. That means deep LinkedIn enrichment + 30-day web research on the person, a personalized 12-step sales script, and a value-driven pitch deck tailored to that specific person — all stored in Notion under "Meeting Prep Report & Sales Script".910**Automation level:** AUTONOMOUS — runs end-to-end without pausing. When inputs come from a calendar booking (via `/morning`), the LinkedIn URL and meeting time are auto-extracted. Offer fit is auto-picked using the scoring rubric below, with ambiguity flagged in the output rather than gated on user confirmation.1112**Routine position:** /morning step 7. Auto-runs once per Discovery Call booked for today. Also runs standalone when called directly with a name + LinkedIn URL.1314---1516## Setup Required1718Replace these placeholders before running:1920| Placeholder | What to replace it with |21|-------------|------------------------|22| `YOUR_MEETING_PREP_NOTION_DB_ID` | Your "Meeting Prep" Notion database ID |23| `[YOUR_PROJECT_PATH]` | Your local project root path (e.g. `/Users/yourname/Documents/my-claude-os`) |2425---2627## Context to read before running28291. Read `context/offers.md` — know all your offers, their ideal clients, pricing, and positioning angles.302. Read `context/icp.md` — know the ICP profile so you can spot fit or misfit quickly.313. Read `references/sales-script-template.md` — the 12-step framework you'll personalize.3233---3435## Steps3637### Part 1 — Get the person's name, LinkedIn URL, and conversation history3839**Routine mode (called by /morning step 7):** Inputs are pre-extracted from a calendar booking. The orchestrator passes:40- `name` (attendee full name)41- `linkedin_url` (from the booking form's LinkedIn URL field)42- `scheduled_time` (today's call time)43- `dm_conversation` (full DM history with this lead, if available via your LinkedIn outreach tool)4445If `dm_conversation` is non-empty, treat it as primary context — the lead's own words from DMs are the strongest signal for "why did they book the call".4647**Standalone mode (user calls skill directly):**48491. Take the name (and LinkedIn URL if provided) from the user.50 - If no name: ask "Who are you meeting with? Give me their name — and their LinkedIn URL if you have it."51 - If LinkedIn URL is provided: skip Part 2, go straight to Part 3.5253### Part 2 — Find their LinkedIn profile (only if no URL given)54552. Try Playwright first:56 - Tool: `mcp__playwright__browser_navigate`57 - URL: `https://www.linkedin.com/search/results/people/?keywords=[FirstName LastName]`58 - Tool: `mcp__playwright__browser_snapshot`59 - Extract the most likely profile URL by name match.60613. If Playwright fails: use Relay as fallback:62 - Tool: `mcp__claude_ai_Relay_APP_Claude_Code__search_linkedin_for_profile`63 - firstName, lastName, company (if known)64 - Extract the profile URL from the result.65664. If no profile found: note "LinkedIn profile not found — enrichment limited" and continue with name-only context.6768### Part 3 — Enrich the person (LinkedIn enrichment tool)69705. Get their full LinkedIn profile using your LinkedIn enrichment tool (e.g. Trigify CLI: `trigify profile enrich --profile-url <linkedin_url>`).71 - Extract: current role, company, headline, about/summary, experience, education, certifications.72 - If this returns empty or errors: note the failure and continue with whatever partial data is available.73746. Get their company profile:75 - Extract from the enrichment output above. If company fields are missing: note "Company profile unavailable" and continue.76777. Get their recent LinkedIn posts:78 - Use your enrichment tool (e.g. `trigify profile posts --profile-url <linkedin_url> --page 0`)79 - Get last 3–5 posts. Extract: topics, themes, language used, pain points mentioned.80 - If this returns empty: note "No posts available" and continue.8182### Part 4 — 30-day research (web search)83848. Run targeted web searches to find anything notable about this person or their company in the last 30 days:85 - Tool: `WebSearch`86 - Searches to run:87 - `"[Full Name]" podcast OR interview OR keynote 2026`88 - `"[Company Name]" funding OR acquisition OR launch OR news 2026`89 - `"[Full Name]" site:linkedin.com`90 - `"[Company Name]" [industry keyword] 2026`91 - Extract: podcast appearances, published articles, funding rounds, product launches, company news.92 - If nothing found in last 30 days: note "No recent news found" and skip this section in the brief.9394### Part 5 — Build the research brief95969. Read `context/offers.md` and identify which 1–2 offers fit this person best based on their role, company size, industry, and pain signals.979810. Write the **Research Brief** (concise — short bullets, no paragraphs):99 - **Who they are:** Role at Company — 1–2 lines max100 - **Company:** What it does, size, industry — 1 line101 - **Right now:** What they're focused on (from posts/activity/news) — 1–2 bullets max, skip if no data102 - **Recent signal:** Anything notable from the last 30 days — 1 bullet, skip if nothing found103 - **Pain signal:** Visible problem or frustration based on profile + company context — 1 line104 - **Best offer fit:** Offer name + one-sentence reasoning105 - **Call type flag:** e.g., "Employee, not a founder — confirm budget authority early" or "Warm inbound — likely already sold"106107### Part 6 — Build the personalized sales script10810911. Run a silent **profile analysis** before writing. Think through:110 - Most relevant aspects of their background (industry, title, experience, seniority)111 - Specific signals from LinkedIn + research that can inform the script112 - **Conversation analysis (if present):** What resonated in DMs? What problem did they articulate? Why did they accept the call?113 - Likely pain points based on their role and industry114 - Which offer maps most naturally and why115 - Likely objections (price, timing, DIY)11611712. Generate the **Personalized Sales Script** following the 12-step framework from `references/sales-script-template.md`:118119 - **Step 1 (Preparation):** 3–5 specific prep items drawn from their profile and research.120 - **Step 2 (Micro Rapport):** 2 rapport questions drawn from their background or career path. Never reference LinkedIn directly — use the insight, not the source.121 - **Step 3 (Agenda & Alpha Frame):** Copy from template — no personalization needed.122 - **Step 4 (Primary Motive):** 2–3 pain-discovery questions tailored to their specific role and situation.123 - **Steps 5–6 (Discovery + Pain):** Adapt questions to their business type, team structure, acquisition/growth context.124 - **Steps 7–9 (Goal, Defeat, Conviction):** Copy from template — no personalization needed.125 - **Steps 10–11 (Pitch):** Name the offer to lead with. Write a 1-sentence positioning line using their own language and context.126 - **Step 12 (Pricing):** State full price, offer same-day decision bonus, stay silent. If they say "too expensive": *"Sorry that my price exceeds your value."* — then stay silent.127128### Part 7 — Generate the pitch deck12913013. Auto-pick the best-fit offer using a scoring rubric. Score every offer in `context/offers.md` against the lead on:131 - **Role fit** (0–3): how well the prospect's title matches the offer's ICP role132 - **Company fit** (0–3): company stage/size fit relative to offer's target133 - **Pain signal match** (0–3): explicit pain in their posts/profile/recent news that the offer solves134 - **Budget fit** (0–2): seniority + company stage suggest they can afford this offer135 - **Recent intent signal** (0–2): bookings, podcasts, posts hinting at the offer's space136 - Total possible = 13 per offer. Highest score wins.137138 **Ambiguity rule:** if the top two offers are within 1 point of each other, pick the highest-scoring one and add a banner:139 > ⚠ Offer fit ambiguous between **[Top Offer]** and **[Second Offer]** (scores X vs Y). Glance before the call and override the deck if the second one feels closer.14014114. Run `offer-build-pitch-deck` with these inputs:142 - Person: full name, role, company143 - Enriched profile summary (from Part 3)144 - Research brief (from Part 5)145 - Sales script (from Part 6)146 - Confirmed offer (name, pricing, deliverables from `context/offers.md`)147 - Deck requirements:148 - 8–15 pages max149 - Value and outcome driven — sell what they GET and HOW they achieve it with you, not features150 - Personalized with their name and company context throughout151 - Structure: Problem they have → Cost of not fixing it → The outcome they want → How we get there together → Offer details → Pricing → Next step152 - Save pitch deck to: `inbox/outputs/pdf/YYYY-MM-DD-operations-meeting-prep-[firstname-lastname].pdf`153154 > **Note:** `offer-build-pitch-deck` is included in this starter pack under `skills/offer-build-pitch-deck/`. Install and configure it first.15515615. **Pitch Deck files:** After the PDF is generated, note both outputs:157 - PDF path: `inbox/outputs/pdf/YYYY-MM-DD-operations-meeting-prep-[firstname-lastname].pdf`158 - HTML URL: `file:///[YOUR_PROJECT_PATH]/inbox/outputs/html/YYYY-MM-DD-operations-meeting-prep-[firstname-lastname].html`159160### Part 8 — Save and push to Notion16116216. Save the full output to:163 `inbox/outputs/md/YYYY-MM-DD-operations-meeting-prep-[firstname-lastname].md`164165 Contents:166 - Research brief167 - Full personalized sales script168 - Reference to pitch deck PDF path16917017. Push to the **Meeting Prep Report & Sales Script** database:171 - Tool: `mcp__claude_ai_Notion__notion-create-pages`172 - parent: `{"type": "data_source_id", "data_source_id": "YOUR_MEETING_PREP_NOTION_DB_ID"}`173 - Properties:174 - `Day & Date`: `YYYY-MM-DD — [First Last] call`175 - `date:Date:start`: today's date in YYYY-MM-DD format176 - `Research Report`: the concise research brief text177 - `Pitch Deck`: `file:///[YOUR_PROJECT_PATH]/inbox/outputs/html/YYYY-MM-DD-operations-meeting-prep-[firstname-lastname].html`178 - Page body content: the full personalized 12-step sales script17918018. Print one-line summary: "Meeting prep ready for [Name]. Research brief + sales script + pitch deck saved to inbox and Notion."181182---183184## Output Format185186```markdown187# Meeting Prep — [First Last] — YYYY-MM-DD188189> ⚠️ [Call type flag — e.g., "Employee, not a founder — confirm budget authority early"]190191---192193## Research Brief194195- **Who they are:** [Role at Company — 1–2 lines]196- **Company:** [What it does, size, industry]197- **Right now:** [What they're focused on — skip if no data]198- **Recent signal:** [Podcast/funding/news from last 30 days — skip if none]199- **Pain signal:** [Visible problem or gap]200- **Best offer fit:** [Offer name] — [1-sentence why]201202---203204## Personalized Sales Script205206### Step 1: Preparation207...208209### Step 12: Pricing210...211212---213214## Pitch Deck215PDF: `inbox/outputs/pdf/YYYY-MM-DD-operations-meeting-prep-[firstname-lastname].pdf`216HTML (interactive): [Open deck](file:///[YOUR_PROJECT_PATH]/inbox/outputs/html/YYYY-MM-DD-operations-meeting-prep-[firstname-lastname].html)217```218219---220221## Edge Cases222223- **LinkedIn URL provided directly:** Skip Part 2 — go straight to enrichment.224- **Enrichment returns empty profile:** Use whatever partial data is available. Still generate the full script with role/company-informed questions. Note "Enrichment partial" at top.225- **No recent posts:** Skip "right now" bullet in brief.226- **No recent news found (WebSearch):** Skip "recent signal" bullet.227- **Offer fit ambiguous (top two within 1 point):** Pick the highest-scoring offer, generate the deck for it, AND add the ambiguity banner. Never pause.228- **Internal meeting (team call, known client check-in):** Output "Internal meeting — no prep needed." Skip all enrichment.229- **offer-build-pitch-deck skill not available:** Note the failure, save the research brief + script only.230- **Notion push fails:** Save to `inbox/outputs/` only. Tell user: "Notion push failed — output saved locally."