# Google Maps Conversion Gap Leads (`automation-lab/google-maps-conversion-gap-leads`) Actor

Find Google Maps local businesses and flag public website conversion gaps for agency prospecting.

- **URL**: https://apify.com/automation-lab/google-maps-conversion-gap-leads.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Lead generation, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/platform/actors/running/actors-in-store#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

## Google Maps Conversion Gap Leads

Turn Google Maps local businesses into an agency-ready prospect list.
This Actor searches a service and US location, opens each public business listing,
then checks the linked website for observable conversion gaps.

The result combines public contact details with practical signals such as missing
online booking, weak mobile markup, slow or heavy homepages, missing contact forms,
no click-to-call link, and absent calls to action.
It is designed for recurring, evidence-based agency prospecting—not generic bulk scraping.

### What does this Actor do?

For each search term and location, the Actor:

1. searches Google Maps in a browser;
2. collects public business names and place URLs;
3. opens each place panel for its address, phone, website, category, rating, and coordinates;
4. fetches the public business homepage when enabled;
5. detects conversion signals in the returned HTML;
6. computes a transparent 0–100 conversion-gap opportunity score;
7. saves one typed dataset row per accepted business.

A failed website request is reported as an audit error.
It is never silently interpreted as proof that a feature is missing.

### Who is it for?

- Web-design agencies building city-and-niche prospect lists
- Local SEO agencies prioritizing businesses with visible website gaps
- Booking and CRM consultants looking for appointment-flow opportunities
- Sales operations teams enriching public local-business records
- Researchers comparing public conversion features across local markets

The Actor is especially useful when a campaign needs a reason for outreach beyond
“we found your business.” Each row records the observed gap behind the score.

### Why use conversion-gap leads?

A generic Maps export tells you who exists.
This Actor adds a bounded homepage audit so you can prioritize businesses with
observable opportunities.

Examples include:

- no public website;
- an unreachable homepage;
- no observed online booking path;
- missing viewport/responsive signals;
- a slow response or unusually heavy homepage;
- no HTTPS;
- no contact form;
- no click-to-call link;
- no meaningful meta description;
- no obvious primary call to action.

These are technical observations, not claims about a business's revenue or quality.

### What data does the Actor extract?

| Group | Fields |
| --- | --- |
| Discovery | `name`, `category`, `searchTerm`, `location`, `googleMapsUrl` |
| Maps contacts | `address`, `phone`, `website`, `latitude`, `longitude` |
| Reputation | `rating`, `reviewsCount` |
| Reachability | `websiteReachable`, `httpStatus`, `finalWebsiteUrl`, `auditError` |
| Performance signals | `responseTimeMs`, `pageSizeBytes`, `slowPageSignal` |
| Mobile and security | `usesHttps`, `hasViewportMeta`, `hasResponsiveCss`, `mobileReady` |
| Conversion features | `hasBooking`, `bookingProvider`, `hasContactForm`, `hasPhoneLink`, `hasEmailLink` |
| Marketing signals | `publicEmails`, `hasAnalytics`, `hasMetaDescription`, `hasPrimaryCallToAction` |
| Prioritization | `conversionGaps`, `gapScore`, `gapSummary`, `auditedAt` |

Nullable fields mean the source did not expose the value or the check could not
establish it. `false` means the corresponding signal was checked and not observed.

### How to get started

1. Open the Actor input page.
2. Add one or more services under **Business categories or services**.
3. Add one or more US cities or metro areas.
4. Choose a lead limit.
5. Keep website auditing enabled for conversion-gap signals.
6. Optionally set a minimum gap score to focus the output.
7. Run the Actor and export the default dataset as JSON, CSV, Excel, or XML.

A useful first input is:

```json
{
  "searchTerms": ["dentists"],
  "locations": ["Austin, TX"],
  "maxLeads": 20,
  "auditWebsites": true,
  "minGapScore": 0
}
```

### Input parameters

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `searchTerms` | string\[] | required | Services or business niches to search |
| `locations` | string\[] | required | US cities or metro areas added to every term |
| `maxLeads` | integer | `20` | Maximum unique rows, from 1 to 200 |
| `auditWebsites` | boolean | `true` | Run bounded public-homepage checks |
| `requireWebsite` | boolean | `false` | Exclude businesses with no Maps website link |
| `minGapScore` | integer | `0` | Keep rows at or above this 0–100 score |
| `websiteTimeoutSecs` | integer | `12` | Per-homepage timeout, from 5 to 30 seconds |

