From sales
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.
npx claudepluginhub naveedharri/benai-skills --plugin salesThis skill uses the workspace's default tool permissions.
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.
Generates design tokens/docs from CSS/Tailwind/styled-components codebases, audits visual consistency across 10 dimensions, detects AI slop in UI.
Records polished WebM UI demo videos of web apps using Playwright with cursor overlay, natural pacing, and three-phase scripting. Activates for demo, walkthrough, screen recording, or tutorial requests.
Delivers idiomatic Kotlin patterns for null safety, immutability, sealed classes, coroutines, Flows, extensions, DSL builders, and Gradle DSL. Use when writing, reviewing, refactoring, or designing Kotlin code.
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.
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:
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.
Use AskUserQuestion to collect what you need. Combine into 1-2 calls max.
Question 1 -- Which pipeline and stage? "Which CRM list/pipeline should I review, and which stage(s) do you want me to focus on?"
list-lists to show them the options.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."
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?"
After collecting answers, confirm your understanding before pulling data.
Read references/CONNECTORS.md for connector-specific patterns. The general flow:
list-lists (Attio) or equivalent to locate the target pipelinelist-list-attribute-definitions to identify the stage field slug, deal value field, and other entry-level attributeslist-attribute-definitions on the parent object (usually "people") to understand where email, phone, name liveCRM 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:
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.
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:
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:
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:
Run email searches in parallel where possible -- don't do them one at a time.
Check which transcription tools are available:
fireflies_search with the prospect's name or email, then fireflies_get_summary for the most recent call(s)search-call-recordings-by-metadata with speaker_person_record_ids or related_record_idsFor each prospect, pull the summary of their most recent 1-2 calls. You need:
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.
For each prospect, synthesize the CRM data, emails, and call transcripts into a clear picture:
Sales cycle status:
Next action:
Priority tier:
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:
Gone cold / Lost: Prospects where all communication has dried up. Signals include:
Unqualified: Prospects who show signs of being a poor fit. Signals include:
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.
PIPELINE REVIEW -- [Stage Name] ([count] prospects, $[total value])
[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)
If the user asked about multiple stages, separate them with a blank line and a stage header. But keep the same compact format.
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.
Use short labels inline with each prospect line:
[HOT] -- respond today[WARM] -- follow up this week[--] -- monitoring, no urgent action[RISK] -- going coldslack_search_users"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.