Website Audit System - Methodology

How an audit score is calculated

Each page is evaluated across six independent dimensions. This document explains what is measured in each, how signals translate into points, and how the final score is composed.

Example total93.6

Structure

Score: 90 / 100 Weight in total: 20%

Evaluates the semantic integrity and navigability of the page's HTML. A well-structured page gives both users and crawlers a clear, predictable hierarchy.

Score90 / 100
Heading structure — max 40 pts
Single H1 tag
The page must have exactly one <h1>. One H1 = 15 pts. More than one = 5 pts (penalised for ambiguity). None = 0 pts.
one title: +15 pts1+ titles: +5 ptsno title
1 found15 pts
Sufficient heading count
At least 3 total headings (H1–H6) signals that content is broken into scannable sections. Rewarded with 5 pts.
found: +5 ptsnot found
7 total5 pts
Heading hierarchy score
Checks that headings nest correctly (no H3 before an H2, etc.). The raw hierarchy score (0–100) contributes up to 20 pts via the formula: score × 0.20.
correct: up to +20 ptsnot correct
100 / 10020 pts
Semantic tags — max 20 pts (5 pts each)
Landmark tags
Presence of <header>, <main>, <article>, and <footer> is checked individually. Each present tag adds 5 pts, for a possible 20 pts total. These tags give screen readers and search engines structural anchors.
main ✓ footer ✓10 pts
Images & links — max 35 pts
Alt text coverage
For every image on the page, alt text is checked. The ratio of covered images drives up to 20 pts: (images − missing_alt) / images × 20. Full coverage earns the maximum.
up to 20 pts
67 / 6720 pts
Internal links
Links pointing to pages within the same domain. 5+ internal links = 10 pts. At least 1 = 5 pts. None = 0 pts. Internal links aid crawlability and user navigation.
up to 10 pts
7 links10 pts
External links
At least one link to an external domain earns 5 pts. External links signal that the page connects to the wider web, a positive trust signal.
5 pts
2 links5 pts
Page size — max 5 pts
HTML size under 500 KB
The raw HTML document (excluding assets) should remain under 500 KB. Leaner HTML parses faster. Passing this threshold earns 5 pts.
5 pts
211 KB5 pts
Scoring formula
H1 score (15) + heading count (5) + hierarchy score × 0.20 (20) + landmark tags (10) + alt coverage × 20 (20) + internal links (10) + external links (5) + HTML size (5) = 90

Load Complexity

Score: 100 / 100 Weight in total: 20%

Measures how much complexity the page introduces at load time — number of requests, scripts, stylesheets, third-party dependencies, and total page weight. Starts at 100 and deducts for excess.

Score100 / 100
Penalty-based scoring. Load Complexity starts at 100. Each threshold violation deducts points. A page with no excess earns the full 100, as seen in this example.
Request count penalties
Total HTTP requests
Counts every resource the browser fetches: HTML, images, scripts, fonts, etc. Over 30 = −5 pts. Over 60 = −15 pts. Over 100 = −25 pts.
1–30: no penalty30–60: −5 pts60–100: −15 pts>100: −25 pts
5 requestsno penalty
Script & stylesheet penalties
JavaScript files
Each JS file adds parse and execution cost. Over 4 files = −5 pts. Over 8 = −10 pts. Over 15 = −20 pts.
0–3: no penalty4–8: −5 pts8–15: −10 pts>15: −20 pts
0 filesno penalty
CSS files
Stylesheets block rendering until downloaded and parsed. Over 4 = −5 pts. Over 8 = −10 pts.
0–3: no penalty4–8: −5 pts>8: −10 pts
0 filesno penalty
Render-blocking scripts
Scripts in the <head> without async or defer block the browser from rendering anything. 1–2 = −3 pts. 3–5 = −8 pts. Over 5 = −15 pts.
0: no penalty1–2: −3 pts3–5: −8 pts>5: −15 pts
0no penalty
External dependency penalties
Third-party domains
Each unique external domain (CDNs, analytics, fonts, embeds) requires a separate DNS lookup and connection. Over 2 = −5 pts. Over 5 = −10 pts. Over 10 = −20 pts.
0–1: no penalty2–5: −5 pts5–10: −10 pts>10: −20 pts
1 domainno penalty
Total page weight
Sum of all transferred bytes (HTML + assets). Over 2 MB = −5 pts. Over 5 MB = −10 pts. Heavy pages hurt users on slow connections and mobile data.
<2 MB: no penalty2–5 MB: −5 pts>5 MB: −10 pts
0.14 MBno penalty
Scoring formula
Starts at 100. Deductions applied per threshold breach above. All metrics within safe thresholds = 100

Security

Score: 100 / 100 Weight in total: 20%

Checks the presence of HTTP security headers that protect visitors from common web attacks. Each header is a binary check — present or absent.

