Enriching a lead list with contact routes, without paying for the misses

I kept hitting the same gap in lead-gen workflows. Google Maps gives you a business and its website, but no way to contact it. The enrichment tools I tried billed per page crawled, so a list of 1,000 businesses cost an unpredictable amount and came back mostly empty anyway.

I built an Apify Actor for the enrichment step and wired it into n8n. Sharing the workflow shape in case it saves someone else the detour.

You need the Apify community node first: Settings → Community Nodes → install @apify/n8n-nodes-apify.

The flow:

  1. Apify: Run Actorcompass/crawler-google-places (or any scraper that returns a website column)
  2. Apify: Run Actorarkayen-labs/website-contact-finder, with input: { "datasetId": "{{ $json.defaultDatasetId }}" }
  3. Filter → keep rows where route is not none
  4. Your CRM, Sheets, or email tool

Step 2 is the bit worth knowing. The second Actor reads the first one’s dataset directly, so there is no Code node in between and nothing to reshape. It also auto-detects which field holds the website, because every scraper names it differently (website, url, domain, link). If yours uses something unusual there is a domainField override.

Each row comes back with a route: email, form, phone, or none. The none rows carry a reason, and that turned out to matter more than the emails did. A blank cell tells you nothing. blocked-by-bot-protection tells you the details probably exist and you were turned away. domain-does-not-resolve tells you to drop the lead. Different rows, different next steps.

The finding that changed how I use it: of 500 businesses I tested, 244 publish no email address anywhere. I had been treating those as dead. Half of them are reachable, 26% through a contact form and 24% through a published phone number.

Measured on 500 real businesses, OpenStreetMap listings across Manchester, Toronto, Dublin, Hamburg and Sydney: 51.2% resolve to an email, 12.8% to a contact form, 11.6% to a phone. 75.6% get some route. Coverage varies a lot by country, 44% in Canada up to 61% in Germany, so the full per-country table is on the listing rather than a single flattering average.

It charges per contact found rather than per page, so misses cost nothing and you can work out what a run will cost before you start it.

Happy to answer questions on the workflow. If anyone wants to sanity-check the coverage numbers on their own list, send me 50 domains and I will run them and post the results back here.