Agency Prospect Finder
Pricing
from $4.00 / 1,000 result items
Agency Prospect Finder
Finds local businesses that look like they run ads but are bleeding money on a broken, slow, or missing website, have weak reviews, and no online booking. Ranks every business into a scored 'needs an agency' list so agencies and freelancers can prioritize outreach.
Pricing
from $4.00 / 1,000 result items
Rating
0.0
(0)
Developer
Tommi Sullivan
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
9 days ago
Last modified
Categories
Share
Agency Prospect Finder — Local Businesses That Need an Agency (Pay Per Result)
Find the local businesses that are already spending on visibility but leaking it through a broken funnel. Give it a location and a vertical (e.g. "dentist" in "Austin, TX") and it returns a ranked list of businesses that look like they run ads but have a slow/broken/missing website, weak reviews, or no online booking — the exact profile of a business that needs an agency and can be shown the problem in one screenshot.
Keywords: agency lead generation, local business leads, website audit scraper, google maps lead finder, cold outreach leads for agencies.
Why this actor
Most "Google Maps scraper" actors dump raw place data and leave the qualifying work to you. This one does the qualifying work: it fetches each business's own website, times it, checks its HTTP status, and scans for booking-tool markers — then combines that with review and category signals into a single 0–100 opportunity score, sorted highest-first. You open the dataset and the top rows are your best outreach targets.
- Composite scoring, not just raw data. Website health (40 pts), reviews (30 pts), booking gap (15 pts), ads-likelihood heuristic (15 pts) — see PRICING.md for cost math and README below for the exact rubric.
- Direct JSON APIs, no browser. Google Places API (New) for business data, a plain HTTP fetch for website health. No headless Chrome, so compute cost stays low.
- Honest heuristics, clearly labeled. "Likely runs ads" is a proxy signal (operational + review_count≥25) — there is no public Ads API this actor calls. It is never presented as verified ad spend.
- Pay per result. No subscription — you pay for scored businesses returned. See PRICING.md.
What it does
- Runs a Google Places Text Search for
"{vertical} in {location}". - Fetches Place Details (rating, review count, up to ~5 reviews, website, phone) for each result.
- Fetches each business's website once: HTTP status, load time, HTTPS, mobile-viewport tag, and a scan for booking-tool links (Calendly, Vagaro, Square, Booksy, etc.).
- Scores every business 0–100 on how much it looks like it needs an agency, tags a tier (
hot/warm/cool/healthy), and lists the specific signals that drove the score. - Sorts by score descending, filters by your minimum score, and pushes.
Input
| Field | Type | Description |
|---|---|---|
location | string | Where to search, e.g. Austin, TX. |
vertical | string | Business type, e.g. dentist, roofer, med spa. |
maxResults | integer | Spend cap on scored records pushed. Default 60. |
minOpportunityScore | integer | Only push businesses at/above this score (0–100). Default 0. |
siteTimeoutSeconds | integer | Per-website fetch timeout. Default 10. |
googlePlacesApiKey | string (secret) | Your Google Cloud Places API key (Places API (New) enabled, billing on). |
proxyConfiguration | object | Proxy for website health checks only (Places API calls go direct). Datacenter is the default and is normally sufficient. |
Input example
{"location": "Austin, TX","vertical": "dentist","maxResults": 60,"minOpportunityScore": 40,"googlePlacesApiKey": "YOUR_KEY","proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["DATACENTER"] }}
Output
| Field | Description |
|---|---|
name, category, address, phone, website, maps_url | Core Places data. |
opportunity_score | 0–100 composite "needs an agency" score. |
opportunity_tier | hot (≥70) / warm (≥45) / cool (≥20) / healthy. |
signals | List of the specific scoring reasons, e.g. ["website:slow(+22)", "no_booking_link(+15)"]. |
site_status | ok / slow / broken / missing / parked / timeout. |
site_load_time_ms, site_http_status, site_is_https, site_has_mobile_viewport | Website health detail. |
rating, review_count, review_response_rate | Review signals (review_response_rate is null if Google's API doesn't expose owner replies — see FAQ). |
has_booking_link, booking_link_url | Booking-tool detection. |
likely_runs_ads, likely_runs_ads_basis | Heuristic flag + a plain-English note on what it is (and isn't) based on. |
scraped_at | ISO-8601 UTC timestamp. |
Scoring rubric
- Website health (max 40):
missing=40,broken/parked=35,timeout=25,slow=22,ok=0. - Reviews (max 30): rating<3.5 (+16) or no rating (+6); <4.2 (+8); review_count<5 (+10) or <20 (+5); low owner-response rate (+4).
- No booking link: +15.
- Likely runs ads (heuristic): +15.
Use cases
- Agency/freelancer cold outreach — build a "these 20 businesses are losing customers to their own website" prospect list per city/niche.
- Franchise/rollup audits — score every location of a franchise or chain for underperforming digital presence.
- Sales enablement — hand reps a pre-scored, pre-qualified list instead of a raw Maps export.
FAQ
Do I need my own Google API key? Yes. Get one at console.cloud.google.com/apis/credentials, enable Places API (New), and attach billing. Google's own usage fees apply on top of this Actor's price — see PRICING.md.
Is "likely runs ads" verified ad spend? No — it's a conservative heuristic (operational + 25+ reviews) used as a proxy for "actively marketed business." There is no public Google/Meta Ads API called. Flagged in every output row via likely_runs_ads_basis.
Is the website check a real Lighthouse audit? No. It's a direct HTTP fetch measuring status code, load time, HTTPS, and a couple of HTML smell tests — described as "basic Lighthouse-style signals," not a real Lighthouse score. Sites behind bot-protection interstitials (e.g. Cloudflare challenge pages) may show a false "slow" or "broken" read since no browser/JS execution is used.
Why is review_response_rate sometimes null? Google's Places API (New) does not publicly document an owner-reply field on review objects as of this build. If Google exposes one, this field populates; otherwise it degrades to null rather than guessing. Marked TODO-VERIFY in src/scoring.py.
Legality
This actor collects only publicly available business data via Google's official Places API (with your own billed key) and public website responses. It does not scrape Google Maps HTML, bypass authentication, or access private data. You are responsible for using the output in line with Google's Places API terms and applicable law. Not affiliated with or endorsed by Google.


