Google Sheets + Anymail Finder: fill lead emails fast
Your lead list looks “ready,” but the EMAIL column tells the truth. Empty cells. Guesswork. And that slow, error-prone routine of checking a company site, hunting formats, and praying you didn’t grab a role inbox that will bounce.
This Sheets email enrichment automation hits marketing ops first, honestly, but agency owners and solo SDRs feel it just as much. You stop doing manual lookups and start getting a cleaner outreach list, with email statuses that help you avoid obvious bad sends.
Below is the exact workflow, what it automates, what results you can expect, and the practical setup details that matter (without turning this into a developer tutorial).
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Sheets + Anymail Finder: fill lead emails fast
flowchart LR
subgraph sg0["Manual Execution Start Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Manual Execution Start", pos: "b", h: 48 }
n1@{ icon: "mdi:database", form: "rounded", label: "Retrieve Prospect List", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-vertical", form: "rounded", label: "Iterate Records", pos: "b", h: 48 }
n3@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Route by Status", pos: "b", h: 48 }
n4@{ icon: "mdi:database", form: "rounded", label: "Update Found Email", pos: "b", h: 48 }
n5@{ icon: "mdi:database", form: "rounded", label: "Update Missing Email", pos: "b", h: 48 }
n6["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Company Email Lookup"]
n7["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/telegram.svg' width='40' height='40' /></div><br/>Notify via Telegram"]
n3 --> n4
n3 --> n5
n1 --> n2
n7 --> n2
n4 --> n2
n6 --> n3
n0 --> n1
n5 --> n7
n2 --> n6
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n0 trigger
class n3 decision
class n1,n4,n5 database
class n6 api
classDef customIcon fill:none,stroke:none
class n6,n7 customIcon
The Problem: Filling Lead Emails Is Slow (and Risky)
Building a company list is easy compared to making it outreach-ready. Someone exports prospects, drops them into Google Sheets, and then the email scavenger hunt begins. You search for patterns, dig through “Contact” pages, try a couple of guesses, and still end up with bounced emails or generic inboxes that never respond. It’s not just time. It’s momentum. When list prep drags on, campaigns ship late, follow-ups happen inconsistently, and you can’t trust your own numbers because the data quality is all over the place.
It adds up fast. And the mess usually shows up in the same places.
- Every company takes a few minutes to research, which turns a “quick list” into a half-day task.
- Bounces creep in because you’re relying on guesses, outdated sources, or a single format rule that doesn’t hold.
- Your team can’t tell what’s safe to send, because “found an email” is not the same as “found a usable email.”
- Once you scale past a small batch, people stop updating the sheet consistently and you lose track of what’s already processed.
The Solution: Enrich Sheet Rows with Anymail Finder + Telegram Alerts
This workflow turns your Google Sheet into a simple enrichment machine. You keep a list of companies and websites in a spreadsheet. When you run the automation, it pulls only the rows that haven’t been processed yet (the “PROCESSING” column is empty), then sends each company to the Anymail Finder API to look for a matching email address. After that, the workflow categorizes what comes back (for example, valid, risky, or not found), writes the email and status outcome into the same row, and marks that lead as processed so it won’t be touched again next run. Finally, it sends you a Telegram message so you know the sheet has been updated and you can move straight into outreach.
The workflow starts with a manual run in n8n, which is perfect when you want control over when enrichment happens. From there, it processes leads one-by-one in a loop, so results don’t get scrambled and each row is updated cleanly. At the end of each processed item, you get a Telegram ping and the workflow continues until your batch is done.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you have a sheet with 200 companies. Manually, even a quick process (find a contact page, guess a format, verify, paste back) is maybe 2 minutes per row, so you’re looking at about 6 to 7 hours of busywork. With this workflow, you run it once, and the only “human time” is checking the sheet and triggering the run, maybe 5 minutes total. The enrichment itself can take a while depending on the API and batching, but you’re not stuck doing it. You just get a Telegram ping when rows update.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets for your lead list input/output.
- Anymail Finder to discover and classify emails.
- Anymail Finder API key (get it from your Anymail Finder account).
Skill level: Beginner. You will connect accounts, paste an API key, and update a Sheet ID in a few nodes.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
Manual run from n8n. You click execute when you’re ready to enrich a batch, which is handy if you only want to spend API credits after a list review.
Pull unprocessed rows from Google Sheets. The workflow reads your spreadsheet and filters for leads where the “PROCESSING” column is empty, so it doesn’t redo work you’ve already completed.
Email lookup and status routing. Each company is sent to Anymail Finder via an HTTP request. The workflow checks the response status and chooses the right path (email found vs. no email found), so the sheet stays tidy and consistent.
Sheet update plus a Telegram ping. The row gets updated with the discovered email (or left blank if not found), “PROCESSING” is marked with an “x,” and Telegram notifies you that updates are happening as the loop continues.
You can easily modify the “only process blank PROCESSING rows” rule to instead target a specific campaign tab or a checkbox column based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Manual Trigger
Start the workflow manually so you can verify the list retrieval and email discovery logic before activating it.
- Add and keep the Manual Execution Start node as the trigger.
- Ensure Manual Execution Start connects directly to Retrieve Prospect List.
Step 2: Connect Google Sheets
Pull prospects from a Google Sheet and enable updates for found and missing emails.
- Open Retrieve Prospect List and set Document to
Find Email by Companyand Sheet toFoglio1. - In Retrieve Prospect List, keep the filter on PROCESSING (lookup column), matching your sheet’s processing logic.
- Credential Required: Connect your googleSheetsOAuth2Api credentials in Retrieve Prospect List.
- Open Update Found Email and set Operation to
Update, Document toFind Email by Company, and Sheet toFoglio1. - Map columns in Update Found Email to:
- EMAIL →
{{JSON.stringify( $json.emails) }} - PROCESSING →
x - row_number →
{{ $('Iterate Records').item.json.row_number }}
- EMAIL →
- Credential Required: Connect your googleSheetsOAuth2Api credentials in Update Found Email.
- Open Update Missing Email and set Operation to
Update, Document toFind Email by Company, and Sheet toFoglio1. - Map columns in Update Missing Email to:
- EMAIL →
= - PROCESSING →
x - row_number →
{{ $('Iterate Records').item.json.row_number }}
- EMAIL →
- Credential Required: Connect your googleSheetsOAuth2Api credentials in Update Missing Email.
Step 3: Set Up the Processing and Lookup Logic
Split the incoming list, call the email discovery API, and route results based on status.
- Keep Retrieve Prospect List connected to Iterate Records to process one row at a time.
- In Company Email Lookup, set URL to
https://api.anymailfinder.com/v5.1/find-email/companyand Method toPOST. - In Company Email Lookup, enable Send Body and add body parameters:
- domain →
{{ $json["WEBSITE"] }} - company_name →
{{ $json["COMPANY NAME"] }}
- domain →
- Set Authentication in Company Email Lookup to
genericCredentialTypewith Generic Auth TypehttpHeaderAuth. - Credential Required: Connect your httpHeaderAuth credentials in Company Email Lookup.
- In Route by Status, keep the rules using
{{ $json.email_status }}for outputsvalid,risky, andnot found.
Step 4: Configure Output and Notifications
Update the sheet based on routing and alert via Telegram when no email is found.
- Ensure Route by Status outputs to Update Found Email for
validandriskystatuses, and to Update Missing Email fornot found. - In Notify via Telegram, set Text to
Alert! Email not foundand Chat ID to[YOUR_ID]. - Credential Required: Connect your telegramApi credentials in Notify via Telegram.
- Keep the loop connections so Update Found Email → Iterate Records and Notify via Telegram → Iterate Records to continue processing all rows.
Step 5: Test and Activate Your Workflow
Run a manual test, confirm updates in the sheet, and then activate the workflow for production use.
- Click Execute Workflow from Manual Execution Start to run a test.
- Verify that rows with found emails are updated by Update Found Email and missing emails are updated by Update Missing Email.
- Confirm that Notify via Telegram sends a message when
email_statusisnot found. - Once results look correct, toggle the workflow to Active to enable production use.
Common Gotchas
- Google Sheets credentials can expire or need specific permissions. If things break, check the n8n credential connection test and confirm the Google account still has access to the spreadsheet.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Anymail Finder API calls can fail if your API key is missing the correct header name/value. Double-check the HTTP Header Auth credential (Authorization) and review the HTTP Request node’s last response for error codes.
Frequently Asked Questions
About 30 minutes if your Google Sheet is ready and you already have an Anymail Finder API key.
No. You’ll connect Google Sheets, paste an API key, and select the right columns. If you can follow a checklist, you’re good.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in Anymail Finder API costs (free trial for testing, then paid usage based on your plan).
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, but you’ll want to decide what “valid enough” means for your outreach. You can treat “valid” as the only acceptable status by adjusting the routing logic in the “Route by Status” switch so only valid results write to the EMAIL column. Another common tweak is writing risky emails to a separate column (like “EMAIL (RISKY)”) so you can review them later instead of sending immediately. You can also change the “PROCESSING” mark to something more descriptive, like “valid,” “risky,” or “not found,” which makes filtering in Google Sheets dead simple.
Usually it’s an expired Google OAuth session or the wrong Google account. Reconnect the Google Sheets credential in n8n, then confirm that same account can open the target spreadsheet in the browser. If it still fails, check the Sheet Document ID in every Google Sheets node, because one mismatched ID can break the run.
Thousands, as long as your Anymail Finder plan and n8n runtime can keep up.
For list enrichment, n8n is often the more comfortable fit because looping through rows, routing by status, and writing back to the same sheet is straightforward and doesn’t require extra paid “steps” for branching. It’s also easier to keep costs predictable if you self-host and run larger batches. Zapier or Make can still work, especially for small lists, but you may end up building awkward workarounds for looping and filtering. The big difference is control: with n8n you can keep the “PROCESSING” logic tight, avoid duplicates, and expand the workflow later (for example, auto-assigning leads or triggering Gmail sends). Talk to an automation expert if you want a quick recommendation based on your lead volume.
Once this is in place, your spreadsheet stops being a “to-do list” and starts being a system. You run enrichment, get notified, and move on.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.