Google Maps Missing Website Finder avatar

Google Maps Missing Website Finder

Pricing

from $2.40 / 1,000 missing website leads

Go to Apify Store
Google Maps Missing Website Finder

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

Delowar Munna

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

21 hours ago

Last modified

Share

Google Maps Missing Website Finder

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 searchQueries is a single phrase like keyword in location. The actor splits on the last in to derive search_keyword and search_location; phrases without in are searched as-is. startUrls is optional and accepts only Google Maps URLs.


📦 Output

The dataset has one view: Missing-website leads — a 31-column flat table.

Missing-website leads table view

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.

SignalPoints
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, or categoryExclude.
  • 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

FilterEffect
Missing websiteAlways on. Only businesses with no website on Maps are saved.
minRatingDrop businesses below this star rating (0 disables).
minReviewCountDrop businesses with fewer reviews (0 disables).
phoneRequiredIf true (default), keep only businesses with a visible phone.
categoryIncludeKeep only rows whose category contains any of these substrings.
categoryExcludeDrop rows whose category contains any of these substrings.
deduplicateResultsDrop 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_id may 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 address field 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.