Email Validation
Validation Scoring
Cleanmails assigns a score from 0–100 to each validated lead. This page explains exactly how the scoring algorithm works.
Scoring Breakdown
Points are added based on each check that passes:
| Check | Points | Notes |
|---|---|---|
| Valid syntax (RFC 5322) | +20 | If syntax fails → score is 0, status: invalid |
| Has MX records | +35 | If no MX → score is 10, status: invalid |
| Not a role account | +15 | Role accounts (info@, admin@) get 0 here |
| Not a free email | +15 | Free providers (Gmail, Yahoo) get +5 instead |
| Reachable: yes | +15 | Domain suggestion / inference indicates reachable |
| Reachable: unknown | +10 | Can't determine reachability |
| Reachable: no | -20 | Strong signal that address doesn't exist |
Instant Failures
Some checks bypass the scoring and mark the lead as invalid immediately:
| Condition | Score | Status |
|---|---|---|
| Invalid syntax | 0 | Invalid |
| Disposable domain | 5 | Invalid |
| No MX records | 10 | Invalid |
Status Categories
| Score Range | Status | Dashboard Color | Recommendation |
|---|---|---|---|
| 60–100 | Valid | Green | Safe to include in campaigns |
| 35–59 | Risky | Amber | May bounce — consider excluding from cold outreach |
| 0–34 | Invalid | Red | Do not send — will damage sender reputation |
Example Scores
| Score | Reason | |
|---|---|---|
| john@company.com | 85 | Valid syntax (+20), MX found (+35), not role (+15), not free (+15) |
| john@gmail.com | 75 | Valid syntax (+20), MX found (+35), not role (+15), free email (+5) |
| info@company.com | 70 | Valid syntax (+20), MX found (+35), role account (+0), not free (+15) |
| john@throwaway.io | 5 | Disposable domain → instant invalid |
| john@nonexistentdomain.xyz | 10 | No MX records → instant invalid |
Validation Checks in Detail
| Check | Speed | What It Does |
|---|---|---|
| Syntax | <1ms | RFC 5322 regex validation |
| Disposable | <1ms | In-memory lookup against 120,000+ known throwaway domains |
| Role Account | <1ms | Pattern match: info@, admin@, support@, etc. |
| Free Provider | <1ms | Known free providers: Gmail, Yahoo, Outlook, ProtonMail, etc. |
| DNS MX Lookup | ~50-100ms | Queries domain for mail exchange records |
| DNS A Fallback | ~50ms | If no MX, checks for an A record (implicit MX) |
| Domain Suggestion | ~5ms | Levenshtein distance to suggest typo corrections |
Concurrency
Validation runs 100 leads in parallel. Each goroutine performs one DNS lookup (~50-100ms) — no heavy CPU or memory usage. A 5,000-lead list typically completes in under 30 seconds.
Filtering by Status
In the dashboard, the lead list view shows a validation summary bar with clickable filters:
- All — Show all leads regardless of status
- Valid — Only leads scored 60+
- Risky — Only leads scored 35–59
- Invalid — Only leads scored 0–34
Use these filters to quickly exclude bad leads before assigning them to campaigns.