What we check
Site IQ scores are computed by 58 deterministic rules - the same site always gets the same score. AI only writes the summary and answers the chat; it never sets the score.
Every rule below runs in typed, unit-tested code and is mirrored 1:1 into the audit engine, so nothing on this page is marketing fluff - it is the exact rubric that produces your grade.
The four dimensions
The overall score is a weighted average of four dimensions. The weights reflect how much each area moves real-world visibility.
SEO
30%Can search engines find, understand, and rank the pages?
15 checks
Tracking & Analytics
25%Is measurement present and consent / privacy handled (GA4, Consent Mode v2, CMP)?
10 checks
AI-Readiness (GEO)
25%Can AI answer-engines read and cite the content (schema, SSR, AI-crawler access)?
17 checks
Tech Basics
20%HTTPS, crawlability, mobile, static performance hygiene, and security response headers (HSTS, CSP, X-Frame-Options).
16 checks
Per-check weights are relative within a dimension; the dimension score renormalizes by the sum of applicable weights, so they do not need to total 100.
The 58 checks
Severity drives the action-plan impact and, for critical checks only, the failure floor (below). Checks run over up to 10 sampled pages - the homepage plus the most commercially relevant pages.
SEO (15 checks)
Dimension weight 30%SEO checks, with ID, description, severity, and relative weight.
| ID | Check | Severity | Weight |
|---|---|---|---|
| S1 | Title present (15-60 chars) | high | 10 |
| S2 | Meta description (70-160 chars) | medium | 7 |
| S3 | Canonical tag present | high | 8 |
| S4 | Indexable (no noindex) | critical | 12 |
| S5 | At least one H1 | medium | 7 |
| S10 | Content depth (>= 300 words) | medium | 7 |
| S12 | Open Graph tags | low | 4 |
| S13 | Image alt coverage | low | 3 |
| S14 | XML sitemap present | medium | 5 |
| S15 | Unique page titles (cross-page) | high | 8 |
| S16 | Unique meta descriptions (cross-page) | medium | 5 |
| S17 | Sampled pages return OK (no 4xx/5xx or soft-404) | high | 9 |
| S18 | Logical heading hierarchy | medium | 6 |
| S21 | Valid hreflang (multilingual sites) | medium | 6 |
| S23 | Canonical resolves to this page (no cross-page mismatch) | medium | 5 |
Tracking & Analytics (10 checks)
Dimension weight 25%Tracking & Analytics checks, with ID, description, severity, and relative weight.
| ID | Check | Severity | Weight |
|---|---|---|---|
| T1 | Analytics present (GA4 or privacy-first) | high | 16 |
| T2 | No legacy Universal Analytics (UA- / analytics.js) | high | 6 |
| T3 | Google Tag Manager | medium | 8 |
| T5 | Consent Mode present (v1) | high | 16 |
| T6 | Consent Mode v2 (ad_user_data + ad_personalization) | high | 10 |
| T7 | Consent / CMP banner | high | 12 |
| T8 | Ad / social pixels | low | 6 |
| T12 | Session recording gated by consent | medium | 8 |
| T15 | dataLayer initialized | low | 3 |
| T20 | Consent Mode default set before tags load | medium | 6 |
AI-Readiness (GEO) (17 checks)
Dimension weight 25%AI-Readiness (GEO) checks, with ID, description, severity, and relative weight.
| ID | Check | Severity | Weight |
|---|---|---|---|
| G1 | Structured data (JSON-LD) present | high | 8 |
| G3 | Server-side rendered content | high | 14 |
| G4 | Direct-answer opening (lead sentence) | high | 10 |
| G5 | Q&A / FAQ structure | medium | 8 |
| G6 | Statistics & data points | medium | 8 |
| G7 | Freshness signals | medium | 6 |
| G8 | Authorship / E-E-A-T | medium | 6 |
| G9 | AI crawlers not blocked in robots.txt | high | 8 |
| G11 | Typed schema entities (Org/Article/Product/FAQ...) | high | 12 |
| G12 | Snippet-eligible (no nosnippet) | high | 8 |
| G14 | Extractable formatting (lists/tables) | medium | 6 |
| G15 | Outbound authoritative citations | medium | 8 |
| G16 | llms.txt present | low | 2 |
| G17 | Entity consistency (brand agrees across schema / og:site_name / title) | medium | 6 |
| G18 | Organization sameAs profiles (Wikidata / Wikipedia / socials) | low | 4 |
| G19 | Sections open with a direct answer (per H2) | medium | 8 |
| G20 | TL;DR / Key Takeaways block near the top | medium | 4 |
Tech Basics (16 checks)
Dimension weight 20%Tech Basics checks, with ID, description, severity, and relative weight.
| ID | Check | Severity | Weight |
|---|---|---|---|
| TB1 | HTTPS | critical | 16 |
| TB5 | robots.txt allows crawling | critical | 8 |
| TB3 | No mixed content | high | 8 |
| TB4 | Mobile viewport | critical | 14 |
| TB10 | Charset & language declared | low | 6 |
| TB12 | Favicon | low | 4 |
| TB6 | Layout stability (img dimensions, CLS proxy) | medium | 6 |
| TB20 | No render-blocking scripts in <head> | medium | 6 |
| TB19 | Modern image formats & lazy-loading | medium | 6 |
| TB22 | Valid HTML5 doctype | low | 3 |
| TB30 | HSTS (Strict-Transport-Security) | medium | 6 |
| TB31 | Content-Security-Policy | medium | 5 |
| TB32 | X-Content-Type-Options: nosniff | low | 3 |
| TB33 | Clickjacking protection (X-Frame-Options / frame-ancestors) | medium | 5 |
| TB34 | Referrer-Policy | low | 3 |
| TB35 | Permissions-Policy | low | 2 |
How the score is computed
Each check returns a ratio in [0, 1]: 1 means it passes on every sampled page, 0 means it fails, and a fraction means partial coverage (for example, 3 of 10 pages have a valid title). Some checks return N/A when their input was not gathered - those are renormalized out, so a site is never penalized for something that could not be measured.
dimension_score = 100 * Σ(weight · ratio) / Σ(weight) over APPLICABLE checks only
overall = 0.30·SEO + 0.25·Tracking + 0.25·GEO + 0.20·TechCritical-failure floor
A failing critical check applies a two-level floor so one catastrophic issue cannot be hidden by strong averages:
- The affected dimension is capped at 59 (a D at best).
- The overall score is dropped one grade band below whatever the weighted math produced (for example, math of 88 with a critical failure becomes 79, a C).
Only the 4 critical checks (S4, TB1, TB5, TB4) can trigger the floor, because they are the signals a static crawl reads with high confidence and that genuinely zero a site's visibility.
Grade bands
| Grade | Score range |
|---|---|
| A | 90-100 |
| B | 80-89 |
| C | 70-79 |
| D | 60-69 |
| F | 0-59 |
The headline overall score is an integer; per-dimension scores keep one decimal.
Honest limits
A fast snapshot makes trade-offs. We would rather state them plainly than over-claim.
10-page snapshot, not a full-site crawl
Site IQ samples the homepage plus the most commercially relevant pages. It complements crawler-grade tools (Ahrefs, Screaming Frog); it does not replace them for site-wide patterns like duplicate titles across thousands of URLs, orphan pages, or broken-link clusters.
A static crawl cannot see runtime-injected tags
GA4, Consent Mode, and CMP banners are routinely injected by a tag manager (GTM, Tealium, Segment) at runtime and can be invisible to a single static crawl, so the engine cannot prove their absence. That is exactly why Tracking is never a critical dimension and the report surfaces a caveat when tracking looks incomplete - rather than scoring a likely-fine site as negligent.
Static performance proxies, not field Core Web Vitals
Layout-stability and script-deferral checks are a hygiene proxy. For real Core Web Vitals and field data, use a lab/field tool such as PageSpeed Insights.