How We Sorted 200 Plumbing Websites
We started with 200 domains that public and paid sources tied to plumbers in St. Petersburg, Florida. Fewer than half turned out to be local plumbers with proof on their own site that they serve the city.
Where the 200 Domains Came From
We pulled every plumbing business with a website from several sources. Free ones: Overture Maps, Foursquare, OpenStreetMap, AllThePlaces and Florida license records. Paid ones: Google business listings, Google Maps and Google organic results.1
A domain made the list if a source placed it inside the city boundary or within 3 km of it.2 That gave 92 domains inside the city and 90 just outside, in places like Gulfport, Kenneth City and Pinellas Park. Another 17 came only from organic search results, with no coordinates. One had only a postal city.1
No source had everything. Foursquare alone found 30 domains, Overture alone 21, Google organic results alone 17.1 The Google lookups cost about $0.18 for the whole slice.3
Why a Quick HTTP Check Failed
Our first pass sent one request to each homepage. It searched the first 400 KB of raw HTML for the city name and plumbing words. It was wrong in both directions.1
- It rejected real plumbers whose sites build the page with JavaScript.
- It rejected plumbers whose address sits only on the contact page.
- It rejected sites that say "Tampa Bay" instead of the city name.
- It accepted lead-generation sites and directories, because they repeat the city name everywhere.
- It counted parked domains and server placeholder pages as live sites.
A real browser found 36 dead domains, not 27. Six domains that passed the quick check were lead-generation sites.1 We dropped the quick check for verdicts on Oct 1, 2026. It now says only whether a domain answers.3
Location mattered too. From a computer in the Netherlands, 47 of the 200 sites did not respond. From a US IP address, 15 of them loaded at once.1 All checks since then run from the US.
How Each Site Was Judged
Each live homepage opened in ordinary Chrome, with JavaScript running, five browsers in parallel. The 171 homepages took about 40 minutes.1
A language model running on our own server then read each captured page. It labeled the site type: a local company's own site, a franchise location page, a national chain, a directory, a lead-generation site, unrelated, or dead. It had to quote the page to back its label, and code checked that each quote was really on the page. Labels with confidence below 0.6 go to a person.1
The model did not decide whether a company is local. Code did that, using the evidence below.
What Counts as Zone Evidence
Code looks at the homepage first. If it finds nothing, it opens up to 2 more pages: contact, service area, or a chain's local page. Evidence ranks from strongest to weakest:1
- A phone number on the site matches the number our sources list for that domain. Those source records already sit in the city. Toll-free 8xx numbers do not count, because a chain uses the same one everywhere.
- A St. Petersburg area ZIP code in the address or structured data: 33701 to 33716, 33730 to 33747, 33781 or 33782.
- A city name from the zone next to "FL" or "Florida". The state is required: Gulfport also exists in Mississippi, and there is a Petersburg in Tennessee.
- Weak: only a region, such as Pinellas or Tampa Bay, or only the 727 area code. This does not put a site in the corpus.
Before 3 duplicates were merged, 91 sites had zone evidence. The split by evidence type:1
| Strongest evidence found | Sites |
|---|---|
| Phone matches source records | 58 |
| City name next to the state | 19 |
| Zone ZIP code | 14 |
Ten of these were local pages of franchises.1 How the three signals differ is covered in Office Address, Service Area, Phone.
The Result
| Group | Domains |
|---|---|
| Local plumbers with zone evidence | 88 |
| Local plumbers, region only | 10 |
| Local plumbers, no zone evidence | 7 |
| Local business in another trade (HVAC, appliance repair) | 13 |
| National chains and brands | 3 |
| Directories and lead-generation sites | 17 |
| Not home services | 16 |
| Duplicates (redirect to another domain on the list) | 4 |
| Blocked by bot protection, even in a browser | 6 |
| Dead, parked or no DNS | 36 |
| Total | 200 |
The 88 sites form the corpus. Only these go on to a full crawl and fact extraction. Of the 88, 45 are inside city limits and 38 are within 3 km of the boundary.1
What Surprised Us
Sources attach the wrong website to a local record. Five domains tied to St. Petersburg belonged to plumbers in Colorado, Idaho, Mississippi, Broward County and Orange City, Florida. Without evidence on the site itself, they would have entered the directory.1
Our starting database missed a lot. It lacked 21 of the 45 in-city plumbers in the corpus. Google alone found 11 of those 45.1
The model sometimes invents a trade. One sewer pipe lining company came back labeled as window cleaning. That is why a person reviews the "another trade" group.1
This is one snapshot, taken Oct 1, 2026. Sites change, and dead domains may come back.
The check reads a homepage and at most 2 more pages. A plumber that shows its area only deeper in the site lands in "region only" or "no zone evidence". A person still has to review those 17 domains.
The corpus covers only businesses with a known website. Florida records list 93 active plumbing licenses with a St. Petersburg address. For 69 of them, we do not know a domain yet. Some have no website at all. License records are explained in Florida contractor licenses.
We have not yet run the same check on Clearwater, so we cannot compare the two cities on this method. Progress is in the work log.
Sources
- Nearbia project data, St. Petersburg plumbing slice, Oct 1, 2026: candidate domain list, per-site verdicts with zone evidence, and slice summary. Snapshot of Oct 1, 2026.
- U.S. Census Bureau, TIGERweb, Places layer, St. Petersburg city boundary (GEOID 1263000), tigerweb.geo.census.gov, downloaded Oct 1, 2026.
- Nearbia project decision log, entries of Oct 1, 2026 on the St. Petersburg plumbing slice and on browser-only site checks.