How to Verify Emails in Google Sheets (Step-by-Step)
Three methods to verify email addresses directly in Google Sheets — from a free regex formula to a one-click add-on. Includes a copyable cleanup checklist.
Your email list lives in a Google Sheet. That part is easy. The hard part is knowing which addresses are actually deliverable before you hit send — and doing that without leaving the spreadsheet, copying data into some other tool, waiting, downloading a CSV, and pasting it back.
This guide covers three methods for verifying emails directly in Google Sheets, from the simplest (a free formula) to the most reliable (a tool that handles the whole thing in-sheet). Each method has real trade-offs. We’ll cover what breaks, when to use what, and give you a checklist you can copy for your pre-send workflow.
Why Email Verification Matters Before You Send
Every ESP (email service provider) — Mailchimp, SendGrid, Instantly, Lemlist — tracks your bounce rate. If hard bounces climb above 2–5%, the consequences get serious fast:
- ESP warnings and sending limits — your account gets flagged
- Domain reputation damage — your sending domain gets associated with bounces
- Deliverability collapse — future sends, even to valid addresses, land in spam
Most senders hit a bounce problem when working from scraped lists, old CRM exports, or contacts that haven’t been emailed in 6+ months. The addresses look fine. The list loaded into Sheets fine. But enough of them have gone dark, changed jobs, or never existed.
Verification catches this before the damage is done.
The Three Methods
| Method | What it checks | Cost | Sheets-native | Accuracy |
|---|---|---|---|---|
| REGEXMATCH formula | Syntax only (format is valid) | Free | Yes | Low |
| Manual CSV upload to provider | Live SMTP handshake | Pay-per-use | No | High |
| Smart Email Verifier Add-on | Live SMTP handshake, in-sheet | Free / $79/yr | Yes | High |
A formula can only tell you that john@example is malformed. It cannot tell you whether [email protected] is a real, active mailbox. For cold outreach or any campaign where deliverability matters, you need the SMTP handshake — a live check that the mailbox accepts mail.
Method 1: REGEXMATCH Formula (Free, Syntax Only)
Use this when you want a fast sanity check — catching obviously broken formats before a larger workflow.
The formula:
=REGEXMATCH(A2, "^[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}$")
Drop this in column B, drag it down. Returns TRUE for valid-looking formats, FALSE for anything that’s clearly broken.
What it catches:
- Missing
@symbol - Invalid domain format
- Spaces inside the address
- Missing TLD (
.com,.io, etc.)
What it does NOT catch:
- Whether the mailbox exists
- Whether the domain accepts mail
- Disposable addresses (
guerrillamail.com,mailinator.com) - Catch-all domains that accept everything
- Role addresses (
info@,noreply@,admin@) — these send but rarely reach a person
When to use it:
- Form validation (catch typos at signup)
- Pre-filtering before a paid verification run (remove the obvious garbage first)
- Quick list audit where deliverability isn’t critical
Limitations: Do not rely on this for cold outreach. A 100% pass rate on REGEXMATCH tells you nothing about whether a single email will actually deliver.
Method 2: Manual CSV Export → Provider Upload → Reimport
This is how most teams handle verification before they find a better way. It works. It’s just slow and error-prone.
The flow:
- Export your Sheets column as a CSV
- Upload to NeverBounce, ZeroBounce, or MillionVerifier
- Wait for results (minutes to hours depending on list size)
- Download the results CSV
- VLOOKUP or paste the statuses back into your Sheet
What you get: Accurate results. These providers run a live SMTP handshake — they connect to the mail server and verify the mailbox exists before returning a status.
The problems:
- Data is stale by the time it’s back. If you export Monday and reimport Wednesday, the list has aged 48 hours. Job changes happen constantly in B2B.
- The VLOOKUP step breaks things. Mismatched row counts, encoding issues from the CSV download, and human error during copy-paste are all real failure modes.
- You’re context-switching. Most people doing this are also managing a campaign. The extra friction means verification gets skipped when time is short.
- API key management is separate. You’re paying three different platforms and managing three different dashboards.
Failure points to watch:
- Provider returns
catch-all— you need a policy for these (see checklist below) - File encoding issues after export (especially with international characters in names)
- CSV column mismatch if you sort or filter your Sheet between export and reimport
When to use it: Works fine for occasional, one-off list cleanups. Breaks down if you’re doing this weekly or for multiple campaigns.
Method 3: Smart Email Verifier Add-on (Recommended)
This is the workflow that eliminates the export/import loop entirely.
Trigger: Install the Smart Email Verifier Add-on from Google Workspace Marketplace (free install, no credit card).
What it does: Connects NeverBounce, ZeroBounce, or MillionVerifier directly to your Sheet. You bring your own API key from whichever provider you use. The add-on handles the calls and writes results back to a column in your Sheet.
Step-by-Step Walkthrough
Step 1: Install the add-on
Open your Google Sheet → Extensions → Add-ons → Get add-ons → Search “Smart Email Verifier” → Install.
Step 2: Add your API key
Open the add-on sidebar → Settings → paste your NeverBounce (or ZeroBounce or MillionVerifier) API key → Save.
You control which provider you use. If you have credits on ZeroBounce, use ZeroBounce. Switch anytime from the sidebar without reconfiguring anything else.
Step 3: Select your email column
Highlight the column with email addresses (e.g., column B). The add-on detects the selection.
Step 4: Click Verify
The add-on loops through the list, calls your chosen provider for each address, and writes a status directly into the next available column.
What gets written back:
| Status | Meaning |
|---|---|
valid | Mailbox exists and accepts mail |
invalid | Mailbox does not exist |
catch-all | Domain accepts all addresses — can’t confirm individual mailbox |
disposable | Known temporary/throwaway email service |
unknown | Provider couldn’t reach the mail server |
Step 5: Filter on valid before sending
Use a standard Sheet filter to keep only valid rows for your campaign. Decide on a policy for catch-all (safe to include for warm outreach; skip for cold).
Failure Points and How to Handle Them
API key not set: The add-on shows an error in the sidebar before running. Fix: go to Settings, re-enter the key, verify it’s the correct environment (test vs. live).
Quota exceeded mid-run: The add-on stops and shows how many rows were processed. Fix: upgrade your provider plan or wait for daily quota reset. Rows already verified keep their status — you only re-run the unverified rows.
Catch-all interpreted as valid: This is an accuracy limitation of the provider, not the add-on. Fix: segment catch-alls separately and apply different send rules (send to warm audiences, skip for cold).
Very large lists (10,000+ rows): Provider API calls take time. Run overnight or in batches. The add-on handles batching automatically — you don’t need to split the Sheet manually.
How to Monitor If It Breaks
- Watch the status column for a sudden increase in
unknownresults (suggests the provider API is down or your key expired) - Check your provider dashboard for quota usage before each campaign run
- If bounce rate climbs after a campaign, cross-reference against the statuses — if
validaddresses are bouncing, the list has aged and needs a re-verification pass
Pre-Send Email Verification Checklist
Copy this into a new Sheet tab and work through it before each campaign:
[ ] 1. Run REGEXMATCH — remove any FALSE rows (broken format)
[ ] 2. Deduplicate (Data → Remove duplicates)
[ ] 3. Remove role addresses: filter out info@, admin@, support@, noreply@, hello@
[ ] 4. Run Smart Email Verifier (or manual upload) — get live statuses
[ ] 5. Keep only "valid" for cold outreach
[ ] 6. Decide on catch-alls: include for warm, exclude for cold
[ ] 7. Remove any previous bounces or unsubscribes from your CRM
[ ] 8. Cap send volume: max 200–400 per sending domain per day for new domains
Which Method Should You Use?
- Occasional cleanup, small lists (<200): REGEXMATCH first, then manual CSV upload once.
- Regular campaigns, list in Sheets already: Smart Email Verifier Add-on. The free plan covers 50 verifications per day; the premium plan ($79/year) covers 500/day.
- One-time bulk clean of a legacy list (>5,000 rows): Manual upload directly to provider for cost efficiency, then move to the Add-on for ongoing maintenance.
The measure of a clean list isn’t just fewer bounces — it’s a sender reputation that holds across campaigns. Teams that verify consistently before sending keep their bounce rate under 1%. Teams that skip it often find out the hard way after the first large send.
Want to skip the export/import loop? The Smart Email Verifier Add-on connects your provider directly to Google Sheets. Install free on Google Workspace Marketplace →