Finding Local Businesses
Outcome: a list of local businesses in a defined area, with website, phone and rating, filtered to independents and ready for contact scraping.
- Surface
- Sync GTM app and MCP server
- Level
- Beginner
- Uses
- google_maps_listings · scrape_emails_from_website · scrape_phones_from_website
- Credits
- ~8 for a 50-listing area
- Prerequisite
- Lesson 04's table
When this is the right route
Some markets are not on LinkedIn in any useful way. Restaurants, clinics, gyms, trades, salons, independent retail — the owner has a business but not a professional profile, and the company has a phone number rather than a corporate email domain.
For these, the map listing is the record: name, address, category, phone, website, rating, review count. That is more actionable than most B2B firmographics.
Reference: google_maps_listings, Google Maps integration.
Searching an area properly
Map searches return results around a point, up to a cap. One search for “dentists in London” does not return every dentist in London — it returns the cap, clustered near the centre.
Search by suburb, not by city
Ten suburb searches return far more unique businesses than one city search, and the coverage is even rather than centre-weighted.
Vary the category term
“Dentist”, “dental clinic”, “orthodontist” surface overlapping but different sets. Run two or three terms and dedupe.
Dedupe on place ID or on name plus address
Not on name. Chains repeat names by design, and dedupe on name alone deletes real locations.
Check the count per search
A search returning exactly the cap means there were more results than you got. Split that area and search again.
The fields that matter
| Field | Why it matters |
|---|---|
| Website | The gateway to everything else — email and phone scraping both need it |
| Phone | Often the only reliable contact channel in this segment |
| Rating and review count | Proxy for size and how established they are; also a personalization hook |
| Category | Your qualification filter |
| Address | Territory assignment, and how you spot multi-location operators |
No website is a qualification signal, not a data gap. Depending on what you sell, a business with no site is either your best prospect or one you cannot serve. Decide which before you filter.
Chains versus independents
The two need completely different treatment: a chain location cannot buy anything, and its decision-maker is at head office.
Practical filters:
- Same name at many addresses in your result set → chain.
- Review count far above the category norm → often a chain or a franchise.
- Website is a national domain with a store locator rather than a single-location site → chain.
For chains, drop the locations and treat the parent as a normal B2B account through lessons 06 and 07. For independents, continue here.
Getting contact details
Local businesses rarely appear in contact databases. Scrape their own site instead.
scrape_emails_from_website— pulls addresses off contact, about and footer pages. Expect a shared inbox rather than a personal one, which is normal and fine for this segment.scrape_phones_from_website— often finds a direct line the map listing does not have.- Verify anything you plan to email. Shared inboxes bounce more than corporate addresses.
Shared inboxes change the message, not just the address. info@ is read by whoever opens it, so write for a business owner who is busy, skip the corporate framing, and lead with the specific, local reason you are writing.
Do this now
Define the area and the category
One city, split into five to ten suburbs. One primary category term plus two variants.
Run one suburb first
Read every result. Confirm the category term returns what you meant.
Run the remaining areas
Dedupe on place ID or name plus address as they come in.
Flag the chains
Sort by name and by review count. Mark repeats and outliers, and split them out.
Scrape contacts on five rows
Emails and phones. Read what comes back before widening.
Widen, then verify
Run across the independents, then verify the addresses you intend to email.
Check your work
- The area was covered by several searches, not one
- Deduplication used place ID or name plus address
- Chains are separated from independents
- Website, phone and rating are populated on most rows
- Scraped emails have been verified
Where this breaks
Scraping a site returns every address on it, including privacy@, abuse@, careers@, and third-party addresses belonging to the web agency that built the site. Sending to those damages your sender reputation and reaches nobody who can buy. Filter the scrape output against a blocklist of role addresses you do not want, and read the first fifty results by hand before trusting the pattern.
Further automation
Local lists go stale in a specific way: businesses close, move and rebrand faster than corporate accounts. Re-running the map search quarterly and comparing against the existing table tells you which rows are dead — and a closed business still sitting in a sequence is worse than a missing one. Local business outreach builds the full play.
Next lesson
09 — Research with AI agents, answering the questions no directory field covers.
Reference for this lesson: google_maps_listings, scrape_emails_from_website, scrape_phones_from_website, Web scrapers.