Find the email by reading the business's own site
How Leadline's email lookup crawls the contact page of every business in your list — and why a freshly-crawled email is worth more than a list-vendor's stale column.

Most lists you can buy come with an email column. Most of those emails bounce. The reason is not that the vendors are lying — it’s that the list was right when it was assembled and the businesses have since rotated the contact form, changed the marketing automation, hired and fired. Six months later, half the addresses don’t reach a person.
Leadline’s email lookup does the boring but reliable thing instead: for every business in your list, it visits the business’s own website and reads the contact page. Whatever address the business publishes today is the address that lands in your row.
This is the working walkthrough.
What email lookup actually does
For each row in your list, the email lookup job:
- Reads the website field (already filled in by the harvest).
- Fetches the homepage.
- Looks for a link or pattern matching
/contact,/about,/team,/get-in-touch,/reach-us, etc. - Fetches that page.
- Parses addresses using a small library of regexes tuned for the common shapes:
name@domain.com,info[at]domain.com,name [at] domain [dot] com, mailto links, Contact-form endpoints that POST to a CRM. - Writes any addresses it found back into the row.
It is a polite client — it respects robots.txt, sends a sensible User-Agent, and backs off if the site returns a 429. It does not hammer a server with parallel requests.
It is also local to the row. The email lookup is a per-row job; you run it on the rows you want enriched, you don’t run it on the whole list.
How to run it
Open the list. Select the rows you want to enrich — could be the whole list, could be the rows that came back missing an email. Click Enrich → Email lookup.
You will see a progress label per row (e.g. “Bella’s Bakery · crawling…”). The job runs in the background; you can keep using the workspace. When a row finishes, the email cell updates.
If a row had no website to start with, the email cell stays empty and the row is flagged. You can fill the website manually and re-run enrichment on just that row.
The whole enrichment runs in your browser. There is no third-party service that sees your list, no API call to a vendor’s enrichment endpoint, no per-row fee.
What you get back
Each row in the list gains an email cell. Some rows will get one address; some will get several (info@, sales@, support@ — all parsed separately). The cell shows the address you would most likely want to write to (sales@ if it exists, otherwise info@, otherwise the first generic address).
If the email lookup finds nothing — no contact page, no published address, all addresses obfuscated — the cell stays empty and a small badge appears on the row showing why. The most common reasons:
- The site has a contact form but no email address anywhere on the page.
- The site uses Cloudflare email obfuscation (the
__cf_email__span pattern), which Leadline does not decode. - The site returns a 403 or 5xx when fetched.
You can hover the badge to see the reason. The row is not flagged as broken — it’s just unenriched. You can re-run enrichment later if the site changes.
Why this is better than a list-vendor’s email column
A list-vendor’s email column is a snapshot from when the vendor assembled the list. The vendor usually refreshes quarterly at best. Between refreshes, half the addresses drift.
Leadline’s email lookup is a snapshot from when you ran it. If you run it on a Tuesday morning and send on Tuesday afternoon, the email was correct as of Tuesday morning. The lag between “the business said this on their website” and “you wrote to them” is hours, not months.
The other thing is consent. The vendor’s email was scraped from somewhere — maybe a public scrape, maybe a leaky form, maybe a third-party aggregator. Leadline reads the business’s own website, where the business chose to put the address. That is the address the business wants to be reached at. It is not a leaked email; it is a published one.
What this is not
A few honest things:
- Not a deliverability guarantee. A published email still bounces if the business’s mail server is misconfigured, if the address is a role account that no one reads, or if the business has gone out of business. Email lookup gives you a clean starting point; sending tools (warmup, validation, etc.) are a separate concern.
- Not an inbox warmup. Leadline does not warm up the address you send from. That’s your ESP’s job.
- Not a per-row cost. There is no charge per enrichment. The job runs locally in the extension; it costs the bandwidth of fetching a contact page per row, which is on the order of single-digit kilobytes.
A small workflow that uses this well
The pattern that comes up most often:
- Harvest a neighbourhood. You now have 80–200 rows with name, address, phone, website.
- Run email lookup on the whole list. Most rows come back with at least one address.
- Sort by “has email” (saved view). The rows with an address are your Tuesday morning list.
- Save the view as “Tuesday list”. Tomorrow, run the enrichment again — the few rows whose email bounced get a fresh pass; the rest stay.
The cycle is: harvest → enrich → send → repeat. Each loop is hours of work, not weeks.
Where to go next
If you have a list, try it: select the rows, click Enrich → Email lookup, watch the cells fill in.
If you want to read more:
- Harvest a neighbourhood — if you don’t have a list yet, this is the starting point.
- The dialer — once your list has phone + email, here’s how to call through it.
- What we don’t do — for the boundaries of what the product does and doesn’t pretend to do.
Email lookup is the boring part. That’s why it works.