Methodology: how the scores work

Every check, every threshold, every weight, printed in full. If a number on a report cannot be traced back to this page, it should not be there.

Last updated 9 November 2026. The rule list is counted exactly at build time and the count is published here; no count is advertised until it is counted.

What a score is, and what it is not

A score is a measurement of checkable properties. It is not a ranking promise and not a probability of being cited. An audit removes reasons to lose; it cannot manufacture reasons to win.

AnswerAudit Multi-Engine Architecture Diagram

SEO weights and formula

SEO score = weighted sum of the 16 category scores. Each category score is 0-100, from the checks in that category.

CategoryWeightChecks
Core SEO15%19
Performance12%21
Content12%7
Images8%15
Security8%6
Links8%4
Accessibility6%6
Structured Data6%8
Social Tags5%7
E-E-A-T5%13
URL Structure4%13
Mobile3%5
HTML Validation2%9
Redirects2%5
AI/GEO Readiness2%5
Internationalization2%5
Crawl-wide ArchitectureIncluded in Crawl15
JavaScript SEO RenderingIncluded in Core SEO4
Total100%167

All 167 checks are audited deterministically according to our open-source rule specifications. Crawl-wide architecture and JavaScript dynamic rendering checks are integrated into comprehensive site-wide evaluations.

SEO score = sum of (category score x category weight), weights as above

GEO weights and formula

GEO score = (weighted sum x 1.15 calibration + presence floor), capped at 100. The calibration and the floor are printed on every GEO report.

CategoryWeight
Content E-E-A-T22%
Technical SEO20%
AI Citability18%
Brand Authority18%
Platform Readiness12%
Schema Markup10%
Total100%
GEO score = min(100, weighted sum x 1.15 + presence floor)

GEO mode crawls up to 100 pages. SEO mode audits up to 5 pages (homepage plus one page per template).

Traditional SEO vs Generative Engine Optimization Architecture Infographic

Grade bands

The same bands apply to SEO and GEO scores.

ScoreGradeWord
90-100AExcellent
80-89BGood
70-79CFair
50-69DPoor
Below 50FFailing

The full rule list

Each check returns pass, warn or fail, with the evidence quoted and a fix. Thresholds are named constants in the rule engine, so this page and the engine cannot drift apart. A check that cannot name its threshold does not ship. Tags: [S] in the Seomator baseline, [C] added from a competitor, [N] new in this tool.

A. Core SEO (19 checks)

  • Title tag present. [S]
  • Title tag length: 30-60 characters ideal, warn outside, fail if missing or over 70. [S]
  • Meta description present. [S]
  • Meta description length 120-160 characters and pixel width max 920px. [S]
  • Canonical URL present, valid (absolute, returns 200, same protocol), single source, no conflicts, no loop, no conflict with noindex, not pointing to the homepage except on the homepage. [S]
  • Viewport meta tag present. [S]
  • Favicon present. [S]
  • H1 tag present, and exactly one H1. [S]
  • Robots meta directives: no accidental noindex or nofollow. [S]
  • No snippet blocking (no nosnippet, no max-snippet 0). [S]
  • Duplicate titles across the crawl. [C]
  • Missing meta descriptions across the crawl. [C]
  • Title and meta description present in the rendered DOM, not only raw HTML. [N]

B. Content (7 checks)

  • Reading level (Flesch-Kincaid grade), warn above grade 12. [S]
  • Text-to-HTML ratio, warn below 25%. [S]
  • Heading hierarchy: no skipped levels. [S]
  • Heading length: warn on H1 over 70 characters, H2 over 100. [S]
  • Word count and thin content: warn under 300 words on an article page. [S]
  • Near-duplicate content across the crawl (simhash similarity over 80%). [C]
  • Duplicate content across the crawl (exact body match). [C]
  • First 200 words answer the page's question directly (direct-answer lead). [N]
  • Content block citability (see citability). [N]
  • Content cannibalisation: two or more pages targeting the same primary keyword (phase 2). [C]

C. Performance (21 checks)

  • No lazy loading above the fold: the LCP image must not be lazy. [S]
  • DOM size: warn over 800 elements, fail over 1,500. [S]
  • Font loading: display swap and preloading. [S]
  • LCP hints: fetchpriority high and preload on the LCP image. [S]
  • Text compression: gzip or Brotli header present. [S]
  • Page weight: HTML under 100KB. [S]
  • Brotli compression, minified inline JS and CSS, inline JS size. [S]
  • HTTP/2 or HTTP/3 support (alt-svc header). [S]
  • Render-blocking resources, preconnect hints, CSS file size, cache policy. [S]
  • Response time (TTFB), warn over 600ms. [S]
  • Video instead of GIF. [S]
  • Lighthouse Performance score and metrics (FCP, LCP, TBT, CLS, Speed Index, TTI, payload) via the PageSpeed Insights API. [S]
  • Core Web Vitals field data (CrUX, 28-day LCP, INP, CLS per URL and origin) next to the lab values, source labelled. [C]
  • Field CWV per template, not only the homepage. [C]
  • Unused CSS and JS estimates from the render (coverage data). [N]

