Nextdoor is an unusually good source for local B2B lead lists, for one structural reason: the businesses on it published their own contact details in order to be contacted. That is a different provenance from a directory that scraped them from somewhere else. The catch is coverage — three usable channels with three different fill rates — and the arithmetic is worth doing before the run rather than after.
Which fields are actually usable
Measured over 741 businesses across 5 cities and 12 categories:
| Channel | Filled | Practical note |
|---|---|---|
phone_number | 93.9% | E.164. The default channel if you have to pick one. |
website_url | 77.2% | Often social rather than a domain, so it is a weak enrichment key. |
email | 62.6% | The constraint on any email-first sequence. |
The coverage arithmetic nobody does first
Requiring one field costs you the inverse of its fill rate. Requiring two costs you more than either, because the gaps are only partly correlated — a business with no website often has no email either, but not always.
Working from the measured rates, for a target of 500 contactable businesses:
- Phone is enough: about 535 rows.
- Email required: about 800 rows.
- Phone and email both required: roughly 830 rows, and the exact figure depends on the category mix.
At $0.008 per business that is the difference between $4.30 and $6.60 — trivial. The reason to do the arithmetic is not cost, it is that discovering the constraint after the run usually means re-running with a different city list, and by then you have a half-built campaign shaped around the wrong row count.
Qualifying inside the dataset
Two fields do most of the qualification work before you export anything. is_verified is Nextdoor's own check, and recommendations_count tells you whether neighbors have said anything at all — 42.4% of businesses have at least one recommendation, and those are measurably the more established half of any category.
recommendations_summary, present on 47.4%, is Nextdoor's one-line synthesis of neighbor commentary. As a qualification signal it is cheap and surprisingly good: a business with a summary mentioning responsiveness is a business somebody actually hired.
If you are scoring leads on sentiment, filter recommendations by kind first. Half the feed is neighbors asking for a provider, not reviewing one — the measured split.
City list or trade area?
A local services business usually serves a catchment rather than a municipality, and Nextdoor's directory happens to return exactly that when you let it: it is distance-ordered and continues into neighbouring towns once the requested city runs out.
So decide which one you want. For a campaign scoped to a city, set onlyRequestedCity: true and the filtering happens during discovery, so dropped rows are never charged. For a campaign scoped to a region, raise the cap and let the overflow happen deliberately — every row carries address_city, so you can always segment afterwards.
The businesses that hid their address
A meaningful share of local providers set their address to private, because the address is their home. Those rows return null across every address field with hide_address: true — and they are frequently the most responsive segment in a category, because they are sole traders who answer their own phone.
Whether that is your best segment or your worst depends entirely on the offer. What matters is not to drop them accidentally through a “has an address” filter you added for hygiene reasons.
A concrete recipe: 500 qualified local services
{
"cities": [
"san-clemente--ca",
"san-juan-capistrano--ca",
"dana-point--ca",
"laguna-niguel--ca",
"mission-viejo--ca"
],
"categories": ["Plumber", "Electrician", "Landscaper", "Roofer"],
"maxBusinessesPerCity": 120,
"onlyRequestedCity": true,
"includeRecommendations": true,
"maxRecommendationsPerBusiness": 20,
"includeCityData": false
}Five cities at 120 each, split across four categories, is up to 600 businesses for roughly $4.80, plus recommendations at $0.002 each. Then filter: keep rows with a phone number, sort by recommendations_count descending, and you have a prioritised list where the top of it is provably active.
Turn city data off unless you need it. At $0.008 per city it is cheap, but a lead list does not use it and the rows land in a separate dataset anyway.
Where the compliance line sits
Business contact details published by a business so that customers can contact them are the least contentious category of scraped data there is. That does not make every use of them lawful: the rules that govern unsolicited commercial contact depend on where you are, where the recipient is, and whether the contact is to a business or an individual.
Two practical notes rather than legal advice. First, a sole trader working from a home address is closer to an individual than a company, and the hide_address flag is a decent signal for that. Second, neighbor content is a different category entirely and is off by default in this Actor for exactly that reason — see which data creates which obligation.



