Google Maps Lead Scraping for Cold Email Pipelines
Build a lead gen pipeline from Google Maps to cold email using search API for structured business data.
A cold email pipeline built on Google Maps data can generate qualified local business leads at scale. One Reddit user documented earning $510K using exactly this approach: scrape Google Maps for businesses, extract contact info, enrich with email data, then run personalized outreach sequences.
The Pipeline
The workflow has four stages: discovery, extraction, enrichment, and outreach. Google Maps gives you business name, category, address, phone, website, ratings, and review count. That structured data is enough to filter for ideal customer profiles before you spend money on email enrichment.
- Discovery: search Google Maps for a business category in a target city
- Extraction: pull structured fields (name, phone, website, rating, reviews)
- Enrichment: find decision-maker emails via the business website domain
- Outreach: send personalized cold emails referencing their rating, review count, or location
Step 1: Pull Google Maps Data
import requests, os
API_KEY = os.environ["SCAVIO_API_KEY"]
def search_google_maps(query: str, location: str) -> list:
"""Search Google Maps for businesses and return structured data."""
resp = requests.post("https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY, "Content-Type": "application/json"},
json={
"query": query,
"search_type": "maps",
"location": location,
"country_code": "us",
})
data = resp.json()
return data.get("local_results", [])
# Example: find dentists in Austin, TX
leads = search_google_maps("dentists", "Austin, TX")
for lead in leads[:5]:
print(f"{lead.get('title')} | {lead.get('rating')} stars "
f"| {lead.get('reviews')} reviews | {lead.get('phone')}")Step 2: Filter for Ideal Customer Profile
Raw Google Maps results include everything from one-person shops to chains. Filter before enriching to avoid wasting credits on leads that will never convert. Good signals: 10-200 reviews (established but not a chain), 3.5-4.5 stars (room for improvement, motivated to invest), has a website (indicates digital presence).
def filter_leads(leads: list) -> list:
"""Filter for leads matching ideal customer profile."""
qualified = []
for lead in leads:
reviews = lead.get("reviews", 0) or 0
rating = lead.get("rating", 0) or 0
website = lead.get("website", "")
if 10 <= reviews <= 200 and 3.5 <= rating <= 4.5 and website:
qualified.append({
"name": lead.get("title"),
"phone": lead.get("phone"),
"website": website,
"rating": rating,
"reviews": reviews,
"address": lead.get("address"),
"category": lead.get("type"),
})
return qualified
qualified = filter_leads(leads)
print(f"Qualified: {len(qualified)} / {len(leads)} total leads")Step 3: Enrich with Email
Once you have qualified leads with websites, extract the domain and use an email finding service. Hunter.io, Apollo, or Snov.io can find decision-maker emails from a domain. The key is to look for owners or managers, not generic info@ addresses.
from urllib.parse import urlparse
def extract_domains(leads: list) -> list:
"""Extract root domains from lead websites for email enrichment."""
for lead in leads:
parsed = urlparse(lead["website"])
lead["domain"] = parsed.netloc.replace("www.", "")
return leads
enriched = extract_domains(qualified)
for lead in enriched[:3]:
print(f"{lead['name']} -> {lead['domain']}")
# Feed domains to your email enrichment provider
# Example with a generic enrichment API:
# for lead in enriched:
# emails = find_emails(lead["domain"])
# lead["emails"] = emailsStep 4: Personalize the Outreach
The Google Maps data gives you personalization hooks that generic cold email lacks. Reference their star rating, review count, or specific location. A dentist with 4.2 stars and 87 reviews responds differently to "I noticed your 87 Google reviews" than to "Dear business owner."
def generate_email(lead: dict) -> str:
"""Generate a personalized cold email using Google Maps data."""
return f"""Subject: Quick question about {lead['name']}
Hi,
I came across {lead['name']} while researching {lead['category']} in
{lead['address']}. With {lead['reviews']} reviews and a {lead['rating']}-star
rating, you clearly have a strong local presence.
I work with businesses like yours to [your value prop]. Would you be
open to a 10-minute call this week?
Best,
[Your name]"""
for lead in qualified[:2]:
print(generate_email(lead))
print("---")Scaling the Pipeline
At $0.005 per Scavio API credit, scraping 1,000 businesses across 10 cities costs $5. After filtering, you might have 300 qualified leads. Email enrichment at ~$0.03/lead adds $9. Total cost for 300 qualified, personalized leads: under $15. The Reddit user who made $510K ran this across dozens of verticals and cities simultaneously.
Legal and Ethical Boundaries
- Google Maps data is publicly available. Scraping it via API is standard practice.
- CAN-SPAM requires: clear sender identity, physical address, opt-out mechanism, honest subject lines.
- Do not scrape personal emails. Target business contact info only.
- Respect opt-outs immediately. One strike and they are off the list permanently.
- Check state and country regulations. GDPR applies if targeting EU businesses.