D. Links (4 checks)

  • Invalid links: empty href, broken internal links returning 4xx. [S]
  • Excessive link count: warn over 100 links per page. [S]
  • Appropriate nofollow: warn on nofollow to internal pages, and on missing nofollow for sponsored or affiliate links. [S]
  • Redirect chains (2 or more hops) and redirect loops, site-wide. [C]
  • Internal link graph: inlink count per page, crawl depth, most and least linked pages, PageRank-style equity score. [C]
  • Orphan pages: in sitemap with zero internal inlinks, or crawled but missing from sitemap. [C]
  • Broken internal links site-wide, with the linking pages listed. [C]
  • Anchor text quality: warn on generic anchors like "click here" on more than 5% of links. [N]
  • External links opening in a new tab without rel noopener. [N]

E. Images (15 checks)

  • Modern image formats: AVIF or WebP share of images. [S]
  • Responsive images: srcset present. [S]
  • Image alt attributes present, descriptive (not a filename), 2-125 characters. [S]
  • Image dimensions specified (width and height). [S]
  • Image lazy loading below the fold. [S]
  • Figure captions present. [S]
  • Image filename quality: descriptive, hyphenated, no spaces. [S]
  • Inline SVG size, picture element fallback, CSS background images used for content. [S]
  • Image dimensions: no images over 2000px wide. [S]
  • Broken image detection: all sources return 200. [S]
  • Oversized images: natural size far above display size (render). [N]

F. Security (6 checks)

  • TLS configuration: HTTPS, valid certificate, no mixed content. [S]
  • HSTS header present with a sane max-age. [S]
  • External links security: target _blank with rel noopener. [S]
  • Full security headers: Content-Security-Policy, X-Frame-Options or frame-ancestors, X-Content-Type-Options, Referrer-Policy, Permissions-Policy, Cross-Origin-Opener-Policy. [C]
  • Mixed content in the rendered DOM (HTTP resources on an HTTPS page). [C]
  • No sensitive data exposed in HTML comments or inline scripts (API keys, tokens, emails in comments). [N]

G. Accessibility (6 checks)

  • Interactive element labels: buttons, inputs and links have discernible names. [S]
  • Heading level order. [S]
  • Full axe-core run via Lighthouse Accessibility, with WCAG success criteria mapped. [C]
  • Colour contrast failures (render). [C]
  • Tap target size and spacing (render). [C]
  • Skip link present. [N]
  • Landmark regions present (header, nav, main, footer). [N]
  • Lang attribute valid (also under Internationalization). [N]

H. Structured Data (8 checks)

  • Schema type present (JSON-LD found). [S]
  • Schema missing @type property. [S]
  • JSON-LD parses and is valid JSON. [S]
  • Schema is server-rendered, not only JS-injected. [S]
  • Validation against Google rich-result rules: required and recommended properties per type (Article, FAQPage, HowTo, Product, BreadcrumbList, Organization, WebSite with SearchAction). [C]
  • Schema-vs-visible-text drift: JSON-LD claims content the page does not show. [C]
  • sameAs links present and pointing at real profiles. [N]
  • Missing recommended schema types per page type, with generated JSON-LD to paste. [N]

I. Social Tags (7 checks)

  • Open Graph title, description, image and URL present. [S]
  • Twitter card present (summary_large_image where appropriate). [S]
  • og:image is reachable and at least 1200x630. [S]
  • og:type matches the page. [S]
  • Social share buttons or links present. [S]
  • og:title and og:description match the page title and meta description (warn on drift). [N]
  • No duplicate or conflicting social tags. [N]

J. E-E-A-T (13 checks)

  • Contact page link present. [S]
  • Author byline present on article pages. [S]
  • Author expertise signals (bio, credentials, author page). [S]
  • Content dates (publication and modification dates present). [S]
  • Physical address present. [S]
  • About page present. [S]
  • Privacy policy and terms pages present. [S]
  • HTTPS and security headers (shared with Security; counted once, shown in both). [S]
  • Experience signals (first-hand knowledge, case studies, original research) out of 25, model-judged. [S]
  • Expertise signals (credentials, technical depth, structured content) out of 25, model-judged. [S]
  • Authoritativeness signals (citations, press mentions, brand recognition) out of 25, model-judged. [S]
  • Trustworthiness signals (security, contact info, editorial standards) out of 25, model-judged. [S]
  • External citations to authoritative sources present. [N]
  • Editorial standards or review process stated on the site. [N]

K. URL Structure (13 checks)

  • URL length, warn over 75 characters. [S]
  • URL slug keywords: slug reflects the title. [S]
  • No stop words, uppercase, underscores (hyphens, not underscores), double slashes, spaces, non-ASCII, or repetitive path segments in the URL. [S]
  • URL parameters: warn on tracking or session parameters. [S]
  • No session IDs in URL. [S]
  • No tracking parameters in URL. [S]
  • No internal search URLs indexed. [S]