A run supports up to 50 term/location combinations.
The lead limit applies across the whole run, not separately to every combination.

### Output example

This shortened row reflects the Actor's current output shape:

```json
{
  "name": "ATX Family Dental",
  "category": "Dentist",
  "address": "1700 S 1st St, Austin, TX 78704",
  "phone": "+1 512-717-3147",
  "website": "https://www.atxfamilydental.com/",
  "rating": 4.9,
  "searchTerm": "dentists",
  "location": "Austin, TX",
  "websiteReachable": true,
  "responseTimeMs": 881,
  "pageSizeBytes": 81941,
  "mobileReady": true,
  "hasBooking": true,
  "hasContactForm": true,
  "hasPhoneLink": true,
  "publicEmails": ["info@atxfamilydental.com"],
  "hasMetaDescription": false,
  "conversionGaps": ["no_meta_description"],
  "gapScore": 4,
  "gapSummary": "no meta description",
  "auditedAt": "2026-08-14T06:41:17.834Z"
}
```

Source pages can change, so values and nullability vary between runs.

### How is the gap score calculated?

The score is a weighted sum capped at 100.
Higher-impact observations such as no website or an unreachable website contribute
more than markup-level signals such as a missing meta description.

The score is intended for sorting a prospect list.
It is not a performance benchmark, accessibility audit, Lighthouse score, or promise
that outreach will convert.

Review `conversionGaps` and the raw boolean fields before acting on a lead.

### How much does it cost to find conversion-gap business leads?

The Actor uses pay-per-event pricing: one run-start event plus one event for each
accepted dataset row.
The start event is **$0.0065** and, at the BRONZE tier, each conversion-gap lead is
**$0.00396**.

| Accepted leads | Example BRONZE cost |
| ---: | ---: |
| 1 | 0.01046 USD |
| 10 | 0.04610 USD |
| 25 | 0.10550 USD |
| 100 | 0.40250 USD |

Rows filtered out by `requireWebsite` or `minGapScore` are not charged as lead events.
Actual platform usage and plan tier can differ; check the run's charge details.

### Website audit definitions

- **Mobile ready** requires viewport markup plus responsive CSS or a device-width viewport.
- **Slow/heavy homepage** means the observed response took at least 2.5 seconds or the checked HTML was at least 1.5 MB.
- **Online booking** means booking-oriented text or a recognized provider was present in returned homepage HTML.
- **Contact form** means a form and contact-oriented wording were both observed.
- **Primary CTA** checks common phrases such as “get a quote,” “contact us,” “call now,” or “book now.”

The audit checks server-returned homepage markup.
Features injected only after complex interaction may not be observed.

### Tips for better prospect lists

- Use specific services such as `emergency plumbers` instead of broad terms like `business`.
- Run one metro at a time when you need clear campaign attribution.
- Set `requireWebsite` when your offer depends on auditing an existing site.
- Start with `minGapScore: 0`, inspect the distribution, then choose a threshold.
- Keep `maxLeads` small while refining a niche.
- Schedule the same input when you need a fresh snapshot for a recurring campaign.

### Limits and failure behavior

Google Maps can vary results by geography, language, ranking, and time.
A city query can include nearby businesses from the wider metro area.
The Actor does not claim exhaustive coverage or strict municipal boundaries.

Browser challenge or empty-shell responses fail the affected search instead of
creating false empty output.
Individual website failures remain visible in `auditError`.
A run may finish with fewer rows when filters exclude discovered businesses.

The Actor uses a direct, resource-blocked browser connection for Maps and does not expose a proxy mode.
There is no automatic residential-proxy fallback.
Business websites are fetched directly with a bounded timeout.

### Export and integration workflows

Common workflows include:

1. export CSV rows with `gapScore >= 20` into a CRM review queue;
2. group by `conversionGaps` to tailor an agency offer;
3. send no-booking prospects to an appointment-system campaign;
4. compare scheduled dataset snapshots in your own warehouse;
5. route unreachable websites to a manual verification step;
6. enrich accepted leads with internal ownership or CRM history.

Always review contact data and follow applicable outreach laws before messaging anyone.

