Skip to content

Local prospecting

Local lead generation from Google reviews

A one-star review is your prospect's customer proving they have the problem you fix.

A job ad is a company spending money on a problem and naming it. A one-star review is that company's customer naming it for them: publicly, specifically, with a date attached, and in language nobody inside the business would ever have chosen.

A dental clinic whose last twelve reviews say "waited forty minutes on hold, nobody ever picks up" is a qualified lead for whoever sells phone automation. The problem is confirmed. The severity is quantified, because it is costing them reviews, which costs them patients. And the first line of your call is already written, in their own customers' words, with a link.

This is the part of the market that most social listening does not serve at all. The category is B2B-SaaS-shaped; nobody points it at Google Maps.

The unit of output: the business, never the reviewer

Stated in the classification rubric because it decides everything downstream.

You are not trying to reach the person who waited forty minutes on hold. You are trying to reach the practice manager who now has a public one-star review about their phone system. The reviewer is the evidence; the business is the prospect.

That settles a surprising number of questions at once. The contact record you need is the business's: its published phone number and website, which Google's own Maps listing already carries. There is no person to enrich, no pseudonymous handle to resolve, and none of the personal-data exposure that person-level GTM tools carry, because a commercial listing is not personal data.

It is, not coincidentally, the most accurate contact data anywhere in the product, and it costs nothing extra to obtain.

You pick the businesses, once

POST /v1/listeners/resolve-places
{ "query": "dental clinic", "location": "Toronto" }

Candidates come back with address, star rating and review count, and nothing is auto-selected. Those three fields are shown because they are what a human uses to tell two same-named businesses apart. "Bayview Dental" is four different businesses in the GTA and one of them is a veterinary practice.

Resolution is a wizard step, never something a run does. This is the most important architectural decision in the mode. If a listener resolved places at run time, it would silently repoint at a different business the day Google reranked its results: your listener for a specific dental group would quietly start collecting reviews for a same-named practice in another city, and nothing on screen would say so. That is the single most common way a review-based listener fills with irrelevant data, and it is unfixable afterwards because you cannot tell which rows came from which resolution.

The cheapest gate in the product

A review above the listener's maxRating (default 3) is rejected before any model call, with the reason recorded as rating.

Google ratings skew high. Heavily. Most reviews on most businesses are four and five stars. Dropping everything above three removes the large majority of retrieved volume for the cost of an integer comparison, and every one of those would otherwise have cost a rerank and possibly a classification call to reach the same conclusion.

Three things about reviews that are easy to get wrong

All handled, and all the kind of bug that produces plausible wrong data rather than an error.

Dates. Reviews report "3 months ago", not a timestamp. An unparsed relative date is worse than a missing one: the recency gate compares Date.parse(…) < cutoff, and NaN < cutoff is false, so an unparsed review sails straight past the window meant to exclude it. Relative dates are resolved and flagged approximateDate, which the dashboard renders as ~ rather than implying a precision the source never gave.

Dedupe. Every review of a place shares that place's URL, so the URL cannot be the key: that would collapse a business's whole review history into one row. Review adapters supply their own key, and supplying one also disables title dedupe, because two short complaints legitimately normalise to the same string.

Volume asymmetry. A business with 2,000 reviews and one with 30 are not comparable on complaint count. Read count and trend together.

Why not Google's official Places API

Reviews come through SerpApi (google_maps to resolve, google_maps_reviews to read). Google's own Places API is disqualified for two independent reasons:

  1. It returns about five reviews per place with no way to page into the one- and two-star tail. Dissatisfaction is the tail. An API that hands you the five reviews Google chose to feature hands you the five happy ones.
  2. Its policies forbid storing Places content beyond narrow exceptions, which is exactly what a signal pipeline does with everything it keeps.

One operational note: Maps and reviews bill as ordinary searches, not on a free tier. Having the key is not the same as having the access.

The roll-up is the call list

GET /v1/places?listenerId=…

Paginated, strongest prospect first, one row per business: count, trend against the previous window, themes ranked by frequency (hold times, no-shows, billing disputes, rude staff), and the strongest quote.

Themes are what change how you sell. "Nine complaints about hold times" is a pitch; clicking it gives you the nine complaints, which is a call where you read one aloud.

Signals carry a star rating and a list of themes, and the label vocabulary is its own: pain_confirmed and at_risk shown by default, healthy and noise behind tabs. The window is 90 days rather than 30, because reviews accrue more slowly than forum posts, and a clinic's phone problem does not stop being true after a month.

The agency shape

This is where the mode earns its keep. An agency selling phone automation, reputation management, scheduling or front-desk staffing runs one listener per vertical per metro:

dental clinics · Toronto        → 40 practices
auto repair · Greater Boston    → 60 shops
med spas · Phoenix              → 35 locations

Each produces a monthly ranked list of businesses whose own customers have publicly documented the exact problem you sell against, with a phone number and a quote attached. The hit rate is unlike a cold list because you are not guessing at fit: the prospect's customers already confirmed it in writing.

Run it as one workspace per client if you are white-labelling, or one workspace with many listeners if the agency owns the prospecting. Export with GET /v1/exports/accounts.csv?format=crm-generic, dial, and quote the review.

The honest limits

Google Maps, not the whole internet. Yelp, Facebook and industry-specific review sites are not in this mode.

Themes are extracted, not curated. A niche vertical produces slightly generic theme labels for the first few runs. Thumbs-down the bad ones: labelled examples are inlined into that listener's next classification prompts.

It will not name the practice manager. It gives you the business, the problem, the evidence, the phone number and the website. Getting past the front desk is still your job.

This is prospecting, not reputation management. If you want to monitor and respond to your own reviews, buy a review-management tool. This reads other businesses' reviews to find who has a problem you can fix.

Questions

Frequently asked questions

Is this for monitoring my own reviews?

No. That is review management, and there are good tools for it. This points at other businesses' reviews to find prospects. The reviewer is evidence; the business being reviewed is the lead.

Which businesses does it watch?

Whichever you resolve in the wizard, by search term and location: "dental clinic" in Toronto, say. You pick them from a list showing address, rating and review count, and nothing is auto-selected. Resolution never happens during a run, so a listener cannot silently repoint at a different business.

Do I get the business's phone number?

Google's Maps listing carries the business's published phone number and website, which for local prospecting is the whole contact record: published by the business, kept current by the business, and outside the personal-data surface that person-level enrichment carries.

Why only reviews of three stars and below?

Maps ratings skew high, so the low tail is where dissatisfaction lives and dropping the rest removes most of the volume for the cost of an integer comparison, before any model call is spent. The threshold is a listener setting; lower it to two if a vertical is noisy.

How often does it check?

Daily or weekly on Go, and as often as hourly on Pro, with a 90-day data window. Reviews accrue slowly, so a weekly schedule is usually the right trade and an hourly listener here is money spent on nothing.

Build a call list from your market's own reviews.

Pick a vertical and a city, resolve the businesses, and read what their customers are already saying.

14 days free · cancel any time before it ends · or see it on your own site first, free