Methodology

How the SEO score is calculated

A transparent, weighted checklist — not a black box. Every point is attributable, and every failure is named on the record so you can act on it.

The 15 on-page checks

Each check runs against the rendered HTML and carries a fixed weight. The score is earned ÷ available × 100.

Check Points Why it matters
Title present 12 The single strongest on-page ranking element. Absent means the page is competing blind.
Title length 10–60 6 Outside this range search results truncate or look thin.
Meta description 10 Controls the snippet. Missing means the engine invents one.
Description length 50–160 5 Too short wastes the slot; too long is cut off.
H1 present 10 Declares the page topic to crawlers and screen readers.
Only one H1 4 Multiple H1s dilute the topic signal.
Canonical tag 8 Prevents duplicate-content splits across parameters and variants.
JSON-LD structured data 10 Required for rich results. Its absence is the most common gap we see.
Open Graph tags 8 Governs how the page renders when shared — a direct traffic lever.
Twitter card 3 Same, for X/Twitter previews.
Viewport meta 6 Without it, mobile rendering is broken and mobile ranking suffers.
html lang attribute 4 Signals language for regional targeting and accessibility.
Image alt coverage ≥ 80% 6 Accessibility plus image-search visibility.
Body content ≥ 300 words 8 Below this, pages rarely rank for anything competitive.
Not noindex 10 A stray noindex removes the page from search entirely — worth catching first.

Core Web Vitals — when we can measure them

LCP and CLS are only observable in a real browser. When a page is rendered by our browser engine, three further checks apply at Google's "good" thresholds: LCP ≤ 2500 ms (10 pts), CLS ≤ 0.1 (5 pts), TTFB ≤ 800 ms (5 pts).

A site is never punished for a measurement we did not take

If a page was fetched over plain HTTP, the performance checks are excluded from both the earned and the available points. That keeps scores comparable instead of quietly penalising pages we simply did not render.

What about XML sitemaps and robots.txt?

Deliberately excluded from the page score. A sitemap is a site-wide fact, not a property of one page, and folding it in would make two pages on the same domain score differently for a reason neither of them controls. We fetch /sitemap.xml and /robots.txt at the domain level and report them as separate flags, which is also how you would want to filter on them.

Why agencies buy this

For SEO agencies — a prospect list that opens itself

Filter for sites with real traffic (Tranco-ranked) that score badly. seo_issues names the exact failures, so your outreach can say "your product pages have no structured data and three of your top templates are missing canonicals" instead of "we noticed some SEO issues". That is the difference between a reply and a delete.

For design and web-build agencies — the redesign trigger

A low score paired with slow LCP and a dated CMS is a site that is costing its owner money right now. Combine with revenue estimation to find the ones that can afford the rebuild, and with hiring signals to find the ones already investing.

For anyone selling to ecommerce

Every score carries its evidence. You can quote a specific, checkable fact in the first line of an email — the single highest-leverage thing in cold outreach.