L. Mobile (5 checks)

  • No horizontal scroll (render). [S]
  • Viewport configured (width device-width, no user-scalable no, no maximum-scale below 5). [S]
  • Tap targets sufficient size and spacing (render). [S]
  • Font sizes readable without zoom (render). [S]
  • Mobile render matches desktop content: no content hidden on mobile that desktop shows. [S]

M. HTML Validation (9 checks)

  • DOCTYPE declaration present. [S]
  • Character encoding declared. [S]
  • Valid head elements (no invalid children in head). [S]
  • No noscript in head. [S]
  • Single head element. [S]
  • HTML size limit: under 200KB. [S]
  • No placeholder text (lorem ipsum, TODO, placeholder copy). [S]
  • Single title element. [S]
  • Single meta description. [S]

N. Redirects (5 checks, plus site-wide)

  • No meta refresh redirect. [S]
  • No JavaScript redirect. [S]
  • No HTTP refresh header. [S]
  • Redirect type: 200, no redirect, or a single 301. [S]
  • No HTTP resource URLs on HTTPS. [S]
  • Redirect chains and loops site-wide. [C]
  • Redirects to 404 or to the homepage (soft 404s). [C]

O. AI and GEO Readiness (5 checks, plus the full GEO modules)

  • Semantic HTML (article, section, main, nav, header, footer present). [S]
  • Content structure for AI (headings, lists, tables, direct answers). [S]
  • AI bot access: no AI crawlers blocked in robots.txt. [S]
  • llms.txt reference found. [S]
  • Schema content drift: JSON-LD aligns with visible text. [S]
  • Block-level citability (see citability). [N]
  • Platform readiness: separate scores for Google AI Overviews, ChatGPT, Perplexity, Gemini and Bing Copilot, model-judged. [N]
  • Brand authority: Wikipedia, Wikidata, YouTube, Reddit, LinkedIn, GitHub presence. LinkedIn is not verifiable from outside (anti-bot protection); it is reported as not verifiable, never as a score. [N]
  • llms.txt validation: presence and formatting, plus llms.txt generation. [N]
  • AI-crawler simulation: fetch robots.txt and llms.txt as about 20 AI bot user-agents. [N]
  • Live 1-prompt AI-mention sample: one prompt, one model, one moment, labelled as a sample with date and sample size, never presented as visibility. [N]
  • Discovery-prompt section: the questions in the site's niche that AI engines answer without naming the brand, and which pages should answer them. [N]

P. Internationalization (5 checks)

  • HTML lang attribute present and valid (BCP 47). [S]
  • Hreflang tags present where the site is multilingual. [S]
  • No hreflang on noindex pages. [S]
  • Hreflang self-reference correct. [S]
  • Hreflang return-link validation: every alternate returns the favour; language and region match. [C]
  • Hreflang consistency: no conflicting language codes, no missing x-default where used. [C]

Q. Crawl-wide and site architecture (15 checks)

  • Sitemap validation: URLs in the sitemap that 404, redirect or are noindex; crawled URLs missing from the sitemap; sitemap index and lastmod trust. [N]
  • Orphan pages (see D). [N]
  • Crawl depth distribution: warn on important pages deeper than 3 clicks. [N]
  • Pagination analysis: rel prev/next, parameter sprawl, faceted URL explosion, crawl traps. [N]
  • Crawl budget proxy: share of crawled URLs that are low-value, parameter, 4xx or redirect. A free proxy for log-file analysis, which needs server logs we do not have. [N]
  • Thin content distribution across the crawl: word-count histogram, pages under 300 words. [N]
  • Near-duplicate clusters (see B). [N]
  • Change monitoring: diff against the previous audit of the same site (phase 2). [N]
  • Log-file analysis: only if the user uploads server logs or connects a CDN; never promised from a crawl alone. [N]

R. JavaScript SEO (4 checks)

  • Rendered-vs-raw diff per page: title, H1, links, images, content and schema present only after JavaScript, with the percentage of content that is JS-dependent. [N]
  • JavaScript errors during render (console errors, failed requests). [N]
  • Content present in raw HTML versus rendered only, per check, so a finding can never say "absent" when one block exists. [N]
  • Render timeouts and partial renders reported explicitly, never silently scored as zero. [N]

Block-level citability

Every paragraph is scored on five dimensions, weighted as below, with a bonus for passages of 134-167 words, the length AI engines quote most easily.

DimensionWeight
Answer Quality30%
Self-Containment25%
Structural Readability20%
Statistical Density15%
Uniqueness10%

AI crawler access

robots.txt is checked against 14 AI crawlers in 3 tiers. Access rate is the share of crawlers allowed to fetch the site, with the matching rule quoted on the report.

TierCrawlers
1GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, PerplexityBot
2Google-Extended, GoogleOther, Applebot-Extended, Amazonbot, FacebookBot
3CCBot, anthropic-ai, Bytespider, cohere-ai

Lighthouse and field data

Limits and fairness

Honest limits

A score measures checkable properties. It is not a ranking promise and not a probability of being cited. Verify each finding on the live page before acting.