Methodology · Last reviewed 2026-04-22
How we rank HVAC providers
Every ranked shortlist on Compare HVAC Pro is produced by the same algorithm. This page documents exactly what it does — what signals we use, how we weight them, and what will and will not change a provider’s position.
On this page
Overview
Our ranker lives in lib/seo/rank-companies.ts. It takes the providers eligible for a given city, groups them into three tiers, scores them within tier, then sorts. The output is deterministic for a given city and week — two homeowners who load the same city page on the same day see the same ranking.
The ranker does not know who has paid for a featured placement. Payment status is applied as a separate, clearly labeled chip on the card (see Sponsored labelsbelow); it does not change the underlying rank.
Three tiers, in order
Every eligible provider is placed in exactly one tier. Tiers sort before scores — a top-rated provider with a lower score still outranks a verified provider with a higher score.
- Top-rated. Google rating ≥ 4.5, review count ≥ 10, and license status is active or not explicitly non-active. These are providers with both a volume signal and a quality signal that clear a public bar.
- Verified. License status is explicitly active, or years in business ≥ 3. These providers clear either a licensing-verification bar or a tenure bar but do not yet meet the top-rated review thresholds.
- Listed. Everything else eligible — newer providers, providers with thin review histories, providers where licensing data is sparse. These render but sort after Verified.
Within-tier score
Inside a tier, providers are sorted by a composite score. The exact formula lives in scoreCompany(); conceptually it combines:
- Rating × log(reviews + 1). Rating carries weight, but not in isolation — a 5.0 with 3 reviews is not more reliable than a 4.7 with 180, and our score reflects that. The log compresses high review counts so a provider doesn’t dominate just because they have 1,000 reviews.
- Years in business × 0.4. Tenure is a weak but real signal. Capped implicitly by being one term in a linear combination.
- Certifications × 2. AHRI, NATE, manufacturer specialist programs — each counts.
- Service breadth × 0.3. A provider offering install + repair + emergency + maintenance is preferred over a single-service outfit when other signals are comparable.
- Emergency service: +4. Listed 24-hour or same-day emergency coverage earns a bump, since emergency availability is a real homeowner constraint.
- 24-hour availability: +3. Separate flag from “emergency” — a company that simply answers outside business hours.
- Weekly jitter in [-1.5, +1.5]. A small, deterministic offset keyed on (citySlug, ISO week, companySlug). This breaks ties and rotates exposure week over week so no single provider gets locked into the #1 slot forever on a given page. See Weekly rotation below.
Data freshness
- Licensing. Re-verified on a rolling cadence against state agency public records (Oregon CCB, Washington L&I, Texas TDLR, Florida DBPR, and others as we expand). Lapsed licenses drop to the “listed” tier immediately and are removed from the site on the next pipeline run.
- Ratings & reviews. Refreshed weekly from Google Business profiles. The review count and rating on a city page reflect the most recent weekly snapshot.
- Business details. Years in business, certifications, services offered, emergency flags, 24-hour flags — refreshed from Google Business profiles plus our own enrichment queries.
Each programmatic page renders a data-provenance strip near its footer that shows the licensing source and the most recent refresh timestamp so homeowners can judge freshness directly.
Weekly rotation
The jitter term is seeded by (citySlug, current ISO week, companySlug) — the same hash per city per week produces the same offset, but the week component rotates the offset each Monday. The practical effect: two qualified providers with similar scores alternate positions across weeks instead of one being permanently pinned on top. The effect is small (±1.5 out of a score that typically runs 10–30) so it cannot promote a “listed” provider above a “top-rated” one.
Sponsored labels
Contractors who pay for featured visibility are labeled as such on the card — in-line, not buried in a footer. A sponsored provider still has to clear the same license, conduct, and complaint-history bar as every other listed provider. Paid placement does not change their tier or their within-tier score; it adds a visible badge and may pin a provider to a highlighted slot within the ranked shortlist when the agreement specifies that placement. When that happens the placement is labeled “Featured” or “Sponsored”, not “Top pick”.
See our affiliate disclosure for the full commercial-relationship policy.
Limits we do not hide
- Not every license is verified in real time. Our re-verification runs on a cadence, not on every page load. A contractor whose license lapsed two days ago may still render as “verified” until the next refresh. The data provenance strip on every page shows the most recent verification date.
- Review data is Google-centric. We pull ratings and review counts from Google Business profiles. We do not merge in Yelp, Angi, or BBB ratings because those sources have non-uniform moderation and review-gate policies.
- Years in business is sometimes missing. Google Business profiles frequently lack a definitive “founded” date. When missing we treat tenure as 0 for scoring purposes — that is why the “Verified” tier accepts either active license OR tenure ≥ 3, not both.
- Sparse cities fall back to a shorter list. In a market with only 4 eligible providers, the ranker still runs but the tiering signal is weak. We show all four rather than filter down to a single “top pick”, and the tier chips make the ranking confidence visible.
- We cannot validate every complaint. When a provider has a pattern of unresolved complaints in public records (state licensing board action, BBB unresolved complaint log), we delist them. We do not investigate individual disputes and we do not publish review text ourselves — we link to Google so homeowners can read the source.
See the ranker in action
Every city page runs the same tier + score logic documented above.