# Google Maps "No Website" & Unclaimed Profile Lead Generator (`automation_studio/google-maps-no-website-leads`) Actor

Find local businesses on Google Maps with missing websites, unclaimed profiles, or low ratings. Includes automated pain-point audits and ready-to-send agency cold outreach pitch hooks.

- **URL**: https://apify.com/automation_studio/google-maps-no-website-leads.md
- **Developed by:** [Automation Studio](https://apify.com/automation_studio) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 distressed local lead dossiers

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?

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 "No Website" & Unclaimed Profile Lead Generator

> **Instantly extract local service businesses on Google Maps that lack websites, have unclaimed profiles, or suffer from low review ratings. Every lead includes a ready-to-send agency cold outreach pitch hook.**

***

### 💡 Why Target Distressed Google Maps Listings?

Standard Google Maps scrapers dump all 500 businesses in a city indiscriminately. But agencies, web designers, and cold callers waste hours manually filtering out established companies that already have digital marketing agencies.

The highest-converting cold pitch in the local agency world is pitching businesses with **glaring, undeniable problems**:

1. 🌐 **No Website**: Businesses running on Google Maps without any website link. They are losing 68%+ of mobile search calls to local competitors. **(High-converting turnkey landing page pitch)**.
2. 🛡️ **Unclaimed Google Business Profile**: Listings displaying *"Claim this business"*. Competitors can alter their phone number, edit hours, or mark them temporarily closed. **(Local SEO verification retainer pitch)**.
3. ⭐ **Reputation Deficit / Review Count Deficit**: Established contractors with under 4.0 stars or fewer than 15 reviews. **(Automated review defense pitch)**.

**Google Maps "No Website" Lead Generator** automatically filters for these high-urgency prospects and drafts bespoke, conversational cold outreach copy for every single record.

***

### ⚡ Key Features

- 🎯 **Targeted Pain-Point Filters**: Filter by `Missing Website`, `Unclaimed Profile`, `Rating ≤ Threshold`, or `Review Count ≤ Threshold`.
- 🚀 **Intelligent Small Keyword & Global Location Expansion**: Enter any small keyword or location (e.g., `'plumber'`, `'Miami'`, `'roofing Austin'`, `'HVAC'`). The built-in query engine automatically expands across 40+ specialized sub-trades, synonyms, and 50+ metropolitan suburb clusters (or directional zones) to guarantee you get maximum qualified leads without manual keyword research.
- 📝 **Pre-Crafted Cold Outreach Pitch Hooks**: Every lead comes with an AI-crafted, conversational cold email / SMS / phone pitch hook tailored to the business's specific deficiency.
- 📞 **Verified Phone Numbers**: Direct phone numbers extracted from the Google listing for rapid cold calling and SMS campaigns.
- 🖼️ **Visual Place Photos in Dataset**: View high-resolution 800px Google Maps photos and industry visual cards directly inside the Apify dataset table view.
- ⚡ **High-Speed Headless Execution**: Rapid card harvesting powered by Playwright Chromium returning qualified leads in seconds.

***

### 📥 Input Parameters

| Parameter | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `searchStrings` | Array of Strings | `["Roofers in Austin TX"]` | Target niche queries and locations (e.g., `'Plumbers in Miami FL'`, `'Dentists in Dallas TX'`). |
| `locationFilter` | String | `""` | Optional location suffix appended to search queries (e.g., `'Austin, TX'`). |
| `maxResults` | Integer | `10` | Maximum number of qualified distressed leads to extract (default trial finishes in <10s). |
| `autoExpandQueries`| Boolean | `true` | Automatically scans related sub-trades and adjacent metro suburbs if a single query exhausts its leads before hitting your target quota. |
| `filterNoWebsite` | Boolean | `true` | When true, only returns businesses where the website link is completely missing. |
| `filterUnclaimed` | Boolean | `false` | When true, only returns businesses whose Google Business profile is unclaimed. |
| `filterLowRating` | Boolean | `false` | When true, only returns businesses with ratings equal to or below the threshold. |
| `maxRatingThreshold`| Number | `4.0` | Maximum star rating threshold for reputation defense filtering. |
| `filterLowReviews` | Boolean | `false` | When true, only returns businesses with review counts below the threshold. |
| `maxReviewThreshold`| Integer | `15` | Maximum review count threshold. |
| `requirePhone` | Boolean | `false` | When true, skips any listings that do not have a public phone number. |
| `proxyConfiguration`| Object | Built-in | Apify Proxy settings for unblocked extraction. |

***

### 📤 Output Data Fields

Every discovered lead record includes complete operational data and custom outreach copy:

```json
{
  "placePhoto": "https://lh5.googleusercontent.com/p/AF1QipN...=w408-h256-k-no",
  "title": "Austin Elite Roofing Pros",
  "category": "Roofing contractor",
  "phone": "(512) 555-0199",
  "rating": 3.8,
  "reviewCount": 6,
  "isClaimed": false,
  "website": null,
  "painPoints": "MISSING_WEBSITE, UNCLAIMED_PROFILE, REPUTATION_DEFICIT, LOW_REVIEW_COUNT",
  "outreach_pitch_hook": "Hey Austin Elite Roofing Pros, was searching for top roofing contractor in Austin, TX and noticed your Google Maps profile doesn't have a website attached. Over 68% of local mobile searchers skip listings without a direct booking page and call competitors instead. I built a clean 1-page mobile demo site specifically for your roofing contractor team—happy to send over a preview link if useful!",
  "address": "1200 S Congress Ave, Austin, TX 78704",
  "url": "https://www.google.com/maps/place/Austin+Elite+Roofing+Pros/@30.25,-97.75,17z/...",
  "placeId": "0x8644b5...:0x1a2b...",
  "searchQuery": "Roofers in Austin TX",
  "scraped_at": "2026-10-07T16:00:00.000Z"
}
```

***

### 🏢 High-Converting Agency Use Cases

1. **Freelance Web Designers**: Pitch high-margin, 1-page mobile landing pages to local contractors who already get Google Maps impressions but lack a website.
2. **Local SEO Agencies**: Identify businesses with unclaimed Google Business Profiles and offer verification, GBP optimization, and citation cleanup.
3. **Reputation Management Consultants**: Find local companies with 3.0–3.9 stars and pitch automated SMS review collection systems to bump them into the Google 3-pack.
4. **Appointment Setting & Cold Call Agencies**: Generate clean lists of local business owners with direct phone numbers for outbound cold calling.

***

### ⚖️ Cold Outreach Best Practices

- **Highlight Competitor Contrast**: Mention that their top 3 local competitors have websites or 50+ reviews.
- **Provide a Free Asset First**: Offer a 2-minute video audit or a pre-made 1-page Figma/live demo rather than asking for a sales call upfront.
- **Keep it Conversational**: Short, 3-sentence emails or SMS messages get 4x higher reply rates than long agency pitches.

# Actor input Schema

## `searchStrings` (type: `array`):

Enter any business trade, city, or small keyword (e.g. 'Roofers in Austin TX', 'plumber', 'Miami', 'Dentists Dallas', 'HVAC'). The Intelligent Query Engine automatically expands small keywords across 40+ sub-trades and metropolitan suburbs to maximize qualified leads.

## `locationFilter` (type: `string`):

Optional location suffix appended to queries (e.g., 'Austin, TX' or 'Miami, FL'). Leave blank if already specified in the query.

## `maxResults` (type: `integer`):

Maximum number of qualified distressed business leads to collect. Default trial (10 leads) finishes in <10 seconds.

## `autoExpandQueries` (type: `boolean`):

When enabled, if a single query exhausts its distressed leads before reaching your target lead quota, automatically scans related sub-trades and adjacent metro suburbs to fulfill your requested lead volume.

## `filterNoWebsite` (type: `boolean`):

When enabled, only returns businesses where website is completely missing on Google Maps.

## `filterUnclaimed` (type: `boolean`):

When enabled, only returns businesses whose Google Business profile has not been claimed or verified.

## `filterLowRating` (type: `boolean`):

When enabled, only returns businesses with an average rating below your threshold.

## `maxRatingThreshold` (type: `number`):

Used when 'Filter: Rating Below Threshold' is enabled. Businesses with ratings equal to or below this will be returned.

## `filterLowReviews` (type: `boolean`):

When enabled, only returns businesses with few reviews (e.g., under 15 reviews).

## `maxReviewThreshold` (type: `integer`):

Used when 'Filter: Review Count Deficit' is enabled.

## `requirePhone` (type: `boolean`):

When enabled, skips any listings that do not have a public phone number.

## `proxyConfiguration` (type: `object`):

Built-in native Apify Proxy rotation to ensure unblocked high-speed Google Maps browsing.

## Actor input object example

```json
{
  "searchStrings": [
    "Roofers in Austin TX"
  ],
  "locationFilter": "",
  "maxResults": 10,
  "autoExpandQueries": true,
  "filterNoWebsite": true,
  "filterUnclaimed": false,
  "filterLowRating": false,
  "maxRatingThreshold": 4,
  "filterLowReviews": false,
  "maxReviewThreshold": 15,
  "requirePhone": false
}
```

# Actor output Schema

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

Dataset containing qualified distressed local business leads

# 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 = {
    "searchStrings": [
        "Roofers in Austin TX"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation_studio/google-maps-no-website-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 = { "searchStrings": ["Roofers in Austin TX"] }

# Run the Actor and wait for it to finish
run = client.actor("automation_studio/google-maps-no-website-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 '{
  "searchStrings": [
    "Roofers in Austin TX"
  ]
}' |
apify call automation_studio/google-maps-no-website-leads --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation_studio/google-maps-no-website-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/p3Sc7hdRwAjJptFQj/builds/isCK6I9rhe0WM2DCu/openapi.json
