pipeline-review ยท diff
git:20260627.94fdd8b to git:20260723.0af5e11
73 added, 96 removed. Audit A to A.
---
name: pipeline-review
- description: Pipeline review and next-action planner. Pulls all prospects from a specified CRM pipeline stage, analyzes
- every email thread and meeting transcript for each prospect, then delivers a concise per-prospect status
- summary with sales cycle recap, action items, contact details (email + phone), and CRM hygiene
- recommendations -- sent directly as a Slack message. This skill is READ-ONLY: it gathers data and reports
- on it but never modifies CRM records. Connects to any CRM (Attio, HubSpot, Salesforce, Pipedrive), email,
- and call transcription tools (Fireflies, Fathom, Gong). MANDATORY TRIGGERS: "pipeline review", "review my
- pipeline", "pipeline status", "what's happening with my deals", "where do my deals stand", "deal status
- report", "pipeline action items", "next steps for my deals", "prospect recap", or any request about
- reviewing active prospects in a pipeline stage and determining next steps.
+ description: Pipeline review and next-action planner. Pulls all prospects from a specified CRM pipeline stage, analyzes every email thread and meeting transcript per prospect, then delivers a concise per-prospect status summary with sales cycle recap, action items (yours and theirs), and contact details, plus a cross-pipeline synthesis of patterns and priorities. Works with Attio or Pipedrive, Gmail, and Fireflies, and degrades gracefully when a source is missing. Use when the user says "review my pipeline", "what is the status of my deals", "next actions for my prospects", "pipeline review for [stage]", or wants a stage-by-stage read of where every deal stands and what to do next.
+ disable-model-invocation: true
---
# Pipeline Review
Pull every prospect from a target pipeline stage, cross-reference their full email history and meeting transcripts, and produce a concise action-oriented summary sent via Slack.
- This skill is **read-only** -- it pulls data and delivers insights but never creates, updates, or deletes CRM records. If the user wants CRM changes (moving stages, deleting duplicates), list the recommendations clearly so they can act on them manually.
-
## What This Skill Produces
- A Slack message (sent to the user or a channel they specify) that fits in roughly **15 lines or fewer**. The message packs the maximum useful information into a tight, skimmable format:
+ A Slack message (sent to the user or a channel they specify) containing, for each prospect:
- - Per-prospect: name, email, phone, deal value, 1-line status, and next action
- - A CRM hygiene section flagging duplicates, no-shows, gone-cold prospects, and unqualified leads with clear recommendations
- - A priority summary so the user knows what to do first
+ - Contact info (email, phone)
+ - Deal value and pipeline metadata (stage, priority, forecast)
+ - A 1-3 sentence recap of the sales cycle so far
+ - Action items from YOUR end (what your team needs to do)
+ - Action items from THEIR end (what the prospect owes you)
+ - A clear recommendation: follow up, escalate, or move out of pipeline
- The message is concise and skimmable -- no emojis, no walls of text. A busy founder should be able to scan it in under 60 seconds and know exactly what to do today.
+ The message is concise and skimmable -- no emojis, no walls of text. A busy founder should be able to scan it in under 2 minutes and know exactly what to do today.
## Phase 0: Gather Context
- Use `AskUserQuestion` to collect what you need. Combine into 1-2 calls max.
+ Use `AskUserQuestion` to collect what you need. Combine into 1-2 calls.
### Round 1 -- Pipeline & Delivery
**Question 1 -- Which pipeline and stage?**
"Which CRM list/pipeline should I review, and which stage(s) do you want me to focus on?"
- If they don't know the exact list name, use `list-lists` to show them the options.
- - If they specify multiple stages, ask whether each stage needs full analysis (email + call history) or just a headcount/summary. Some stages (like "Meeting Booked" where no calls have happened yet) only need a prospect list, not deep analysis.
+ - Common stages: "Next Call Scheduled", "Proposal Sent", "Negotiation", "Follow-up Needed"
**Question 2 -- Where should I send the summary?**
"Where do you want the pipeline summary sent? I can DM you on Slack or post it to a channel."
- Default: DM to the user. Search for their Slack user by email from CRM workspace membership.
### Round 2 -- Scope (if needed)
- **Question 3 -- Any prospects to skip or special instructions?**
- "Should I review ALL prospects in those stages, or skip any? Anything specific you want me to flag?"
- - Usually the answer is "all" -- but some users want to exclude recently-added leads or focus on specific names.
+ **Question 3 -- Any prospects to skip?**
+ "Should I review ALL prospects in that stage, or skip any?"
+ - Usually the answer is "all" -- but some users want to exclude recently-added leads or specific names.
After collecting answers, confirm your understanding before pulling data.
## Phase 1: Data Collection
### Step 1 -- Discover CRM Structure
Read `references/CONNECTORS.md` for connector-specific patterns. The general flow:
1. **Find the list**: Use `list-lists` (Attio) or equivalent to locate the target pipeline
2. **Understand the schema**: Use `list-list-attribute-definitions` to identify the stage field slug, deal value field, and other entry-level attributes
3. **Identify record-level fields**: Use `list-attribute-definitions` on the parent object (usually "people") to understand where email, phone, name live
- ### Step 2 -- Pull All Prospects from the Target Stage(s)
+ ### Step 2 -- Pull All Prospects from the Target Stage
- CRM APIs paginate (typically 50 records max per request), and stage filtering can be unreliable depending on the CRM.
+ This is the step that requires the most care. CRM APIs paginate (typically 50 records max per request), and stage filtering can be unreliable depending on the CRM.
**Recommended approach -- full scan with local filtering:**
Rather than relying on server-side stage filters (which can fail silently or have inconsistent syntax), pull ALL entries from the list in paginated batches and filter locally. This is more reliable and avoids missing prospects due to filter syntax issues.
```
offset = 0
all_target_entries = []
while has_more:
batch = list-records-in-list(list=TARGET_LIST, limit=50, offset=offset)
for entry in batch:
- if entry.stage in TARGET_STAGES:
+ if entry.stage == TARGET_STAGE:
all_target_entries.append(entry)
offset += 50
```
Save entry-level data as you go: entry_id, parent_record_id, stage, deal value, priority, forecast, close date, notes, agreement stage.
**Important**: Count your results and sanity-check with the user. If they say "I see 10 prospects" but you only found 4, you missed some. Go back and re-scan.
- **Duplicate detection**: While scanning, track `parent_record_id` occurrences. If the same record appears more than once in the same stage, that's a duplicate entry. Log these for the CRM hygiene section.
-
### Step 3 -- Fetch Contact Details
Collect all unique `parent_record_id` values from the entries, then batch-fetch person records:
```
get-records-by-ids(object="people", record_ids=[...])
```
Extract for each prospect:
- **Name** (required)
- - **Email address** (required -- also needed for email/call searches, and included in the Slack message)
- - **Phone number** (required in the Slack message -- include even if you have to note "no phone on file")
+ - **Email address** (required -- also needed for email/call searches)
+ - **Phone number** (include if available)
- **Company** (if linked)
- **Location** (if available)
### Step 4 -- Pull Email History for Each Prospect
- For every prospect that needs deep analysis (not stages where the user only wants a summary), search for all email threads using their email address:
+ For every prospect, search for all email threads using their email address:
```
search-emails-by-metadata(participant_email_addresses=["prospect@company.com"], limit=10)
```
This returns email metadata: subject, summary, snippet, sender, sent_at. For the most recent 2-3 emails, pull full content with `get-email-content` if the summary alone doesn't tell you enough about the current state.
Key things to extract from emails:
- When was the last email exchange? (recency = urgency signal)
- Who sent the last email -- us or them? (ball in whose court?)
- What was discussed? Any commitments, questions, or objections?
- - Any calendar interactions? (accepted/declined meetings = engagement signal)
- Any new stakeholders cc'd? (buying committee expansion = good sign)
Run email searches in parallel where possible -- don't do them one at a time.
### Step 5 -- Pull Meeting/Call Transcripts
Check which transcription tools are available:
- **Fireflies**: Use `fireflies_search` with the prospect's name or email, then `fireflies_get_summary` for the most recent call(s)
- **Attio call recordings**: Use `search-call-recordings-by-metadata` with speaker_person_record_ids or related_record_ids
- **Other tools**: Check available MCPs for Gong, Fathom, Otter, etc.
For each prospect, pull the summary of their most recent 1-2 calls. You need:
- When the call happened
- Key topics discussed
- Action items from the call
- Any objections or concerns raised
- Next steps that were agreed on
If no transcription tool is connected, skip this step and note it in the output. The email analysis alone is still valuable.
- If a transcription service rate-limits you, fall back to email analysis for the remaining prospects and note the limitation.
-
## Phase 2: Analysis
- ### Per-Prospect Analysis
-
- For each prospect, synthesize the CRM data, emails, and call transcripts into a clear picture:
+ For each prospect, synthesize the CRM data, emails, and call transcripts into a clear picture. Think about:
**Sales cycle status:**
- - Where are they in the buying process?
+ - Where are they in the buying process? (early discovery, evaluation, negotiation, stalled)
- How long have they been in this stage?
- Is momentum building or fading?
- **Next action:**
- - What's the single most important thing to do for this prospect?
+ **Action items -- our end:**
+ - Proposals or materials we promised but haven't sent
+ - Follow-up calls we need to schedule
+ - Questions from the prospect we haven't answered
+ - Internal tasks (get pricing approved, loop in a specialist, etc.)
- **Priority tier:**
+ **Action items -- their end:**
+ - Feedback they promised but haven't delivered
+ - Internal reviews or approvals they're waiting on
+ - Stakeholders they need to loop in
+ - Documents or access they need to provide
+
+ **Recommendation:**
- HOT: Respond today -- they're actively engaged or just reached out
- - WARM: Follow up this week -- there's momentum but it'll fade without action
+ - URGENT: Follow up this week -- there's momentum but it'll fade without action
- MONITOR: Keep nurturing -- engaged but not ready to move
- - AT RISK: Going cold -- needs a re-engagement attempt or a decision to move out
-
- ### CRM Hygiene Check
-
- This is a critical part of the review. Scan the data you've already collected and flag:
-
- **Duplicates**: Same `parent_record_id` appearing multiple times in the same stage. List which entries are duplicates and recommend keeping the earliest one (or the one with the most data) and deleting the rest.
-
- **No-shows**: Prospects who had meetings booked but evidence suggests they didn't attend or cancelled. Signals include:
- - Calendar decline in email history
- - Meeting booked but zero follow-up communication afterward
- - Explicit "can't make it" or rescheduled-then-ghosted patterns
- Recommend moving these to a "No Show" stage.
-
- **Gone cold / Lost**: Prospects where all communication has dried up. Signals include:
- - No email exchange in 4+ weeks
- - Explicit decline ("going a different direction", "not interested")
- - Multiple unanswered follow-ups
- Recommend moving these to "Lost" stage.
-
- **Unqualified**: Prospects who show signs of being a poor fit. Signals include:
- - Personal email domain (gmail, yahoo, etc.) with no company affiliation
- - No engagement at all -- no email replies, no call, no calendar interaction
- - Job title or company mismatch with your ICP
- Recommend moving these to "Unqualified" stage.
+ - AT RISK: Going cold -- needs a re-engagement attempt or decision to move out
## Phase 3: Compose and Send
- ### The 15-Line Rule
-
- The Slack message must be **concise enough to scan in under 60 seconds**. Aim for roughly 15 lines total. This is a hard constraint -- if you have 20 prospects, you can't give each one 4 lines. Compress.
-
- The way to achieve this: each prospect gets ONE line. Use a tabular/compact format. Put the detailed CRM hygiene recommendations at the bottom in 2-3 lines.
-
### Message Format
+ Structure the Slack message like this (no emojis anywhere):
+
```
- PIPELINE REVIEW -- [Stage Name] ([count] prospects, $[total value])
+ PIPELINE REVIEW -- [Stage Name] ([count] Prospects)
+ Total pipeline value: $X
- [PRIORITY] [Name] | [email] | [phone] | $[value] -- [1-line status + next action]
- [PRIORITY] [Name] | [email] | [phone] | $[value] -- [1-line status + next action]
- ...
+ ---
- CRM CLEANUP NEEDED:
- - Duplicates: [names] (delete extra entries)
- - No-shows: [names] (move to No Show)
- - Lost: [names] (move to Lost)
- - Unqualified: [names] (move to Unqualified)
- ```
+ [PRIORITY TIER: e.g., "RESPOND TODAY"]
- If the user asked about multiple stages, separate them with a blank line and a stage header. But keep the same compact format.
+ [NUMBER]. [NAME] -- $[VALUE] | [Agreement Stage] | [Priority]
+ Email: [email] | Phone: [phone]
+ Sales cycle: [1-3 sentence recap of where things stand]
+ Our action: [What we need to do]
+ Their action: [What they owe us]
- For stages the user only wants a summary of (like "Meeting Booked" with no call history), just list names with contact info and any notable flags -- don't do the full status analysis.
+ ---
- ### Priority Labels
+ [Next priority tier...]
- Use short labels inline with each prospect line:
- - `[HOT]` -- respond today
- - `[WARM]` -- follow up this week
- - `[--]` -- monitoring, no urgent action
- - `[RISK]` -- going cold
+ ---
+ PRIORITY SUMMARY:
+ 1. TODAY: [brief list]
+ 2. THIS WEEK: [brief list]
+ 3. NEXT WEEK: [brief list]
+ ```
+
### Formatting Rules
- - No emojis. None.
- - Each prospect = ONE line. Name, email, phone, value, and a short status phrase.
- - Use Slack markdown sparingly: *bold* for section headers only.
- - Group by priority, most urgent first.
- - CRM hygiene section at the end, 2-4 lines max.
- - The entire message should be roughly 15 lines. If you have too many prospects, consider grouping low-priority ones (e.g., "[MONITOR] 5 others on track, no action needed").
+ - No emojis. None. Not even one.
+ - No bold headers with colons followed by long paragraphs. Keep everything tight.
+ - Each prospect block should be 4-6 lines max.
+ - Use Slack markdown (*bold* for names and section headers, not for emphasis within sentences).
+ - Group prospects by urgency tier, most urgent first.
+ - End with a numbered priority summary so the user knows what to do in what order.
### Sending
1. Find the user's Slack ID: search by email or name using `slack_search_users`
2. Send to their DM (user_id as channel_id) or to the channel they specified
3. Confirm the message was sent and share the link
## Troubleshooting
**"I see more prospects than you found"**
This almost always means the pagination or filtering missed some. Re-scan ALL entries without any server-side filter and count matches manually. The full-scan approach described in Step 2 prevents this.
**"No emails found for a prospect"**
Check if the email address in the CRM is correct. Some prospects use a different email for scheduling vs. correspondence. Try searching by name in Fireflies if email search returns nothing.
**"Fireflies has no calls for this prospect"**
The meeting may be under a colleague's name. Try searching by the prospect's company name or by the date range when the deal was active.
**Rate limits or timeouts**
- CRM and email APIs may rate-limit. If you hit limits, add small delays between requests. For Fireflies, the search endpoint can be slow -- be patient and retry on timeout. If rate-limited, fall back to email-only analysis for the remaining prospects rather than stalling the entire review.
+ CRM and email APIs may rate-limit. If you hit limits, add small delays between requests. For Fireflies, the search endpoint can be slow -- be patient and retry on timeout.
+
+ ## Self-improvement
+
+ This skill is never finished. Improve it as you use it.
+
+ - When the user corrects how a step was done, update the relevant reference file (or this SKILL.md) so the correction sticks. Do not just fix it for this run.
+ - When a correction is a hard rule ("always do X", "never do Y"), add it as a permanent rule here.
+ - When the user says an output was genuinely good, save it to `references/examples/` so it becomes a model for future runs.
+ - Keep the skill small while you do this: when you add something, run the deletion test and cut anything that no longer changes behavior.