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))infochecks are unavailable evidence: excluded from the denominator, not counted as passes or failures.- Bounds:
0..100. A list with onlyinfochecks returnsnull. - Explaining a change: diff the non-
infocheck IDs and statuses. One pass flip is worthround(100 / n)wherenis the current measured count; a warning is half credit.
AI readiness score
score = round(100 * count(pass) / count(measured signals))- Measured:
pass,fail,warning.unavailableis excluded. - A
warningis measured but earns no partial credit. - Bounds:
0..100,nullwhen 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/poorthresholds. - 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
citedandmentionedbooleans 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.
