Scoreling

Every check we run

Each check explains what it looks for, why it matters, and how to fix it. Nothing here is a secret formula: the score is just these checks and their weights.

SEO

22 checks

Page declares a canonical URL

Without a canonical, every URL variant that reaches this page (tracking parameters, trailing slash, uppercase path) can be indexed as a separate page, splitting the ranking signal between duplicates.

Canonical points at this page

A canonical aimed somewhere else tells Google to index that other URL instead of this one. Done by accident, usually by copying a template, it removes the page from search while everything still looks fine on screen.

Heading levels are not skipped

Screen readers and crawlers read headings as an outline. Jumping from H2 straight to H4 implies a missing level, so the outline reports a section that does not exist.

hreflang alternates are absolute URLs

Google requires fully qualified URLs in hreflang annotations. Relative hrefs are ignored without any error, so the language targeting simply never happens and nobody notices.

Document declares its language

The lang attribute tells screen readers which pronunciation rules to use and helps search engines serve the page to the right audience. Without it a screen reader may read English text with the wrong phonetics.

Images have alt text

Alt text is how a screen reader describes an image and how a search engine understands it. Missing alt attributes are an accessibility defect and lost image-search traffic at the same time.

Page links to the rest of the site

Internal links are how crawlers reach the rest of the site and how ranking signal flows between pages. A page with none is a dead end that hoards whatever authority it earns.

Structured data parses as JSON

A JSON-LD block with a trailing comma or an unescaped quote is discarded whole. The rich result it was meant to earn silently never appears, and nothing in the page looks broken.

Meta description length is in range

Descriptions shorter than about 120 characters leave the snippet half empty; past about 160 the end is cut off mid-sentence.

Page has a meta description

The meta description is the snippet under the title in search results. Without one Google assembles a snippet from whatever text it finds, which is often a navigation menu or a cookie banner.

Page is not blocked by a robots meta tag

A noindex directive removes the page from search entirely. It is the most damaging single line on a page, and it is nearly always left behind by accident after a staging deploy.

No insecure subresources

An https page that pulls scripts, styles, or images over http has those requests blocked or downgraded by the browser. Layout and behaviour break with no server-side error to show for it.

Open Graph tags are present

Open Graph decides what a link to this page looks like when someone shares it on Slack, WhatsApp, LinkedIn, or Facebook. Missing tags turn a share into a bare URL with no image, which measurably costs clicks.

robots.txt lets Google crawl the page

A Disallow rule in robots.txt stops Googlebot from fetching the page at all, so everything else on this report stops mattering: the page can only appear in results as a bare URL with no description, or not at all.

Page has exactly one H1

The H1 states what the page is about. Zero leaves the topic unstated; several compete with each other and make the page read as a list of unrelated sections.

Site has a reachable XML sitemap

A sitemap is the list of pages a site wants crawled. Without one Google finds pages only by following links, so new or thinly linked pages can take weeks to be discovered.

Title length is in range

Below about 30 characters the strongest on-page signal is left half unused; past about 60 Google truncates the title in the results page and the tail is wasted.

Title and H1 are related but not identical

The title is written for the search results page and the H1 for the visitor who already clicked. Making them byte-identical wastes a second chance to describe the page, while sharing no vocabulary at all suggests the two disagree about the topic.

Page has a title

The <title> element is the headline Google shows in search results and the label the browser puts on the tab. A page without one is listed under a machine-picked fallback that nobody chose.

Twitter card type is declared

Without a card type, X renders a shared link as plain text even when Open Graph tags exist. It is one line of markup that decides whether the share carries an image.

URL is short and readable

Long parameter-laden URLs get truncated in results, are harder to share, and multiply into near-duplicate variants of the same page.

No noindex in the X-Robots-Tag header

X-Robots-Tag does the same job as the robots meta tag but travels in the HTTP response, so it is invisible in the page source. A page can look perfectly indexable while the server quietly forbids it.

Markup

10 checks

Buttons have accessible names

A button whose only content is an icon announces itself to a screen reader as just "button", which tells the user nothing about what pressing it will do.

Character encoding is declared

With no declared charset the browser guesses, and the guess is wrong often enough that accented characters, quotes, and emoji turn into mojibake for some visitors and not others.

No deprecated presentational tags

Tags like <center> and <font> were removed from the standard. Browsers still honour them today, but they mix styling into the markup and no longer respond to CSS the way the rest of the page does.

Page uses the HTML5 doctype

A missing or legacy doctype drops the browser into quirks mode, where box sizing and layout follow rules from the 1990s. The page then differs from every modern stylesheet assumption.

Element ids are unique

An id must appear once per document. Duplicates break label-to-input pairing, in-page anchors, and any script that looks an element up by id, and every one of those failures is silent.

Page declares a favicon

The favicon is how a user finds this tab among twenty others and how the site appears in bookmarks and history. Without a declared one the browser requests /favicon.ico and usually gets a 404.

HTML parses without errors

Browsers repair broken markup silently, and each one repairs it slightly differently. Unclosed and misnested tags are where a layout that works in one browser collapses in another.

Styling lives in stylesheets, not attributes

Inline style attributes cannot be cached, overridden by a stylesheet, or covered by a Content Security Policy that forbids inline styles. In quantity they also bloat every HTML response.

Users can zoom the page

Disabling zoom locks out everyone who needs to magnify text. On modern browsers it buys nothing in return.

Viewport meta tag is present

Without it mobile browsers render the page at desktop width and shrink it to fit, which fails Google's mobile usability bar and leaves text unreadable on a phone.

Links

2 checks

Speed

8 checks

Response carries cache headers

Without a usable Cache-Control header, browsers and CDNs re-fetch the page on every visit, so returning visitors pay the full load cost again for content that did not change.

Cumulative Layout Shift

CLS measures content jumping around after it appears. It is why a visitor taps the wrong button when an ad or a late-loading image pushes the page down under their finger.

Interaction to Next Paint

INP is how long the page takes to visibly respond after a tap or a click. Above 200ms the interface starts to feel like it is ignoring the user.

Largest Contentful Paint

LCP is the moment the biggest element in the viewport finishes rendering, which is when a visitor feels the page has arrived. Google's threshold for good is 2.5 seconds.

HTML document weight

This is the HTML document alone, before images and scripts. A multi-megabyte document usually means the whole page was rendered server-side into one response, and every visitor pays for it on every load.

Lighthouse performance score

Google's own composite of loading, interactivity, and visual stability, measured on a simulated mid-range phone. This is the number PageSpeed Insights puts at the top of its report.

HTML is compressed in transit

Gzip or Brotli typically cuts HTML to a quarter of its size. Serving it uncompressed wastes that bandwidth on every single request, and it is usually one line of server config.

Time to first byte

How long the server took to start answering, measured on our own request. A slow first byte delays everything downstream no matter how well the front end is built.