List quality scorecard skill

Pre-send quality scorecard for any lead list.

by growthenginenowoslawski·MIT license·★ 736 Stars on the repo·GitHub ↗

Use now

Files of List quality scorecard

growthenginenowoslawski/main1 file shown
SKILL.md
Show the full text176 lines

List Quality Scorecard

A CSV of 5,000 leads is not the same as a good list of 5,000 leads. This skill grades your list across 8 dimensions BEFORE you send, catching preventable waste.

Why this exists

The three campaign failure modes cold email runners hit most:

  1. Bad list — the copy doesn't matter when you're emailing the wrong people
  2. Unverified emails — bounces burn domain reputation
  3. ICP drift — you think you're targeting VPs, but the list is mostly Managers

Each of these is catchable before you send, in 5 minutes, for free.

Inputs

A CSV with at minimum these columns:

  • email — the primary email
  • first_name, last_name
  • job_title OR title
  • company_name OR company
  • company_domain (optional, derived from email if missing)
  • company_industry (optional, used for ICP fit scoring)
  • company_headcount (optional, used for ICP fit scoring)

Output

A markdown scorecard with:

  • Letter grade (A+ to F)
  • 8 dimension scores (each 0-100)
  • Top 5 issues to fix
  • Pre-send checklist

Usage

npx tsx scripts/score-list.ts --list=leads.csv --icp-file=client-profile.yaml --out=scorecard.md

Optional --icp-file lets the scorecard compare your list against your declared ICP filters (from /icp-onboarding).

The 8 dimensions

1. Email verification coverage (critical)
  • What: % of emails validated via MillionVerifier or equivalent
  • Rule: 100% of a cold list must be verified before sending. Unverified emails = bounces = dead domains.
  • Score: 100 if all verified, 0 if <50% verified
2. Duplicate email rate
  • What: % of duplicate emails in the list
  • Rule: <1% acceptable, >5% is a problem
  • Score: 100 at 0%, drops linearly
3. Duplicate domain rate
  • What: max # of leads from any single domain
  • Rule: 1-2 leads per domain ideal. 5+ suggests you're over-indexing on one company.
  • Score: 100 if avg <2 per domain, 60 if avg 2-5, 30 if >5
4. Title relevance
  • What: % of titles matching your ICP's job title list
  • Rule: Exact-match + synonym list. If 40% of your "VP Sales" list is actually "Sales Manager", you have drift.
  • Score: 100 if ≥80% match, 50 if 40-80%, 0 if <40%
5. Bad-title detection
  • What: % of titles matching known-bad patterns
  • Bad patterns: intern, assistant, coordinator, student, part-time, retired, non-English titles when targeting US
  • Rule: <2% is normal, >10% means your Prospeo filter is too loose
  • Score: 100 if <2%, drops sharply after
6. Catch-all domain density
  • What: % of emails on catch-all domains (e.g., info@, contact@, hello@)
  • Rule: <5% acceptable for B2B outbound
  • Score: 100 if <5%, 50 at 5-15%, 0 if >15%
7. ICP fit
  • What: % of leads matching your client-profile.yaml filters on industry + headcount
  • Requires: --icp-file passed
  • Rule: 80%+ match, 100 if exact
8. Name quality
  • What: % with both first_name AND last_name populated AND looking human
  • Checks: Not all-caps, not fake names ("Admin", "Info"), not email-as-name
  • Rule: 95%+ acceptable
  • Score: 100 if 95%+, drops linearly

Letter grade mapping

Weighted average across 8 dimensions (verification and ICP fit weighted 2x):

Average Grade Action
90-100 A+ / A Ship it
80-89 B Minor fixes, then ship
70-79 C Fix top 3 issues first
60-69 D Serious cleanup required
<60 F Don't send. Rebuild the list.

Example output

=== List Quality Scorecard ===

File: leads.csv (2,147 rows)
Grade: B (84/100)

Dimensions:
1. Email verification:    100/100  (100% verified, good)
2. Duplicate emails:       95/100  (1.1% duplicates — trim before send)
3. Duplicate domains:      78/100  (avg 2.4 per domain — some over-concentration)
4. Title relevance:        82/100  (85% titles match "VP Sales" / "Head of Sales")
5. Bad-title detection:    92/100  (3% Coordinators slipped in — filter)
6. Catch-all density:      80/100  (8% catch-all — consider dropping)
7. ICP fit:                88/100  (88% match declared industry filter)
8. Name quality:           97/100  (good)

Top 5 issues to fix:
1. 23 emails are duplicates (1.1%) — deduplicate before upload
2. 64 leads are on catch-all addresses (3.0%) — drop or deprioritize
3. 64 Coordinators in the list — filter by seniority ≥ Manager
4. 147 leads cluster on 12 domains (>5 each) — cap at 3 per domain
5. 258 leads outside declared industry filter (12%) — filter by company_industry

