Methodology
Every cost range, license count, permit fee, water-hardness reading, and climate stat on this site is sourced from public records. This page documents the sources, refresh cadence, and audit process. Send corrections to [email protected].
Last refreshed: · Refresh cadence: monthly for permits + utility rates, quarterly for license counts, annually for climate baselines.
How AlertPlumber calculates cost ranges
The cost ranges shown on every service hub and service×city page combine three sources:
- Permit data from city open-data portals (e.g., Phoenix Open Data Portal , Analyze Boston ) and aggregator BuildZoom . Permits show actual project values reported by licensed contractors.
- Labor wage data from the Bureau of Labor Statistics β Plumbers, Pipefitters, and Steamfitters (47-2152) . Median hourly + metro-level adjustments.
- Material cost indices from BLS PPI plus retail data from major distributors (Ferguson, big-box pro counters).
The published range is the 25thβ75th percentile of the combined dataset for each service in each metro. Outliers (commercial-scale projects, high-end remodels) are excluded. Sample sizes < 50 permits in a metro fall back to the regional average.
How the network verifies plumber credentials
AlertPlumber routes calls and form submissions through the eLocal partner network. eLocal's network operations include a credentialing process that cross-references plumbers in their pool against the relevant state contractor licensing board. The boards eLocal references include:
- California β Contractors State License Board (CSLB) β C-36 Plumbing
- Texas β TSBPE β Master + Journeyman + Tradesman Plumber
- Florida β DBPR β Certified + Registered Plumbing Contractor
- Arizona β Registrar of Contractors β C-37 Plumbing
- Massachusetts β Board of Plumbers β Master + Journeyman
- +45 other state boards covered by the eLocal network's verification process
What AlertPlumber promises and what it does not. AlertPlumber does not independently verify the credentials of any individual plumber on a per-call basis, and AlertPlumber does not perform plumbing services itself. The credentialing process described above is operated by the eLocal partner network. Homeowners are encouraged to independently confirm a plumber's credentials with the state board directly before authorizing any work. Links to each board's public lookup are provided above for that purpose.
Permit data sources
- Phoenix Development Services β fee schedule + permit counts
- Boston Inspectional Services Department
- Minneapolis Regulatory Services
- City open-data portals (Socrata, Accela, OpenGov platforms) for the top 500 cities
Climate data
- NOAA NCEI β National Centers for Environmental Information β frost line depths, freeze days, regional climate normals
- NOAA NWS β National Weather Service β local forecast offices for city-specific data
Utility rate data
- EIA β US Energy Information Administration β gas + electric residential rates
- City utility commission portals (e.g., Boston Water & Sewer Commission , Phoenix Water Services )
Water quality data
- USGS β Hardness of Water Map
- EPA SDWIS β Safe Drinking Water Information System β main breaks, lead service line inventory (LCRR 2024)
- EWG Tap Water Database β community-level contaminant data
- Annual city Consumer Confidence Reports (CCRs) for hardness + contaminant detail
Per-source refresh cadence
Public datasets refresh on different schedules. AlertPlumber mirrors each source's natural cadence β so the data on every page reflects what was current the last time the source published.
| Source | Cadence | What changes when it refreshes |
|---|---|---|
| City development services permit fees | Quarterly | Permit fee dollar amounts; permit counts |
| State contractor license boards | Quarterly | Active plumber count; new licensee additions |
| USGS Water Hardness Map | Annually | Per-county hardness readings (rare to change materially) |
| EPA SDWIS lead service line inventory | Annually (LCRR cycle) | Per-utility lead-line counts as replacement programs progress |
| NOAA NCEI frost-line + freeze-day data | Annually | Climate normals; updated each spring after the prior winter |
| EIA + city utility commission rates | Monthly | Residential gas/electric/water rates per metro |
| BLS Plumbing-Pipefitting wage statistics (OES 47-2152) | Annually (May release) | National + state median hourly wages; calculator labor anchor |
| BuildZoom permit aggregate data | Monthly (rolling) | Per-city actual permit values from licensed contractors |
| US Census ACS housing-vintage | Annually (December release) | Median home age; municipal-sewer coverage % per ZIP |
Each scraper writes its output to a per-source JSON snapshot (with the scrape timestamp embedded). The build then aggregates these into per-city data files that get embedded on every relevant page. If a source refresh is overdue (more than 1.5Γ its cadence), the build emits a warning so the operator notices.
How a citation actually flows from scraper to page
-
A Python scraper (e.g.
scripts/scrapers/data_layers/permits.py) fetches the source page (e.g. Phoenix Development Services fee schedule), extracts the relevant value (permit fee = $185), and writes a snapshot:src/data/scraped/permits/phoenix.json. Every value carries both its rawvalueAND thesource_url+source_label+scraped_attimestamp. -
An aggregator (
scripts/scrapers/data_layers/aggregate.py) merges all per-source snapshots into one per-city file:src/data/scraped/data-layers/phoenix.json. -
The Astro page template imports the per-city JSON and renders each value
inline with a
<CitationLink>component that emits an anchor with the live source URL + adata-cite-tierattribute. -
At build time,
scripts/verify-citations.mjsHEAD-checks every rendered citation URL. Any 404 blocks the build. -
On every quarterly refresh, the operator re-runs the scraper, the JSON
updates, the build re-renders, the citation URLs HEAD-check again, and
the per-page
last_revieweddates auto-bump.
Editorial standards
- Every numeric claim cites its public source inline via
<a href>. - Build script HEAD-checks every cited URL β dead links block the build.
- No fabricated reviews, no fake star ratings, no invented author personas.
- Every page bylined “By the AlertPlumber Editorial Team.”
- Corrections processed within 5 business days — submit to [email protected].
- Full citation policy + voice rules at Editorial Standards.
Cost calculator data flow
The calculator on /tools/cost-calculator/ (and embedded on every service hub + service×city page) uses this exact pipeline:
- Visitor enters ZIP β looked up against
src/data/zip-to-city.json. - If matched (e.g. ZIP 85032 β Phoenix), the calc pulls Phoenix's scraped permit fee + state plumber count + water authority + hardness from the per-city JSON.
- Calc formula:
cost = national_base × modifier, where modifier blends 40% permit-fee delta, 30% plumber-density delta, and 30% baseline anchor. - Each result lists THE source URLs that fed it (city development services + state license board + BLS + BuildZoom).
- If ZIP doesn't match a known city β state-level modifier from the city CSV. If no state match β national average.
Full calculator spec at docs/cost-calculator-spec.md in the repo.
Tracking + privacy
AlertPlumber uses Google Analytics 4 with Consent Mode v2. By default:
analytics_storage,ad_storage,ad_user_data, andad_personalizationall start as denied. No identifiers leave the visitor's browser.- The cookie banner upgrades
analytics_storageto granted only on explicit Accept. ad_personalizationis permanently denied β AlertPlumber doesn't run advertising and never targets visitors based on browsing.- Visitors with Global Privacy Control headers are treated as opted-out for the entire session, regardless of cookie banner choice.
- No third-party advertising cookies, pixels, or remarketing tags are loaded β ever.
Server-side: visitor IP is used briefly for security (rate-limit hashing) and the optional Phase 1.5+ geo-detection lookup. IP is never stored β only the hashed token-bucket identifier is persisted (~24 chars), and only for as long as the rate-limit window. See Privacy Policy for the full data inventory.
What AlertPlumber does NOT do
- Display fake customer reviews or star ratings
- Maintain a permanent contractor "roster" β license verification happens fresh per match
- Charge homeowners for the referral service (free to use)
- Perform, supervise, or guarantee any plumbing work β that's the licensed plumber's responsibility
- Operate as a licensed contractor in any state