B2B Email List Verification in 30 Minutes with Google Sheets

With a simple Google Sheets workflow and free tools, you can run a B2B email list verification on any purchased list in 30 minutes. You’ll run quick checks for syntax, share of non-work emails, MX record check, and job title and company fit. The result is a simple traffic-light scorecard that helps you decide to send, test, or replace the contacts.
TL;DR
-
Green = Send: Send the list if syntax passes at 98% or higher, non-work addresses are 5% or less, all domains have mail servers, and the title and company match 90% or more on a 20-record sample.
-
Yellow = Pilot: Send to a small number of the records and store the failed rows aside for replacement.
-
Red = Reject: Definitely do not send these and store them aside for replacement.
How to Verify a B2B Email List in 4 Steps
Step 1: Fix Blanks & Validate Email Syntax (5 min)
Goal: Make sure every row has a valid, standardized email and passes a basic syntax check. Then calculate the Syntax "ok" percentage, aiming for 98% or higher, to spot obvious errors before running deeper tests.
Open a new Google Sheet, then do the following:
-
Create headers in row 1:
- Email in A1
- Normalized_email in B1
- Syntax_ok in C1
-
Paste your list of emails into column A under the email header
-
Make the normalized_email column in column B:
-
Click B2 and paste the following formula, then press Enter:
=LOWER(TRIM(A2)) -
With B2 still selected, double-click the small blue square in the corner of the cell to fill the formula down the whole column.
-
This column is needed to create a cleaned version of each email. It removes extra spaces and converts all text to lowercase, which prevents false failures in later checks.
-
Check email syntax in column C:
-
Click C2 and paste the following formula, then press Enter:
=IF(REGEXMATCH(B2,"^\[A-Za-z0-9.\_%+\\\]+@\[A-Za-z0-9.\\\]+ \\\[A-Za-z\]{2,}\$"),"ok","bad_syntax") -
Double-click the small blue square to fill it down.
-
-
Get your KPI, which is the percentage of "ok" in column C:
-
Click any empty cell, like E2, and paste this:
=COUNTIF(C2:C,"ok")/COUNTIF(B2:B,"\<\>") -
Format E2 as a percentage by selecting Format, then Number, then Percent.
-
Aim for a target of 100%. We set 100% as the target because anything lower suggests deeper issues such as poor parsing or outdated sources, which waste sends and cause preventable bounces. Scores at 100% show cleaner data, stronger deliverability, and less manual cleanup before you send.
Step 2: Non-Work Share of Emails (5 min)
Goal: Estimate how many emails are not real work inboxes. These include shared role addresses such as info@ or personal webmail like Gmail. They rarely belong in B2B outreach.
-
Add these headers in row 1 (continue in the same sheet):
- Local_part in D1
- Domain in E1
- Is_role in F1
- Is_free_webmail in G1
- Non_work_flag in H1
-
Make the Local_part column in column D. The local part is the text before the "@" in an email address:
-
Click D2 and paste:
=IFERROR(LEFT(B2, FIND("@",B2)-1),"") -
Double-click the small blue square to fill down.
-
-
Make the Domain column in column E. The domain is the text after the "@" in an email address:
-
Click E2 and paste:
=IFERROR(RIGHT(B2, LEN(B2)-FIND("@",B2)),"") -
Double-click the small blue square to fill down.
-
-
Check to see if the email is role-based in column F:
-
Click F2 and paste:
=IF(REGEXMATCH(D2,"^(info\|sales\|support\|help\|admin\|contact\ |marketing\|billing\|careers\|jobs\|press\|media\|hr)\$"), "role","person") -
Double-click the small blue square to fill down.
Role-based emails are usually a shared inbox that rarely get replies. As a result, you should keep the number as low as possible to improve engagement and deliverability.
-
-
Check to see if the email is free webmail, like @gmail or @yahoo:
-
Click G2 and paste:
=IF(REGEXMATCH(E2,"^(gmail\\com\|googlemail\\com\|yahoo\\com\|outlook \\com\|hotmail\\com\|aol\\com\|icloud\\com\|proton\\me)\$"), "free","corp") -
Double-click the small blue square to fill down.
Free webmail emails are discouraged for B2B outreach because they usually belong to personal accounts, not business inboxes, which lowers reply and conversion rates.
-
-
Combine the role-based and free webmail columns into a single non-work flag:
-
Click H2 and paste:
=IF(OR(F2="role", G2="free"), "non_work", "work") -
Double-click the small blue square to fill down.
-
-
Compute your KPI, which is the percentage of non-work emails:
-
Click any empty cell, like J2, and paste:
=(COUNTIF(F2:F,"role")+COUNTIF(G2:G,"free"))/COUNTIF(B2:B,"\<\>") -
Format J2 as a percentage by selecting Format, then Number, then Percent.
-
Your target should be 5% or lower. Keeping non-work emails under this level helps you focus on real business inboxes instead of shared or consumer accounts that lower reply rates and distort deliverability. A smaller share is better, since fewer role or free addresses mean better targeting, clearer tracking, and less wasted send volume.
Step 3: MX Record Check and Checking if the Domain Accepts Mail (10 min)
Goal: Quickly confirm that each company domain can receive mail. A missing MX record is a strong warning sign in purchased B2B lists and often points to dead or fake domains.
-
Create a new tab for this check:
- Click the + at the bottom of the sheet and name it MX_check.
-
Add headers in row 1 in the MX_check tab:
- Domain in A1
- MX_result in B1
- Sample_flag in C1
-
Bring in the unique list of domains from Step 2 (column E on your main tab):
-
Click A2 in MX_check and paste:
=SORT(UNIQUE(FILTER(Main!E2:E, Main!E2:E\<\>"")),1,TRUE) -
Replace Main with the name of your first sheet if different.
-
-
Mark the first 100 to 200 rows as your sample:
-
Click C2 and paste:
=IF(ROW()-1\<=200,"sample","skip") -
Double-click the small blue square to fill down. If you want exactly 100, change 200 to 100.
-
-
Run an MX lookup for each sample domain:
-
Pick one method:
- Web tool: Search for "MX lookup" using sites like MxToolbox or Google Admin Toolbox. Enter the domain, run the check, and copy the result.
- Using the Mac or Linux terminal: dig +short mx [sample domain]
- Using the Windows PowerShell or CMD: nslookup -type=mx [sample domain]
-
If the lookup shows one or more MX records and no clear error, type "pass" in column B for that row.
-
If the lookup shows no MX record or returns an error such as NXDOMAIN or timeout, type "fail" in column B for that row.

