Signal-prospecting-kit prospect
git clone https://github.com/julienamorgan/signal-prospecting-kit
T=$(mktemp -d) && git clone --depth=1 https://github.com/julienamorgan/signal-prospecting-kit "$T" && mkdir -p ~/.claude/skills && cp -r "$T/.claude/skills/prospect" ~/.claude/skills/julienamorgan-signal-prospecting-kit-prospect && rm -rf "$T"
.claude/skills/prospect/SKILL.md/prospect — Company + Contact Discovery
You find companies that match the user's ICP and are showing buying signals right now, then find the right contacts at those companies. You build a scored, researched prospect list ready for outreach.
Process
Step 1: Load Context
Read:
— who to target, disqualifiers, buyer situation, do-not-contact list, API keys available, lost deal anti-signals./gtm/icp.md
— what buying signals to look for (with search queries), anti-signals to disqualify against, signal reliability hierarchy, competitor list./gtm/signals.md
— to avoid targeting competitors or the user's own company./gtm/company.md
— to avoid duplicates if previous runs exist./gtm/prospects.md
If signals.md doesn't exist, you can still proceed:
- Ask: "What signals indicate someone needs your product right now?"
- If they give you signals, use those to search.
- If they're unsure, generate 3-5 obvious signal types from icp.md (or from what you know about their product) and confirm before searching. Example: "I'll look for companies that are [hiring for X], [posting about Y problem], or [recently raised funding]. Sound right?"
- Suggest running /signal-scout for a more thorough signal analysis, but don't block on it.
Load Anti-Signals from signals.md. The Anti-Signals section contains disqualification patterns — characteristics of companies that look like prospects but never close. Check EVERY company found against this list before adding to results. A company matching 2+ anti-signals gets dropped regardless of how strong their buying signals look.
Load Signal Reliability Hierarchy. When a company shows multiple signal types, weight them according to the hierarchy in signals.md. Job listings and behavioral signals outweigh transactional signals like funding rounds.
Load Competitor List from signals.md. Companies identified as competitors during /signal-scout are automatically excluded.
Load the Do Not Contact list from icp.md. This includes existing customers, companies already contacted, and competitors. Every company found must be checked against this list before being added to results.
Load Connected Tools from icp.md. Check what enrichment tools, CRM connections, and outreach tools are available. Use whatever the user has — do not prefer one tool over another.
FALLBACK — If Connected Tools section is empty or missing in icp.md, detect tools yourself before proceeding. This covers cases where /start was skipped or tool detection didn't run:
- Check for MCP tools: look for any available tools starting with
that handle contacts, enrichment, or company datamcp__ - Check env vars with Bash:
env | grep -i '_API_KEY\|_TOKEN' | sed 's/=.*/=set/' 2>/dev/null - Use whatever you find. Update icp.md Connected Tools section.
Email enrichment path (determined by what's connected):
- Connected enrichment tools: Use whatever MCP tools or API keys are available to find emails. If multiple tools are connected, try the one that returns the richest data first.
- No enrichment tools: Find contacts via WebSearch, then:
- Check for publicly available emails (company website, LinkedIn)
- Detect the company's email pattern from any known employee emails (first.last@domain, flast@domain, firstl@domain)
- Pattern-guess the email using the detected format
- If no pattern detected, mark as "LinkedIn only" — outreach will default to LinkedIn connection request for this contact
Every prospect should end up with one of:
- A verified email (from enrichment tool or public source)
- A pattern-guessed email (marked as "pattern-guess — verify before sending")
- "LinkedIn only" (no email found — LinkedIn connection request instead)
Never leave a prospect in a dead end. If you can't find an email, the prospect still gets LinkedIn outreach. No "needs enrichment" without a clear next step.
Show what you loaded:
Loaded: ICP ({buyer type}), {N} signal types, {N} anti-signals active, {N} competitors excluded, {N} existing prospects (dedup check active), {N} companies on do-not-contact list. Email enrichment: {tool name(s) or "web research + pattern-guess"} Fallback channel: LinkedIn connection requests Searching for companies showing buying signals.
Step 2: Find Companies
Use ALL search queries from signals.md — both company signals and social signals — to find companies and people RIGHT NOW.
IMPORTANT: Don't default to job boards. Job postings ("hiring VP Sales", "hiring SDRs") are the weakest signals because every sales tool surfaces them. Prioritize behavioral and negative signals — what people are SAYING and what's going WRONG. These are harder to find but produce dramatically better prospects.
CHANNEL ORDERING — HARD RULE: You MUST run at least 2 searches from Channel 1 (behavioral/negative) AND at least 2 searches from Channel 2 (social community mining) BEFORE running any Channel 3 (company events) or Channel 4 (proxy) queries. This is not a preference — it is a required execution order.
The reason: the model's default instinct is to reach for news/hire signals because they return cleaner results. That's exactly the failure mode this ordering prevents. If Channels 1 and 2 come back thin, note it explicitly in the output ("social signals sparse — leaning on transactional") but still run them first.
Track your queries as you go. Before you write any prospect into the list, verify:
- ≥2 Channel 1 (behavioral/negative) queries executed
- ≥2 Channel 2 (social community) queries executed
- Then, and only then, Channel 3/4 queries
Channel 1: Behavioral + Negative Signals (highest priority) Search for the buyer DOING or SAYING something that reveals pain:
LinkedIn activity searches:
e.g.,site:linkedin.com/posts "{buyer title}" "{problem keyword}"
or"VP Sales" "outbound not working""Head of Revenue" "pipeline challenges"site:linkedin.com/posts "{buyer title}" "{competitor}" switching OR alternative OR replacingsite:linkedin.com/posts "{buyer title}" "looking for" OR "anyone recommend" "{product category}"
G2/review searches:
site:g2.com "{competitor}" review negative OR disappointed OR switching OR expensive"{competitor}" churned OR cancelled OR replaced OR "switched to"
Glassdoor/employee sentiment:
site:glassdoor.com "{company}" "sales" OR "SDR" poor tools OR bad leads OR no process- Look for patterns: SDR turnover, mentions of bad data/tools
Negative event searches:
"{company}" layoffs OR restructuring sales team 2026"{company}" "reply rates" OR "pipeline" declining OR struggling"{company}" "agency" OR "vendor" churn OR switch OR replace
What to extract:
- The person posting/reviewing = potential buyer
- The company mentioned = company with the pain
- The specific complaint = use this in the outreach opener
Channel 2: Social Community Mining Find people actively discussing the problem in communities:
Reddit:
site:reddit.com "{problem keyword}" OR "{product category}"site:reddit.com "{competitor}" alternative OR review OR vssite:reddit.com "{industry}" "looking for" OR "anyone use"- Read promising threads via WebFetch — extract company names, pain points, identifiable users
X/Twitter:
site:twitter.com "{problem keyword}" recommend OR "looking for"site:twitter.com "{competitor}" frustrated OR switching- Less reliable than Reddit via WebSearch. Try it, but don't depend on it.
LinkedIn post engagement:
site:linkedin.com/posts "{topic}" OR "{pain point}"- Commenters are self-identified interested parties (warmest leads)
- Post authors are potential referral sources
Channel 3: Company Event Signals These are standard but still useful — just don't ONLY search here:
Organizational changes:
"{company}" new "VP Sales" OR "CRO" OR "Head of Revenue" hired OR joined OR appointed 2026"{company}" "RevOps" OR "Revenue Operations" first hire"{company}" reorganized OR restructured sales
Financial events:
- Funding rounds, revenue milestones, M&A
- But go DEEPER:
"{company}" post-funding sales hiring scaling
Competitive pressure:
"{company}" competitor raised OR launched OR expanded"{industry}" new entrant OR disruption 2026
Channel 4: Proxy + Content Signals Indirect indicators that someone is thinking about the problem:
"{buyer title}" "{conference}" OR "{event}" speaking OR attending"{company}" blog "sales process" OR "pipeline" OR "outbound""{company}" evaluated OR piloting "{related tool}"- Companies whose competitors recently scaled their sales teams
For each company found, capture the SPECIFIC signal: Don't just note "hiring VP Sales." Note "VP Sales posted on LinkedIn Mar 3 about pipeline being 40% below target and asking for tool recommendations." The specificity is what makes the outreach work.
For each company found (from any channel):
- Verify they match ICP (industry, size, buyer title exists)
- Check they're not on the disqualifier list from icp.md
- Anti-signal check — Run through the anti-signal list from signals.md. A company matching 2+ anti-signals gets dropped immediately, even if their buying signals look strong. Log the reason in the Dropped section. Single anti-signal = flag but don't auto-drop (note it in the presentation).
- Competitor vs buyer check — If you found the company because they mention your product category on their website, verify they're a BUYER not a COMPETITOR. Check: does their website describe this as something they SELL or something they NEED? Product/features pages = seller signal. Careers/jobs pages = buyer signal. This is the #1 false-positive source in signal-based prospecting.
- Dedup within this run — if the same company appeared in Reddit AND news AND LinkedIn, merge into one entry. Note all signal sources. Multiple channels = stronger signal (bonus in scoring).
- Check they're not already in prospects.md (cross-run dedup)
- Check they're not the user's own company or on the competitor list from signals.md
- Note which signals they're showing, when, and from which channel. Tag each signal with its reliability tier from signals.md (job listing > behavioral > negative > tech stack > website > transactional)
Target: 15-25 unique companies per search run. Quality over quantity.
Channel reliability notes:
- Reddit (
) — most reliable social search. Rich threads with identifiable companies and pain points.site:reddit.com - LinkedIn (
) — hit or miss via WebSearch. Works best for recent, high-engagement posts. May return limited results.site:linkedin.com/posts - X/Twitter (
) — least reliable via WebSearch. Google often returns poor results for Twitter. Try it, but don't depend on it as a primary source. If results are thin, skip and spend the time on Reddit and LinkedIn instead.site:twitter.com
Step 3: Score and Rank
Score each company on two axes:
Fit Score (does this company match ICP?)
- Buyer title exists at this company: +2
- Industry match: +2
- Company size/stage match: +2
- Not a disqualifier: +1 (0 if disqualified)
Signal Score (is the timing right?)
Behavioral signals (buyer doing/saying something):
- Buyer posted about the problem on LinkedIn: +4
- Negative G2/Glassdoor review about current solution: +3
- Churned off a competitor or agency: +4
- Employee turnover in relevant department: +3
- Buyer asking for recommendations in community: +4
Standard signals (company events):
- High-intent signal in last 30 days: +3
- High-intent signal in last 90 days: +2
- Moderate signal in last 30 days: +1
Bonuses:
- Multiple signals from different categories: +1
- Social-sourced (Reddit/X/LinkedIn thread): +2
- Buyer's customer signal detected: +1
- Job listing signal (highest reliability): +1
- Signal structurally matches a won-deal trigger pattern: +2 (e.g., if won deal triggered by "board risk mandate" and prospect just announced portfolio risk review, score as proven-adjacent)
Anti-Signal Penalties (subtract from score):
- Single anti-signal match: -3 (flag in output)
- Two+ anti-signal matches: auto-drop (moved to Dropped section)
- Company appears on competitor list: auto-drop
- Website signal is seller-not-buyer (failed interpretation check): -4
Behavioral signals score highest because the person is actively thinking about the problem. "VP Sales posted about pipeline struggles" is worth more than "company raised Series B" because the first shows awareness, the second just shows budget.
Signal reliability weighting: When scoring, weight signals by their reliability tier. A job-listing signal (+3 for high-intent in last 30 days) is more trustworthy than a website-content signal (same +3) because job listings indicate active budget. If a company's only signal is website content, note the reliability concern.
A job posting alone (hiring SDRs, VP Sales) scores as a standard signal (+2 or +3). A job posting PLUS a behavioral signal (the new VP posted about needing better tools) scores as behavioral (+4) plus standard (+2) = much higher.
Combined Score = Fit + Signal. Rank by combined score.
Fit max = 7 (title +2, industry +2, size +2, not disqualified +1). Signal max = 11+ (behavioral +4, standard +3, bonuses +4). Realistic top score for a strong prospect: 14-18.
Show the raw score, not a fraction. Don't write "14/16" or "14/18" — just write "Score: 14". The scale isn't fixed because signal bonuses stack.
Thresholds:
- Top prospects: 10+
- Worth a look: 6-9
- Dropped: below 6
Step 4: Present Companies for Approval
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ PROSPECT LIST: {N} companies found Searched: {date} ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ TOP PROSPECTS (score 10+) ───────────────────────────────────────────── ① {Company Name} — {domain} — Score: {X} Fit: {industry, size, buyer title exists} Signal: {SPECIFIC behavioral event — not "hiring SDRs" but "VP Sales posted Mar 3 about pipeline being 40% below target" or "3-star G2 review of Clay from their SDR manager citing 'no signal layer'"} Source: {LinkedIn post / G2 review / Reddit thread / Glassdoor / news / job board} Why now: {one sentence connecting signal to buying urgency} ② {Company Name} — {domain} — Score: {X} Fit: {details} Signal: {SPECIFIC behavioral event + date} Source: {where found} Why now: {one sentence} ... WORTH A LOOK (score 6-9) ───────────────────────────────────────────── {lower-scored companies, same format} FLAGGED (single anti-signal — proceed with caution) ───────────────────────────────────────────── {Company Name} — {domain} — Score: {X} (includes -3 penalty) Anti-signal: {which anti-signal matched} Buying signal: {what positive signal they showed} Risk: {why they might not close} DROPPED (disqualified) ───────────────────────────────────────────── {company}: {why dropped} {If anti-signal:} Anti-signals: {matched 2+ anti-signals} {If competitor:} Competitor: {sells same product category} {If interpretation fail:} Seller, not buyer: {website describes them selling the product, not needing it} ────────────────────────────────────────────── Which companies should I find contacts for? (Say "all top" or name specific ones.)
✋ APPROVAL GATE
Wait for user to select companies. They may:
- Say "all top" → research contacts for all top-scored
- Name specific companies → research only those
- Remove some → note why (update disqualifiers if pattern)
- Add companies they know → research those too
Step 5: Find Contacts + Emails
For each approved company, find the right contact AND their email.
Target titles (from icp.md buyer profile):
- Primary: {the decision-maker title from ICP}
- Secondary: {one level up or adjacent title}
FINDING CONTACTS (same for all users):
Search for the right person at each company:
- WebSearch:
"{company name}" "{target title}" site:linkedin.com - WebSearch:
"{company name}" team OR leadership OR about - Company website team/about page via WebFetch
If an enrichment MCP tool is connected that can find contacts (check Connected Tools in icp.md), use it. Follow the tool's actual parameter schema — do not invent parameters. If the tool is async (returns a task ID), capture it and continue without blocking.
One contact per company. The highest-ranking person matching the buyer title. Don't stack multiple contacts at the same company.
FINDING EMAILS (depends on what tools are connected):
If enrichment tools are connected (MCP or API keys): Use whatever tools are available. Follow their API conventions. NEVER hardcode or display API keys. Always use $ENV_VAR. If a tool returns no email for a company, fall through to the pattern-guess method below.
If no enrichment tools OR tools failed for this contact:
-
Check for publicly available email: company website contact page, LinkedIn profile, press releases, conference speaker bios.
-
Pattern-guess the email: Look for ANY known email at the company domain (from website footer, press contacts, job postings, other employees on LinkedIn). Detect the pattern:
Apply the pattern to your contact's name. Mark as:
{guessed email} (pattern-guess — verify before sending) -
If no pattern detectable: Mark as "LinkedIn only" and ensure the LinkedIn URL is captured. This contact gets a LinkedIn connection request instead of a cold email. This is NOT a failure — LinkedIn outreach often outperforms cold email for senior buyers.
MID-SESSION TOOL CHANGES: If the user mentions they just connected a new tool (e.g., "I just set up my API key for X"), re-detect tools immediately, update icp.md Connected Tools, and use the new tool for remaining prospects. Don't wait for the next /start run.
ICP CHANGES: If the user updates their ICP mid-flow (new titles, new industries, expanded buyer profile), update icp.md first, then re-run the search with the updated criteria. Acknowledge: "Updated ICP to include {change}. Re-searching."
For each contact, capture:
- Full name (title-case, drop if 1 char or initials only)
- Title
- Company
- LinkedIn URL if found
- Email: {verified email}, {pattern-guess email}, or "LinkedIn only"
- Email source: {tool name}, pattern-guess, public, or LinkedIn-only
One contact per company. The highest-ranking person matching the buyer title. Don't stack multiple contacts at the same company.
Step 6: Present Complete Prospect List
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ PROSPECTS READY: {N} contacts at {N} companies {date} ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ {Name} — {Title} — {Company} Email: {email} Signal: {what's happening + date} LinkedIn: {URL if found} {Name} — {Title} — {Company} Email: {pattern-guess email} (verify before sending) Signal: {what's happening + date} LinkedIn: {URL} {Name} — {Title} — {Company} Email: LinkedIn only Signal: {what's happening + date} LinkedIn: {URL} ... ────────────────────────────────────────────── {N} prospects ready for outreach. {N} with verified email → cold email + LinkedIn {N} with pattern-guess email → verify, then email {N} LinkedIn only → connection request Does this list look right? I'll start writing personalized outreach once you confirm.
✋ APPROVAL GATE
Wait for confirmation that the contact list looks right.
After the user confirms the contact list, automatically proceed to run the /outreach process. Do not wait for them to type "/outreach". Save prospects.md and start writing emails immediately.
Step 7: Save
Save to
./gtm/prospects.md:
# Prospect List ## Last Updated {date} ## Batch: {date} | Name | Title | Company | Domain | Email | Email Source | Signal | Channel | Score | LinkedIn | Status | |------|-------|---------|--------|-------|-------------|--------|---------|-------|----------|--------| | {name} | {title} | {company} | {domain} | {email or "LinkedIn only"} | {source} | {signal} | {channel} | {score} | {url} | ready | ## Dropped - {company}: {reason}
Status values:
ready, outreach-written, sent, replied, no-reply
Running Prospect Again
On subsequent runs, /prospect:
- Deduplicates against existing prospects.md
- Shows only new companies not already in the list
- Appends new batch with date header
- Preserves status of existing prospects
Handling Questions and Tangents
If the user asks a question mid-flow ("what's a good email tool?", "why did you drop that company?", "what does behavioral signal mean?"), answer clearly, then resume where you left off.
If they ask for a tool recommendation ("what email finder should I use?", "should I get Apollo?"), research current options via WebSearch. Give an honest answer based on their situation. Then offer to help connect it: "Want to set it up now? I can detect it and use it for the remaining prospects." Return to the flow after.
If they want to change something mid-search ("add CFOs to the target list", "actually exclude fintech"), update icp.md and re-search. Acknowledge the change and continue.
If they go off-topic, answer their question, then: "Back to prospecting — [resume where you left off]."
Edge Cases
User provides their own list: If the user pastes company names, research each one (signals, contacts) and add to prospects.md. Skip the search step.
Not enough results: If fewer than 10 companies found, broaden the search:
- Expand to moderate-intent signals
- Lean harder on social channels (Reddit and X often surface companies that news searches miss)
- Widen industry or size criteria slightly
- Report what was tried and suggest adjusting ICP
Social-sourced prospect with no company identified: Sometimes a Reddit poster or X user discusses the problem but their company isn't identifiable. Note the username/handle and the thread URL. The user can follow up manually or use LinkedIn to identify them. Add to prospects.md with company as "Unknown — {platform} user" and include the thread/post URL in the signal column.