HubSEOhubseoDocs
Product

How Scores Are Computed

Exact formulas, bounds, and missing-data rules for every HubSEO score. No black boxes.

Every score in HubSEO has a published formula, hard bounds, and an explicit missing-data rule. This page is the contract. If a report and this page ever disagree, treat that as a bug.

Overall audit score: seo-weighted-v2

overall = round(0.45 * performance + 0.35 * seo + 0.20 * bestPractices)
  • Inputs: mobile Lighthouse Performance, SEO, and Best Practices category scores.
  • Accessibility is reported separately, with weight 0.
  • Bounds: 0..100.
  • Missing-data rule: if the mobile lab run is unavailable, the audit is partial and the overall score is omitted. No missing category is treated as zero.
  • This is a mobile lab diagnostic. It is not a ranking prediction.
  • Explaining a change: compare the three category scores first. Each mapped category retains its Lighthouse audit refs, which identify which findings moved. Lighthouse's internal audit weighting inside a category is not re-implemented, so a category delta is the most precise arithmetic attribution available.

Check-set score

score = round(100 * (passes + 0.5 * warnings) / count(non-info checks))
  • info checks are unavailable evidence: excluded from the denominator, not counted as passes or failures.
  • Bounds: 0..100. A list with only info checks returns null.
  • Explaining a change: diff the non-info check IDs and statuses. One pass flip is worth round(100 / n) where n is the current measured count; a warning is half credit.

AI readiness score

score = round(100 * count(pass) / count(measured signals))
  • Measured: pass, fail, warning. unavailable is excluded.
  • A warning is measured but earns no partial credit.
  • Bounds: 0..100, null when nothing was measured.
  • Grades: Strong ≥ 75, Mixed ≥ 50, Limited < 50, unmeasured when null.
  • Full detail: AI readiness.

CrUX Core Web Vitals grades

  • Real-user p75 values from the Chrome UX Report, graded per metric against the standard good / needs-improvement / poor thresholds.
  • A missing metric is ungraded and omitted. It is never converted to zero.
  • Lab and field stay separate: Lighthouse lab timing never masquerades as real-user INP. See Core Web Vitals and CrUX.

Lighthouse category scores

  • Native Lighthouse category scores, mapped to 0..100.
  • Unavailable when a Lighthouse run fails; reported as unavailable, not zero.

GEO visibility aggregate

score = round(50 * presenceShare + 50 * citationShare)
  • Requires at least 3 completed external samples. Below that, the status is insufficient_data, not a low score.
  • Explaining a change: compare the cited and mentioned booleans of the completed samples.

PDF presentation colours

Presentation only: GOOD ≥ 90, WARN ≥ 50, BAD < 50; a null score renders as "Unscored" with muted colour. The colour never changes the underlying value.

Human severity

Belongs to a single finding, ranked by the rule in the Evidence Desk: Fix this first, Important improvement, Worth improving, Optional polish.

The standing rule

Scores do not predict traffic, rankings, revenue, or real-engine visibility. They describe the measured state of the URL at scan time. When evidence is missing, HubSEO reports the absence instead of computing around it.

Missing data is never zero

Every score in HubSEO treats unavailable evidence as unmeasured, not as a failing grade. A page whose Lighthouse run fails gets a partial report with the overall score omitted; a URL with no public CrUX sample reports no INP. If you see a zero where evidence was missing, that is a bug.

On this page