Use case · SimpleVerifier Team
Deduplicating and validating emails for data teams
Normalise first (trim, lowercase, split multi-value cells), remove duplicates on the normalised value, then verify each unique address once and store the status and reason next to the record. Duplicates and addresses we cannot check are free on the email plans, so deduplicating first only saves you time, not money.
Email columns arrive from CRMs, exports and merged vendor files with stray whitespace, mixed case and the same person twice. Validation on a dirty column wastes effort and returns confusing counts.
A repeatable order of operations makes the output trustworthy enough to join back to the source table.
What goes wrong in email data
Duplicates hide behind formatting
JANE@Company.com and jane@company.com are the same inbox. Gmail also treats dots and +tags as the same inbox. Dedupe on a normalised key but keep the original value.
Multi-value cells
Some exports put several addresses in one cell, separated by semicolons or commas. Split them before validating or only the first is checked.
Status without a reason
A bare valid or invalid flag is hard to act on. The reason (mailbox not found, accepts all addresses, disposable) decides the next step, so store both.
Stale results
A result describes the day it ran. Confirmed results are reused for 14 days; after that the mailbox is checked again. Store the check date.
Dedupe and validate in order
Normalise
Trim whitespace, lowercase, split multi-value cells and drop empty strings. The email list cleaner does this in the browser for files; in code, the same few lines in your pipeline do it.
Deduplicate
Use the duplicate remover or a group-by on the normalised key. Keep the record with the most complete fields and note the merged IDs.
Validate in bulk or by API
For files, upload a CSV (up to 100,000 rows). For pipelines, call the API from your job runner; see bulk-verifying a CSV with the API and the Python guide.
Join results back
Join on the email key and store status, reason and check date. Treat risky as its own category rather than collapsing it into valid or invalid.
Schedule re-checks
Re-validate on a cadence that matches how fast your contacts change, and before any large send.
Mapping results to a status column
| Result | What to do | Why |
|---|---|---|
| valid | deliverable | Mailbox confirmed by the server. |
| risky · Accepts all addresses | unconfirmed (catch-all) | Never mark it valid. |
| risky · Role-based address | unconfirmed (role) | Shared inbox. |
| risky · Server would not confirm | retry | Temporary. |
| invalid | undeliverable | Mailbox not found, no mail server, bad format or disposable. |
Keep unconfirmed addresses as their own state so downstream users can decide.
Common questions
- Do I pay for duplicate addresses?
- No. On the email plans, duplicates and addresses we cannot check are free; each unique address counts once.
- Should I dedupe before or after validation?
- Before. Deduplicate on the normalised address, validate once, then join the result back to every record that shares it.
- Can I run validation from a pipeline?
- Yes, through the API on Pro and above, or by uploading CSV files on any plan.
- How do I treat catch-all results?
- As unconfirmed, not valid. The server accepted any recipient, so the specific mailbox could not be checked.
Run a file through it
Pro is $29.99 a month and never cuts you off: the first 100,000 emails a month run at full speed, then big lists run slower. CSV uploads, the API (10,000 calls a month, then $1.50 per 1,000), the Google Sheets add-on and the email finder are all included. Cancel any time.
The first 100 checks are free with a Google sign-in and no card, once per account.