Pre-send checklist:
[ ] Deduplicate by email
[ ] Drop catch-all if >5% (reduces bounce rate)
[ ] Filter out bad titles
[ ] Cap per-domain concentration
[ ] Re-run verifier if list shrunk >10%

When to use

  • AFTER list-building skills (/prospeo-full-export, /blitz-list-builder, /google-maps-list-builder, /disco-like)
  • AFTER email waterfall (/email-waterfall)
  • BEFORE Smartlead upload

When NOT to use

  • On a list of <100. Sample too small for reliable stats.
  • On a fully static list (same every send). Check once, reuse.

Scripts

  • scripts/score-list.ts — the main scorecard

What to do next

If grade ≥ B: /campaign-copywriting to write the emails. Then /smartlead-campaign-upload-public to launch as DRAFT.

If grade < C: fix the top 3 issues (from scorecard output), re-run this skill until grade ≥ B. Don't upload a C-grade list — bounces and low reply rates will damage domain reputation.

Or wait: if large fixes are needed (missing email verification, 30%+ bad titles), address those BEFORE spending more on email-finding or enrichment.

  • /icp-prompt-builder — more surgical ICP fit scoring (AI per-company)
  • /icp-onboarding — produces the client-profile.yaml this skill checks against
  • /email-waterfall — run BEFORE this skill for verification coverage

The 1% rule alignment

A list that scores below C-grade is very likely to produce reply rates below 1%, which violates the 1% rule (see /email-deliverability-audit). Catching list issues here saves you the deliverability hangover later.

