Overview
Cold email agencies manually search Google Maps, copy business details into spreadsheets, then import into outreach tools. This n8n workflow automates the entire pipeline: search Google Maps by industry and location, extract contact details, enrich with Google search data, and push qualified leads directly to the CRM. 1,000 leads cost $10 (Maps search + enrichment).
Trigger
Daily cron at 6 AM or triggered by new location added to the watchlist.
Schedule
Daily at 6 AM UTC
Workflow Steps
Load Target Industries and Locations
Read the list of industry-location pairs from a Google Sheet or database. Each row defines a search query for Google Maps.
Search Google Maps for Businesses
For each industry-location pair, search Google Maps via Scavio API. Extract business name, phone, address, rating, review count, and website.
Filter by Quality Signals
Remove businesses below the minimum rating threshold (default 3.5 stars) and those without websites or phone numbers.
Enrich with Google Search Data
For each qualified lead, run a Google search for the business name to pull company description, social profiles, and recent news.
Push to CRM and Outreach Tool
Create or update contacts in HubSpot, Salesforce, or a Google Sheet. Tag leads with source, industry, and quality score.
Python Implementation
import requests, os
API_KEY = os.environ["SCAVIO_API_KEY"]
def maps_to_leads(industry: str, location: str, min_rating: float = 3.5) -> list:
# Step 1: Search Google Maps
resp = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY, "Content-Type": "application/json"},
json={"query": f"{industry} {location}", "platform": "google-maps", "country_code": "us"},
timeout=15,
)
maps_data = resp.json()
leads = []
for place in maps_data.get("local_results", []):
if place.get("rating", 0) < min_rating:
continue
if not place.get("phone"):
continue
# Step 2: Enrich with Google search
enrich = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY, "Content-Type": "application/json"},
json={"query": place.get("title", ""), "country_code": "us"},
timeout=10,
)
enrich_data = enrich.json()
leads.append({
"name": place.get("title", ""),
"phone": place.get("phone", ""),
"address": place.get("address", ""),
"rating": place.get("rating"),
"reviews": place.get("reviews"),
"website": place.get("website", ""),
"description": enrich_data.get("knowledge_graph", {}).get("description", ""),
})
return leads
leads = maps_to_leads("roofing contractors", "Dallas TX")
print(f"{len(leads)} qualified leads ready for CRM")JavaScript Implementation
const H = {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
async function mapsToLeads(industry, location, minRating=3.5) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {method:'POST', headers:H, body:JSON.stringify({query:industry+' '+location, platform:'google-maps', country_code:'us'})});
const d = await r.json();
const leads = [];
for (const p of (d.local_results||[]).filter(p=>(p.rating||0)>=minRating && p.phone)) {
const er = await fetch('https://api.scavio.dev/api/v1/search', {method:'POST', headers:H, body:JSON.stringify({query:p.title, country_code:'us'})});
const ed = await er.json();
leads.push({name:p.title, phone:p.phone, address:p.address, rating:p.rating, reviews:p.reviews, website:p.website, description:ed.knowledge_graph?.description||''});
}
return leads;
}
const leads = await mapsToLeads('roofing contractors','Dallas TX');
console.log(leads.length+' qualified leads');Platforms Used
Google Maps
Local business search with ratings and contact info
Web search with knowledge graph, PAA, and AI overviews