lead-gengoogle-mapscold-email

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.

9 min

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

Python
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).

Python
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.

Python
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"] = emails

Step 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."

Python
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.