List quality scorecard skill
Pre-send quality scorecard for any lead list.
by growthenginenowoslawski·MIT license·★ 736 Stars on the repo·GitHub ↗
npx degit growthenginenowoslawski/coldoutboundskills/skills/list-quality-scorecard#main ~/.claude/skills/list-quality-scorecardChecked ·commit main
Files of List quality scorecard
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:
- Bad list — the copy doesn't matter when you're emailing the wrong people
- Unverified emails — bounces burn domain reputation
- 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 emailfirst_name,last_namejob_titleORtitlecompany_nameORcompanycompany_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.yamlfilters on industry + headcount - Requires:
--icp-filepassed - 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.
Related skills
/icp-prompt-builder— more surgical ICP fit scoring (AI per-company)/icp-onboarding— produces theclient-profile.yamlthis 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 | |
| 2 | name list-quality-scorecard |
| 3 | description 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 | |
| 8 | 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. |
| 9 | |
| 10 | ## Why this exists |
| 11 | |
| 12 | The three campaign failure modes cold email runners hit most: |
| 13 | |
| 14 | **Bad list** — the copy doesn't matter when you're emailing the wrong people |
| 15 | **Unverified emails** — bounces burn domain reputation |
| 16 | **ICP drift** — you think you're targeting VPs, but the list is mostly Managers |
| 17 | |
| 18 | Each of these is catchable before you send, in 5 minutes, for free. |
| 19 | |
| 20 | ## Inputs |
| 21 | |
| 22 | A 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 | |
| 33 | A 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 | |
| 42 | npx tsx scripts/score-list.ts --list=leads.csv --icp-file=client-profile.yaml --out=scorecard.md |
| 43 | |
| 44 | |
| 45 | Optional `--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 | |
| 101 | Weighted 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 | |
| 116 | File: leads.csv (2,147 rows) |
| 117 | Grade: B (84/100) |
| 118 | |
| 119 | Dimensions: |
| 120 | 1. Email verification: 100/100 (100% verified, good) |
| 121 | 2. Duplicate emails: 95/100 (1.1% duplicates — trim before send) |
| 122 | 3. Duplicate domains: 78/100 (avg 2.4 per domain — some over-concentration) |
| 123 | 4. Title relevance: 82/100 (85% titles match "VP Sales" / "Head of Sales") |
| 124 | 5. Bad-title detection: 92/100 (3% Coordinators slipped in — filter) |
| 125 | 6. Catch-all density: 80/100 (8% catch-all — consider dropping) |
| 126 | 7. ICP fit: 88/100 (88% match declared industry filter) |
| 127 | 8. Name quality: 97/100 (good) |
| 128 | |
| 129 | Top 5 issues to fix: |
| 130 | 1. 23 emails are duplicates (1.1%) — deduplicate before upload |
| 131 | 2. 64 leads are on catch-all addresses (3.0%) — drop or deprioritize |
| 132 | 3. 64 Coordinators in the list — filter by seniority ≥ Manager |
| 133 | 4. 147 leads cluster on 12 domains (>5 each) — cap at 3 per domain |
| 134 | 5. 258 leads outside declared industry filter (12%) — filter by company_industry |
| 135 | |
| 136 | Pre-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 | |
| 175 | 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. |
| 176 |
Discussion
Alternatives
Browse more free Claude skills or everything in Sales.