Google Maps Lead Scorer - Rank Local Businesses 0-100
Pricing
from $2.00 / 1,000 scoring runs
Google Maps Lead Scorer - Rank Local Businesses 0-100
Turn a Google Maps scrape into a ranked call list. Scores every business 0-100 from website quality, reviews, rating, hours, socials, category fit and contactability, with point-by-point reasons and weights you control. Goal presets for web, SEO and review agencies. No LLM.
Pricing
from $2.00 / 1,000 scoring runs
Rating
0.0
(0)
Developer
mohamed alaya
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
16 days ago
Last modified
Categories
Share
You scraped 5,000 local businesses from Google Maps. Who do you call first? This Actor turns the scrape into a ranked call list: every business gets a 0-100 score, a tier (Hot / Warm / Cool / Cold) and the reasons, based on website quality signals, review volume, rating, Maps profile completeness, opening hours, social profiles, category fit and how easily you can reach them. Deterministic rubric, no LLM, no network calls, weights you control.
Built to sit right behind the Google Maps scraper: it reads that Actor's output as-is (title, categoryName,
website, phone, totalScore, reviewsCount, openingHours, emails, facebooks, claimThisBusiness,
permanentlyClosed ...), and also accepts CSV exports from other directories.
Pick what you sell: the score changes with your offer
A good lead depends on the offer, so goal switches the rubric:
| Goal | Who it is for | What scores high |
|---|---|---|
bestOverall | general prospecting, partnerships | established, well-rated, reachable, complete profile, own https website |
websiteAgency | web design / SEO agencies | no website, a social page or free-builder site as "website", or no https, on a business with real reviews and a phone |
reputationMgmt | review / reputation tools | many reviews but a rating between 3.0 and 4.4 |
localMarketing | social media / local marketing | good ratings with few social profiles and a thin Maps profile |
Then override any weight: {"reviewVolume": 40, "email": 0}. Weights are relative; the score is always scaled to 0-100.
How a score is built
score = 100 x sum(weight x signal) / sum(weight) over the criteria that apply:
| Criterion | Reads |
|---|---|
| Phone | a phone number is listed |
| an e-mail is present (e.g. from the Maps scraper's contact enrichment) | |
| Website | none / social page / free builder subdomain (Wix, Square, business.site ...) / own domain without https / own https domain |
| Social profiles | Facebook, Instagram, LinkedIn, X, YouTube, TikTok links found |
| Review volume | log-scaled review count (500+ reviews = full marks) |
| Rating | the star rating, interpreted by your goal |
| Maps profile | opening hours, description, photos, claimed listing |
| Category fit | only when you set targetCategories |
Missing data is not zero. If your records have no emails column the e-mail criterion is left out and the other
weights are rescaled; the row lists it under leadNotScored. Closed businesses, excluded categories and businesses below
your minReviews become tier Skip (kept at the end of the dataset with the reason, unless you turn that off).
It does not visit the website, so "website quality" means what the listing itself shows (does a site exist, is it a social page, a free-builder subdomain, https or not). It cannot judge design, speed or SEO of the site.
Output
One row per business, your original columns plus:
{"title": "Greenleaf Plumbing Co.","categoryName": "Plumber","phone": "(512) 555-0190","website": null,"totalScore": 4.9,"reviewsCount": 64,"leadRank": 4,"leadScore": 76,"leadTier": "A","leadTierLabel": "Hot","leadWhy": "Strengths: no website: strong web-design / SEO opening (+33.3); phone number listed (+15.6); rating 4.9 (well liked) (+11.1). Weak spots: no e-mail found (0/8.9); Maps profile 33% complete (2.2/6.7).","leadBreakdown": ["Phone: 15.6/15.6 - phone number listed","Website: 33.3/33.3 - no website: strong web-design / SEO opening","Review volume: 13.4/20 - 64 reviews (established)","Rating: 11.1/11.1 - rating 4.9 (well liked)"],"leadNotScored": ["Category fit (no data: no target categories set)"],"leadWebsiteStatus": "none","leadGoal": "websiteAgency"}
(the example above was run with goal: websiteAgency; the breakdown is abridged.)
Key-value store: TOP_LEADS.csv (rank, score, tier, name, category, phone, e-mail, website, address, rating,
reviews, why, Maps link: your call sheet) and SUMMARY (tier counts, score range, weights used, warnings).
Started with no input it scores a built-in sample of 15 Google Maps businesses (two are closed and come out as tier Skip).
Input
| Field | Default | What it does |
|---|---|---|
datasetIds / places / sourceUrl / csvText | built-in sample | Google Maps scraper dataset IDs, pasted rows, a CSV / JSON URL or pasted CSV. |
goal | bestOverall | The rubric preset (table above). |
weightOverrides | {} | Your own weights: phone, email, website, socials, reviewVolume, rating, profile, categoryFit. |
targetCategories / excludeCategories | [] | Words matched against Maps categories (dentist, plumber ...). |
minReviews, excludeClosed | 0, true | Skip rules. |
tierACutoff / tierBCutoff / tierCCutoff | 75 / 55 / 35 | Where Hot / Warm / Cool start. |
topN, csvTopCount, includeSkipped | 0 (all), 100, true | Output size. |
fieldMap | {} | Rename columns: {"name":"Business","rating":"Stars","reviews":"Votes"}. |
Pipelines
- Maps scraper -> Remove Duplicate Leads -> this Actor. Overlapping searches return the same business twice; merge first, then score the clean list.
- Maps scraper with contact enrichment -> this Actor -> export
TOP_LEADS.csv-> your CRM or dialer. - Schedule it after a weekly scrape and diff the top tier.
Make, Zapier and n8n work through the Apify integrations (trigger on "run succeeded"). From code:
curl -X POST "https://api.apify.com/v2/acts/that_red_bird~maps-lead-scorer/runs?token=$APIFY_TOKEN" \-H 'content-type: application/json' \-d '{"datasetIds":["YOUR_MAPS_DATASET_ID"],"goal":"websiteAgency","targetCategories":["plumber","roofing"]}'
AI agents can call it as an Apify Actor tool (MCP) with the same JSON.
Pricing
Pay per event: $0.002 per run + $0.002 per business scored (skipped rows included, they are delivered output). 1,000 businesses cost about $2. Rows that cannot be read are not charged and the run stops cleanly at your maximum cost. Scoring 100,000 rows took about 4 seconds in testing.
FAQ
Is the score "accurate"? It is a transparent ranking rule, not a prediction of who will buy. Check the leadWhy
and leadBreakdown on a few rows, tune the goal and weights until the top of the list matches your instinct, then trust it for the rest.
Why do two goals rank the same business differently? Because "good" changes with what you sell. A business without a website is a great web-agency lead and a poor partnership lead.
My file is not from the Maps scraper. Use fieldMap to point at your columns. Anything it cannot find is left out of the
score and listed in leadNotScored.
Does it scrape or call anything? No. It only reads the data you give it.
Support
Open an issue on the Actor page with a row that scored surprisingly and we will check the rubric. A short review helps others find it.