# Website Lead Finder: Local Businesses With No or Bad Websites (`kodabloomllc/website-lead-finder`) Actor

Find local businesses with no website, a broken one, an outdated one or only a Facebook page. Works on Google Maps Scraper results. Adds builder (Wix, WordPress, Squarespace...), AI-built verdict, and a lead score.

- **URL**: https://apify.com/kodabloomllc/website-lead-finder.md
- **Developed by:** [KodaBloom LLC](https://apify.com/kodabloomllc) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 business checkeds

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

## Website Lead Finder: Local Businesses With No or Bad Websites

Find local businesses that need a website. Give it the results of a Google Maps search (plumbers, hair salons, coffee shops, restaurants, any category) and it checks every business's website. You get a list sorted with the best leads first.

### What it finds

| Lead | Score | What it means |
|---|---|---|
| No website | 100 | Google Maps lists no website at all |
| Domain lost | 97 | The website address now shows an unrelated site |
| Website broken | 95 | The site doesn't load or shows an error page |
| Domain parked | 92 | "Coming soon", "domain for sale" or a default server page |
| Only a social, booking or ordering page | 90 | Facebook, Instagram, Yelp, Booksy, StyleSeat, Vagaro, Toast, DoorDash and similar |
| Outdated website | 60 to 85 | No HTTPS, not mobile-friendly, old copyright year, very old HTML |
| Website has problems | 30 to 60 | Free Wix plan with Wix ads, free builder address (name.wixsite.com), placeholder text, almost no text, no page title, no phone number, slow to load |
| Website looks fine | 5 to 15 | Probably not a lead |

Chain and franchise locations (Starbucks, 7-Eleven, Roto-Rooter and similar) are marked "not a lead", since their website is run by head office.

For every website it also tells you:

- **Builder**: Wix, Squarespace, WordPress, GoDaddy, Webflow, Shopify, Duda, Square Online, Toast, Lovable and more
- **Built with AI**: hand, bot or can't tell, from [HandOrBot](https://handorbot.com)
- **Outdated signs** and **problems**, in plain words you can use in a sales call

### Example

In a test on 100 real businesses in Sacramento (40 plumbers, 30 coffee shops, 30 hair and beauty salons), it found 30 with no website, 6 with a broken or lost website, 3 with only a Facebook or booking page, 1 outdated site and 5 on free or weak setups. It also set aside 14 chain locations.

### How to use it

1. Run the [Google Maps Scraper](https://apify.com/compass/crawler-google-places) for a category and city, for example "hair salon" in "Sacramento, CA".
2. Open this actor and pick that run's dataset in **Google Maps Scraper dataset**.
3. Turn on **Only output leads** if you want just the businesses worth calling.

You can also paste a list of websites, or give businesses as JSON with name, website, phone and address.

### Output

One row per business, best leads first:

```json
{
  "name": "Great Cuts",
  "category": "Hair salon",
  "phone": "(916) 555-0100",
  "city": "Sacramento",
  "website": "http://www.greatcutsacramento.com/",
  "lead_reason": "outdated website",
  "lead_score": 85,
  "builder": "custom / unknown",
  "built_with_ai": "hand",
  "outdated": "no HTTPS; not mobile-friendly (no viewport); old HTML (font/center tags)",
  "issues": "no meta description"
}
```

Name, phone, address, city, rating, review count and the Google Maps link are carried over from the Google Maps results.

### Send leads to Google Sheets, a CRM or n8n, Make and Zapier

You can run this actor on a schedule and send new leads wherever your team works. No code needed.

**Run it right after the Google Maps Scraper.** Open your Google Maps Scraper task, go to the **Integrations** tab, and connect it to this actor. Set the input to `{"datasetId": "{{resource.defaultDatasetId}}", "onlyLeads": true}`. Each time the scrape finishes, your leads are checked automatically. Add a schedule to the scraper task for a fresh list every week.

**n8n, Make or Zapier.** Use the Apify app (Zapier, Make) or the Apify node (n8n). Start from "Actor run finished" for this actor, fetch the dataset items, and add one row or contact per lead. Common setups:

- New leads go into a Google Sheet, with columns for name, phone, lead_reason and outdated
- Leads with a lead_score of 90 or more go into HubSpot, Pipedrive or Airtable as new contacts
- A Slack or email message when a new city run finds more than 10 leads

Every field is plain text or a number, with no nested objects, so each one maps straight to a column or CRM field.

**AI agents.** This actor also works as a tool for AI assistants through the [Apify MCP server](https://mcp.apify.com), so an agent can ask for "hair salons in Sacramento with no website" and get the list.

### Pricing

You pay per business checked, with or without a website.

### Good to know

- Only the homepage is checked.
- Some sites block automated visits. Those are marked "could not check" with a low score, so you can look at them yourself.
- A site that fails to load is tried twice before it is called broken.
- Adult sites are skipped.

Made by KodaBloom LLC. Questions: info@kodabloom.com

# Actor input Schema

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

Pick the dataset from a Google Maps Scraper run (compass/crawler-google-places), e.g. "hair salon" in your city. Name, phone, address, rating and website are carried over.

## `websites` (type: `array`):

Business websites, one per line. Bare domains like example.com are fine.

## `businesses` (type: `array`):

Objects with name, website, phone, address, city (any extra fields are ignored). Businesses with no website are kept and marked as the best leads.

## `onlyLeads` (type: `boolean`):

Leave out businesses whose website looks fine and chain locations. Every business checked is still counted.

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

Stop after this many (0 = no limit).

## `maxConcurrency` (type: `integer`):

How many websites to load at the same time.

## Actor input object example

```json
{
  "websites": [
    "greatcutsacramento.com",
    "aimeesbobacafe.com",
    "armstrongplumbing.net"
  ],
  "onlyLeads": false,
  "maxBusinesses": 0,
  "maxConcurrency": 4
}
```

# Actor output Schema

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

One row per business, best leads first: lead reason and score, builder, AI verdict, outdated signs and problems.

# 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 = {
    "websites": [
        "greatcutsacramento.com",
        "aimeesbobacafe.com",
        "armstrongplumbing.net"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("kodabloomllc/website-lead-finder").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 = { "websites": [
        "greatcutsacramento.com",
        "aimeesbobacafe.com",
        "armstrongplumbing.net",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("kodabloomllc/website-lead-finder").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 '{
  "websites": [
    "greatcutsacramento.com",
    "aimeesbobacafe.com",
    "armstrongplumbing.net"
  ]
}' |
apify call kodabloomllc/website-lead-finder --silent --output-dataset

```

## MCP server setup

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

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/2xRKmJsqmivUatBrU/builds/vddiwgPQskrkOMp4p/openapi.json
