Small Business Website Opportunity Finder
Pricing
Pay per usage
Small Business Website Opportunity Finder
Find small business websites with visible opportunity gaps using geography and category searches, then score their website quality and improvement potential.
Pricing
Pay per usage
Rating
5.0
(2)
Developer
Jesper Frilund
Maintained by CommunityActor stats
0
Bookmarked
7
Total users
2
Monthly active users
9 days ago
Last modified
Categories
Share
Find small businesses with websites that show visible improvement opportunities — useful for freelance web developers, small agencies, SEO consultants, and lead generation teams.
This Actor discovers businesses from a place + category, visits their websites, and scores practical website gaps such as weak booking paths, thin content, missing trust signals, and unclear contact information.
What it does
- Searches for businesses by geography and category.
- Finds each business website when available.
- Fetches the homepage and priority pages.
- Extracts website signals.
- Returns opportunity and trust scores with outreach-friendly summaries.
Setup: Google Places API key required
Discovery mode (searching by places + categories) uses the Google Places API directly — it no longer depends on any Apify public actor. You need your own Google Cloud API key with the Places API (New) enabled.
- In Google Cloud Console, enable the Places API (New) for a project.
- Create an API key (restrict it to the Places API for safety).
- Set it as an environment variable / Apify secret named
GOOGLE_MAPS_API_KEY(the actor also acceptsGOOGLE_PLACES_API_KEYas an alternate name if you already use that convention elsewhere).
If the key is missing or invalid, or the Places API returns an error (auth, quota, etc.), the Actor does not crash — it writes one friendly discovery-error row to the dataset explaining what went wrong and what to do next, and the run still finishes normally. Manual domains mode does not need this key at all, since it skips discovery entirely.
Good use cases
- Find local businesses that may need a website refresh.
- Build prospect lists for web design, SEO, CRO, or conversion work.
- Prioritize outreach based on visible website gaps.
- Compare businesses in the same category and city.
Example inputs
{"places": ["Nyköping, Sweden"],"categories": ["pizza restaurant"],"maxResults": 20,"maxPagesPerSite": 2,"googleMapsMaxCrawledPlacesPerSearch": 20}
{"places": ["Norrköping, Sweden"],"categories": ["pet groomer"],"maxResults": 20,"maxPagesPerSite": 2,"googleMapsMaxCrawledPlacesPerSearch": 20}
{"places": ["Manchester, UK"],"categories": ["hair salon", "barbershop"],"maxResults": 20,"maxPagesPerSite": 2,"googleMapsMaxCrawledPlacesPerSearch": 20}
Input fields
| Field | Type | Description |
|---|---|---|
places | array | Cities, regions, or geographies to search in. |
categories | array | Business categories to search for, e.g. pizza restaurant, pet groomer, hair salon. |
maxResults | integer | Maximum number of websites to analyze. Default is 20 for beta/normal prospecting. |
maxPagesPerSite | integer | Maximum number of pages to fetch per website. Default is 2 for beta/normal prospecting. |
googleMapsMaxCrawledPlacesPerSearch | integer | How many Google Maps places to inspect per query before filtering. Default and maximum are 20 to keep runs cost-safe by default. |
domains | array | Optional manual domain list for direct audit mode. Leave empty for discovery mode. |
Category examples
Use plain business categories — the kind of thing you would search for on Google Maps. Google Maps is usually forgiving, so free-form local-language terms can work well too, for example skoaffär, frisör, or pizzeria. English is still a good fallback if a local term gives weak results.
Good input:
"categories": ["hair salon", "pet groomer", "pizza restaurant"]
Avoid vague inputs like small business, good leads, companies, or websites. Combine one clear category with one place instead, for example dentist + Manchester, UK.
Quick starter list
If you are unsure what to enter, start with one of these:
pizza restaurantrestaurantcafebakeryhotelbed and breakfasthair salonbarbershopnail salonbeauty salonpet groomerdog daycareveterinariancar repairdentistcleaning companypaintercarpenterplumberelectricianlandscapergymyoga studiophysiotherapistchiropractor
Food, drink, and hospitality
| What you want | Try these category inputs |
|---|---|
| Pizza restaurants | pizza restaurant, pizzeria, pizza, pizzerior |
| Restaurants | restaurant, restaurang |
| Cafés | cafe, café, kafé, coffee shop |
| Bakeries / pastry shops | bakery, bageri, konditori |
| Bars / pubs | bar, pub |
| Hotels / guest houses | hotel, bed and breakfast, guest house, bnb |
| Shoe stores | shoe store, shoe shop, skoaffär, skobutik |
Beauty and personal services
| What you want | Try these category inputs |
|---|---|
| Hair salons | hair salon, frisör, frisörsalong |
| Barbers | barber, barbershop, herrfrisör |
| Nail salons | nail salon, nagelsalong |
| Beauty salons | beauty salon, skönhetssalong |
| Massage / spa | massage, spa |
| Tattoo studios | tattoo studio, tatuerare |
Pets and animals
| What you want | Try these category inputs |
|---|---|
| Pet groomers | pet groomer, dog grooming, hundfrisör, hundsalong, hundtrim |
| Dog daycare / boarding | dog daycare, dog boarding, hunddagis, hundpensionat |
| Veterinarians | veterinarian, veterinary clinic, veterinär |
Home, trades, and local services
| What you want | Try these category inputs |
|---|---|
| Car repair | car repair, auto repair, bilverkstad, verkstad |
| Dentists | dentist, dental clinic, tandläkare |
| Cleaning companies | cleaning company, cleaning service, städfirma, städbolag |
| Painters | painter, painting contractor, målare, målerifirma |
| Carpenters / builders | carpenter, construction company, snickare, byggfirma |
| Plumbers | plumber, plumbing service, rörmokare, vvs |
| Electricians | electrician, elektriker, elinstallation |
| Landscapers / gardeners | landscaper, gardener, trädgårdsservice |
| Locksmiths | locksmith, låssmed |
Health, fitness, and activities
| What you want | Try these category inputs |
|---|---|
| Gyms | gym, fitness center, träningscenter |
| Yoga studios | yoga studio, yoga |
| Physiotherapy | physiotherapist, physical therapy, fysioterapeut |
| Chiropractors | chiropractor, kiropraktor |
| Clinics | clinic, private clinic, vårdcentral |
Tips for better results
- Start with one city and one category, for example
Malmö, Sweden+frisör. - If a Swedish category gives weak results, try the English equivalent too.
- Use
maxResults: 20andgoogleMapsMaxCrawledPlacesPerSearch: 20for beta testing and normal prospecting. This gives useful coverage while keeping Google Places costs bounded. - Use
maxResults: 10-30depending on city/category size. - For larger cities, run multiple focused category/place combinations instead of one huge Google Maps pull. The current default intentionally caps discovery to keep usage predictable.
- Some businesses only list Facebook, Foodora, booking platforms, or no website. These may be filtered out or ranked lower.
Output fields
Each result is written as one flat lead row in the Apify dataset. The important fields are visible directly in the table so you can judge leads without reading logs.
Key fields:
| Field | Meaning |
|---|---|
businessName | Business name when found. |
domain / websiteUrl | Website being analyzed. |
leadPriority / leadQuality | Human-readable outreach priority. Start here before reading numeric scores. |
opportunityLevel | Text description of improvement potential, e.g. High improvement potential. |
trustLevel | Text description of trust hygiene, e.g. Weak trust hygiene. |
scoreExplanation | Plain-English explanation of what drove the score. |
leadScore | Numeric prospect score for sorting, based on opportunity, fit, and contactability. |
displayScore / opportunityScore | Legacy numeric opportunity score. Higher means more visible improvement potential, not “better design”. |
trustScore | Numeric trust/hygiene score. Higher means stronger trust signals. |
smallBusinessFitScore | Helps separate independent-business leads from chains/platforms. |
mainReason | Main reason the lead looks interesting. |
topFixesText | Practical website fixes to mention or sell. |
outreachAngle | Outreach-ready pitch angle. |
phone / email / address | Contact details when found. |
summary | Concise lead summary. |
details | Full nested diagnostics for debugging/audit. |
See docs/output-field-register.md for the full output register and field meanings.
Example output shape:
{"businessName": "Pizzeria Mamma Mia","domain": "mammamiapizza.se","websiteUrl": "https://mammamiapizza.se","leadScore": 76,"leadPriority": "high","leadQuality": "Strong outreach lead","verdict": "Strong outreach lead","opportunityLevel": "High improvement potential","trustLevel": "Weak trust hygiene","scoreExplanation": "Opportunity is high improvement potential and trust is weak trust hygiene. Main drivers: trust hygiene gap, booking/conversion gap.","displayScore": 72,"opportunityScore": 72,"trustScore": 41,"smallBusinessFitScore": 83,"mainReason": "trust hygiene gap, booking/conversion gap","topFixesText": "add privacy policy; add clearer booking CTA","outreachAngle": "Lead with booking and conversion...","phone": "...","email": null,"summary": "Visible website improvement potential with weak trust hygiene."}
How to interpret scores
Start with the text fields first:
- Lead quality / priority: the practical outreach verdict.
- Opportunity level: how much visible website improvement potential the site appears to have.
- Trust level: how strong or weak the trust/hygiene signals appear.
- Score explanation: the main reasons behind the labels.
Numeric scores are mainly for sorting and filtering:
- Opportunity score /
displayScore: higher means more visible improvement potential. It does not mean the website is visually better. - Trust score: higher means stronger trust and hygiene signals.
- Small business fit: helps separate realistic independent-business prospects from larger chains or platforms.
Scores are directional heuristics, not a human design review. Spot-check websites before outreach.
Google Places cost control
Discovery mode uses Google Places API. Cost depends mainly on search requests. The current default is cost-safe: one bounded Text Search request per query, capped at 20 places per search, and no Place Details calls unless explicitly enabled by environment variables.
Recommended normal beta input:
{"maxResults": 20,"maxPagesPerSite": 2,"googleMapsMaxCrawledPlacesPerSearch": 20}
For a cheap smoke test:
{"maxResults": 5,"maxPagesPerSite": 1,"googleMapsMaxCrawledPlacesPerSearch": 5}
Set Google Cloud billing alerts and check Billing → Reports plus Places API (New) → Metrics/Quotas during beta.
Notes and limitations
This is a beta tool. Results are heuristic and should be spot-checked before outreach.
Discovery depends on search/map data availability. Some businesses may only list Facebook, Foodora, booking platforms, or no website at all. The Actor prioritizes real business websites over directories and weak platform pages when possible.
Scores are website-quality signals, not a judgment of the business itself.
Best workflow
- Start with one city and one category.
- Use
maxResults: 20,maxPagesPerSite: 2, andgoogleMapsMaxCrawledPlacesPerSearch: 20for a realistic cost-safe beta/prospecting pass. - Spot-check the top results.
- Export usable leads into your CRM or outreach sheet.
- Refine category/place and rerun.