# Local lead generation

Selling to local businesses has a specific problem: the list is easy and the qualification is not. Anyone can pull every dentist in a city. What separates a list from a pipeline is knowing which of them has a problem you fix, and having a reason to call that is not "I noticed you have a website".

Reviews solve that. They are public, dated, specific, and they say out loud what is wrong.

## The pipeline

```
local.places         →  businesses on Google Maps for a query and a city
reviews.search       →  recent reviews, ratings and whether the owner replied
company.enrich       →  firmographics for the ones with a website
contact.find         →  a named contact rather than the front desk
```

## Step 1: the list

```bash
curl -X POST https://api.routergrowth.com/v1/run \
  -H "Authorization: Bearer $ROUTERGROWTH_API_KEY" \
  -d '{
    "capability": "local.places",
    "input": {"query": "dental clinic", "location": "Lyon, France", "limit": 100}
  }'
```

Name, category, address, phone, website, rating and review count per place. Two filters do most of the qualification before you have looked at anything else:

- **No website, or a website that is a single page.** If you sell web, SEO or booking software, this is the whole pitch.
- **Rating between 3.0 and 4.3 with a real review count.** Below 3.0 is often a business with problems no vendor fixes. Above 4.5 they are doing fine and know it. The band in between is a business that cares, is visibly not winning, and has budget.

Run the same query across neighbourhoods rather than once for the city. Map results are ranked and truncated by proximity, so one city-level query systematically misses the outskirts.

## Step 2: reviews are the qualification

```bash
curl -X POST https://api.routergrowth.com/v1/run \
  -H "Authorization: Bearer $ROUTERGROWTH_API_KEY" \
  -d '{"capability": "reviews.search",
       "input": {"place": "Clinique Dentaire Bellecour, Lyon", "platform": "google", "limit": 50}}'
```

Rating, text, author, date and the owner's response. Three reads, in order of how much they tell you:

1. **Are negative reviews unanswered?** An unanswered one-star review from last month is a business with no process for this. If you sell reputation management, review response or anything customer-experience adjacent, that is your opening line and it is specific.
2. **What do the complaints have in common?** Ten reviews about waiting on hold is a phone problem. Ten about booking is a software problem. The pattern names the product you should be pitching.
3. **Has the rating trend moved?** Reviews are dated. Recent reviews materially worse than older ones is a business with a new problem and urgency to match.

Run it on `yelp` as well where relevant. The complaint sets differ.

## Step 3: finish the row

```bash
curl -X POST https://api.routergrowth.com/v1/run \
  -H "Authorization: Bearer $ROUTERGROWTH_API_KEY" \
  -d '{"capability": "company.enrich", "input": {"domain": "cliniquebellecour.fr"}}'
```

For the places with a website, firmographics tell you size, which decides whether this is a one-person operation or a group with a marketing budget. Then a named contact rather than the generic inbox:

```bash
curl -X POST https://api.routergrowth.com/v1/run \
  -H "Authorization: Bearer $ROUTERGROWTH_API_KEY" \
  -d '{"capability": "contact.find",
       "input": {"first_name": "Marie", "last_name": "Laurent", "company_domain": "cliniquebellecour.fr"}}'
```

Local businesses have shallow org charts, so the owner is usually the buyer and usually findable. Coverage is thinner here than in mid-market B2B, and unmatched lookups are not billed, so running it across the whole list costs only what it finds.

## The scored list

Four columns turn this into a call queue:

| Signal | Where it comes from | What it means |
| --- | --- | --- |
| Rating 3.0 to 4.3 | `local.places` | Cares, visibly not winning |
| Unanswered negative reviews | `reviews.search` | No process, recent pain |
| No website or a thin one | `local.places` | Obvious gap, easy pitch |
| Named contact found | `contact.find` | Reachable without a gatekeeper |

Three or four signals is a call today. One is a newsletter.

## Where it breaks

- **Map data is denormalized and duplicated.** The same business appears under variant names and stale addresses. Dedupe on phone and website before you count your list.
- **Review coverage varies by platform and country.** Google dominates in most markets, Yelp in some. Absence of reviews is often absence of a claimed listing, which is itself a signal.
- **Chains and franchises pollute the list.** A location has no budget authority. Filter on repeated brand names early.
- **Local contact data is thinner than B2B.** Expect a lower hit rate on `contact.find` here than the mid-market numbers in the enrichment guides. The phone number from `local.places` is often the more reliable channel.

## Run it as an agent

```bash
routergrowth run -c local.places -i '{"query":"dental clinic","location":"Lyon, France","limit":100}'
routergrowth run -c reviews.search -i '{"place":"Clinique Dentaire Bellecour, Lyon","limit":50}'
routergrowth run -c contact.find -i '{"first_name":"Marie","last_name":"Laurent","company_domain":"cliniquebellecour.fr"}'
```

The scoring pass is exactly the kind of loop an agent should own: pull, read the reviews, score, and hand back only the rows worth a call.

## FAQ

### Why the 3.0 to 4.3 rating band specifically?

Below 3.0 the problems are usually operational rather than marketing, and a vendor pitch lands badly on a business in real trouble. Above 4.5 the business is performing and has no urgency. The middle band is where a business is visibly not winning, cares enough that the reviews sting, and has revenue to spend. It is a heuristic, not a law, and it is worth re-tuning per vertical.

### How do I avoid pitching a franchise location?

Filter on repeated brand names in the `local.places` result before anything else, and check whether the website is a location subpage of a national domain. Franchise locations rarely control budget, so time spent on them converts at near zero. The exception is a franchisee-owned location with its own domain, which behaves like an independent business.

### Are Google and Yelp reviews different enough to pull both?

In markets where Yelp has real share, yes. The complaint sets diverge because the audiences do, and a business that responds diligently on one platform often ignores the other entirely. That gap is itself a finding. In markets where Yelp is thin, Google alone is enough and the second call is not worth the cost.

### Is the phone number better than the email here?

Often, yes. Local contact data is thinner than mid-market B2B, so `contact.find` hit rates are lower, while `local.places` returns a verified phone number for nearly every listing. For local outreach the realistic pattern is phone as the primary channel with email as follow-up, which is the reverse of B2B SaaS outbound.

### What does the whole list cost to build and score?

The place lookup and the review pull are fractions of a cent each, so the scan across a city is cheap. The cost concentrates in enrichment and contact lookup, and those only run on rows that already passed the review filter. Scoring first and enriching second is what keeps a several-hundred-business scan in the low single-digit dollars.
