On-Page SEO Checker
Enter a URL and, optionally, a target keyword. The checker fetches the page as Chrome and as Googlebot and reports what the raw HTML says: title and meta description with character and pixel length, robots meta and X-Robots-Tag, canonical, H1 count and heading outline with skipped levels, image alt coverage, internal and external links and nofollow share, Open Graph and Twitter card, hreflang validity, JSON-LD types, lang, viewport, charset, word count and keyword density and placement. No score — a list of what passed, what to look at and what is only information. Nothing stored.
The page is fetched from our server as Chrome and as Googlebot without running JavaScript — what a crawler's first pass sees. Only derived numbers and short text samples come back; nothing is stored or logged. Rate limit: 30 checks per 5 minutes per address. Guidance ranges (title 30–60, description 70–160, 300 words) are conventions, not rules; the checker reports what it found and does not decide what the page should say.
How it works
1. The page is fetched from our server twice, in parallel — as desktop Chrome and as Googlebot — without running JavaScript, following up to 5 redirects with public-host checks on every hop; the Chrome response is analysed, the Googlebot response is compared for status and content (the SSR checker's fetch) 2. <head> is parsed for title, meta description, robots (and X-Robots-Tag from the headers), canonical, hreflang links, Open Graph and Twitter meta, viewport, charset, lang; <body> for headings (H1–H6 in document order), images and alt text, links and rel=nofollow, visible text 3. Length checks: title 30–60 characters as guidance and pixel width on a 600 px desktop line (Arial 20 px, measured in your browser), description 70–160 characters; both are information, not rules — Google rewrites titles and descriptions it does not like regardless of length 4. Structure checks: exactly one H1 (more is allowed in HTML5, flagged as information), no skipped heading level (H2 → H4), canonical present, absolute and self-referencing, lang attribute well-formed (BCP 47), viewport present, hreflang tags valid (ISO 639-1 / 3166-1), JSON-LD types listed 5. Keyword (optional): whole-word occurrences in the visible text, density as a percentage of words, presence in title, H1, meta description, URL and the first 100 words; density above 3% is flagged as information, absence as a warning — no target density is recommended 6. Every check is one of: passed, warning (worth a look), fail (blocks indexing: noindex, missing title) or info; there is no score, because a sum of unequal things is not a measurement
About on-page SEO and what the checker measures
On-page SEO is the part of search optimisation that lives inside one HTML document: what the page says it is about (title, headings, text), how it wants to be treated (robots, canonical, hreflang), and how it presents itself when shared (Open Graph, Twitter card) or rendered on a phone (viewport, lang). Everything here is under the site owner's control and visible in the raw HTML, which is why a checker can read it without a browser and why a crawler's first pass sees exactly this.
The title and meta description are the two lines that appear in search results — or rather, the two lines Google starts from: it rewrites titles it finds too long, too short, repetitive or off-topic, and it swaps in a snippet from the text when the description does not match the query. The character guidance (30–60 and 70–160) is where rewrites become less likely, not a rule; the pixel width matters more than characters because a title of 60 wide letters is cut where a title of 60 narrow ones is not. The checker measures both and reports them as information.
Robots and canonical are the two signals that decide whether the page is in the index at all and under which URL. A noindex in the meta tag or the X-Robots-Tag header removes it; the checker treats that as a fail because on a page you are optimising it is almost always a mistake. A canonical that points elsewhere is not an error — it is how duplicate and parameter URLs are meant to work — but on a page meant to rank it is worth knowing, so the checker reports it as information with the target. A relative canonical is flagged because some crawlers resolve it differently.
Keyword density fell out of ranking factors a long time ago, and the checker does not recommend a number. What it reports is whether the term appears where a reader would expect a page about that topic to mention it — title, first heading, description, opening paragraph — and whether it is repeated so often that the text reads as written for a machine. Those are editorial facts, not optimisation targets. Word count is the same: 300 is where the checker stops calling a page thin, not a length to aim for.
Frequently asked questions
- Why is there no score?
- Because a score adds up things that are not comparable — a missing viewport and a noindex tag are not two points on the same scale. The checker gives each item a status instead: fail for what blocks indexing, warning for what is worth a look, info for what is simply true about the page, passed for what is in order. Read the fails first, then the warnings.
- What title length is right?
- There is no exact number. Google shows roughly 600 pixels of a desktop title — about 50–60 characters of average width — and rewrites titles it considers poor regardless of length. The checker reports characters and pixels and flags outside 30–60 as information. A title that says what the page is, with the main term early, matters more than hitting the range.
- Is more than one H1 a problem?
- HTML5 allows several H1s, and Google has said it handles them fine. The convention of one H1 exists because it keeps the document outline readable and makes the main topic unambiguous. The checker reports multiple H1s as information, not a warning; skipped heading levels (H2 to H4) are also information — they hurt accessibility more than search.
- The checker says the canonical points elsewhere. Is that bad?
- It depends on whether it is intended. A canonical to another URL tells Google to index that URL instead of this one — correct for duplicates, filtered listings, tracking parameters and syndicated copies; wrong for a page you want to rank on its own. The checker cannot know which case this is, so it reports the target URL as information.
- Does keyword density matter?
- Not as a ranking factor. Google has said there is no ideal density, and stuffing a term is against its spam policies. The checker shows the density and where the term appears so you can judge whether the page reads naturally and covers the topic; above 3% it adds a note because that is where text usually starts to read as repetitive. Treat it as an editorial check.
- Why fetch as Googlebot too?
- Because some sites serve crawlers different HTML, block them, or redirect them. The checker uses the same two-agent fetch as the SSR checker and analyses the Chrome response; if the Googlebot response has a different status or materially different content, that is reported, since the on-page findings may then not be what Google sees.
- The page uses JavaScript to render content. Will the checker see it?
- No — it reads the raw HTML the server returns, which is what a crawler sees on its first pass and what social and AI fetchers see, full stop. If the title, headings or text are added by JavaScript, they are missing here. That is itself a finding: use the SSR checker to see how much of the page depends on rendering.