Example of a "pass" MX result in Linux Terminal 
Example of a "fail" MX result in Linux Terminal -
-
Compute your KPI, which is the percentage of MX checks that passed on the sampled rows:
-
Click any empty cell, like E2, in MX_check and paste:
=COUNTIFS(B:B,"pass",C:C,"sample")/COUNTIF(C:C,"sample") -
Format E2 as a percentage by selecting Format, then Number, then Percent.
-
Your target for the pass rate should be 100%. If a domain does not pass the MX check, then it will almost certainly bounce.
Step 4: 20-Record Human Spot-Check (10 min)
Goal: Confirm that a small, random sample matches your ICP. Check that the companies and decision-makers fit your target profile before you rely on the full list.
-
Add these headers on your main sheet (same tab as Steps 1 and 2):
- Random in I1
- Company_site_ok in J1
- Title_match_ok in K1
-
Create a random number for each row. This is so that we can pick 20 and random:
-
Click I2 and paste:
=RAND() -
Double-click the small blue square to fill down.
-
-
Sort by column I to get your sample:
- Select your entire table including headers.
- Select Data, then Sort range, then Advanced range sorting options, then check "Data has header row".
- Sort by column I with A to Z checked.
- The first 20 rows under the headers are your sample.
-
Check the company website in column J:
- For each of the 20 sampled rows, open the company website using the domain or company field.
- In J2 to J21, type "yes" if the website exists and fits your target industry or region. Type "no" if it does not exist or is outside your target.
-
Check the decision-maker title in column K:
- In K2 to K21, type "yes" if the job title is a decision-maker for your ICP, such as Director, VP, Head, Founder, Owner, or C-level. Type "no" if it is not.
-
Compute your KPI, which is the percentage of the titles and companies that match:
-
Click any empty cell, like N2, and paste:
=COUNTIFS(J2:J21,"yes",K2:K21,"yes")/20 -
Format N2 as a percentage by selecting Format, then Number, then Percent.
-
Your target should be 90% or higher. A 90% pass rate or better on a random sample shows the vendor understood your ICP. Lower rates point to industry or title drift that will waste sends and time.
Traffic-Light Scorecard
Goal: Combine your four KPIs into one clear decision: GREEN, YELLOW, or RED.
-
Put your four KPI percentages as decimals into cells
- Put the Syntax OK value from step 1 into cell AA1
- Put the Non-work value from step 2 into cell AB1
- Put the MX checks value from step 3 into cell AC1
- Put the title and company match value from step 4 into cell AD1
-
Create the traffic-light cell
-
Click any empty cell, like AE2, and paste:
=IF(AND(AA2\>=0.98, AB2\<=0.05, AC2\>=1, AD2\>=0.90),"GREEN", IF(AND(AA2\>=0.95, AB2\<=0.10, AC2\>=0.95,AD2\>=0.70), "YELLOW" ,"RED")) -
Now you’ll have the results! The list will have either a GREEN, YELLOW, or RED light.
-
What to Do with Each Result
-
Green = (Send): Load the list into your email provider or CRM. Keep a suppression list for role and free accounts.
-
Yellow = (Pilot): Send to only a small number of the records. Store the emails that failed syntax, MX, or non-work checks aside for replacement.
-
Red = (Reject & Replace): Do not send these. Make sure to replace all failed records.
Conclusion
You’ve learned how to clean emails, check syntax, flag non-work addresses, test MX records, and confirm job title and company fit, then combine those checks into a single traffic-light scorecard. Now apply the workflow to your list and apply the following result: GREEN means load and send while keeping a suppression list, YELLOW means send only a small number as a record pilot and replace the failed rows, and RED means stop sending and replace the failed rows immediately. Save this page as a template and repeat the process for every new batch to keep quality and deliverability high.
FAQ
What’s a "non-work" email?
A non-work email is either a shared or role-based inbox such as info@ or sales@, or a personal address from a free webmail domain like Gmail or Yahoo. Keep these low in B2B lists since they rarely reach individual decision-makers.
Why treat "no MX" as a fail?
Treat "no MX" as a fail because most real businesses have MX records. While some domains without them can still receive mail, they often come from poor or fake data sources. It’s a simple and safe filter for purchased lists.
What if my sample fails the Title Match but the other metrics look good?
If your sample fails the Title Match but other metrics look good, run a pilot with about 5 to 10% of the list and track replies or booked meetings.
Ready to reach fresh, human-verified leads today?
Start for FreeRelated articles
How To Safely Blend First Party And Third Party B2B Data
Use your own first-party data to define your ICP, then fill the gaps with human-verified B2B contact lists. Learn how to merge both without disrupting your CRM.
Why Today’s Job Market Quickly Breaks Your CRM
See the key labor market stats behind job hopping and job hugging and learn why fast job changes cause your CRM to become outdated in under two years.
Scraped, Crowdsourced, and Research Grade B2B Data Explained
Most cheap B2B lists are scraped or pooled. See how to spot risky data, test any provider, and choose real research-grade human verified data.


