Ran 12 searches (4 keyword variants x 3 Texas cities) to see what you can actually get out of Google Maps for a local service niche, and then looked at which fields are worth building a filter on. The ceiling is real. A single Maps query returns roughly 120 results, and paginating past that gives you the same listings back. So "scrape every plumber in Dallas" is not something one search can do. You have to multiply queries. What worked: same city, four phrasings that people actually type (roofing contractor / roofing company / roofer / commercial roofing). Each phrasing returns a different slice rather than a subset of the first one. 12 searches got me 506 unique listings after de-dupe. That is the easy part. Here is what the data actually looks like. Ratings are noise. 88.3% of the 506 sit between 4.5 and 5.0. Only 6.1% are below 3.5. If your targeting is "rating above 4", you have selected 94% of the market. It is not a filter, it is a formality. Review count is the real filter. Median 39 reviews, mean 122.8, and 53.8% have fewer than 50. That is roughly the line between "the owner answers the phone" and "there is a receptionist and somebody doing marketing". Splitting on review count actually changes who you are talking to. Contactability across the 506: 91.9% have a website 98.4% have a phone 6.9% have a phone but no website That last group is the one nobody mentions. They are paying for a Google Business Profile and have no site, which usually means no SEO retainer, no ad spend, no agency. Depending on what you sell it is either your best list or your worst, but it is definitely the most differentiated slice in the file. Email hit rate: on a separate 52-listing sample with website crawling on, 29.2% of the ones that had a website exposed a real address. The rest you are guessing at, and guessing is how you end up in spam. One trap worth naming. De-duplicating on place_id gives you a clean file that is still wrong for outreach. In my 506, seven street addresses accounted for 17 records (virtual office suites downtown), and 17 brand names appeared at 36 different listings (multi-location chains). If you are counting companies, place_id is the wrong key. If you count physical locations, it is the right one. Mixing the two is how a 506-row list turns into an argument with a client about why three of the rows are the same company. Curious what the rest of you use as the actual qualification filter for local leads. Review count, no-website, or something I am not thinking of.
Yeah, I'm getting flak for having only 5* reviews, but in general people only review if it's really bad or really good.
From the contractor side, a few things the data can't show: Review count tracks the trade as much as company size. A roofer doing a handful of big jobs a month collects reviews far more slowly than a plumber running dozens of service calls a week, so a roofing company with 40 reviews can be bigger than a plumber with 150. I'd only compare review counts within one trade. Phone but no website often means referral-fed rather than struggling. Plenty of those owners are booked out through word of mouth. They're short on time, not leads, so a pitch for more leads misses them, while help with quoting, scheduling or follow-up might land. And what gets a contractor to reply is naming one specific thing on their own listing (no photos of finished work, reviews with no owner response, wrong hours) rather than sending a generic audit. It shows you actually looked.
I've done the same kind of pull for trades work and I landed in almost the same place: rating is useless as a filter, review count is the first cut. What I stack on top of review count is recency and replies. A roofer with 40 reviews where the newest is eight months old and the owner never replies is a different prospect from one with 30 reviews, three in the last month, and the owner answering every one. The second business is alive and paying attention to its profile, which means it will usually take a call. The no-website slice is the one I spend the most time on too, but I qualify it one step further. Phone-only businesses that have uploaded photos recently are usually owner-operated and reachable, while a bare profile with no photos and no posts is often a listing somebody set up once and forgot. I check photos and posts before I call, because a dead profile usually means a dead number too. One thing that saved me arguments: I de-dupe on phone number, not place_id or name. Chains share names and suites share addresses, but the phone is usually the real business. When two listings share a number I treat them as one company and keep the stronger location.