
Salesforce's built-in validation checks the format of an email address, not whether the mailbox exists, as vendor guides point out. You only learn about bad addresses after you send and they bounce. Salesforce email verification therefore happens outside Salesforce: you export your leads and contacts, run the file through an email verifier and write the results back to the records.
CampaignKit has no Salesforce app or native integration, so this guide uses Salesforce's own export and import tools. That means nothing to install. You need permission to export reports and to edit the records (an admin, for the import step) and a free CampaignKit account.
How to verify emails already in Salesforce:

This is a manual round trip. Nothing syncs between Salesforce and CampaignKit on its own. For new leads you can automate the check with Zapier, covered further down.
Salesforce email validation, the kind you get out of the box or build with validation rules, checks the format of an address. Vendor guides point out that this doesn't tell you whether the mailbox exists (MassMailer, LeadMagic, checked 2026-10-17). A correctly formatted address on a dead domain, a typo in the domain or a disposable address all pass a format check.
You find out when the email bounces. For why bounces happen and what they cost you, see how to reduce your bounce rate.
Not the same thing: Salesforce also sends its own verification emails, for example when a user changes their email address. That's a separate admin feature. This guide is about checking the email addresses of your leads and contacts.
Salesforce email verification starts with a clean export. Build a tabular Lead or Contact report with these columns:
Add names if they help you review the results. Keep the ID columns no matter what: they are how the results find their way back to the right records.
To export the report in Lightning Experience, as of October 2026 (Salesforce Help: Export a Report):
You need the Export Reports permission. If you don't have the export option, ask your Salesforce admin. A Details Only export as CSV or XLS isn't limited in rows or columns.
This is the email address verification step, and it happens outside Salesforce. In the CampaignKit app, create a new bulk validation and upload the CSV. XLS and XLSX files work too, up to 20MB each.
Keep the Email column headed "Email", where it is. If the report has other columns with "email" in their header, such as Email Opt Out or Email Bounced Reason, remove them before you upload. Otherwise the leftmost of those columns is the one CampaignKit checks.
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. |
When the job is done, download the results as CSV. Your original columns stay as they were, including the IDs, and CampaignKit adds its own columns after them, including cpkit.score and cpkit.details. The codes sit in cpkit.details. One cell can hold more than one code, separated by commas, for example verifyRejected,role.
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.
Decide by the codes in cpkit.details, not by the score alone. The same score can come from different causes, and 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. Decide based on how much risk you'll accept.didYouMean only shows up on an address that already failed. The suggested correction is in the cpkit.didYouMean column. You can fix the typo on the record and re-check that one address, or flag it with the rest.
In Salesforce, the results need somewhere to live. Ask your admin to add a custom text field to Leads and Contacts, for example "Email Status". Then add a column with that header to your results file and fill it in per row, for example Suppress, Review or Valid.
Don't delete the records, and don't use the Email Opt Out checkbox for bad addresses. Opt-out records a person's choice, not whether their address works. A separate status field keeps those two things apart.
Build an update file from the results: the ID columns plus the Email Status column. Keep a backup copy of your original export as a .csv before you change anything. If you have a sandbox, run the update there first. Either way, try a small file of a few records before the full one.
The Data Import Wizard can update existing leads, contacts or accounts matched by their Salesforce ID. It doesn't work for custom objects, and Salesforce notes it assumes admin-level knowledge. In Lightning Experience, as of October 2026 (Salesforce Help: Update records with the Data Import Wizard):
For leads:
For contacts:
For larger files, use Data Loader (Salesforce Developers: Perform mass updates, as of October 2026):
| Data Import Wizard | Data Loader | |
|---|---|---|
| Where you start | Salesforce Setup | The Data Loader tool, Update |
| Records | Leads, contacts or accounts (no custom objects) | Matched by record ID |
| Contact updates need | The contact ID and the account ID | The record ID |
| Best for | Smaller updates | Larger files |
| Afterwards | Check the updated records | Review the success and error log files |
The export round trip cleans what you already have. To check each new lead as it arrives, connect Salesforce and CampaignKit through Zapier, a third-party automation service. This isn't a CampaignKit integration with Salesforce; Zapier connects the two.
A Zap for this has three steps:
The CampaignKit step returns a classifier (valid, risky or invalid), the 0–10 score, flags such as disposable, role and catch-all, and a description with the reasons. Map whichever you need into Salesforce fields.
According to Zapier, the Salesforce app needs a paid Zapier plan, a Salesforce Sales or Service edition and My Domain (Zapier Help, checked 2026-10-17). Zapier's cost is separate from CampaignKit credits.
Limits to know:
Start with 200 free validations and verify your first Salesforce export. After that, pricing is pay as you go from $6 for 2,500 emails, and credits never expire. To check a handful of addresses first, use the free email verifier, no signup needed.
If your campaigns go out from another platform, the same approach works there: see how to clean your Klaviyo list and how to clean your Mailchimp email list. For platform-independent steps, see how to clean your email list.
Start with 200 free validations. Upgrade only when you're ready.
No credit card required • Cancel anytime