How often should you clean your email list?
· 4 min read · Email validation
Clean your email list on three triggers rather than one fixed date: verify every address when it enters your systems, re-verify contacts you haven't mailed in roughly three months or more before you send to them, and remove hard bounces after every send. For most B2B teams that works out to checking new records continuously and running a larger re-check before each campaign or sequence that reaches older contacts.
A calendar schedule ("clean quarterly") is easy to remember and easy to get wrong. A list that grows by event imports and a list that only grows by double opt-in decay at very different rates. Tie the cleaning to the events that actually make addresses go bad.
Why addresses go bad between sends
People change jobs and their work mailbox is disabled. Companies rebrand and retire a domain. Someone fat-fingers gmial.com on a form. A trial user signs up with a disposable inbox that stops existing next week. None of this announces itself. You find out when you send and the message bounces.
Mailbox providers notice too. Google's email sender guidelines tell senders to make sure recipients opt in, to "confirm each recipient's email address before subscribing them", and to automatically unsubscribe recipients who have multiple bounced messages. They also ask bulk senders to keep the spam rate reported in Postmaster Tools below 0.3%. Bounces and complaints aren't the same metric, but they come from the same root cause: mailing people who didn't ask for it or no longer have that address. If you're working out what level of bounces should worry you, see what is a good email bounce rate.
A cleaning schedule by list type
| List | When to verify | Notes |
|---|---|---|
| Product signups and trial users | At signup, in real time | Catch typos and disposable domains before the account exists. |
| Inbound form leads | On submission, before the CRM | See verifying form leads before the CRM. |
| Event and webinar registrations | At registration, and again before post-event follow-up | Badge-scan and paper-form imports are typo-heavy. |
| Outbound prospect lists | Immediately before each sequence | Lists bought or built weeks ago have had time to decay. |
| Newsletter subscribers | Before sends to anyone not mailed in about 3 months | Recent recipients are covered by your own bounce data. |
| Dormant CRM contacts | Before any reactivation campaign | Often the worst segment in the database. |
The three-month mark isn't a rule from any standard. It's a reasonable default: short enough that job changes haven't piled up, long enough that you aren't paying to re-check people who opened last week. Shorten it for outbound lists, lengthen it for opt-in lists with steady engagement.
Signals that mean clean now, whatever the calendar says
- A send returned noticeably more hard bounces than usual. Pull the segment, check what it has in common (one import, one event, one source), and verify the rest of that source.
- A big import landed. CSV uploads from events, partners or an old tool skip whatever checks your forms do.
- You're about to change sending infrastructure or warm up a new domain. A new domain has no reputation to absorb a bad send.
- A sales team complains about bounced sequences. That's usually a sign that list building has outrun verification.
What "cleaning" should do with each result
Cleaning isn't just deleting. A verification run gives you four outcomes and each one needs a different action:
- Invalid (nonexistent mailbox, no mail server, disposable domain, broken syntax): suppress. Keep the record as suppressed instead of deleting it, so a later import doesn't add it back.
- Valid: keep mailing.
- Risky (catch-all domains, role addresses like
info@, full mailboxes): keep, but segment. Mail them in smaller batches or only with strong engagement history. - Unknown (the server wouldn't answer): retry later. Don't suppress on unknown.
The detail behind each status and reason code is in email verification statuses explained.
Making the schedule cheap to run
Most of the cost of list cleaning comes from re-checking addresses that were fine. Two habits keep it down:
- Verify at the point of entry. A real-time check on forms and signups means your bulk runs only ever handle aged records. Verifying form leads before the CRM shows one way to do it.
- Skip what your own sends already proved. An address that accepted mail and got an open or reply last month doesn't need a verifier's opinion.
With pingutil you can do both from one API: POST /v1/verify for single addresses in a form handler, and POST /v1/verify/batch with up to 50 addresses per call for a pre-send re-check. Catch-all domains come back as risky / accept_all instead of being counted as valid, so the bucket you mail with confidence stays honest. Try a few addresses in the verification demo, or wire it into a script with the Python tutorial.
The short version of the schedule: verify at the door, re-verify anything old before you mail it, and let every send's bounces update the list for you.
Questions people ask
- Is cleaning my email list once a year enough?
- Only if you send rarely and every address was verified when it came in. Lists that feed weekly newsletters or outbound sequences should be re-checked before each large send to contacts you haven't mailed recently, and should drop hard bounces after every send.
- Should I re-verify contacts I emailed last week?
- Usually not. If you mailed them recently and they didn't bounce, your own send results are fresher evidence than a verification check. Spend verification on contacts that haven't been mailed in months and on newly imported records.