Score leads skill

Lead scoring skill for Claude Code and Codex: tier inbound or outbound leads as Hot/Warm/Cold against a buyer persona and ICP.

by explorium-ai·MIT license·★ 197 Stars on the repo·GitHub ↗

Use now

Inside this skill

SKILL.md · the author's own words
# Score Leads

Gather verified person, account, and trigger evidence per lead so a downstream model can tier leads Hot / Warm / Cold against a stated pers…

## Input

- Leads (required): list of prospect IDs, emails, LinkedIn URLs, or name+company rows. Mixed types allowed.
- Buyer persona (required): target job titles or title keywords, seniority, and department.
- ICP (required): country (or region-country), company size buckets, optional revenue buckets, optional industry (LinkedIn or NAICS, mutual…
- Source label per lead (optional): e.g. demo_request, pricing_inquiry, free_trial, content_download, webinar_attended, cold_inbound. Passe…
- Tier thresholds (optional): Hot and Warm cutoffs on the composite the caller computes.
- Trigger lookback (optional): default 90 days for recent business events.

## Workflow

1. Lock the persona and ICP rule set. Restate persona (titles, seniority, department) and the ICP filter shape. Discover canonical values f…

Word-for-word excerpt, not a result. Read the full SKILL.md ↓

Files of Score leads

explorium-ai/main1 file shown
SKILL.md
Show the full text48 lines
score-leads/SKILL.md48 lines · 7.4 KB

Score Leads

Gather verified person, account, and trigger evidence per lead so a downstream model can tier leads Hot / Warm / Cold against a stated persona and ICP. This skill collects the evidence and restates the rule set; it does NOT apply scoring math.

Input

  • Leads (required): list of prospect IDs, emails, LinkedIn URLs, or name+company rows. Mixed types allowed.
  • Buyer persona (required): target job titles or title keywords, seniority, and department.
  • ICP (required): country (or region-country), company size buckets, optional revenue buckets, optional industry (LinkedIn or NAICS, mutually exclusive), optional tech stack, optional company age.
  • Source label per lead (optional): e.g. demo_request, pricing_inquiry, free_trial, content_download, webinar_attended, cold_inbound. Passed through verbatim.
  • Tier thresholds (optional): Hot and Warm cutoffs on the composite the caller computes.
  • Trigger lookback (optional): default 90 days for recent business events.

Workflow

  1. Lock the persona and ICP rule set. Restate persona (titles, seniority, department) and the ICP filter shape. Discover canonical values for every free-text dimension (industry, tech stack, job title, city) before applying any filter. Tighten persona matches by intersecting a job-title filter with a seniority filter: a title-only filter is loose and returns near-matches at the rim. Note the mutually exclusive choices (LinkedIn vs NAICS; country vs region-country). Echo persona and ICP in the output so scoring math is auditable.
  2. Resolve each lead. Bucket every input row; never silently drop one. Known prospect IDs pass through. Email rows resolve by email: email is a unique identifier, so a no-match is a hard fail, NOT a fallback to name search (a typo'd email must not silently resolve to a different real person). LinkedIn URL rows resolve by URL. Name+company rows resolve by full name plus company name or domain: person matching returns only an id or null (no confidence score, no candidate list), so a name+company match at a 10k+ employee company is indistinguishable from a unique email match. Treat name+company matches as Verified-with-caveat by default. Free-text rows like "Jane Doe at Acme" parse to the name+company path. Persona-only rows (no name, "the CFO at Notion") must NOT use full_name="CFO" (silently returns nothing); instead match the business, then sample prospects at that account filtered by canonical job title and seniority, and surface the candidates as Verified (caveat) for the user to pick. Tag each row: Auto-resolved, Verified (caveat), Ambiguous (pause), or Failed (no match). Never reroute Failed emails into name search.
  3. Enrich the person. Profile (full name, title, seniority, department, linkedin URL) plus contacts. Default email-only (cheaper); switch to email + phone only when phone is required (SDR dialer flows). Per-prospect post history is a current gap; if recent activity matters, pull the employer's recent posts as a substitute.
  4. Resolve and enrich the lead's company. Match the business by domain or name, then enrich firmographics (headcount, revenue range, country, industry, size bucket, age, description). Add technographics when the ICP names a tech stack. Add funding posture when the ICP cares about stage.
  5. Fetch recent triggers per account on the configured lookback (default 90 days). Relevant events: new funding rounds, leadership hires in the persona's department, hiring surges in the persona's department, office openings or relocations, product launches, new partnerships. For accounts where prospect-level moves matter (job change into the persona seat), also fetch prospect events. Tag each event with age in days. Event-attribution sanity check: ensure events tie to the matched business, not blended across parent / subsidiary entities.
  6. Optional ICP corroboration. If the caller wants to know whether the lead's account looks like the broader ICP shape, size the ICP filter set once and attach the summary (total addressable count, size bucket distribution, top industries). Do not re-pull per lead.
  7. Compose one evidence row per lead. Each row carries: input identifier, resolution status, person id, full name, title, mapped seniority (canonical), mapped department, email, phone, linkedin URL, company name, company domain, business id, headcount, revenue range, country, industry, size bucket, revenue bucket, tech stack hits (only those intersecting the ICP tech list), top 3 recent events (type, age in days, one-line summary), source label, caveat strings (Stale, Ambiguous, Failed, Missing phone, Email not found). Process in chunks of ~25 end-to-end so working context does not balloon.
  8. State the scoring boundary explicitly. The output ships the per-lead evidence plus the rule set verbatim. Composite scoring and tier assignment (Hot / Warm / Cold) are the caller's job. Do not invent a composite score in this skill.

Output Format

  • Restated rules: persona (titles, seniority set, department set); ICP filter set (exact object with canonical-resolved values, plus the industry-taxonomy and country-vs-region choices); trigger lookback in days.
  • Resolution summary: one row per input with input, resolved name, person id, status. Status legend: Auto-resolved, Verified (caveat), Ambiguous, Failed.
  • Per-lead evidence rows: one row per lead with the columns from step 7.
  • ICP shape (optional, when corroboration ran): total addressable count, top size buckets, top industries.
  • Scoring rules handed to the caller: persona-match rule (title list, seniority set, department set), ICP-match rule (the filter object), source weights (or raw label pass-through), trigger weights (event-type weights and recency decay), tier thresholds (Hot and Warm cutoffs).
  • Caveats: Failed leads are not scoreable, list separately; stale records (>12 months) get a "downweight title-based fit" flag; Hot-candidate leads missing both phone and professional email get a "verify contact data before outreach" flag.

Limitations

  • Scoring math is downstream LLM work. This skill gathers evidence and restates the rule set; it does NOT produce a composite score or assign a tier.
  • Name+company resolution can return multiple plausible matches at large companies; those rows surface as Ambiguous, and the matching response carries no confidence signal to disambiguate.
  • Company size and revenue are bucketed, not exact counts; persona/ICP math must work against the bucket.
  • Industry taxonomy (LinkedIn vs NAICS) is mutually exclusive on a single ICP filter.
  • No built-in scoring engine, no contact data-quality sort, no native employee or revenue sort, no Inc/Fortune ranking signal, no metro taxonomy, no sub-department job-function filter.
  • Department is null for many cross-functional senior roles (Chief X Officer, President, Founder). Group these under "Unattributed".
  • The mapped seniority column should show the canonical value used for filtering.
1---
2name: score-leads
3description: "Lead scoring skill for Claude Code and Codex: tier inbound or outbound leads as Hot/Warm/Cold against a buyer persona and ICP. Resolves each lead, fetches person profile and contact data, pulls account firmographics and recent business events, and returns per-lead evidence rows. Use for inbound lead scoring, CRM enrichment scoring, MQL prioritization, and outbound contact prioritization. Triggers on 'score these leads', 'tier this list', 'rank inbound', 'prioritize my MQLs', 'which lead should I call first', 'data enrichment for inbound scoring'. Works in Claude Code, Codex, and other AI agents."
4---
5 
6# Score Leads
7 
8Gather verified person, account, and trigger evidence per lead so a downstream model can tier leads Hot / Warm / Cold against a stated persona and ICP. This skill collects the evidence and restates the rule set; it does NOT apply scoring math.
9 
10## Input
11 
12- Leads (required): list of prospect IDs, emails, LinkedIn URLs, or name+company rows. Mixed types allowed.
13- Buyer persona (required): target job titles or title keywords, seniority, and department.
14- ICP (required): country (or region-country), company size buckets, optional revenue buckets, optional industry (LinkedIn or NAICS, mutually exclusive), optional tech stack, optional company age.
15- Source label per lead (optional): e.g. demo_request, pricing_inquiry, free_trial, content_download, webinar_attended, cold_inbound. Passed through verbatim.
16- Tier thresholds (optional): Hot and Warm cutoffs on the composite the caller computes.
17- Trigger lookback (optional): default 90 days for recent business events.
18 
19## Workflow
20 
211. Lock the persona and ICP rule set. Restate persona (titles, seniority, department) and the ICP filter shape. Discover canonical values for every free-text dimension (industry, tech stack, job title, city) before applying any filter. Tighten persona matches by intersecting a job-title filter with a seniority filter: a title-only filter is loose and returns near-matches at the rim. Note the mutually exclusive choices (LinkedIn vs NAICS; country vs region-country). Echo persona and ICP in the output so scoring math is auditable.
222. Resolve each lead. Bucket every input row; never silently drop one. Known prospect IDs pass through. Email rows resolve by email: email is a unique identifier, so a no-match is a hard fail, NOT a fallback to name search (a typo'd email must not silently resolve to a different real person). LinkedIn URL rows resolve by URL. Name+company rows resolve by full name plus company name or domain: person matching returns only an id or null (no confidence score, no candidate list), so a name+company match at a 10k+ employee company is indistinguishable from a unique email match. Treat name+company matches as Verified-with-caveat by default. Free-text rows like "Jane Doe at Acme" parse to the name+company path. Persona-only rows (no name, "the CFO at Notion") must NOT use full_name="CFO" (silently returns nothing); instead match the business, then sample prospects at that account filtered by canonical job title and seniority, and surface the candidates as Verified (caveat) for the user to pick. Tag each row: Auto-resolved, Verified (caveat), Ambiguous (pause), or Failed (no match). Never reroute Failed emails into name search.
233. Enrich the person. Profile (full name, title, seniority, department, linkedin URL) plus contacts. Default email-only (cheaper); switch to email + phone only when phone is required (SDR dialer flows). Per-prospect post history is a current gap; if recent activity matters, pull the employer's recent posts as a substitute.
244. Resolve and enrich the lead's company. Match the business by domain or name, then enrich firmographics (headcount, revenue range, country, industry, size bucket, age, description). Add technographics when the ICP names a tech stack. Add funding posture when the ICP cares about stage.
255. Fetch recent triggers per account on the configured lookback (default 90 days). Relevant events: new funding rounds, leadership hires in the persona's department, hiring surges in the persona's department, office openings or relocations, product launches, new partnerships. For accounts where prospect-level moves matter (job change into the persona seat), also fetch prospect events. Tag each event with age in days. Event-attribution sanity check: ensure events tie to the matched business, not blended across parent / subsidiary entities.
266. Optional ICP corroboration. If the caller wants to know whether the lead's account looks like the broader ICP shape, size the ICP filter set once and attach the summary (total addressable count, size bucket distribution, top industries). Do not re-pull per lead.
277. Compose one evidence row per lead. Each row carries: input identifier, resolution status, person id, full name, title, mapped seniority (canonical), mapped department, email, phone, linkedin URL, company name, company domain, business id, headcount, revenue range, country, industry, size bucket, revenue bucket, tech stack hits (only those intersecting the ICP tech list), top 3 recent events (type, age in days, one-line summary), source label, caveat strings (Stale, Ambiguous, Failed, Missing phone, Email not found). Process in chunks of ~25 end-to-end so working context does not balloon.
288. State the scoring boundary explicitly. The output ships the per-lead evidence plus the rule set verbatim. Composite scoring and tier assignment (Hot / Warm / Cold) are the caller's job. Do not invent a composite score in this skill.
29 
30## Output Format
31 
32- Restated rules: persona (titles, seniority set, department set); ICP filter set (exact object with canonical-resolved values, plus the industry-taxonomy and country-vs-region choices); trigger lookback in days.
33- Resolution summary: one row per input with input, resolved name, person id, status. Status legend: Auto-resolved, Verified (caveat), Ambiguous, Failed.
34- Per-lead evidence rows: one row per lead with the columns from step 7.
35- ICP shape (optional, when corroboration ran): total addressable count, top size buckets, top industries.
36- Scoring rules handed to the caller: persona-match rule (title list, seniority set, department set), ICP-match rule (the filter object), source weights (or raw label pass-through), trigger weights (event-type weights and recency decay), tier thresholds (Hot and Warm cutoffs).
37- Caveats: Failed leads are not scoreable, list separately; stale records (>12 months) get a "downweight title-based fit" flag; Hot-candidate leads missing both phone and professional email get a "verify contact data before outreach" flag.
38 
39## Limitations
40 
41- Scoring math is downstream LLM work. This skill gathers evidence and restates the rule set; it does NOT produce a composite score or assign a tier.
42- Name+company resolution can return multiple plausible matches at large companies; those rows surface as Ambiguous, and the matching response carries no confidence signal to disambiguate.
43- Company size and revenue are bucketed, not exact counts; persona/ICP math must work against the bucket.
44- Industry taxonomy (LinkedIn vs NAICS) is mutually exclusive on a single ICP filter.
45- No built-in scoring engine, no contact data-quality sort, no native employee or revenue sort, no Inc/Fortune ranking signal, no metro taxonomy, no sub-department job-function filter.
46- Department is null for many cross-functional senior roles (Chief X Officer, President, Founder). Group these under "Unattributed".
47- The mapped seniority column should show the canonical value used for filtering.
48 

Discussion

Alternatives

AI Sales Team — Main OrchestratorYou are a comprehensive AI sales intelligence and outreach system for Claude Code. You help founders, sales teams, agency owners, and…Sales & ecommerce · MITAuto research publicAutonomous cold email campaign launcher. Takes one target company domain, scrapes their website, generates an ICP with Claude, pulls matching leads via Prospeo, enriches emails + company descriptions, personalizes each lead with parallel Claude Code Task sub-agents (A/B/C variants), and uploads as a live Smartlead campaign. Uses local JSON files for state (no database required). Use for automated daily campaign launches after you have an initial `client-profile.yaml` from /icp-onboarding. Triggers on "auto-research", "launch an automated campaign", "daily campaign", "run the research loop".Sales & ecommerce · MITABM Campaign — DIY PlaybookABM campaign skill for Claude Code: run a full Account-Based Marketing campaign end-to-end — from ICP definition to live LinkedIn Ads. Builds targeted account lists with Vibe Prospecting, enriches and scores companies with real-time B2B data, generates personalized ad creatives with Claude Code and Figma, pushes matched audiences to LinkedIn Ads, and monitors campaigns daily at scale. The complete GTM skill for AI-driven account-based marketing in Claude Code, Codex, Hermes-Agent, and OpenClaw. No agency needed.Sales & ecommerce · MITAccount contact shortlistContact data skill for Claude Code and Codex: build a ranked shortlist of decision-makers and contacts at a target company for outbound prospecting, deal acceleration, or renewal/expansion plays. Returns verified contact data including email, phone, LinkedIn profile, title, seniority, and department. Provide a company name or domain plus optional seniority focus or use case. Use for contact data enrichment, LinkedIn profile lookup, and building outbound contact lists. Works in Claude Code, Codex, Hermes-Agent, and OpenClaw.Business & ops · MIT