1---
2name: list-quality-scorecard
3description: Pre-send quality scorecard for any lead list. Grades duplicate rate, title diversity, bad-title patterns, catch-all domain density, ICP fit, email verification coverage. Outputs a letter grade + action items BEFORE you send. Catches bad lists before they burn inboxes. Run after email enrichment, before Smartlead upload.
4---
5 
6# List Quality Scorecard
7 
8A CSV of 5,000 leads is not the same as a good list of 5,000 leads. This skill grades your list across 8 dimensions BEFORE you send, catching preventable waste.
9 
10## Why this exists
11 
12The three campaign failure modes cold email runners hit most:
13 
141. **Bad list** — the copy doesn't matter when you're emailing the wrong people
152. **Unverified emails** — bounces burn domain reputation
163. **ICP drift** — you think you're targeting VPs, but the list is mostly Managers
17 
18Each of these is catchable before you send, in 5 minutes, for free.
19 
20## Inputs
21 
22A CSV with at minimum these columns:
23- `email` — the primary email
24- `first_name`, `last_name`
25- `job_title` OR `title`
26- `company_name` OR `company`
27- `company_domain` (optional, derived from email if missing)
28- `company_industry` (optional, used for ICP fit scoring)
29- `company_headcount` (optional, used for ICP fit scoring)
30 
31## Output
32 
33A markdown scorecard with:
34- **Letter grade** (A+ to F)
35- **8 dimension scores** (each 0-100)
36- **Top 5 issues to fix**
37- **Pre-send checklist**
38 
39## Usage
40 
41```bash
42npx tsx scripts/score-list.ts --list=leads.csv --icp-file=client-profile.yaml --out=scorecard.md
43```
44 
45Optional `--icp-file` lets the scorecard compare your list against your declared ICP filters (from `/icp-onboarding`).
46 
47## The 8 dimensions
48 
49### 1. Email verification coverage (critical)
50 
51- **What:** % of emails validated via MillionVerifier or equivalent
52- **Rule:** 100% of a cold list must be verified before sending. Unverified emails = bounces = dead domains.
53- **Score:** 100 if all verified, 0 if <50% verified
54 
55### 2. Duplicate email rate
56 
57- **What:** % of duplicate emails in the list
58- **Rule:** <1% acceptable, >5% is a problem
59- **Score:** 100 at 0%, drops linearly
60 
61### 3. Duplicate domain rate
62 
63- **What:** max # of leads from any single domain
64- **Rule:** 1-2 leads per domain ideal. 5+ suggests you're over-indexing on one company.
65- **Score:** 100 if avg <2 per domain, 60 if avg 2-5, 30 if >5
66 
67### 4. Title relevance
68 
69- **What:** % of titles matching your ICP's job title list
70- **Rule:** Exact-match + synonym list. If 40% of your "VP Sales" list is actually "Sales Manager", you have drift.
71- **Score:** 100 if ≥80% match, 50 if 40-80%, 0 if <40%
72 
73### 5. Bad-title detection
74 
75- **What:** % of titles matching known-bad patterns
76- **Bad patterns:** `intern`, `assistant`, `coordinator`, `student`, `part-time`, `retired`, non-English titles when targeting US
77- **Rule:** <2% is normal, >10% means your Prospeo filter is too loose
78- **Score:** 100 if <2%, drops sharply after
79 
80### 6. Catch-all domain density
81 
82- **What:** % of emails on catch-all domains (e.g., `info@`, `contact@`, `hello@`)
83- **Rule:** <5% acceptable for B2B outbound
84- **Score:** 100 if <5%, 50 at 5-15%, 0 if >15%
85 
86### 7. ICP fit
87 
88- **What:** % of leads matching your `client-profile.yaml` filters on industry + headcount
89- **Requires:** `--icp-file` passed
90- **Rule:** 80%+ match, 100 if exact
91 
92### 8. Name quality
93 
94- **What:** % with both first_name AND last_name populated AND looking human
95- **Checks:** Not all-caps, not fake names ("Admin", "Info"), not email-as-name
96- **Rule:** 95%+ acceptable
97- **Score:** 100 if 95%+, drops linearly
98 
99## Letter grade mapping
100 
101Weighted average across 8 dimensions (verification and ICP fit weighted 2x):
102 
103| Average | Grade | Action |
104|---|---|---|
105| 90-100 | A+ / A | Ship it |
106| 80-89 | B | Minor fixes, then ship |
107| 70-79 | C | Fix top 3 issues first |
108| 60-69 | D | Serious cleanup required |
109| <60 | F | Don't send. Rebuild the list. |
110 
111## Example output
112 
113```
114=== List Quality Scorecard ===
115 
116File: leads.csv (2,147 rows)
117Grade: B (84/100)
118 
119Dimensions:
1201. Email verification: 100/100 (100% verified, good)
1212. Duplicate emails: 95/100 (1.1% duplicates — trim before send)
1223. Duplicate domains: 78/100 (avg 2.4 per domain — some over-concentration)
1234. Title relevance: 82/100 (85% titles match "VP Sales" / "Head of Sales")
1245. Bad-title detection: 92/100 (3% Coordinators slipped in — filter)
1256. Catch-all density: 80/100 (8% catch-all — consider dropping)
1267. ICP fit: 88/100 (88% match declared industry filter)
1278. Name quality: 97/100 (good)
128 
129Top 5 issues to fix:
1301. 23 emails are duplicates (1.1%) — deduplicate before upload
1312. 64 leads are on catch-all addresses (3.0%) — drop or deprioritize
1323. 64 Coordinators in the list — filter by seniority ≥ Manager
1334. 147 leads cluster on 12 domains (>5 each) — cap at 3 per domain
1345. 258 leads outside declared industry filter (12%) — filter by company_industry
135 
136Pre-send checklist:
137[ ] Deduplicate by email
138[ ] Drop catch-all if >5% (reduces bounce rate)
139[ ] Filter out bad titles
140[ ] Cap per-domain concentration
141[ ] Re-run verifier if list shrunk >10%
142```
143 
144## When to use
145 
146- AFTER list-building skills (`/prospeo-full-export`, `/blitz-list-builder`, `/google-maps-list-builder`, `/disco-like`)
147- AFTER email waterfall (`/email-waterfall`)
148- BEFORE Smartlead upload
149 
150## When NOT to use
151 
152- On a list of <100. Sample too small for reliable stats.
153- On a fully static list (same every send). Check once, reuse.
154 
155## Scripts
156 
157- `scripts/score-list.ts` — the main scorecard
158 
159## What to do next
160 
161**If grade ≥ B:** `/campaign-copywriting` to write the emails. Then `/smartlead-campaign-upload-public` to launch as DRAFT.
162 
163**If grade < C:** fix the top 3 issues (from scorecard output), re-run this skill until grade ≥ B. Don't upload a C-grade list — bounces and low reply rates will damage domain reputation.
164 
165**Or wait:** if large fixes are needed (missing email verification, 30%+ bad titles), address those BEFORE spending more on email-finding or enrichment.
166 
167## Related skills
168 
169- `/icp-prompt-builder` — more surgical ICP fit scoring (AI per-company)
170- `/icp-onboarding` — produces the `client-profile.yaml` this skill checks against
171- `/email-waterfall` — run BEFORE this skill for verification coverage
172 
173## The 1% rule alignment
174 
175A list that scores below C-grade is very likely to produce reply rates below 1%, which violates the 1% rule (see `/email-deliverability-audit`). Catching list issues here saves you the deliverability hangover later.
176 

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 · MITCold email outreachRun end-to-end B2B cold-email outreach through the Hyper MCP — enrich prospects with Apollo, scrape per-prospect signals from company sites and LinkedIn, draft personalized emails using proven hook frameworks, send via Gmail with safe defaults, and route replies into labeled folders. Use when the user wants to write cold emails, run an outbound sequence, prospect a list, build a follow-up cadence, "reach out to leads," or asks why nobody is replying to their cold emails.Sales & ecommerce · MITBuild a system for handling sales leadsTell us how leads reach your team today and you get back a written playbook for scoring, routing, and following up on every lead fast.Business & ops · MIT