Small Business Website Opportunity Finder avatar

Small Business Website Opportunity Finder

Pricing

Pay per usage

Go to Apify Store
Small Business Website Opportunity Finder

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

Jesper Frilund

Maintained by Community

Actor stats

0

Bookmarked

7

Total users

2

Monthly active users

9 days ago

Last modified

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

  1. Searches for businesses by geography and category.
  2. Finds each business website when available.
  3. Fetches the homepage and priority pages.
  4. Extracts website signals.
  5. 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.

  1. In Google Cloud Console, enable the Places API (New) for a project.
  2. Create an API key (restrict it to the Places API for safety).
  3. Set it as an environment variable / Apify secret named GOOGLE_MAPS_API_KEY (the actor also accepts GOOGLE_PLACES_API_KEY as 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

FieldTypeDescription
placesarrayCities, regions, or geographies to search in.
categoriesarrayBusiness categories to search for, e.g. pizza restaurant, pet groomer, hair salon.
maxResultsintegerMaximum number of websites to analyze. Default is 20 for beta/normal prospecting.
maxPagesPerSiteintegerMaximum number of pages to fetch per website. Default is 2 for beta/normal prospecting.
googleMapsMaxCrawledPlacesPerSearchintegerHow many Google Maps places to inspect per query before filtering. Default and maximum are 20 to keep runs cost-safe by default.
domainsarrayOptional 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 restaurant
restaurant
cafe
bakery
hotel
bed and breakfast
hair salon
barbershop
nail salon
beauty salon
pet groomer
dog daycare
veterinarian
car repair
dentist
cleaning company
painter
carpenter
plumber
electrician
landscaper
gym
yoga studio
physiotherapist
chiropractor

Food, drink, and hospitality

What you wantTry these category inputs
Pizza restaurantspizza restaurant, pizzeria, pizza, pizzerior
Restaurantsrestaurant, restaurang
Caféscafe, café, kafé, coffee shop
Bakeries / pastry shopsbakery, bageri, konditori
Bars / pubsbar, pub
Hotels / guest houseshotel, bed and breakfast, guest house, bnb
Shoe storesshoe store, shoe shop, skoaffär, skobutik

Beauty and personal services

What you wantTry these category inputs
Hair salonshair salon, frisör, frisörsalong
Barbersbarber, barbershop, herrfrisör
Nail salonsnail salon, nagelsalong
Beauty salonsbeauty salon, skönhetssalong
Massage / spamassage, spa
Tattoo studiostattoo studio, tatuerare

Pets and animals

What you wantTry these category inputs
Pet groomerspet groomer, dog grooming, hundfrisör, hundsalong, hundtrim
Dog daycare / boardingdog daycare, dog boarding, hunddagis, hundpensionat
Veterinariansveterinarian, veterinary clinic, veterinär

Home, trades, and local services

What you wantTry these category inputs
Car repaircar repair, auto repair, bilverkstad, verkstad
Dentistsdentist, dental clinic, tandläkare
Cleaning companiescleaning company, cleaning service, städfirma, städbolag
Painterspainter, painting contractor, målare, målerifirma
Carpenters / builderscarpenter, construction company, snickare, byggfirma
Plumbersplumber, plumbing service, rörmokare, vvs
Electricianselectrician, elektriker, elinstallation
Landscapers / gardenerslandscaper, gardener, trädgårdsservice
Locksmithslocksmith, låssmed

Health, fitness, and activities

What you wantTry these category inputs
Gymsgym, fitness center, träningscenter
Yoga studiosyoga studio, yoga
Physiotherapyphysiotherapist, physical therapy, fysioterapeut
Chiropractorschiropractor, kiropraktor
Clinicsclinic, 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: 20 and googleMapsMaxCrawledPlacesPerSearch: 20 for beta testing and normal prospecting. This gives useful coverage while keeping Google Places costs bounded.
  • Use maxResults: 10-30 depending 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:

FieldMeaning
businessNameBusiness name when found.
domain / websiteUrlWebsite being analyzed.
leadPriority / leadQualityHuman-readable outreach priority. Start here before reading numeric scores.
opportunityLevelText description of improvement potential, e.g. High improvement potential.
trustLevelText description of trust hygiene, e.g. Weak trust hygiene.
scoreExplanationPlain-English explanation of what drove the score.
leadScoreNumeric prospect score for sorting, based on opportunity, fit, and contactability.
displayScore / opportunityScoreLegacy numeric opportunity score. Higher means more visible improvement potential, not “better design”.
trustScoreNumeric trust/hygiene score. Higher means stronger trust signals.
smallBusinessFitScoreHelps separate independent-business leads from chains/platforms.
mainReasonMain reason the lead looks interesting.
topFixesTextPractical website fixes to mention or sell.
outreachAngleOutreach-ready pitch angle.
phone / email / addressContact details when found.
summaryConcise lead summary.
detailsFull 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

  1. Start with one city and one category.
  2. Use maxResults: 20, maxPagesPerSite: 2, and googleMapsMaxCrawledPlacesPerSearch: 20 for a realistic cost-safe beta/prospecting pass.
  3. Spot-check the top results.
  4. Export usable leads into your CRM or outreach sheet.
  5. Refine category/place and rerun.