Kolton Dupey · 2025-08-31 · 7 min read
Google Maps Lead Generation: Automate Business Discovery with n8n (Step-by-Step Guide)
Automation

🧠 Why this exists
- Finds relevant businesses by query + location
- Resolves official websites (not Google URLs)
- Extracts emails reliably with smart cleaning/validation
- Builds a structured sheet for your CRM or mailer
- Scales safely with delays and error handling
🖊️ Resources Used
- n8n - workflow automation platform
- Google Places API - Free 1,000 requests with any Google Account
- Google Sheets - for housing collected information
🏗️ Architecture Overview
- Search: Google Places Text Search to get a page of relevant businesses (e.g., "financial advisor Wisconsin").
- Details + Website: Places Details API per business to get the official website + phone + Maps URL.
- Scrape: HTTP GET against each website with a sane User-Agent and a short Wait between requests.
- Extract + Clean: Regex to find emails, decode HTML, normalize, and split to single-row items.
- De-dupe + Filter: Remove repeats and drop empty rows.
- Export: Append to Google Sheets with columns [company, emails, website, address, phone].
🧩 Node-by-Node (exact flow)
1) 🔎 HTTP Request — Google Places Text Search
- Endpoint:
- Query:
query=YOUR_QUERY(e.g., dentist Minnesota) - Auth:
key=${GOOGLE_PLACES_API_KEY} - Output: list of places (place_id, name, formatted_address, …).
2) 🧽 Code — Extract URLs / Normalize Results
- Flattens search response → one item per place.
- De-duplication by place_id in case of overlaps.
3) ♻️ Remove Duplicates — (First Pass)
Compares by address to eliminate near-duplicates.
4) 📦 Split in Batches — Loop Over Items
Prevents spikes, keeps scrape speed safe.
5) 🌐 HTTP Request — Places Details (Website Resolution)
- Endpoint:
https://maps.googleapis.com/maps/api/place/details/json - Fields: name, website, formatted_phone_number, url.
- Output: the official business website.
6) 🔗 Merge → 🧮 Code — Normalize Merge
Consolidates search + details into clean JSON:
7) 🌍 HTTP Request — Scrape Site
- GET
{{ $json.fetch_url }}with headers (User-Agent, Accept-Language). onError: continueensures workflow never halts.
8) ⏱️ Wait — 1 second
Politeness delay to avoid bans.
9) 🧪 Code — Extract Emails + Company (from <title>)
Regex for emails:
Extract <title> for company name, decode HTML entities.
10) 🧹 Remove Duplicates — (Second Pass)
De-dupes on emails list.
11) 🧰 Code — Split/Validate Emails
Cleans & validates each email:
12) 🚰 Filter — Drop Null Emails
Keeps only rows with actual emails.
13) 📤 Google Sheets — Append
Maps fields to columns:
- company
- website
- address
- phone
🗺️Steps 1-3

🗺️Steps 4-7

🗺️Steps 8-11

🗺️Steps 12-15

🔄 Replicability Across Industries
- Real Estate 🏠: Scrape agents or property managers in a given city.
- Law Firms ⚖️: Pull contact info for attorneys in specific practice areas.
- Marketing Agencies 📈: Find local businesses in target niches like restaurants, gyms, or salons.
- Consultants 💼: Identify businesses in need of your services by geography + industry keywords.
🛠️ Configuration Notes
- Queries: Adjust by niche + geography.
- API Keys: Store safely in n8n creds/env.
- Delays: 1–2s between requests; increase if 429s appear.
- Headers: Realistic User-Agent.
- Error Tolerance: Keep
onError: continuefor resilience.
🧪 Email Extraction: Making It Robust
- ✅ Validation: regex + MX check if needed
- 🧼 Sanitization: remove junk characters and URL fragments
- 🔁 De-dupe: Sets for local & global uniqueness
- 🧾 Company Name: from <title> tag, decode entities
📈 Scaling & Ops
- Pagination: Handle next_page_token from Google API.
- Concurrency: Low + steady beats bans.
- Retries: Add exponential backoff if needed.
- Monitoring: Log counts: places, sites, emails, rows.
- Storage: Add DB node for "already-seen".
- CRM Sync: Push directly into Salesforce, HubSpot, etc.
🚀 How to Import & Run
- Import JSON workflow into n8n.
- Configure Google Sheets + Places API credentials.
- Update search query in Text Search node.
- Test with a single query.
🚀 Next Steps
- Enrichment: add Clearbit/LinkedIn scraping.
- Verification: SMTP-free email checks.
- Outreach: pipe into MailerLite/HubSpot.
- Attribution: log outreach results in CRM.
❓ Frequently Asked Questions
Is this Google Maps lead generation method legal?
How much does it cost to run this Google Maps automation?
Can I use this for industries other than the examples shown?
Do I need coding experience to set up this n8n workflow?
– Kolton Dupey
Want this built for your business?
This post comes from a real engagement. Dealing with something similar? Book a 15-minute call and I'll tell you what it would take.
Related posts

The Ultimate Guide to Enterprise Document Automation: A Deep Dive into Advanced DocuSign Integration
Explore a sophisticated Python-based DocuSign automation system with over 2,400 lines of production-ready code that transforms manual document workflows into highly efficient, scalable operations for enterprise environments.
15 min read · 2025-08-22
Read post →
Automating Earnings Call Intelligence with Python, GPT-4, and Twitter Integration
Learn how to build an end-to-end automation pipeline that scrapes earnings call transcripts, summarizes them using GPT-4, extracts sentiment and strategic insights, and posts results to Twitter for scalable financial content production.
10 min read · 2025-07-23
Read post →
From Click to CRM - Automating Lead Flow from WhatConverts to Salesforce with AI-Powered Precision
Discover how to build an intelligent automation system that captures leads from WhatConverts and seamlessly integrates them into Salesforce with AI-enhanced data processing using Zapier.
5 min read · 2025-07-14
Read post →