Google Maps Missing Website Finder
Pricing
from $2.40 / 1,000 missing website leads
Google Maps Missing Website Finder
Find local businesses on Google Maps that do not have a website listed. Returns phone, address, category, rating, reviews, Google Maps URL, coordinates, and a transparent opportunity score for outreach by web design agencies, SEO consultants, and local lead-generation teams.
Pricing
from $2.40 / 1,000 missing website leads
Rating
0.0
(0)
Developer
Delowar Munna
Actor stats
0
Bookmarked
1
Total users
1
Monthly active users
21 hours ago
Last modified
Categories
Share

Find local businesses on Google Maps that do not have a website listed. Built for web design agencies, SEO consultants, freelancers, and B2B lead-generation teams who want a clean, outreach-ready list of website prospects — not a generic Google Maps dump.
V1 deliberately avoids website crawling, email extraction, full review scraping, photos, menus, and AI enrichment so the run stays fast and cheap. You only pay for unique missing-website leads that pass your filters and are successfully written to the dataset.
✨ Why this scraper
- Focused on missing-website leads — every saved row is a business with no website on Google Maps.
- 31 flat fields tuned for cold outreach (phone, address parts, opportunity score, reason tags).
- Pay-Per-Event —
$per saved unique lead. Businesses with websites, duplicates, filtered rows, and failed pushes are not charged. - Transparent opportunity score (0–100) — rule-based, no AI; explained below.
- No login, no cookies, no sessions — just a search phrase like
plumbers in Canberra. - CSV-friendly output — flat structure, comma-separated
reason_tags, drops cleanly into Sheets / Excel / CRMs.
🚀 Quick start — sample inputs
Example 1 — single query, AU
{"searchQueries": ["plumbers in Canberra"],"maxResults": 100,"country": "AU","language": "en","phoneRequired": true,"includeCoordinates": true,"includeOpeningHours": false,"includeOpportunityScore": true,"deduplicateResults": true,"proxyConfiguration": { "useApifyProxy": true }}
Example 2 — multi-query, rating + reviews filter, exclude big-box categories
{"searchQueries": ["electricians in Sydney NSW","dentists in Melbourne VIC","cafes in Brisbane QLD"],"maxResults": 500,"country": "AU","language": "en","minRating": 4,"minReviewCount": 10,"phoneRequired": true,"categoryInclude": [],"categoryExclude": ["department store", "shopping mall"],"includeCoordinates": true,"includeOpeningHours": false,"includeOpportunityScore": true,"deduplicateResults": true,"proxyConfiguration": { "useApifyProxy": true }}
Example 3 — Start URLs (advanced)
{"startUrls": ["https://www.google.com/maps/search/cleaning+services+in+New+York/?hl=en"],"maxResults": 50,"phoneRequired": true,"includeOpportunityScore": true,"deduplicateResults": true,"proxyConfiguration": { "useApifyProxy": true }}
Each entry of
searchQueriesis a single phrase likekeyword in location. The actor splits on the lastinto derivesearch_keywordandsearch_location; phrases withoutinare searched as-is.startUrlsis optional and accepts only Google Maps URLs.
📦 Output
The dataset has one view: Missing-website leads — a 31-column flat table.

