n8n: Google Maps leads to Google Sheets with contact emails
This guide builds a lead list in Google Sheets from a Google Maps search, for example "plumber in Austin, TX": one row per business with name, address, phone, website, email, LinkedIn and Facebook. It uses the free n8n-nodes-datagleaner community node, which runs two Data Gleaner Actors on Apify (Google Maps Leads, then Website Contact Details) and returns their rows as normal n8n items.
Use your own token. Create an API token in Apify under Settings, Integrations and save it in the node's credential. Never paste it into a shared workflow or sheet.
Install and import
- Self-hosted n8n: Settings, Community nodes, Install, enter
n8n-nodes-datagleaner. (Community nodes are not available on every n8n Cloud plan.) - Download one of the two templates below and use Workflows, Import from file.
- Open both Data Gleaner nodes and create the credential "Data Gleaner (Apify) API" with your Apify token.
- Create a Google Sheet with this header row:
placeId, name, address, phone, website, emails, linkedin, facebook(the batch template also writescontactStatus). Connect your Google account in the Sheets node and pick the sheet. - Edit the search text in Find Local Leads and run it.
Which template
| Template | How it calls contact details | Use it when |
|---|---|---|
| Per place | One Get Contact Details run per place | Small searches, simplest to read |
| Batch, one contact run | A Code node gathers every website, one run covers the search, a second Code node matches the results back to places by website host | Anything over a handful of places |
The batch template needs the matching step because the Actor returns sites in a different order than it received them, so rows must be joined on the website host, never on position.
Cap what a run can spend
Every Data Gleaner operation has a Max Charge (USD) setting under Run Settings. It is sent to Apify as maxTotalChargeUsd, a hard cap: the run stops when it is reached. Leave it empty and your Apify account default applies (on our account that default was $59, so set your own). Max Places Per Search in Find Local Leads is the other cost control.
Skip Facebook and Instagram "websites"
Some Google Maps listings give a Facebook or Instagram page as the business website. Those pages are not company sites and block crawlers, so a contact run on them returns nothing. Get Contact Details therefore has Skip Social-Network URLs, on by default: Facebook, Instagram, LinkedIn, X/Twitter, TikTok, YouTube and Linktree URLs are dropped before the run. The batch template's Collect Websites Code node applies the same filter. Switch the option off in the node's Options if you do want those URLs scanned.
What we tested (2026-11-01)
We installed n8n-nodes-datagleaner@0.2.1 into a local n8n 2.45 and ran the batch template on "plumber in Austin, TX" with 3 places and a $0.05 Max Charge on both nodes. Apify showed that cap on both runs. Results:
| Step | Result |
|---|---|
| Find Local Leads | 3 places, 4.3 s, charged 3 x $0.0015 |
| Collect Websites | 3 places, 1 of them a Facebook page: 2 websites kept, 1 skipped |
| Get Contact Details | one run for both sites, 9.6 s, 2 sites with an email, charged 2 x $0.002 |
| Match Contacts to Places | 3 rows: two with office@reliantplumbing.com and a Facebook link, one skipped place with no email |
Total charged $0.0085 for the three places. An earlier run of the per-place template cost the same $0.0085 but made three contact runs and took 17.9 s for the contact step, against 9.6 s for the batch. The two sites in the test were pages of one company, so the email count (2 of 3) is not a hit rate; expect an email on roughly half to two-thirds of small-business sites.
Install note for self-hosters
If a manual install into n8n's nodes folder fails on a native module build, use npm install --ignore-scripts --legacy-peer-deps there. Installing through Settings, Community nodes needs neither.
Try it: Website Contact Details Scraper on Apify. $0.002 per site with an email, nothing for sites without. The Apify free plan includes monthly credit, so a test run costs nothing out of pocket.
Related guides
- Find emails from a website list in Clay with an HTTP API column
- Clay: find a contact email per row with the Run Apify Actor action
- Find emails from a list of websites in n8n with Apify
- Find emails from a website list in Make (formerly Integromat)
- Find emails from a company website in Zapier with Webhooks
- Find emails from a website list in Google Sheets (Apps Script)