
Klaviyo list cleaning usually means suppressing contacts who stopped engaging. That leaves out a different problem: Klaviyo doesn't check whether an address is real before you send to it. It only reacts after a bounce or a complaint.
Good list cleaning in Klaviyo covers both. You verify the addresses in a CSV first, then let Klaviyo's own suppression and bounce handling take care of the rest. By the end of this guide you'll have an exported list, a CampaignKit verification pass and a suppression file ready to import. You need a Klaviyo account with the Owner, Admin or Analyst role and a free CampaignKit account.
How to clean a Klaviyo list:
Email.
This is a manual round trip: export, verify, import. CampaignKit has no Klaviyo integration, so nothing syncs between the two on its own.
Klaviyo has no pre-send email verification. It doesn't run a syntax or mailbox check on addresses you import, and there's no native email-verification integration. It finds out an address is bad when the email bounces.
That's why validating first matters. Typos, disposable addresses, dead mailboxes and domains without mail servers can sit in a list until your first send, and Klaviyo only learns about them when they bounce. For why bounces happen and what a healthy rate looks like, see how to reduce your bounce rate.
Klaviyo's own cleaning guide takes a different approach: build a segment of profiles that received at least five emails but never opened or clicked in about 90 days, exclude it from sends, run a sunset flow, then suppress (Klaviyo, checked 2026-09-28). Keep doing that. Verification catches addresses that were never deliverable. It can't tell you who has stopped reading, because CampaignKit doesn't see your open or click data.
A suppressed profile is one Klaviyo won't email. The Klaviyo suppression list collects several kinds:
| Type | How a profile gets it |
|---|---|
| Hard bounce | Automatically, after one permanent bounce. Klaviyo removes the address from all lists. |
| Soft bounce | Automatically, after more than 7 consecutive soft bounces. Only soft bounces in the past 2 years count. |
| Spam complaint | Automatically, when the recipient marks your email as spam. |
| User suppressed | Manually, by a CSV import or by suppressing a profile directly. Your suppression file lands here. |
Suppression is separate from consent. An unsubscribe or spam complaint also sets the profile's consent status to "unsubscribed."
To see your Klaviyo bounce rate and bounce details, go to Analytics → Deliverability → Bounce details. You can also open Profiles → View suppressed profiles and filter by email bounce.
Sources: Klaviyo's bounce handling and suppressed profiles articles, checked 2026-09-28.
To export a list or segment from Klaviyo (Klaviyo, checked 2026-09-28):
Only the Owner, Admin and Analyst roles can export. Exports are capped at 700 columns, so pick specific properties if your profiles carry many.
This is the step that actually cleans the Klaviyo list. In the CampaignKit app, create a new bulk validation and upload the CSV. XLS and XLSX files work too, up to 20MB each. For a short list you can paste the addresses in instead.
Every address starts at a score of 10. Some checks end validation on the spot: a syntax error, a domain with no MX record or a mailbox that doesn't exist drops the score straight to 0. Other findings subtract points, so the final score lands somewhere between 0 and 10.
Each result also records why, as one or more result codes:
| Code | Meaning |
|---|---|
syntax |
The address isn't correctly formatted. |
domain |
The domain has no MX record. |
mailbox |
The mailbox doesn't exist. |
verifyRejected |
The mailbox couldn't be verified. |
blacklist |
The local part or the domain is blocklisted. |
disposable |
A disposable (temporary) address. |
catchAll |
The domain accepts mail for any address. |
role |
A role address, such as info@, support@ or sales@. |
didYouMean |
The domain looks like a typo of a well-known provider. |
In the results file these codes sit in the cpkit.details column, next to cpkit.score. One cell can hold more than one code, separated by commas, for example verifyRejected,role. That's why the next step reads the whole cell, not just the first value.
Verification has limits. Some mail servers won't confirm whether a mailbox exists, and catch-all domains accept mail for any address. Those get a lower score rather than a clear yes or no.
New accounts get 200 free validations with no credit card. After that, pricing is pay as you go from $6 for 2,500 emails, and credits never expire. For list-cleaning steps that don't depend on any platform, see how to clean your email list.
Download the results as a CSV. You get your original columns plus CampaignKit's columns, including cpkit.score and cpkit.details.
Decide what to suppress by the codes in cpkit.details, not by the score alone. The score is a range, and the same score can come from different causes. The code tells you the reason.
Code found in cpkit.details |
Bucket | Typical score |
|---|---|---|
syntax, domain or mailbox |
Suppress | 0 |
disposable |
Suppress | 1–2 |
blacklist |
Suppress | 1–2 (blocklisted local part) or 1 (blocklisted domain) |
verifyRejected |
Judgment call | 6 |
catchAll |
Judgment call | 9 |
role |
Judgment call | 7–9 |
didYouMean |
Not a verdict, a typo hint | Same as the failing code it comes with |
| (empty cell) | Keep | 10 |
Because a cell can list several codes, apply the rule to every code in it:
catchAll,disposable means suppress.verifyRejected,role is still a judgment call, because neither code is in the Suppress bucket. Decide based on how much risk you'll accept on this list.didYouMean only shows up next to domain, blacklist or mailbox, on an address that already failed, when its domain looks like a typo of a well-known provider (such as gmai.com). The suggested correction is in the cpkit.didYouMean column. Either fix the typo and re-check that one address, or suppress the original along with the rest of the Suppress bucket.
Then build the Klaviyo suppression file. Klaviyo requires exactly one column, headered Email, with one address per row (Klaviyo, checked 2026-09-28). Delete every other column, including all the cpkit.* columns, rename the email column to Email and save as CSV.
To suppress a list of addresses in Klaviyo:
The addresses show up as "User suppressed", and Klaviyo stops emailing them.
CampaignKit has no native Klaviyo integration, but you can connect the two with Zapier. Use Klaviyo's Profile Added to Segment or List trigger with CampaignKit's Validate Email Address action, and each new profile gets a 0–10 score as it's added.
This only covers new profiles. It's a polling trigger, so it won't clean the list you already have. And acting on a result, like suppressing an address that will bounce, is still a manual step today.
Email, and nothing else.Sign up and bulk-verify your next Klaviyo export: the first 200 validations are free, then $6 per 2,500, and credits never expire. To check a handful of addresses first, use the free email verifier, no signup needed. If you also send from Mailchimp, the same validate-before-you-import approach works there: see how to clean your Mailchimp email list.
Start with 200 free validations. Upgrade only when you're ready.
No credit card required • Cancel anytime