# Business Opportunity Scorer for Agencies (Google Maps) - $3/1k (`xarso/data-tools`) Actor

Turn a Google Maps dataset into a ranked prospect list for agencies: no website, site down, unclaimed listing, low rating, few reviews, no socials. Each business gets a 0-100 score, services to pitch and a ready opening line. No scraping. Free demo: run without a dataset.

- **URL**: https://apify.com/xarso/data-tools.md
- **Developed by:** [xarso](https://apify.com/xarso) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.10 / 1,000 business scoreds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Business Opportunity Scorer for Agencies (Google Maps)

Turn your **Google Maps Scraper** results into a **prioritized prospect list** for your agency. For every business you get the problems you can fix for them (no website, website down, unclaimed Google listing, low rating, few reviews...), an **opportunity score from 0 to 100**, the **services to pitch**, and a **ready-to-use opening line** for your cold email or call.

**No scraping.** It works on the dataset you already have, so it is fast, cheap and doesn't break when Google changes its pages.

### Who is it for?

- **Web design agencies** looking for businesses with no website, a dead website, or a Facebook page instead of a site
- **Local SEO and Google Business Profile** consultants looking for unclaimed or incomplete listings
- **Reputation management** services looking for businesses with low ratings or few reviews
- **Social media managers** looking for businesses with no social presence
- **Lead-gen freelancers** who sell qualified local leads

### How it works

1. Run [Google Maps Scraper](https://apify.com/compass/crawler-google-places) for your niche and city (turn on contact details to also get email and social checks).
2. Open this Actor, pick that run's dataset in **Dataset**, and click **Start**.
3. Sort the results by **Score** or filter by **Tier** (`hot`, `warm`, `cold`) and start your outreach with the hottest leads.

Set **Minimum opportunity score** to 25 or 50 to get (and pay for) only warm or hot leads.

**Try it free:** click **Start** without picking a dataset to see the output on 3 fictional demo businesses. Demo runs are never charged.

### What it detects

| Opportunity | What to pitch | Points |
|---|---|---|
| No website on the Google listing | Website design | 35 |
| Website is offline | Website repair / rebuild | 35 |
| Google listing not claimed by the owner | Google Business Profile setup | 30 |
| Uses a social page or directory instead of a website | Website design | 25 |
| Rating below 4.0 (5+ reviews) | Reputation management | 25 |
| Website on a free builder subdomain | Professional website / domain | 15 |
| Fewer than 20 reviews | Review generation | 15 |
| 10%+ of reviews are 1-star | Reputation management | 10 |
| No opening hours on Google | Google Business Profile optimization | 10 |
| No social media profiles found\* | Social media management | 10 |
| Fewer than 10 photos | Google Business Profile optimization | 8 |
| Personal email (e.g. Gmail) instead of a domain email\* | Professional email / domain | 8 |

\* Only checked when your Google Maps dataset includes contact details. Businesses that are permanently or temporarily closed are skipped and not charged.

**Tiers:** `hot` = 50+ points, `warm` = 25-49, `cold` = under 25.

### Output

One row per business:

```json
{
    "name": "Joe's Plumbing",
    "tier": "hot",
    "opportunityScore": 80,
    "opportunityLabels": [
        "No website on the Google listing",
        "Google listing not claimed by the owner",
        "Fewer than 20 reviews"
    ],
    "suggestedServices": ["Website design", "Google Business Profile setup", "Review generation"],
    "openingLine": "While looking at plumber listings in Austin on Google Maps, I noticed Joe's Plumbing has no website. People who search online usually pick a business they can check first, so you are likely losing those customers.",
    "phone": "(512) 555-0100",
    "email": "joe@gmail.com",
    "website": null,
    "websiteAlive": null,
    "rating": 4.6,
    "reviewsCount": 7,
    "category": "Plumber",
    "city": "Austin",
    "googleMapsUrl": "https://www.google.com/maps/..."
}
```

A run summary with counts per tier and the most common services is saved as `SUMMARY` in the key-value store.

### Pricing

Pay per event: you are charged once per business returned. Closed businesses and businesses below your minimum score are free.

### Works well with

- [Email Verifier for Leads](https://apify.com/xarso/email-verifier-for-leads): verify the emails of your hot leads before you send.

### FAQ

**Does it scrape Google?** No. It reads the dataset you already scraped. The only network check is whether the business website answers.

**Can I use it from n8n, Make, Zapier or an AI agent?** Yes, through the Apify API, the official integrations, or the Apify MCP server.

**Can I change the opening lines?** They are a starting point. Personalize them before sending; you are responsible for complying with anti-spam and data protection laws in your outreach.

### Feedback

Missing a signal you would pay for? Open an issue on the Actor's Issues tab.

# Actor input Schema

## `datasetId` (type: `string`):

Pick the dataset from your Google Maps Scraper run. Turn on contact details in the scraper to also get email and social-media checks. Leave empty to run a free demo on 3 fictional businesses.

## `minOpportunityScore` (type: `integer`):

Only return (and pay for) businesses with at least this score. 0 = return all. 25 = warm and hot leads only, 50 = hot leads only.

## `checkWebsite` (type: `boolean`):

Detects websites that are down (a strong sign the business needs a new site). Adds a few seconds per new domain.

## `maxBusinesses` (type: `integer`):

Stop after this many businesses. 0 = no limit.

## `concurrency` (type: `integer`):

How many businesses to process in parallel.

## Actor input object example

```json
{
  "minOpportunityScore": 0,
  "checkWebsite": true,
  "maxBusinesses": 0,
  "concurrency": 10
}
```

# Actor output Schema

## `prospects` (type: `string`):

No description

## `summary` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("xarso/data-tools").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("xarso/data-tools").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 '{}' |
apify call xarso/data-tools --silent --output-dataset

```

## MCP server setup

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

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/Z1hojgtcRn9Qp3Ttr/builds/8yAQEtBOhF841OfPE/openapi.json
