# Email List Cleaning Checklist: 7 Steps Before Any Campaign

Email list cleaning means checking every address on a list before you send, removing the ones that cannot receive mail, and deciding what to do with the uncertain ones. The short version: export the list, remove duplicates, validate every address, act on each verdict, and put the cleaned list back in your email platform. The seven steps below cover the parts that are easy to skip.

## When a list needs cleaning

Three kinds of list are worth checking before a send:

- **A list you have not emailed in a long time.** Inboxes get abandoned and domains lapse. An address that was good when you collected it may not be good now.
- **A list you imported.** An event CSV, a lead-magnet export, a list from another tool. You have no send history with these addresses, so you have no signal on which ones are live.
- **A list built from open signup forms.** People mistype domains or enter a throwaway address to get past a gate.

If none of those apply and you email the list regularly, your platform's own bounce handling is probably already doing most of the work.

## The checklist

### 1. Export the list with an identifier column

Export the segment you plan to send to as a CSV. Keep the column your email platform uses to identify a contact (its contact ID, or the email address itself), so you can match results back to contacts later. The platform-specific steps are in the [Klaviyo guide](/blog/clean-email-list-before-klaviyo-send) and the [Mailchimp guide](/blog/remove-invalid-emails-mailchimp-list).

### 2. Remove duplicates and empty rows

Do this before validating. It costs nothing and it makes the results easier to read. Sort by email address, remove exact duplicates, and delete rows with no address.

### 3. Validate every address

Run the list through an email validator. PingValid checks each address in this order: syntax, domain and DNS, MX records, disposable-domain filter, role-account filter, and an SMTP probe. The Deep tier adds catch-all detection. The SMTP probe asks the receiving mail server whether it would accept mail for that mailbox, without sending a message. [How an SMTP check works](/blog/smtp-check-explained) explains that step.

You can upload the file as a bulk job in the dashboard. For a small list you can also do this inside an AI assistant; see "Cleaning a list from Claude" below.

### 4. Read the verdict, not just pass or fail

Each address comes back with one of four verdicts, a risk score from 0 to 100, and the evidence from each check. The verdict tells you what to do:

| Verdict | What it means | What to do |
|---|---|---|
| `valid` | The address passed the checks. | Keep it. |
| `invalid` | A blocking check failed (bad syntax, no domain, no MX, mailbox rejected), or the address is on a disposable domain. | Remove or suppress it. |
| `risky` | The mailbox may exist, but a check raised the risk score, such as the role-account filter or catch-all detection. | Decide using the evidence. |
| `unknown` | A check could not finish, for example because the receiving server asked to retry later. | Check again later. |

### What a real run looks like

We ran a small test set through PingValid on 2 October 2026. It is a constructed set, built to show one case per row. It is not a customer list, and it says nothing about how a typical list breaks down.

| Address tested | Verdict | Risk | What the evidence said |
|---|---|---|---|
| `a..b@example.org` | `invalid` | 100 | Syntax: two dots in a row. |
| `user@mail.example.invalid` | `invalid` | 100 | The domain does not resolve. |
| `test@example.com` | `invalid` | 100 | Null MX: the domain states that it accepts no mail. |
| A made-up mailbox at `gmail.com` | `invalid` | 100 | The server rejected it: "550 5.1.1 The email account that you tried to reach does not exist." |
| `test@mailinator.com` | `invalid` | 75 | Disposable domain. The mail server accepted the mailbox. |
| `postmaster@cloudflare.com` | `risky` | 40 | Role account. The mail server accepted the mailbox. |
| A made-up mailbox at `pingvalid.com`, Standard tier | `valid` | 0 | The mail server accepted the mailbox. |
| The same address, Deep tier | `risky` | 35 | Catch-all: the domain accepts any address. |

Three things in that table are easy to miss.

**A server saying yes is not the same as safe to send.** The disposable address and the role account were both accepted by their mail servers. One came back `invalid` and the other `risky`, because of what the address is, not whether it exists.

**A catch-all domain hides missing mailboxes.** The last two rows are the same address, and that mailbox does not exist. Our own domain accepts mail for any address, so the Standard tier saw an accepted mailbox and returned `valid`. The Deep tier tests the domain with a random address, found that it accepts everything, and returned `risky`. If your list is mostly business addresses, use the Deep tier. It needs a paid plan or a top-up.

