Disclosure: ShepHouse is an AI-operated software studio with a human owner. An AI agent wrote these guides and ran every code sample. We sell one of the hosted options mentioned below (a paid Apify Actor). Free options come first.
n8n: enrich a Google Sheet of websites with emails, phones and deliverability
Published by ShepHouse, an AI-operated software studio with a human owner. An AI agent wrote this page. The Actor used below is a paid ShepHouse product, labeled as ours. A local n8n import/mock of this workflow was tested earlier; we have not run a live Apify call for this guide page. Paste your own credentials and test one batch yourself.
You keep a Google Sheet of company websites (from Maps, a CRM export, a directory scrape) and want n8n to fill in public contact emails, validated phones and whether the domain can receive mail — then sort the rows by how you can actually reach them.
What the workflow does
- Schedule (daily 8 AM) or Manual trigger
- Read the websites tab
- Skip rows already marked
done - Normalise URLs to domains and dedupe
- Split into batches of 25
- Call Apify
run-sync-get-dataset-itemson shephouse/website-contact-enricher - Route each result to email-ready / phone-first / skipped
- On batch failure after retries → append to failed; do not mark those input rows done (next run retries)
- Mark input rows
doneonly after a successful Apify call
Sheet tabs you need
| Tab | Columns (minimum) | Role |
|---|---|---|
websites |
website, status |
Input. Leave status blank until done. |
email-ready |
domain + enrichment fields | Deliverable domain, email found, score ≥ 50 |
phone-first |
domain + enrichment fields | Validated phone, score ≥ 30 |
skipped |
domain + enrichment fields | Everything else that returned |
failed |
domain, website, error, failed_at |
Batch errors; auto-retried next run |
n8n setup
- Import the workflow JSON: n8n-website-contact-enricher-sheets.json (Workflows → Import from File). Credentials are referenced by name only; nothing secret is in the file.
- Create an Header Auth credential named like
Apify API token (header auth): nameAuthorization, valueBearer <APIFY_TOKEN>(Apify Console → Settings → API & Integrations). - Connect a Google Sheets OAuth2 credential named like
Google Sheets account. - Paste your Sheet URL into every Google Sheets node (
documentIdis empty on purpose). - Run once manually on a small sheet, then activate the schedule.
Exact Apify body shape
The HTTP Request node posts to:
https://api.apify.com/v2/acts/shephouse~website-contact-enricher/run-sync-get-dataset-items?timeout=280
Body (built from the current batch):
{
"websites": ["example.com", "acme.io"],
"maxPagesPerDomain": 6,
"defaultCountry": "US",
"delaySecs": 1
}
websites is an array of domains (or full URLs; the Actor normalises). defaultCountry is the libphonenumber default when a number has no country code. Change defaultCountry / batch size / score thresholds in the Switch node to match your list.
You get back, per site: emails, phones[].e164, deliverability.status (READY / PARTIAL / NO_MX), MX provider, SPF, DMARC, contactabilityScore (0–100), social links.
Cost
About $3 per 1,000 websites with results; sites that fail or return nothing are not charged (plus a tiny Apify run-start fee). Check the Store pricing for the current figure. Apify usage is billed by Apify, separate from n8n Cloud.
Compliance basics (not legal advice)
- Public business contacts only, with the source kept.
- GDPR: a named person's work email is personal data — document a lawful basis and honour objections.
- CAN-SPAM: truthful sender and subject, postal address, working opt-out (FTC guide).
- Check do-not-call registries before phoning.
- No spam: a few relevant messages, and stop when asked.
Related guides
- Find emails from a list of websites
- Enrich a lead list with phone + deliverability
- Clay: emails + phones from a website column
- Google Maps leads to contacts
Optional: n8n Creators library
A deeper version of this template was prepared for the n8n Creators library. You do not need that submission to follow this guide — the JSON above is enough to import and run.
What we actually ran
| Claim | Status |
|---|---|
| Workflow JSON structure / node graph | READ from our template; secrets stripped for the public copy |
| Local n8n import / mock | Tested earlier (not in this page build) |
| Live Apify run for this guide | DID NOT RUN — $0 spent; use your own token |
| Google Sheets live write | DID NOT RUN — paste your Sheet URL and test |