Find, score, and manage business leads from Google Maps. Search by type and location, filter by website presence, review count, and rating, enrich with email addresses and website quality analysis, score leads with AI, generate outreach messages, and export to CSV.
- Search Google Maps by business type and location (city/state or zip code)
- Set a target result count (200, 500, 1000+) — auto-calculates grid coverage to hit your number
- 3 data sources: Google Places API, SerpAPI, or free Docker-based scraper
- Filter by: website (has/doesn't have), phone, review count, rating, category, exclude names
- Score leads with customizable rule-based scoring + optional AI enhancement (OpenAI, Claude, Gemini)
- Check websites for SSL, mobile-friendliness, load speed, platform (WordPress/Wix/etc.), booking page
- Find emails via Hunter.io integration
- Manage leads with a built-in pipeline: New → Contacted → Replied → Meeting → Won/Lost + notes
- Generate outreach from customizable templates that auto-fill business name, gaps, and details
- Choose export columns — pick exactly which fields go into your CSV
- Cache results — re-running a search costs nothing (cached in your browser)
- Track costs — real-time session spend tracker in the header
The goal is to distribute this as a normal desktop app so users do not need Node.js, Git, or the command line.
- Go to the repo's Releases page
- Download the latest
Maps Lead Gen-Setup-...exe - Double-click the installer
- Launch Maps Lead Gen from the desktop or Start menu
- Open Settings in the app and paste your API keys
The installer bundles the frontend and local backend together, so the user only needs to install the app and configure their keys.
The app still needs service credentials for the features you want to use:
- Google Places API key for primary search
- SerpAPI key if you want that search source
- Hunter.io key for email enrichment
- OpenAI / Claude / Gemini key for AI scoring
Only the Google Places API key is required for the core workflow.
npm ci
npm run electron:build:winThe generated installer will be written to dist-electron/.
This repo includes a workflow at .github/workflows/build-desktop-installer.yml.
- Run it manually from the Actions tab, or
- Push a tag like
v1.0.1
When the workflow runs, it builds the Windows installer and:
- uploads it as a workflow artifact
- attaches it to the GitHub Release when triggered by a version tag
No technical experience needed.
- Go to https://nodejs.org and click the green LTS button
- Open the downloaded
.pkgfile and follow the installer - Verify: open Terminal (
Cmd + Space→ typeTerminal) and runnode --version
cd ~/Desktop && git clone https://github.com/anthonyonazure/maps-lead-gen.git
cd ~/Desktop/maps-lead-gen && npm install
If you see "git: command not found", click Install when the popup appears, then try again.
Google gives you $200/month in free credits — enough for ~6,000 searches.
- Go to https://console.cloud.google.com/ and sign in
- Create a new project (name it anything)
- Go to APIs & Services → Credentials → + Create Credentials → API key
- Copy the key (starts with "AIza...")
- Enable these two APIs:
cd ~/Desktop/maps-lead-gen && npm run dev
Open http://localhost:5173, click the gear icon, paste your API key, click Save.
- Go to https://nodejs.org and click the green LTS button
- Run the
.msiinstaller (click Next through everything) - Verify: open Command Prompt (Windows key → type
cmd) and runnode --version
- Go to https://git-scm.com/download/win and run the installer (defaults are fine)
cd %USERPROFILE%\Desktop
git clone https://github.com/anthonyonazure/maps-lead-gen.git
cd maps-lead-gen
npm install
Same as Mac Step 3 above.
cd %USERPROFILE%\Desktop\maps-lead-gen
npm run dev
Open http://localhost:5173, click the gear icon, paste your API key, click Save.
Mac: cd ~/Desktop/maps-lead-gen && npm run dev → open http://localhost:5173
Windows: Open Command Prompt, run cd %USERPROFILE%\Desktop\maps-lead-gen then npm run dev → open http://localhost:5173
Press Ctrl + C in the terminal to stop. Previous searches are cached — click history to reload for free.
| Feature | Description |
|---|---|
| Target Results | Enter how many you want (200, 500, 1000) — auto-calculates grid size |
| 3 Data Sources | Google Places API, SerpAPI, or free Docker scraper |
| Filters | Website, phone, reviews (min/max), rating (min/max), category, exclude names |
| Search History | Click any past search to reload instantly (no API cost) |
| Cost Tracker | Session spend, per-search cost, remaining monthly credit |
| Feature | Description |
|---|---|
| Rule-Based Scoring | Customizable weight sliders: no website (+30), low reviews (+20), low rating (+15), etc. |
| AI Enhancement | Optional — OpenAI, Claude, or Gemini adds a 1-line assessment per lead |
| Score Badges | Hot (70+), Warm (40-69), Low (0-39) — sortable column |
| Score Breakdown | Expand any row to see exactly why it scored the way it did |
| Feature | Description |
|---|---|
| Website Check | SSL, mobile-friendly, load speed, platform detection, booking page, contact form |
| Email Finder | Hunter.io integration — find contact emails for businesses with websites |
| Tech Score | 0-100 rating of website quality (low = better lead for selling web services) |
| Feature | Description |
|---|---|
| Pipeline | Click "Manage" on any lead → set status: New → Contacted → Replied → Meeting → Won/Lost |
| Notes | Add notes per lead — persists across sessions |
| Outreach Templates | 4 default GHL-focused templates + create your own. Auto-fills business name, gaps, reviews |
| Template Variables | {business_name}, {gaps}, {reviews}, {rating}, {platform}, {email}, {your_name} |
| Feature | Description |
|---|---|
| Column Picker | Choose exactly which columns to include in your CSV |
| Export Selected | Checkboxes to pick specific leads |
| Export All | Download entire filtered result set |
| 18 Available Columns | Name, address, phone, email, website, rating, reviews, score, AI summary, platform, mobile, SSL, booking, load time, status, notes, categories, Google Maps URL |
| Service | What It Does | Cost | Get Key |
|---|---|---|---|
| Google Places | Primary search data source | $200/mo free credit (~6,000 searches) | Google Cloud Console |
| SerpAPI | Alternative search (no result cap) | $50/mo for 5,000 searches | serpapi.com |
| Hunter.io | Find contact emails | 25 free/mo, $49/mo for 1,000 | hunter.io |
| OpenAI | AI lead scoring (GPT-4o-mini) | ~$0.15 per 1,000 leads | platform.openai.com |
| Anthropic | AI lead scoring (Claude Haiku) | ~$0.25 per 1,000 leads | console.anthropic.com |
| Google Gemini | AI lead scoring (Gemini Flash) | ~$0.10 per 1,000 leads | aistudio.google.com |
| Docker Scraper | Free alternative (no API key) | Free | gosom/google-maps-scraper |
Only the Google Places API key is required. Everything else is optional.
| Target Results | Grid | API Calls | Cost |
|---|---|---|---|
| Up to 60 | None | ~3 | ~$0.10 |
| ~200 | 2x2 | ~12 | ~$0.38 |
| ~500 | 3x3 | ~27 | ~$0.86 |
| ~1,000 | 4x4 | ~48 | ~$1.54 |
| ~2,000 | 6x6 | ~108 | ~$3.46 |
Cached searches cost $0.
| Problem | Solution |
|---|---|
command not found when typing npm |
Node.js didn't install — go back to Step 1 |
| "API key is invalid" | Enable both APIs (Places + Geocoding). Wait a minute and retry |
| "connection refused" in browser | Terminal with npm run dev must be open and running |
| "0 of 20 results" showing | Filters are too narrow — clear review/rating limits |
| Find Emails button doesn't work | Set your Hunter.io key in Settings first |
- Backend: Express + TypeScript
- Frontend: React + Vite + Tailwind CSS
- Data: Google Places API, SerpAPI, gosom scraper
- AI: OpenAI, Anthropic, Google Gemini
- Storage: Browser localStorage (no database, no accounts)
MIT