Overview
Sales teams need a steady pipeline of local leads but manual discovery caps out at 20 per day. This workflow automates Google Maps discovery across target categories and locations, enriches each lead with SERP data (website, reviews, social profiles), and outputs CRM-ready CSV. 100 qualified leads for ~$1 in API credits.
Trigger
Daily at 6 AM, before the sales team starts outreach.
Schedule
Daily
Workflow Steps
Load Target Categories and Locations
Read the target business categories (plumber, dentist, HVAC) and geographic locations from a config file.
Discover Businesses via Google Maps
For each category-location pair, search Google Maps via Scavio to find businesses with addresses, ratings, and phone numbers.
Deduplicate Against Previous Days
Compare discovered businesses against the existing lead database. Skip businesses already in the pipeline.
Enrich with SERP Data
For each new lead, search Google for the business name to find their website, social profiles, and recent mentions.
Export to CRM-Ready CSV
Format all enriched leads into a CSV with columns: name, address, phone, rating, website, social profiles.
Python Implementation
import requests, os, json, csv
from pathlib import Path
API_KEY = os.environ["SCAVIO_API_KEY"]
H = {"x-api-key": API_KEY, "Content-Type": "application/json"}
TARGETS = [
{"category": "plumber", "location": "Austin TX"},
{"category": "electrician", "location": "Austin TX"},
{"category": "dentist", "location": "Austin TX"},
]
def discover_maps(category: str, location: str) -> list:
resp = requests.post(
"https://api.scavio.dev/api/v1/search",
headers=H,
json={"query": f"{category} in {location}", "platform": "google-maps", "country_code": "us"},
timeout=15,
)
return [{"name": p.get("title", ""), "address": p.get("address", ""), "rating": p.get("rating"), "phone": p.get("phone", "")}
for p in resp.json().get("local_results", [])]
def enrich(name: str, location: str) -> dict:
resp = requests.post(
"https://api.scavio.dev/api/v1/search",
headers=H,
json={"query": f"{name} {location}", "country_code": "us"},
timeout=10,
)
organic = resp.json().get("organic_results", [])
return {"website": organic[0].get("link", "") if organic else "", "mentions": len(organic)}
def daily_pipeline():
all_leads = []
for t in TARGETS:
leads = discover_maps(t["category"], t["location"])
for lead in leads:
enrichment = enrich(lead["name"], t["location"])
lead.update(enrichment)
lead["category"] = t["category"]
all_leads.append(lead)
# Write CSV
if all_leads:
with open("leads.csv", "w", newline="") as f:
w = csv.DictWriter(f, fieldnames=all_leads[0].keys())
w.writeheader()
w.writerows(all_leads)
print(f"Discovered {len(all_leads)} leads across {len(TARGETS)} categories")
return all_leads
leads = daily_pipeline()
for l in leads[:5]:
print(f"{l['name']}: {l.get('website', 'N/A')} ({l.get('rating', 'N/A')} stars)")JavaScript Implementation
const H = {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
const fs = await import('fs');
const TARGETS = [{category:'plumber',location:'Austin TX'},{category:'electrician',location:'Austin TX'},{category:'dentist',location:'Austin TX'}];
async function discoverMaps(category, location) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {method:'POST', headers:H, body:JSON.stringify({query:category+' in '+location, platform:'google-maps', country_code:'us'})});
return ((await r.json()).local_results||[]).map(p=>({name:p.title||'', address:p.address||'', rating:p.rating, phone:p.phone||''}));
}
async function enrich(name, location) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {method:'POST', headers:H, body:JSON.stringify({query:name+' '+location, country_code:'us'})});
const organic = (await r.json()).organic_results||[];
return {website:organic[0]?.link||'', mentions:organic.length};
}
async function dailyPipeline() {
const allLeads = [];
for (const t of TARGETS) {
const leads = await discoverMaps(t.category, t.location);
for (const lead of leads) {
const e = await enrich(lead.name, t.location);
Object.assign(lead, e, {category:t.category});
allLeads.push(lead);
}
}
if (allLeads.length) {
const header = Object.keys(allLeads[0]).join(',');
const rows = allLeads.map(l=>Object.values(l).join(','));
fs.writeFileSync('leads.csv', header+'\n'+rows.join('\n'));
}
return allLeads;
}
const leads = await dailyPipeline();
console.log('Discovered '+leads.length+' leads');
for (const l of leads.slice(0,5)) console.log(l.name+': '+(l.website||'N/A'));Platforms Used
Google Maps
Local business search with ratings and contact info
Web search with knowledge graph, PAA, and AI overviews