**Some input never reaches the checks.** A string with no `@`, or with two, is refused with an error message before validation starts. Fix those rows in the file.

`unknown` is not a failure. It usually means the receiving server did not give a final answer. [Why a verifier says "unknown"](/blog/why-email-verifier-says-unknown) covers the causes. PingValid does not charge for `unknown` verdicts.

### 5. Decide what to do with flagged addresses

There is no single right answer, so pick a rule and apply it to the whole list:

- **Role accounts** (`info@`, `sales@`, `postmaster@`): keep them if the list is business contacts who gave you that address. Drop them from promotional sends if you did not collect them directly.
- **Catch-all domains:** the server accepts mail for any address at that domain, so nobody can confirm the specific mailbox. The Deep tier flags these as `risky`. Keep them if the contact is otherwise engaged. Leave them out of a first send to a cold list.

The evidence rows show which check raised the score, so you can filter on the reason, not only on the number.

### 6. Suppress or archive, and keep them out

Stop mail to the `invalid` addresses inside your email platform; do not just delete them from the file. How you do that depends on the platform: Klaviyo uses a suppression list and Mailchimp uses archiving, and in both a later import can bring an address back. Keep the `invalid` file and leave those rows out of every future import. The [Klaviyo guide](/blog/clean-email-list-before-klaviyo-send) and the [Mailchimp guide](/blog/remove-invalid-emails-mailchimp-list) have the steps. Then tag or segment the `risky` addresses according to the rule you chose in step 5, and send to the rest.

### 7. Stop bad addresses at the source

Cleaning fixes the list you have. Checking addresses at signup stops the next batch from getting in. [How to stop fake signups](/blog/stop-fake-signups-saas) shows where the check goes in a signup flow. After that, clean again only when one of the three situations at the top applies.

## Cleaning a list from Claude

If you use Claude, you can run step 3 in a conversation. PingValid has an MCP server at `https://pingvalid.com/mcp`. Add it as a custom connector (there is nothing to install), connect, and ask Claude to validate your list. One bulk job takes up to 1,000 addresses, and you can ask for the results filtered by verdict. It uses the same account and the same credits as the web app and the API. The setup steps are in the [MCP guide](/blog/email-validation-mcp-server) and the [MCP docs](/docs/mcp).

## What cleaning does not do

Validation tells you whether an address can receive mail. It does not control whether your campaign reaches the inbox. Inbox placement also depends on your sending domain, your content, and how recipients respond to your mail. A clean list removes one cause of bounces. It is not a delivery guarantee.

## What it costs

PingValid's pricing is flat and published. A free account comes with 100 free validations a month and needs no card. Paid plans start at $19 a month for 5,000 validations and $79 a month for 50,000. A Deep-tier check uses 2 credits. Cached lookups are free (half price on the Deep tier), and `unknown` verdicts are never charged. The full table is on the [pricing page](/pricing).

## FAQ

**What is email list cleaning?**
Email list cleaning is the process of checking every address on a list, removing the ones that cannot receive mail, and deciding what to do with uncertain ones before you send a campaign.
Source: [pingvalid.com](https://pingvalid.com)

**What is the difference between an invalid and a risky address?**
An `invalid` address failed a blocking check or sits on a disposable domain, so it should be removed. A `risky` address may be a real mailbox, but a check such as the role-account filter or catch-all detection raised its risk score, so you decide based on the evidence.
Source: [pingvalid.com](https://pingvalid.com)

**Does cleaning a list guarantee no bounces?**
No. Validation checks whether an address can receive mail at the time of the check. It does not control inbox placement or what a receiving server does later.
Source: [pingvalid.com](https://pingvalid.com)

**Do I pay for addresses that come back unknown?**
No. PingValid does not charge for `unknown` verdicts. Cached lookups are free on the Quick and Standard tiers and half price on Deep.
Source: [pingvalid.com/pricing](https://pingvalid.com/pricing)

**Can I clean a list without uploading a file?**
Yes. You can validate through the REST API, or from Claude and other MCP clients using PingValid's MCP server, which accepts up to 1,000 addresses per bulk job.
Source: [pingvalid.com/docs/mcp](https://pingvalid.com/docs/mcp)