# Google Maps Lead Priority Scorer (`reverenced_garnet/apify-gmaps-lead-priority`) Actor

Scores Google Maps places (from any Google Maps scraper's output) into a single 0-100 lead-priority score by combining missing website, unclaimed profile, GBP completeness, and relative review count. Zero-fetch, zero-LLM.

- **URL**: https://apify.com/reverenced\_garnet/apify-gmaps-lead-priority.md
- **Developed by:** [オレンジ Tb](https://apify.com/reverenced_garnet) (community)
- **Categories:**
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 scored leads

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### What does Google Maps Lead Priority Scorer do?

This Actor takes the output of **any Google Maps scraper** (such as [Google Maps Scraper](https://apify.com/compass/crawler-google-places)) and turns it into a single, sortable **lead-priority score from 0 to 100** for every business. It combines four signals that local SEO and marketing agencies already sell against — no independent website, an unclaimed Google Business Profile, missing profile fields, and a below-median review count versus similar nearby businesses — into one number plus a plain-English list of reasons.

It does **not** scrape anything itself and makes no external API or LLM calls. You already have the place data from a Maps scraper; this Actor just scores it, in seconds, for about the price of the cheapest scraping tier — and only the leads you receive are billed.

### Key features

- **🎯 Combined lead-priority score** — no independent website, unclaimed profile, GBP completeness, and relative review count merged into a single 0-100 number instead of four separate exports to juggle.
- **📈 Change tracking between runs** — run this Actor again later on the same area and every lead is tagged `NEW`, `UPDATED`, or `UNCHANGED` vs. last time, so you only re-review what actually moved.
- **🚫 Closed businesses excluded automatically** — places marked permanently closed on Google Maps are dropped before scoring, so you never call a business that no longer exists.
- **💸 Filter before you pay** — set a minimum tier and only Hot (or Hot+Warm) leads are ever charged for.
- **🔔 Built-in Slack / Discord / webhook notifications** — post a summary of new or updated leads straight to your team, no separate integration setup required.

### Why use this Actor?

Existing tools give you *one* signal at a time — a list of businesses with no website, or a list of unclaimed profiles. But a business missing a website **and** unclaimed **and** falling behind its neighbors on reviews is a much hotter lead than one missing just a website. This Actor combines the signals so your sales team can sort by a single number instead of juggling four separate exports.

Typical users: local SEO agencies and freelancers doing outbound prospecting, marketing agencies building target lists for a specific city or category, and directory/listing sites prioritizing which businesses to reach out to for profile claims.

### How to use Google Maps Lead Priority Scorer

1. Run a Google Maps scraper (e.g. [Google Maps Scraper](https://apify.com/compass/crawler-google-places)) for the area and category you care about, and grab its dataset output.
2. Paste that array of place objects into the **Google Maps places** input field here (or chain the two Actors together with an Apify integration).
3. Optionally set **Minimum priority tier** to only keep Hot or Hot+Warm leads.
4. Run it. Results are sorted highest-priority first.

### Input

| Field | Type | Description |
|---|---|---|
| `places` | array | The place objects from a Google Maps scraper's dataset output |
| `minTier` | string | `Hot`, `Warm`, or `Cold` (default) — the minimum tier to include in the output |
| `slackWebhookUrl` | string (optional) | Slack Incoming Webhook URL — posts a summary after each run |
| `discordWebhookUrl` | string (optional) | Discord Channel Webhook URL — posts a summary after each run |
| `webhookUrl` | string (optional) | Any URL — receives a structured JSON summary (e.g. for n8n/Make) |
| `notifyOnlyNewOrUpdated` | boolean | Default `true` — only include `NEW`/`UPDATED` leads in notifications |

Example input:

```json
{
  "places": [{ "title": "Lemari Coffee", "placeId": "ChIJv79rmEfzGGARhXlSEd8ceiQ" }],
  "minTier": "Warm"
}
```

### Output

```json
{
  "title": "Lemari Coffee",
  "placeId": "ChIJv79rmEfzGGARhXlSEd8ceiQ",
  "priorityScore": 60,
  "tier": "Warm",
  "changeStatus": "NEW",
  "reasons": [
    "No independent website (social-media link or none at all)",
    "No business description"
  ],
  "hasRealWebsite": false,
  "isUnclaimed": false,
  "completenessScore": 70,
  "reviewPercentileInGroup": 25.0
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

#### Scoring breakdown

| Signal | Max points |
|---|---|
| No independent website (a bare social-media link doesn't count) | 35 |
| Unclaimed Google Business Profile | 25 |
| Other missing profile fields (phone, description, hours, photos, categories) | 25 |
| Review count below the median for similar nearby businesses | 15 |

Tiers: **Hot** ≥ 70, **Warm** 40–69, **Cold** < 40.

### Data table

| Field | Type | Description |
|---|---|---|
| `title` | string | Business name |
| `placeId` | string | Google Maps place ID |
| `priorityScore` | number | 0-100 combined lead-priority score |
| `tier` | string | `Hot`, `Warm`, or `Cold` |
| `changeStatus` | string | `NEW`, `UPDATED`, or `UNCHANGED` vs. the previous run on this Actor |
| `reasons` | array | Plain-English reasons contributing to the score |
| `hasRealWebsite` | boolean | False if no site, or only a social-media link |
| `isUnclaimed` | boolean | True if the Google Business Profile is unclaimed |
| `completenessScore` | number | 0-100 GBP profile completeness |
| `reviewPercentileInGroup` | number | Review-count percentile vs. same city+category peers |

### Pricing / cost estimation

Pay-per-event: a small flat fee when a run starts, plus a per-lead fee for each scored result returned ($0.005 run start + $0.0015 per scored lead). Because this Actor does no scraping or external calls, it costs about the same as, or less than, the cheapest scraping tier for the same places — and only the scored leads you actually receive are billed.

**How much does scoring 1,000 leads cost, on top of scraping them?**

| Step | Cost for 1,000 places |
|---|---|
| Scrape 1,000 places with [Google Maps Scraper](https://apify.com/compass/crawler-google-places) | Listed "from $1.50 / 1,000 places" on its Store page; ≈ $4 / 1,000 measured in practice (Aug 2026) |
| Score those same 1,000 places with this Actor | $0.005 run start + 1,000 × $0.0015 ≈ **$1.51** |

The scraping is already paid for; this Actor adds only about $1.51 per 1,000 leads scored.

### Tips

- Score places from a single city/category batch at a time — the review-percentile signal compares each business against others in the same city and category, so mixing very different markets in one run dilutes that signal.
- Set `minTier: Hot` if you only want to pay for the highest-value leads.
- Set `slackWebhookUrl` / `discordWebhookUrl` / `webhookUrl` to get notified automatically — by default only new/updated leads are included, so re-running the same area on a schedule only pings you about what actually changed.
- Prefer Telegram, WhatsApp, or an app connector like Notion? This Actor's built-in webhooks cover Slack/Discord/generic; for anything else, use this Actor's **Integrations** tab in Apify Console, which works the same way for every Actor on the platform.

### FAQ, disclaimers and support

- This Actor never fetches any website or calls Google directly — accuracy depends entirely on the freshness of the place data you feed it.
- A business with a social-media page (Instagram, Facebook, etc.) instead of its own website is treated the same as having no website, since that's the actual pitch local SEO agencies make.
- Found an edge case or want a different scoring weight scheme? Use the Issues tab on this Actor's page.

### Legal & responsible use

This Actor is an independent, unofficial tool. It is not affiliated with, endorsed by, or sponsored by Google. "Google Maps" and "Google Business Profile" are trademarks of Google LLC, used here only to describe compatibility.

The presence of a phone number or address on a public Google Business Profile does not by itself constitute consent to receive marketing calls or messages. Before using this data for outreach you are responsible for complying with the laws that apply to you and your recipients — for example GDPR/UK GDPR, CAN-SPAM and TCPA in the US, and Japan's Act on Regulation of Transmission of Specified Electronic Mail and Act on Specified Commercial Transactions. This Actor does not verify consent or opt-in status.

# Actor input Schema

## `places` (type: `array`):

Paste the dataset output (array of place objects) from a Google Maps scraper Actor here — e.g. Compass's "Google Maps Scraper". You can also chain this Actor directly after one using an Apify integration.

## `minTier` (type: `string`):

Only output leads at or above this priority tier. Hot = highest opportunity, Cold = lowest. Set to Cold to get every place scored.

## `slackWebhookUrl` (type: `string`):

Post a summary of scored leads to a Slack channel via an Incoming Webhook URL.

## `discordWebhookUrl` (type: `string`):

Post a summary of scored leads to a Discord channel via a Channel Webhook URL.

## `webhookUrl` (type: `string`):

POST a structured JSON summary (all scored leads with score/tier) to any URL of your choice — e.g. n8n, Make, or your own endpoint.

## `notifyOnlyNewOrUpdated` (type: `boolean`):

If ON (default), notifications only include leads whose changeStatus is NEW or UPDATED vs. your last run on this Actor. If OFF, every scored lead in the output is included in the notification.

## Actor input object example

```json
{
  "places": [],
  "minTier": "Cold",
  "notifyOnlyNewOrUpdated": true
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "places": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("reverenced_garnet/apify-gmaps-lead-priority").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "places": [] }

# Run the Actor and wait for it to finish
run = client.actor("reverenced_garnet/apify-gmaps-lead-priority").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "places": []
}' |
apify call reverenced_garnet/apify-gmaps-lead-priority --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,reverenced_garnet/apify-gmaps-lead-priority"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/6dGW6hGODpxqSPNXw/builds/oTeOtmfR8D2QkcSwx/openapi.json
