Skip to main content
AlertPlumber editorial standards

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:

  1. 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.
  2. Labor wage data from the Bureau of Labor Statistics β€” Plumbers, Pipefitters, and Steamfitters (47-2152) . Median hourly + metro-level adjustments.
  3. 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:

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

Climate data

Utility rate data

Water quality data

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.

SourceCadenceWhat 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

  1. 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 raw value AND the source_url + source_label + scraped_at timestamp.
  2. 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.
  3. 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 + a data-cite-tier attribute.
  4. At build time, scripts/verify-citations.mjs HEAD-checks every rendered citation URL. Any 404 blocks the build.
  5. 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_reviewed dates 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:

  1. Visitor enters ZIP β†’ looked up against src/data/zip-to-city.json.
  2. 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.
  3. Calc formula: cost = national_base × modifier, where modifier blends 40% permit-fee delta, 30% plumber-density delta, and 30% baseline anchor.
  4. Each result lists THE source URLs that fed it (city development services + state license board + BLS + BuildZoom).
  5. 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, and ad_personalization all start as denied. No identifiers leave the visitor's browser.
  • The cookie banner upgrades analytics_storage to granted only on explicit Accept.
  • ad_personalization is 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
Call (844) 727-2225 Get a quote