### Run with the Apify API using cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~google-maps-conversion-gap-leads/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchTerms":["plumbers"],"locations":["Miami, FL"],"maxLeads":10,"auditWebsites":true}'
```

Use the returned run's default dataset ID to download items.

### Run with JavaScript

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/google-maps-conversion-gap-leads').call({
  searchTerms: ['med spas'],
  locations: ['Phoenix, AZ', 'Las Vegas, NV'],
  maxLeads: 25,
  minGapScore: 20,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Run with Python

```python
from apify_client import ApifyClient
import os

client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/google-maps-conversion-gap-leads').call(run_input={
    'searchTerms': ['dentists'],
    'locations': ['Austin, TX'],
    'maxLeads': 20,
    'auditWebsites': True,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### Use through MCP

Add the Actor to Claude Code:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/google-maps-conversion-gap-leads"
```

#### Claude Desktop

Use this server entry in Claude Desktop:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/google-maps-conversion-gap-leads"
    }
  }
}
```

#### Cursor

Add the same `mcpServers.apify.url` value in Cursor's MCP settings.

#### VS Code

Add the same HTTP MCP server URL in your VS Code MCP configuration.

Example prompt:

> Find up to 20 med spas in Phoenix from Google Maps, audit their public websites,
> and summarize businesses with gap scores of 20 or more by observed conversion gap.

### Responsible use and legality

This Actor processes publicly visible business listings and public website markup.
You are responsible for your use, data retention, and compliance with Google terms,
website terms, privacy rules, anti-spam laws, and outreach regulations.

Do not use results for harassment, discrimination, deceptive messaging, or decisions
that require consent or regulated personal data.
Respect opt-outs and verify a signal before making a claim to a business.

### FAQ

**Why are there fewer leads than requested?**

Maps may expose fewer unique businesses, a search may fail, or your website/score
filters may exclude rows. Lower `minGapScore` and inspect a smaller unfiltered run.

**Why is a website feature null?**

Null means the audit was disabled, no website was available, or the check could not
establish the value. Review `websiteReachable`, `httpStatus`, and `auditError`.

**Why was a booking tool missed?**

The homepage may load it only after interaction or from a page the Actor did not visit.
The Actor checks the returned homepage, not an entire website crawl.

**Does this measure Core Web Vitals?**

No. `slowPageSignal` uses observed response time and HTML size only.
Use a dedicated performance tool for lab or field Core Web Vitals.

### Related automation-lab Actor

Use [Google Maps Email Extractor & Lead Finder](https://apify.com/automation-lab/google-maps-lead-finder)
when your main job is broad Maps contact and email extraction without this Actor's
conversion-gap scoring workflow.

# Actor input Schema

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

Services or niches to search on Google Maps, such as dentists, plumbers, or med spas.

## `locations` (type: `array`):

Locations added to every search term. Up to 50 term/location combinations are allowed.

## `maxLeads` (type: `integer`):

Maximum unique business audit rows saved across all searches.

## `auditWebsites` (type: `boolean`):

Fetch each public homepage and check booking, mobile, speed, contact, CTA, and related conversion signals.

## `requireWebsite` (type: `boolean`):

Skip Maps listings that do not expose a public business website. Leave off to include no-website opportunities.

## `minGapScore` (type: `integer`):

Only save businesses at or above this 0–100 opportunity score. Use 0 to retain all audited listings.

## `websiteTimeoutSecs` (type: `integer`):

Maximum seconds allowed for each public homepage request.

## Actor input object example

```json
{
  "searchTerms": [
    "dentists"
  ],
  "locations": [
    "Austin, TX"
  ],
  "maxLeads": 20,
  "auditWebsites": true,
  "requireWebsite": false,
  "minGapScore": 0,
  "websiteTimeoutSecs": 12
}
```

# Actor output Schema

## `dataset` (type: `string`):

Dataset containing all accepted business audit rows.

# 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": [
        "dentists"
    ],
    "locations": [
        "Austin, TX"
    ],
    "maxLeads": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/google-maps-conversion-gap-leads").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": ["dentists"],
    "locations": ["Austin, TX"],
    "maxLeads": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/google-maps-conversion-gap-leads").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": [
    "dentists"
  ],
  "locations": [
    "Austin, TX"
  ],
  "maxLeads": 20
}' |
apify call automation-lab/google-maps-conversion-gap-leads --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/google-maps-conversion-gap-leads"
        }
    }
}

```

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/adwxnNWKaLqBgZnbz/builds/oLos7TMOhkXbuM8av/openapi.json
