How to find local businesses that need a website (Google Maps + Apify)
If you sell websites, local SEO or reputation management, the hardest part isn't the work. It's finding businesses that actually need it.
Most people scrape Google Maps, open a spreadsheet with 500 rows, and then check every business by hand: Do they have a website? Does it load? Is the listing claimed? How are the reviews? That takes hours, and most rows turn out to be businesses that are already fine.
Here is a way to automate the whole filter in two steps, without writing a scraper.
Step 1: Get the businesses from Google Maps
Use Google Maps Scraper on Apify. Enter a niche and a city, for example plumber + Austin, TX. Turn on contact details if you also want emails and social profiles.
When the run finishes, you get a dataset with one row per business: name, phone, website, rating, review count, whether the listing is claimed, photos, opening hours and more.
Step 2: Score every business for sales opportunities
Feed that dataset into Business Opportunity Scorer for Agencies. It doesn't scrape anything again. It reads the dataset you already have and checks each business for problems you can fix:
| Signal | What you can pitch | Points |
|---|---|---|
| No website on the listing | Website design | 35 |
| Website is offline | Website repair / rebuild | 35 |
| Listing not claimed by the owner | Google Business Profile setup | 30 |
| Facebook page or directory used as the "website" | Website design | 25 |
| Rating below 4.0 | Reputation management | 25 |
| Website on a free builder subdomain | Professional site / domain | 15 |
| Fewer than 20 reviews | Review generation | 15 |
| No opening hours | Profile optimization | 10 |
| No social profiles | Social media management | 10 |
Each business gets a score from 0 to 100 and a tier:
-
hot(50+): several fixable problems -
warm(25–49) -
cold(under 25)
You also get a list of services to pitch and a ready-to-use opening line based on what was found. For example:
While looking at plumber listings in Austin on Google Maps, I noticed Joe's Plumbing has no website. People who search online usually pick a business they can check first, so you are likely losing those customers.
The website check uses DNS plus a direct connection test, so it isn't fooled by sites that block bots.
What the results look like
Results depend a lot on the niche. When I tested it, dentists in a big city were almost all cold, because they already have good websites and plenty of reviews. Handymen in a smaller city returned a lot of hot leads.
The niche matters more than the tool. Pick trades and small local services, not industries that already spend on marketing.
Doing it from code
If you'd rather automate it (for example, a weekly job that emails you new hot leads), here is the whole pipeline with the Apify JavaScript client:
import { ApifyClient } from 'apify-client'; const client = new ApifyClient({ token: process.env.APIFY_TOKEN }); // 1. Scrape Google Maps const maps = await client.actor('compass/crawler-google-places').call({ searchStringsArray: ['plumber'], locationQuery: 'Austin, TX', maxCrawledPlacesPerSearch: 200, }); // 2. Score the businesses, keep only warm and hot leads const scored = await client.actor('xarso/data-tools').call({ datasetId: maps.defaultDatasetId, minOpportunityScore: 25, }); const { items } = await client.dataset(scored.defaultDatasetId).listItems(); for (const lead of items) { console.log(lead.tier, lead.opportunityScore, lead.name, lead.phone); console.log(' ', lead.openingLine); } Setting minOpportunityScore: 25 means you only get, and only pay for, warm and hot leads. Closed businesses are skipped for free.
Before you send emails
Scraped emails are often outdated or contain typos. Run them through Email Verifier for Leads first. It flags invalid, disposable and mistyped addresses (gmial.com), so your bounce rate stays low and your domain doesn't get flagged.
Try it free
Open the scorer and click Start without choosing a dataset. It runs a free demo on three fictional businesses, so you can see the exact output before using your own data.
One last note: personalize the opening lines before you send them, and follow anti-spam rules (CAN-SPAM, GDPR) in your outreach. A short, relevant message about a real problem works much better than a mass blast.