with one click
icp-scorer
// Score leads against your Ideal Customer Profile. Analyzes title, company, industry fit and assigns A/B/C/D tiers for prioritization.
// Score leads against your Ideal Customer Profile. Analyzes title, company, industry fit and assigns A/B/C/D tiers for prioritization.
| name | icp-scorer |
| description | Score leads against your Ideal Customer Profile. Analyzes title, company, industry fit and assigns A/B/C/D tiers for prioritization. |
Score leads against your Ideal Customer Profile to prioritize outreach.
# Score leads with default ICP
./scripts/score.sh leads.json > scored.json
# Score with custom ICP config
ICP_CONFIG=my-icp.json ./scripts/score.sh leads.json > scored.json
# Filter to A/B tier only
./scripts/score.sh leads.json | jq '.leads | map(select(.tier == "A" or .tier == "B"))'
# For AI-powered scoring (optional but recommended)
export ANTHROPIC_API_KEY="sk-ant-..."
# OR
export OPENAI_API_KEY="sk-..."
Create icp-config.json:
{
"target_titles": [
"VP Marketing",
"Head of Marketing",
"CMO",
"Director of Marketing",
"Head of Growth",
"Founder",
"CEO",
"Agency Owner"
],
"target_industries": [
"SaaS",
"E-commerce",
"DTC",
"Marketing Agency",
"Technology"
],
"company_size": {
"min": 10,
"max": 500,
"ideal": "50-200"
},
"keywords": [
"AI", "automation", "marketing", "growth", "scale"
],
"exclude_titles": [
"Student",
"Intern",
"Looking for",
"Open to work"
]
}
| Category | Points | Criteria |
|---|---|---|
| Title Match | 0-25 | Exact match = 25, Close = 20, Related = 15, Adjacent = 10 |
| Company Size | 0-20 | Perfect fit = 20, In range = 15, Close = 10 |
| Industry | 0-20 | Exact match = 20, Adjacent = 15, Related = 10 |
| Keywords | 0-15 | Multiple matches = 15, Some = 10, Few = 5 |
| Engagement | 0-10 | From intent_score (comment > reaction) |
| Signals | 0-10 | Hiring, funding, growth mentions |
Total: 100 points
| Tier | Score | Action |
|---|---|---|
| A | 80-100 | Priority outreach, heavy personalization |
| B | 60-79 | Include in sequence, moderate personalization |
| C | 40-59 | Lower priority, template outreach |
| D | 0-39 | Skip or save for later |
Expects output from lead-enricher:
{
"leads": [
{
"name": "Jane Doe",
"headline": "VP Marketing at Acme Corp | AI Enthusiast",
"company": "Acme Corp",
"company_size": "51-200",
"company_industry": "SaaS",
"linkedin_url": "https://linkedin.com/in/janedoe",
"intent_score": 10,
"engagement_text": "Great insights on AI automation!"
}
]
}
{
"meta": {
"total_leads": 50,
"tier_a": 8,
"tier_b": 15,
"tier_c": 12,
"tier_d": 15,
"scored_at": "2026-02-14T15:00:00Z"
},
"leads": [
{
"name": "Jane Doe",
"headline": "VP Marketing at Acme Corp | AI Enthusiast",
"company": "Acme Corp",
"linkedin_url": "https://linkedin.com/in/janedoe",
"icp_score": 85,
"tier": "A",
"score_breakdown": {
"title_match": 25,
"company_size": 20,
"industry": 20,
"keywords": 10,
"engagement": 10,
"signals": 0
},
"score_reason": "Exact title match (VP Marketing), ideal company size, SaaS industry, AI keywords in headline"
}
]
}
Uses keyword matching and rules. Good for high volume.
SCORING_MODE=rules ./scripts/score.sh leads.json
Uses Claude/GPT to analyze fit. Better for nuanced scoring.
SCORING_MODE=ai ./scripts/score.sh leads.json
# Full pipeline
./linkedin-miner/scripts/mine.sh "AI marketing" 20 > raw.json
./lead-enricher/scripts/profile-enrich.sh raw.json | \
./lead-enricher/scripts/enrich.sh > enriched.json
./icp-scorer/scripts/score.sh enriched.json > scored.json
# Get A-tier leads only
cat scored.json | jq '.leads | map(select(.tier == "A"))'
{
"target_titles": ["Founder", "CEO", "Agency Owner", "Managing Director"],
"target_industries": ["Marketing Agency", "Creative Agency", "Digital Agency"],
"company_size": {"min": 5, "max": 50}
}
{
"target_titles": ["VP Marketing", "Head of Growth", "CMO", "Director Marketing"],
"target_industries": ["SaaS", "Technology", "Software"],
"company_size": {"min": 50, "max": 500}
}
{
"target_titles": ["Founder", "CEO", "Head of Marketing", "E-commerce Manager"],
"target_industries": ["E-commerce", "DTC", "Retail", "Consumer Goods"],
"company_size": {"min": 10, "max": 200}
}
Generate comprehensive research briefs before sales calls. Pulls company info, recent news, prospect background, and suggests talking points.
Scan A-tier leads for buying signals using Perplexity deep research. Checks for funding, hiring, press, and growth indicators to prioritize the hottest prospects.
Verify email addresses before sending to protect deliverability. Uses Hunter.io verification API. Filters out invalid, disposable, and risky emails.
Load leads and email sequences into Instantly.ai campaigns. Handles lead upload, custom variables, and campaign management.
Enrich leads with full LinkedIn profile data (RapidAPI) and verified work emails (Hunter.io + Apollo). Two-stage enrichment for maximum data capture.
Mine LinkedIn posts for engaged prospects using Fresh LinkedIn Data API (RapidAPI). Scrapes posts by keyword/influencer and extracts engagers (commenters + reactors) with profile data.