Score100 / 100
Binary checks only. Each of the five security signals is either present (✓) or absent (✗). The score is derived entirely from the server response headers — no page content is analysed.
HTTP response headers checked
HTTPS
The page is served over an encrypted TLS connection. This is the baseline requirement for all other security headers to be meaningful.
✓ Present
Strict-Transport-Security (HSTS)
Instructs browsers to only connect via HTTPS for a defined period, even if the user types http://. Prevents protocol downgrade attacks.
✓ Present
Content-Security-Policy (CSP)
Defines which sources of scripts, styles, and media the browser is allowed to load. Mitigates cross-site scripting (XSS) attacks by blocking unauthorised content.
✓ Present
X-Frame-Options
Prevents the page from being embedded in an <iframe> on another site. Protects against clickjacking attacks where a malicious overlay tricks users into unintended clicks.
✓ Present
X-Content-Type-Options
Set to nosniff, this stops browsers from guessing the MIME type of a response, preventing them from treating a script file as HTML or vice versa.
✓ Present
Referrer-Policy
Controls how much referrer information is included when the user navigates away. Limits leakage of internal URLs and user paths to third-party sites.
✓ Present
Scoring formula
All 5 headers present = 100. Each missing header reduces the score proportionally.

AI Readability

Score: 81.9 / 100 Weight in total: 20%

Evaluates how well the page communicates its meaning to automated systems — search engines, AI crawlers, and social media scrapers. Covers structured data, metadata quality, content clarity, and discoverability signals.

Score81.9 / 100
Semantic richness — up to 20 pts (weight: 20%)
Semantic richness score
Computed from the presence of <main> and <footer> tags (base 80%), plus a bonus of up to 25 pts for the count of <nav>, <aside>, and <section> elements (capped at 1× multiplier).
Formula: (semantic_flags / 2) × 80 + min((nav+aside+section) / 2, 1) × 25.
92.5 / 100× 0.20 → 18.5 pts
Heading & alt clarity — up to 30 pts
Heading clarity score
Directly inherits the heading hierarchy score from the Structure dimension. A correct heading order = 100. Contributes up to 15 pts via weight 0.15.
100 / 100× 0.15 → 15 pts
Image alt coverage ratio
The fraction of images that have alt text: (images − missing_alt) / images. Multiplied by 100 and weighted at 0.15, it contributes up to 15 pts. Full coverage = full points.
1.0 (100%)× 0.15 → 15 pts
Structured data & social tags — up to 35 pts
Schema.org / JSON-LD
Points for each JSON-LD block (json_ld_count × 10) plus each unique schema type detected (schema_type_count × 20), capped at 30 pts. Weighted at 0.20, contributes up to 6 pts.
8 schema types found
30 pts (capped)× 0.20 → 6 pts
Open Graph tags
Presence of any og: meta tags earns 15 pts. These power link previews on social platforms and inform AI summarisers about the page's intent. Weighted at 0.05.
7 og: tags× 0.05 → 0.75 pts
Twitter Cards
Presence of any twitter: meta tags earns 5 pts. Controls the appearance of links when shared on X/Twitter. Weighted at 0.05.
4 twitter: tags× 0.05 → 0.25 pts
New signals group — up to 15 pts
Meta description quality
Length thresholds: missing = 0 pts, too short (<50 chars) = 4 pts, too long (>160 chars) = 6 pts, optimal (50–160 chars) = 10 pts. This page's description is 202 chars, so rated "too_long".
too_long → 6 pts
202 chars6 / 10
Title tag quality
Same thresholds: missing = 0, too short (<10 chars) = 4, too long (>60 chars) = 6, optimal = 10 pts. This page's title is 102 chars, rated "too_long".
too_long → 6 pts
102 chars6 / 10
Canonical tag
A <link rel="canonical"> tag tells crawlers the authoritative URL for the page, preventing duplicate content issues. Present = 2 pts.
+2 pts
✓ Present2 / 2
Contact information
Detected by regex scanning visible text for email addresses or phone numbers. Contact presence earns 1 pt — it signals legitimacy and business intent to AI systems.
+1 pt
Email found1 / 1
Content-to-noise ratio
Ratio of visible text characters to total HTML bytes. If ≥ 5% of the HTML is readable text, the page is considered content-rich and earns 1 pt. Low ratios suggest tag-heavy template pages with little actual content.
0.006 < 0.05 threshold
0.0060 / 1
Scoring formula (composite)
(semantic_richness × 0.20) + (heading_clarity × 0.15) + (alt_coverage × 100 × 0.15) + (internal_link_ratio × 100 × 0.05) + (schema_score × 0.20) + (og_score × 0.05) + (twitter_score × 0.05) + new_signals_score = 81.9

Appearance*

Score: 59.4 / 100 Not included in total score

A heuristic assessment of homepage visual quality based purely on HTML and inline CSS — no screenshots or rendering. Checks for key UX components and visual discipline. * Note: currently informational only, not included in the total score calculation.

