# Google Maps Leads + Website Audit for Agencies (`centorprat/google-maps-leads-website-audit`) Actor

Google Maps leads for agencies: search any business type + city (or use a Google Maps dataset) and audit each one: no/broken/outdated website, no SSL or mobile, no booking, no analytics/pixel, unclaimed Google profile, weak reviews. Scores, pitch reasons, phone, emails.

- **URL**: https://apify.com/centorprat/google-maps-leads-website-audit.md
- **Developed by:** [Centor Prat](https://apify.com/centorprat) (community)
- **Categories:** Lead generation, Marketing, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.70 / 1,000 business auditeds

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

## 🎯 Google Maps Leads + Website Audit for Agencies

**Find local businesses that need what you sell, and know why before you call.** Type a business type and a
city (or pick a Google Maps Scraper dataset you already have). Every business is **audited**: its website,
its Google Business Profile and its reviews. You get **opportunity scores** for web design, local SEO,
reputation, online booking and ads tracking, plain-English **pitch reasons**, and the **phone, emails and social
profiles** to reach the owner.

Built on top of the Google Maps Scraper (the most-used actor on Apify) · real website checks, not guesses ·
structured JSON · ready for AI agents, Zapier, Make and your CRM.

### ⚡ Why it's different

- **It actually opens every website.** Most "no website" lead tools only look for an empty field on Google Maps.
  This one fetches the site and checks it: broken, parked, social-only, DIY builder, no HTTPS, not
  mobile-ready, outdated footer, slow, no analytics/pixel, no online booking, no schema.
- **Five services, one run.** Each business gets a score for **web design**, **local SEO / Google Business
  Profile**, **reputation**, **online booking** and **ads tracking**, plus its best-fit service.
- **Pitch reasons you can paste.** "Google Business Profile is UNCLAIMED", "Only a facebook.com page instead of a
  website", "Bookings by phone / WhatsApp only", "Footer says 2011: looks unmaintained".
- **Built not to embarrass you.** Bot-protected sites are never called "broken", chains and franchises are
  detected and down-weighted, and on Wix / Squarespace / GoDaddy sites (where tracking is configured inside the
  builder) we never claim "no pixel".
- **Bring your own data.** Already ran the Google Maps Scraper? Pick that dataset and only pay for the audit.

### 📋 What you get (per business)

| Field | Meaning |
|---|---|
| `name`, `category`, `address`, `city`, `phone`, `website`, `googleMapsUrl`, `placeId` | The business from Google Maps |
| `emails`, `socials` | Public emails and social profiles found on the business's own website |
| `rating`, `reviewsCount`, `photosCount`, `googleProfileClaimed`, `hasOpeningHours` | Google Business Profile signals |
| `opportunity.webDesign` / `.localSeo` / `.reputation` / `.booking` / `.adsTracking` | 0–100 opportunity score per service |
| `bestService`, `opportunityScore` | The strongest opportunity for this business |
| `score`, `scoredFor`, `qualified` | Score for the service you chose, and whether it passes your minimum score with a phone or email |
| `pitch`, `reasons` | Why: plain-English reasons per service |
| `websiteAudit.status` | `ok`, `none`, `not_own_site` (Facebook/Instagram/Booksy page), `broken`, `parked`, `protected` |
| `websiteAudit.https`, `.mobileReady`, `.builder`, `.copyrightYear`, `.outdated`, `.responseSeconds` | Website quality checks |
| `websiteAudit.analytics`, `.bookingMode`, `.hasSchema`, `.hasMetaDescription`, `.hasContactForm` | Marketing stack checks (`bookingMode`: online / manual / none) |
| `isChainOrFranchise` | Chain / multi-location site detected (scores are down-weighted) |

### 📥 Input

| Field | Type | Meaning |
|---|---|---|
| `searchTerms` | array | Business types as you'd type into Google Maps, e.g. `["plumber"]`, `["dentist","orthodontist"]` |
| `location` | string | City / region / country, e.g. `"Pueblo, CO, USA"`, `"Madrid, Spain"` |
| `maxPlacesPerSearch` | integer | Businesses per search term (default 30, max 500) |
| `service` | string | `all`, `webDesign`, `localSeo`, `reputation`, `booking`, `adsTracking` |
| `minScore` | integer | Score needed to count as a qualified lead (default 50) |
| `onlyQualified` | boolean | Return (and bill) only qualified leads |
| `datasetId` | string | Audit an existing Google Maps Scraper dataset instead of searching |
| `includeContacts`, `includeClosed`, `language`, `concurrency`, `webhookUrl` | | Options |

**Example input: plumbers in a city, all services**

```json
{ "searchTerms": ["plumber"], "location": "Pueblo, CO, USA", "maxPlacesPerSearch": 30 }
```

**Example input: web design leads only (no / broken / outdated website)**

```json
{ "searchTerms": ["hair salon", "barber shop"], "location": "Lugo, Spain", "language": "es",
  "service": "webDesign", "minScore": 60, "onlyQualified": true }
```

**Example input: audit a Google Maps dataset you already have**

```json
{ "datasetId": "<your Google Maps Scraper dataset ID>", "service": "localSeo", "onlyQualified": true }
```

### 📤 Output (one row per business)

Real output for a plumber in Pueblo, CO (search: `plumber`, `Pueblo, CO, USA`):

```json
{
  "name": "Industrial Plumbing & Heating Co.",
  "category": "Plumber",
  "address": "2008 E 17th St, Pueblo, CO 81001",
  "phone": "(719) 546-1730",
  "website": "https://industrialph.com/",
  "emails": ["service@industrialph.com"],
  "googleMapsUrl": "https://www.google.com/maps/search/?api=1&query=Industrial%20Plumbing%20%26%20Heating%20Co.&query_place_id=ChIJAVQ35YKjE4cRGhRyOexiYyQ",
  "rating": 5, "reviewsCount": 4, "photosCount": 1,
  "googleProfileClaimed": false, "hasOpeningHours": true, "isChainOrFranchise": false,
  "opportunity": { "webDesign": 0, "localSeo": 85, "reputation": 25, "booking": 70, "adsTracking": 30 },
  "bestService": "localSeo", "opportunityScore": 85,
  "pitch": [
    "Google Business Profile is UNCLAIMED",
    "Only 1 photo on Google",
    "Only 4 Google reviews",
    "Website has no LocalBusiness schema"
  ],
  "reasons": {
    "localSeo": ["Google Business Profile is UNCLAIMED", "Only 1 photo on Google", "Only 4 Google reviews", "Website has no LocalBusiness schema"],
    "reputation": ["Very few reviews (4)"],
    "booking": ["No online booking or scheduling on its website"],
    "adsTracking": ["Has analytics but no Meta/Google Ads pixel: no retargeting"]
  },
  "websiteAudit": {
    "status": "ok", "https": true, "mobileReady": true, "responseSeconds": 0.09, "builder": null,
    "generator": "WordPress 7.1.3", "hasMetaDescription": true, "hasSchema": false, "hasContactForm": true,
    "analytics": ["googleAnalytics"], "bookingMode": "none",
    "issues": ["no LocalBusiness schema markup", "analytics only: no ad pixel (Meta / Google Ads) found"]
  },
  "contactable": true, "score": 85, "scoredFor": "localSeo", "qualified": true
}
```

#### How the scores work

| Service | Strong signals |
|---|---|
| **webDesign** | No website (95) · only a Facebook / Instagram / Booksy page (90) · broken or parked site (92) · no HTTPS, not mobile-ready, footer ≥3 years old, DIY builder, slow |
| **localSeo** | Google profile unclaimed (+45) · under 10 photos · no opening hours · under 20 reviews · no meta description / schema |
| **reputation** | Rating under 3.5 (90) · under 4.0 (70) · under 4.3 (40) · very few reviews |
| **booking** | Appointment-based business (clinics, salons, restaurants, home services, lawyers...) with no online booking (70), or bookings by phone / WhatsApp only (60) |
| **adsTracking** | Website with no analytics, tag manager or pixel (60) · analytics but no Meta / Google Ads pixel (30) |
Chains and franchises are detected (shared domain or `/locations/` pages) and down-weighted.

### 💰 Pricing (pay-per-event menu)

- **`business-audited`**: per business audited and returned.
- **`qualified-lead`** (premium): per returned lead that meets your `minScore` and has a phone or email.
- Searches run the **Google Maps Scraper**, which bills its own places to your account (about $0.004 per place).
  Auditing an existing dataset (`datasetId`) has no Maps cost.
- With `onlyQualified`, only qualified leads are returned and billed.

### 💡 Use cases

- **Web design agencies:** businesses with no website, a Facebook-only page, a broken or 10-year-old site.
- **Local SEO agencies:** unclaimed Google Business Profiles, few photos, missing hours, no schema.
- **Reputation management:** businesses rated under 4.0 or with a handful of reviews.
- **Booking software sales (salons, clinics, restaurants, home services):** who still books by phone or WhatsApp.
- **Ads & analytics agencies:** businesses with no pixel, no tag manager, no tracking.
- **AI sales agents:** one call returns qualified, explained, contactable leads.

### 🚀 Ready-made tasks (one click)

Pre-configured runs for each kind of agency. Open one, change the business type and city, run:

- [Web Design Leads: Businesses With No or Outdated Website](https://apify.com/centorprat/google-maps-leads-website-audit/examples/web-design-leads-no-website): Find local businesses with no website, a Facebook-only page or an outdated site on Google Maps. Verified, scored, with phone and emails.
- [Local SEO Leads: Unclaimed Google Business Profiles](https://apify.com/centorprat/google-maps-leads-website-audit/examples/local-seo-leads-unclaimed-google-profile): Find businesses with unclaimed or weak Google Business Profiles: few photos, no hours, few reviews. Scored local SEO leads with contacts.
- [Reputation Management Leads: Low-Rated Businesses](https://apify.com/centorprat/google-maps-leads-website-audit/examples/reputation-management-leads-low-ratings): Find businesses with low Google ratings or few reviews: ready-to-pitch reputation management leads with phone and emails.
- [Booking Software Leads: No Online Booking](https://apify.com/centorprat/google-maps-leads-website-audit/examples/booking-software-leads-salons-clinics): Find salons, clinics and home-service businesses with no online booking (phone/WhatsApp only). Verified leads with contacts.
- [Ads Agency Leads: No Analytics or Ad Pixel](https://apify.com/centorprat/google-maps-leads-website-audit/examples/ads-agency-leads-no-tracking-pixel): Find local businesses with no Google Analytics, tag manager or Meta pixel on their website. Ready-to-pitch ads and tracking leads.
- [Dentist Leads with Website & Google Profile Audit](https://apify.com/centorprat/google-maps-leads-website-audit/examples/dentist-leads-website-audit): Dental practice leads with website, booking, SEO and review audit, opportunity scores, phone and emails. Any city.
- [Restaurant Leads: Website, Reservations & Reviews Gaps](https://apify.com/centorprat/google-maps-leads-website-audit/examples/restaurant-leads-google-maps-audit): Restaurant leads from Google Maps with website, reservation and review gaps scored, plus phone and emails. Any city.
- [Contractor Leads: HVAC, Roofing & Plumbing](https://apify.com/centorprat/google-maps-leads-website-audit/examples/contractor-leads-hvac-roofing-plumbing): HVAC, roofing and plumbing contractor leads with website, scheduling, Google profile and review gaps scored. Phone and emails included.
- [Negocios sin página web en Google Maps](https://apify.com/centorprat/google-maps-leads-website-audit/examples/negocios-sin-pagina-web-google-maps): Encuentra negocios sin web o con web anticuada en Google Maps. Leads verificados con teléfono, email y motivos para tu propuesta.

### 🤖 For AI agents (MCP)

One call: search terms + city in, scored and explained leads out. Every input is typed and described.

```json
{
  "mcpServers": {
    "google-maps-leads": {
      "url": "https://mcp.apify.com/?tools=actors,docs,centorprat/google-maps-leads-website-audit"
    }
  }
}
```

**Claude Code:** `claude mcp add --transport http apify "https://mcp.apify.com/?tools=actors,docs,centorprat/google-maps-leads-website-audit" --header "Authorization: Bearer <YOUR_APIFY_TOKEN>"`

No extra setup: this Actor is callable from Claude, Cursor, ChatGPT or any MCP client through the Apify MCP server, and agents can find it on their own with the server's `search-actors` tool.

Call it from code:

```bash
curl -X POST "https://api.apify.com/v2/acts/centorprat~google-maps-leads-website-audit/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"searchTerms":["plumber"],"location":"Pueblo, CO, USA","maxPlacesPerSearch":20,"onlyQualified":true}'
```

### ❓ FAQ

- **Where does the business data come from?** Google Maps, via the Google Maps Scraper run from your account, or from your own Google Maps dataset.
- **How is the website audited?** We fetch the homepage (and the contact page if the homepage has no email) like a browser would, and check HTTPS, the mobile viewport tag, the builder, the footer copyright year, response time, analytics / tag manager / pixels, booking links and widgets, schema markup, the meta description and forms.
- **What does `protected` mean?** The site blocks automated visits (bot protection). It exists, so we never pitch it as broken.
- **Why isn't a big brand scored high?** Chain and franchise locations use a corporate website and marketing team, so their web, SEO and booking scores are down-weighted.
- **Why no "no pixel" pitch on Wix / Squarespace sites?** Those builders add tracking from their settings, which isn't visible in the page source, so we don't guess.
- **How accurate is "no online booking"?** We look for 70+ booking and scheduling platforms, booking links and "book / reserve / appointment" buttons in several languages. We only pitch it when none are found; "manual" means bookings are by phone or WhatsApp.
- **Which countries?** Anywhere Google Maps works. Set `language` for local results (e.g. `es`, `de`, `fr`).
- **How fast is it?** Around 30 seconds for 15 businesses, including the Google Maps search. Website audits run in parallel.
- **What does it cost?** This actor's audit per business plus the Google Maps Scraper's own per-place price when it searches. Use `onlyQualified` to pay only for leads you'll use.
- **Are emails personal data?** They may be. We only read emails the business publishes on its own website. Use them lawfully (GDPR, CAN-SPAM, your local rules).

### 📜 Data & attribution

Business listings from Google Maps (via the Google Maps Scraper by compass). Website signals from each
business's own public website. DNS via Google Public DNS. Nothing is stored after the run.

### 🔗 Related actors

Part of one suite of keyless, agent-ready composers by the same developer:

- [Shopify Dropshipping & Store Trust Checker](https://apify.com/centorprat/shopify-dropshipping-checker): check any Shopify store for dropshipping signals (AliExpress images, markups, new catalogues) and a store-trust band — signals, not accusations.
- [Shopify App Detector: Tech Stack, Pixels & Theme](https://apify.com/centorprat/shopify-app-detector): paste Shopify store domains (or a dataset) and get each store’s apps by category, ad/analytics pixels, theme, catalog and contacts. No search cost.
- [Shopify Store Leads + App Audit (Reviews, Email, Pixels)](https://apify.com/centorprat/shopify-store-leads-app-audit): Shopify stores by niche, verified and audited for missing apps (reviews, email/SMS, upsell, loyalty, chat, subscriptions), pixels and theme: scored leads with emails.
- [FEMA Flood Zone & Property Risk API - Zillow/Redfin Enricher](https://apify.com/centorprat/fema-flood-zone-property-risk): FEMA flood zone + 18-hazard FEMA risk index + neighborhood demographics per US address, or for a whole Zillow/Redfin dataset.
- [Domain Lookup API - DNS, MX, SPF, Tech & Contact Emails](https://apify.com/centorprat/domain-lookup-dns-mx-email): DNS + live homepage → IPs, MX/SPF, tech, socials and public contacts per domain.
- [Wikipedia & Wikidata API - Entity Facts, Summary & Pageviews](https://apify.com/centorprat/wikipedia-wikidata-api): Wikipedia + Wikidata + pageviews → one structured brief per company, person or place.
- [Country Economic Data API - World Bank GDP, FX & Holidays](https://apify.com/centorprat/world-bank-country-economic-data): World Bank + FX + public holidays → one market brief per country.
- [Weather, Air Quality & Earthquake Risk API by Location](https://apify.com/centorprat/weather-air-quality-earthquake-api): live weather + air quality + earthquakes → one clear/caution/hazard verdict per point, worldwide.
- [Aircraft Tracker API (ADS-B) - Approach & Military Alerts](https://apify.com/centorprat/aircraft-tracker-adsb): aircraft approaching a point with CPA/ETA + military/unidentified flags and alerts.
- [NARA Catalog Extractor](https://apify.com/centorprat/nara-catalog-extractor): US National Archives catalog search → digital-object download URLs + metadata.

# Actor input Schema

## `searchTerms` (type: `array`):

What businesses to find, as you would type into Google Maps, e.g. \["dentist"], \["plumber", "electrician"], \["hair salon"]. One Google Maps search per term.

## `location` (type: `string`):

City, region or country to search in, e.g. "Austin, TX, USA", "Madrid, Spain", "Manchester, UK".

## `maxPlacesPerSearch` (type: `integer`):

How many Google Maps results to audit per search term (1-500). The Google Maps Scraper bills ~$0.004 per place on top of this actor's audit.

## `service` (type: `string`):

Score and sort leads for one service, or 'all' to use each business's best-fit service.

## `minScore` (type: `integer`):

A lead is 'qualified' when its score for the chosen service is at least this AND it has a phone or email.

## `onlyQualified` (type: `boolean`):

Drop businesses below the minimum score (and those with no phone or email). Only returned rows are billed.

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

Pick (or paste the ID of) the dataset of a Google Maps Scraper run you already did. It is audited directly, with no new Google Maps search and no Maps cost. Read-only access.

## `maxItems` (type: `integer`):

Safety cap when auditing an existing dataset.

## `includeContacts` (type: `boolean`):

Read public emails and social links from each business's own website (homepage, then the contact page).

## `includeClosed` (type: `boolean`):

Keep places marked permanently or temporarily closed on Google Maps.

## `language` (type: `string`):

Language code for Google Maps results, e.g. en, es, de, fr.

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

How many business websites are audited at once.

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

If set, qualified leads are POSTed here as JSON (Zapier / Make / n8n / your CRM).

## Actor input object example

```json
{
  "searchTerms": [
    "dentist"
  ],
  "location": "Austin, TX, USA",
  "maxPlacesPerSearch": 5,
  "service": "all",
  "minScore": 50,
  "onlyQualified": false,
  "maxItems": 5000,
  "includeContacts": true,
  "includeClosed": false,
  "language": "en",
  "concurrency": 8
}
```

# Actor output Schema

## `leads` (type: `string`):

One row per Google Maps business: name, category, address, phone, website, emails, socials, rating, reviews, photos, Google profile claimed status, website audit (status, HTTPS, mobile, builder, copyright year, speed, analytics/pixels, booking mode, schema, contact form), opportunity scores for webDesign / localSeo / reputation / booking / adsTracking, best service, score, qualified flag and pitch reasons.

# 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 = {
    "searchTerms": [
        "dentist"
    ],
    "location": "Austin, TX, USA",
    "maxPlacesPerSearch": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("centorprat/google-maps-leads-website-audit").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 = {
    "searchTerms": ["dentist"],
    "location": "Austin, TX, USA",
    "maxPlacesPerSearch": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("centorprat/google-maps-leads-website-audit").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 '{
  "searchTerms": [
    "dentist"
  ],
  "location": "Austin, TX, USA",
  "maxPlacesPerSearch": 5
}' |
apify call centorprat/google-maps-leads-website-audit --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,centorprat/google-maps-leads-website-audit"
        }
    }
}
```

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/QrDYPzQjrpaYRIUXK/builds/C2o9cWaAxrbpwQ59c/openapi.json
