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.
- Every SEO check is deterministic and reproducible: same page, same result.
- Where a number comes from a third party (Lighthouse, Chrome UX Report), the source is named on the report.
- Where a score comes from a model (E-E-A-T, platform readiness), it is labelled as judgement, with reasons shown.
- Platform readiness weights are our rubric for what each engine appears to weight, not the real weighting.
- Every number carries its source (fetched, CrUX, PageSpeed, model) and its date.
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.
| Category | Weight | Checks |
|---|---|---|
| Core SEO | 15% | 19 |
| Performance | 12% | 21 |
| Content | 12% | 7 |
| Images | 8% | 15 |
| Security | 8% | 6 |
| Links | 8% | 4 |
| Accessibility | 6% | 6 |
| Structured Data | 6% | 8 |
| Social Tags | 5% | 7 |
| E-E-A-T | 5% | 13 |
| URL Structure | 4% | 13 |
| Mobile | 3% | 5 |
| HTML Validation | 2% | 9 |
| Redirects | 2% | 5 |
| AI/GEO Readiness | 2% | 5 |
| Internationalization | 2% | 5 |
| Crawl-wide Architecture | Included in Crawl | 15 |
| JavaScript SEO Rendering | Included in Core SEO | 4 |
| Total | 100% | 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.
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.
| Category | Weight |
|---|---|
| Content E-E-A-T | 22% |
| Technical SEO | 20% |
| AI Citability | 18% |
| Brand Authority | 18% |
| Platform Readiness | 12% |
| Schema Markup | 10% |
| Total | 100% |
GEO mode crawls up to 100 pages. SEO mode audits up to 5 pages (homepage plus one page per template).
Grade bands
The same bands apply to SEO and GEO scores.
| Score | Grade | Word |
|---|---|---|
| 90-100 | A | Excellent |
| 80-89 | B | Good |
| 70-79 | C | Fair |
| 50-69 | D | Poor |
| Below 50 | F | Failing |
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.
| Dimension | Weight |
|---|---|
| Answer Quality | 30% |
| Self-Containment | 25% |
| Structural Readability | 20% |
| Statistical Density | 15% |
| Uniqueness | 10% |
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.
| Tier | Crawlers |
|---|---|
| 1 | GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, PerplexityBot |
| 2 | Google-Extended, GoogleOther, Applebot-Extended, Amazonbot, FacebookBot |
| 3 | CCBot, anthropic-ai, Bytespider, cohere-ai |
Lighthouse and field data
- Lighthouse scores come from the Google PageSpeed Insights API (free, 25,000 requests per day). The Lighthouse version is printed on every report.
- Field data comes from the Chrome UX Report API (free, 150 queries per minute), a 28-day rolling window about 2 days behind. A 404 from CrUX means insufficient real-user traffic, which is a valid result for small sites, not an error and not a zero.
- Lighthouse numbers are lab data. Google ranks with field data from real Chrome users. The report shows both and labels each.
- PSI responses are cached 24 hours, CrUX responses 7 days.
Limits and fairness
- SEO mode audits up to 5 pages (homepage plus one page per template). GEO mode crawls up to 100 pages. Finished reports are cached 24 hours per URL, so repeat audits are instant and free.
- Rate limits: 10 SEO audits per hour per visitor, 3 full GEO audits per day per visitor. A per-target-domain limit stops one visitor hammering a victim site through the tool.
- Per-page timeout 15-30 seconds, 2MB body cap, max 5 redirects, polite crawl rate of 2-3 requests per second per domain, robots.txt and Crawl-delay respected.
- Reports are public by URL only if you share the link, are not indexed or listed in public directories, and are permanently deleted after 30 days. Audit history on the tool pages lives strictly in your own browser (localStorage) with zero account required.
- We fetch and render only publicly accessible pages. We never log in, never submit forms, never solve CAPTCHAs, and never evade bot protection. A page that blocks our crawler is reported as blocked, never scored as zero.
- We never send a full page's text to a language model, only short excerpts or structured signals.
Honest limits
- An audit removes reasons to lose; it cannot manufacture reasons to win. It is not a keyword tool, not a penalty scanner, and not a ranking promise.
- Lighthouse numbers are lab data. Google ranks with field data from real Chrome users. The report shows both and labels each.
- One audit covers up to 5 pages in SEO mode and 100 pages in GEO mode at launch. It cannot find orphan pages outside the crawled set or site-wide duplicate content beyond the crawl; a full-site crawl is a later phase.
- Log-file analysis needs server logs; it is not promised from a crawl alone. The crawl budget proxy in Section Q is a proxy, labelled as such.
- Every SEO check is deterministic and reproducible. Where a number comes from a third party (Lighthouse, CrUX), the source is named. Where a score comes from a model (E-E-A-T, platform readiness), it is labelled as judgement.
- A rendered audit sees what Googlebot sees, but Googlebot's rendering is not identical to a headless browser run. Small differences are possible and the report says so.
- Daily prompt tracking, rank tracking, and backlink indexes are not part of this tool. Readiness is not visibility.