Sample record — Missing-website leads
{"search_query": "cleaning services in New York","search_keyword": "cleaning services","search_location": "New York","business_name": "All Heart Homecare Agency Inc.","category": "Home health care service","rating": 4.8,"review_count": 436,"phone": "(718) 524-3521","address": "1664 East 14th Street, Brooklyn, NY 11229, USA","street_address": "1664 East 14th Street","suburb": "","city": "Brooklyn","state": "NY","postcode": "11229","country": "USA","website": "","has_website": false,"missing_website": true,"phone_available": true,"google_maps_url": "https://www.google.com/maps/place/All+Heart+Homecare+Agency+Inc./","place_id": "0x89c24494bb709a4d:0xf24a71bd4f525f09","latitude": 40.608757,"longitude": -73.95954,"opening_hours": "","is_open_now": true,"business_status": "Open","opportunity_score": 90,"opportunity_label": "High","reason_tags": "missing_website,phone_available,address_available,high_rating,many_reviews,category_available,opening_status_available","source_type": "query","scraped_at": "2026-05-05T13:49:32.598Z"}
Output fields (31)
search_query, search_keyword, search_location, business_name, category, rating, review_count, phone, address, street_address, suburb, city, state, postcode, country, website, has_website, missing_website, phone_available, google_maps_url, place_id, latitude, longitude, opening_hours, is_open_now, business_status, opportunity_score, opportunity_label, reason_tags, source_type, scraped_at.
🎯 Website Opportunity Score
Transparent rule-based score (0–100) computed from visible fields — no AI, no enrichment.
| Signal | Points |
|---|---|
| Missing website | +30 |
| Phone available | +20 |
| Full address | +15 |
| Review count ≥ 10 | +10 |
| Review count ≥ 50 | +10 |
| Rating ≥ 4.0 | +10 |
| Category present | +5 |
| Opening hours / open status | +5 |
Labels: High (80–100) · Medium (50–79) · Low (1–49) · Unknown (0).
Reason tags are returned as a single CSV string for spreadsheet friendliness, e.g. missing_website,phone_available,high_rating,many_reviews.
💰 Pricing
Pay-Per-Event. The actor charges a single missing-website-lead event for each unique, missing-website business that passes filters and is successfully written to the dataset. The actor honors the user-configured per-run spending cap (Apify eventChargeLimitReached) and stops cleanly when reached.
Not charged:
- Businesses that show a website on Google Maps.
- Duplicates (de-duplicated by
place_id, listing URL, or name + address / phone / location). - Rows filtered out by
minRating,minReviewCount,phoneRequired,categoryInclude, orcategoryExclude. - Rows missing a
business_name. - Failed dataset pushes.
- Anything after the per-run spending cap is reached.
📊 Run summary
After each run, a RUN_SUMMARY entry is written to the key-value store:
{"inputs_total": 5,"successful_inputs": 4,"failed_inputs": 1,"raw_results_found": 850,"businesses_with_website": 520,"missing_website_found": 180,"results_saved": 100,"duplicates_removed": 20,"filtered_out": 60,"charged_events": 100,"blocked_requests": 2,"retry_count": 8,"runtime_seconds": 420,"scraped_at": "2026-05-05T10:30:00.000Z"}
charged_events should equal results_saved unless the charging API fails or the per-run spending cap is reached.
⚙️ Filters
| Filter | Effect |
|---|---|
| Missing website | Always on. Only businesses with no website on Maps are saved. |
minRating | Drop businesses below this star rating (0 disables). |
minReviewCount | Drop businesses with fewer reviews (0 disables). |
phoneRequired | If true (default), keep only businesses with a visible phone. |
categoryInclude | Keep only rows whose category contains any of these substrings. |
categoryExclude | Drop rows whose category contains any of these substrings. |
deduplicateResults | Drop duplicates across queries (recommended ON). |
Filters are applied after extraction and before dataset push or event charge.
🚧 Limitations (V1)
- Cards-only extraction: V1 reads each business row directly from the search results panel and does not click into individual place detail panels. A row is treated as "missing website" when no website button is shown on the card. Phone, full opening hours, and
place_idmay be empty when Google does not surface them on the card. - No website crawling, email extraction, or social link extraction.
- No full review text or sentiment.
- No photos, menus, prices, or popular times.
- No login / cookie / session-based scraping.
- Address parsing into street / suburb / city / state / postcode is best-effort; the full
addressfield is the source of truth. - Per-run hard cap is 10,000 saved leads.
🛠️ Technical notes
- Stack: Node.js 22 · Apify SDK 3 · Crawlee · Puppeteer.
- Concurrency:
min=1,max=3(conservative to reduce blocking). - Memory: 1 GB min · 2 GB default · 4 GB max.
- Proxy: Apify Proxy enabled by default; custom configs accepted.
- Diagnostics: On the first failed render (no feed, or feed but zero cards), the actor saves the page HTML and URL to the key-value store as
debug-no-feed-html/debug-zero-cards-html.