How to Verify Emails in Salesforce (Leads and Contacts)

How to Verify Emails in Salesforce (Leads and Contacts)

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.

Short answer

How to verify emails already in Salesforce:

  1. Export a Lead or Contact report as CSV, with the record ID and the Email field.
  2. Verify the file in CampaignKit. Every address gets a score from 0 to 10 and a result code.
  3. Decide what to flag, based on the result codes.
  4. Update the records with the results, in a custom status field, using the Data Import Wizard or Data Loader.
  5. Exclude the flagged records from your campaigns.

Illustration of the round trip: export leads and contacts, verify the file, update the records with the results

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.

Why Salesforce doesn't catch bad addresses

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.

Export your leads and contacts from Salesforce

Salesforce email verification starts with a clean export. Build a tabular Lead or Contact report with these columns:

  • For leads: the Lead ID and Email.
  • For contacts: the Contact ID, the Account ID and Email. The update step for contacts matches on both IDs, so you need the Account ID in the file too.

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):

  1. From the Reports or Analytics tab, or from the report run page, open the dropdown and select Export.
  2. Select the Details Only export view. It exports each row without formatting. (Formatted Report exports .xlsx only.)
  3. Choose CSV as the format and pick the encoding.
  4. Click Export.

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.

Verify the exported file with CampaignKit

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 what to do with each result

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:

  1. If any code in the cell is in the Suppress bucket, flag the address. A judgment-call code next to it doesn't change that. catchAll,disposable means suppress.
  2. If every code in the cell is a judgment call, it's your call. verifyRejected,role is still a judgment call. Decide based on how much risk you'll accept.
  3. If the cell is empty, every check passed. Keep the address.

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.

Update the Salesforce records

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.

Option A: Data Import Wizard

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:

  1. From Setup, enter "Data Import Wizard" in Quick Find, select it and click Launch Wizard.
  2. Choose Leads, then Update existing records.
  3. Under Match Lead by, choose Salesforce.com ID.
  4. Choose your CSV file.
  5. Map the Lead ID field to your ID column, and Email Status to your status column.
  6. Click Start Import.

For contacts:

  1. Launch the wizard the same way and choose Accounts and Contacts, then Update existing records.
  2. Set both Match Contact by and Match Account by to Salesforce.com ID.
  3. Choose your CSV file.
  4. Map the contact ID and the account ID columns, plus your status column.
  5. Click Start Import.

Option B: Data Loader

For larger files, use Data Loader (Salesforce Developers: Perform mass updates, as of October 2026):

  1. Start from an export or report that includes the record ID, and save a backup copy of the CSV.
  2. Edit the file to hold the ID and the new status values.
  3. Launch Data Loader and click Update. Records are matched by their record ID.
  4. Review the success and error log files.
  5. If something went wrong, restore the records from your backup.

Which one to use

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

Verify new leads automatically with Zapier

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:

  1. Trigger: Salesforce New Lead.
  2. Action: CampaignKit Validate Email Address, with the lead's email mapped to Email Address.
  3. Action: Salesforce Update Lead (or Update Record), writing the result into your status field.

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:

  • Only new leads. The Zap doesn't touch records already in Salesforce. Use the export round trip for those.
  • Not instant. New Lead is a polling trigger, so leads are checked when Zapier next polls, not the moment they're created.
  • Test the write-back. How the result lands in Salesforce depends on how you map the fields in your Zap. Run it on a test lead first.

Check it works

  1. In Salesforce, open a Lead or Contact list view and filter it by your Email Status field.
  2. Compare the count for each status with the number of rows in your update file that carry it.
  3. Spot-check two or three flagged addresses in the free email verifier. They should usually come back with the same failed check or flag as in your results file. Mailbox checks run live, so a result can occasionally differ.

Troubleshooting

  • The import updated nothing. Check that the file has the ID column and that you chose Salesforce.com ID as the match option. For contacts, the account ID column has to be there and mapped too.
  • The export has no Email column. Add the Email field to the report's columns.
  • The wrong column was checked. The leftmost column with "email" in its header is the one CampaignKit checks. Remove or rename the other columns with "email" in their header, such as Email Opt Out, and keep only your Email column.
  • Zapier can't find CampaignKit. Search for "CampaignKit" as one word in the Zapier app directory.

Next step

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.

Join 1,000+ CompaniesImproving Email Deliverability

Start with 200 free validations. Upgrade only when you're ready.

No credit card required • Cancel anytime