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:

CheckPointsNotes
Valid syntax (RFC 5322)+20If syntax fails → score is 0, status: invalid
Has MX records+35If no MX → score is 10, status: invalid
Not a role account+15Role accounts (info@, admin@) get 0 here
Not a free email+15Free providers (Gmail, Yahoo) get +5 instead
Reachable: yes+15Domain suggestion / inference indicates reachable
Reachable: unknown+10Can't determine reachability
Reachable: no-20Strong signal that address doesn't exist

Instant Failures

Some checks bypass the scoring and mark the lead as invalid immediately:

ConditionScoreStatus
Invalid syntax0Invalid
Disposable domain5Invalid
No MX records10Invalid

Status Categories

Score RangeStatusDashboard ColorRecommendation
60–100ValidGreenSafe to include in campaigns
35–59RiskyAmberMay bounce — consider excluding from cold outreach
0–34InvalidRedDo not send — will damage sender reputation

Example Scores

EmailScoreReason
john@company.com85Valid syntax (+20), MX found (+35), not role (+15), not free (+15)
john@gmail.com75Valid syntax (+20), MX found (+35), not role (+15), free email (+5)
info@company.com70Valid syntax (+20), MX found (+35), role account (+0), not free (+15)
john@throwaway.io5Disposable domain → instant invalid
john@nonexistentdomain.xyz10No MX records → instant invalid

Validation Checks in Detail

CheckSpeedWhat It Does
Syntax<1msRFC 5322 regex validation
Disposable<1msIn-memory lookup against 120,000+ known throwaway domains
Role Account<1msPattern match: info@, admin@, support@, etc.
Free Provider<1msKnown free providers: Gmail, Yahoo, Outlook, ProtonMail, etc.
DNS MX Lookup~50-100msQueries domain for mail exchange records
DNS A Fallback~50msIf no MX, checks for an A record (implicit MX)
Domain Suggestion~5msLevenshtein 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.