ShepHouse Guides

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

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

  1. 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.
  2. Create an Header Auth credential named like Apify API token (header auth): name Authorization, value Bearer <APIFY_TOKEN> (Apify Console → Settings → API & Integrations).
  3. Connect a Google Sheets OAuth2 credential named like Google Sheets account.
  4. Paste your Sheet URL into every Google Sheets node (documentId is empty on purpose).
  5. 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.

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

Last tested: 2026-11-04. Corrections welcome via the product order page linked from Shop.