Score59.4 / 100
UX component checks — up to 60 pts
Hero section
Detected via class names containing "hero", "banner", "jumbotron", "cover", or "splash", or via a background-image style on a top-level section. Also credited if the first image appears within the first 40 HTML tags. Earns 10 pts.
found: +10 ptsnot found
not found0 / 10
Logo
Searched for within the <header> first — an image with "logo" in the alt text, or an SVG element. Falls back to any <img> with "logo" in alt or src. Earns 15 pts.
found: +15 ptsnot found
not found0 / 15
CTA button
Scans all <a> and <button> elements for action verbs: book, contact, hire, inquire, get in touch, start, schedule, reserve. First match earns 10 pts.
found: +10 ptsnot found
not found0 / 10
Navigation quality
Counts links within the <nav> element: 0 = missing (0 pts), 1–2 = sparse (5 pts), 3–8 = ok (15 pts), 9+ = cluttered (5 pts). Optimal navigation is neither bare nor overwhelming.
0 links: 0 pts1-2 links: 5 pts3-8 links: 15 pts9+ links: 5 pts
5 links15 / 15
Footer completeness
The <footer> is checked for a copyright symbol (©) or the word "copyright" in its text. Presence earns 10 pts — a complete footer signals a professional, trustworthy page.
found: +10 ptsnot found
✓ Found10 / 10
Visual discipline — up to 40 pts (score × 0.40)
Font discipline
Extracts all font-family declarations from inline styles, normalises and de-duplicates them. Penalty: (font_count − 3) × 8 for 4+ fonts. If no fonts are detected at all, no penalty is applied (can't assess discipline).
0-3: no penalty4-11 fonts 12+ fonts
0 detected
Color discipline
Counts unique hex and RGB values in inline CSS. Penalty: (color_count − 10) × 2 for 11+ colors.
Visual discipline score = 100 − font_penalty − color_penalty, then multiplied by 0.40 for up to 40 pts.
< 10 colors17-34 colors 35+ colors
visual_discipline = 100 - 0 - 14 = 86 × 0.40 = 34.4
17 colors× 0.40 → 34.4 pts
Scoring formula
hero (0) + logo (0) + CTA (0) + nav ok (15) + footer (10) + visual_discipline (34.4) = 59.4

Lighthouse

Score: 97 / 100 Weight in total: 20%

Google Lighthouse is run headlessly against the live page. Four categories are measured. The audit uses the Performance score directly as the Lighthouse Score for weighting purposes.

Score97 / 100
Lighthouse categories (all 0–100)
Performance
Google's weighted composite of Core Web Vitals and load timing metrics. This is the value used as the lighthouse_score in all further calculations.
97
Accessibility
Audits contrast ratios, ARIA labels, keyboard navigability, and semantic HTML usage. Reported as a standalone signal.
100
Best Practices
Checks for HTTPS, modern image formats, no browser errors, secure third-party libraries, and correct use of APIs.
100
SEO
Lighthouse's own SEO checks: robots.txt, mobile viewport, crawlability, and meta tag completeness.
100
Core Web Vitals reported
LCP — Largest Contentful Paint
Time until the largest visible element (image or text block) has fully loaded. Under 2.5 s is "Good". This page: 2,524 ms — borderline.
2,524 ms
CLS — Cumulative Layout Shift
Measures unexpected visual movement as the page loads. Under 0.1 is "Good". This page has virtually no layout shift.
0.001
TBT — Total Blocking Time
Total time the main thread was blocked long enough to prevent input response. Under 200 ms is "Good". Zero indicates no long tasks.
0 ms
Speed Index
How quickly content is visually populated during load, measured in milliseconds. Lower is better.
1,380 ms
Score used in calculations
The Lighthouse Performance score (97) is used directly as the lighthouse_score input to both the Efficiency Score and the Total Score.

Total Score

93.6 / 100

The total score is a weighted average of five core dimensions. Appearance is excluded at this stage. A separate Efficiency Score is also computed as a performance-focused composite.

Structure
90
× 20%
Load
100
× 20%
Security
100
× 20%
AI Readability
81
× 20%
Lighthouse
97
× 20%
Total Score
93.6
(90 × 0.20) + (100 × 0.20) + (100 × 0.20) + (81 × 0.20) + (97 × 0.20)
= 18 + 20 + 20 + 16.2 + 19.4
= 93.6
Efficiency Score — a separate composite

The Efficiency Score is a focused view on technical delivery quality. It weights the three dimensions most directly tied to page speed and code health.

Structure
90
× 35%
Load Complexity
100
× 35%
Lighthouse
97
× 30%
Efficiency formula
(structure × 0.35) + (load_complexity × 0.35) + (lighthouse × 0.30)
= (90 × 0.35) + (100 × 0.35) + (97 × 0.30)
= 31.5 + 35 + 29.1 = 96 (rounded)
Score summary — all dimensions
Structure
90 / 100
Load Complexity
100 / 100
Security
100 / 100
AI Readability
81 / 100
Lighthouse
97 / 100
Efficiency Score (structure + load + lighthouse)
96 / 100
Appearance (informational only)
59 / 100
Total Score
93.6 / 100