On-Page SEO Audit

Paste your page HTML to check the title and description (characters and pixels), canonical, robots, H1, heading order, images, lang, viewport, Open Graph, structured data and keyword placement, with a stated weighted score.

Workspace

How the result is calculated

The HTML is parsed with DOMParser (no scripts run and no images load). Every check passes or fails with a weight by severity: critical 10, important 5, improvement 2. Score = sum of weights of passed checks ÷ sum of weights of applicable checks × 100. Checks: title (present, 30–60 characters, ≤ 580px), description (present, 70–160 characters, ≤ 920px), canonical (present and absolute), noindex, H1 (present and single) and heading order, image alt and dimensions, lang and viewport, Open Graph and Twitter, JSON-LD (valid or not), generic and empty anchor text, and keyword placement (title, H1, first 100 words). Pixel width is measured with Canvas in Arial.

Limits: It does not measure speed, crawling, backlinks or content quality. Pasted HTML may be server-rendered or post-JS and differ from what Google sees. Pixels are an estimate. The score is an internal aid, not a Google score, and does not predict rankings.

FAQ

Why can I not enter a URL?

Browsers cannot fetch pages from other domains (CORS); paste the HTML (View source).

Does 100 guarantee ranking?

No, it only means these basic technical checks pass.

Newest tools

Recently added free tools — they run in your browser without uploading your data

All tools →

Write HTML, CSS and JS and see the preview instantly in an isolated iframe with a console, screen sizes and link sharing

Local

Draw a workflow from JSON as an SVG diagram using original positions or an automatic layout, coloured by category, with SVG download

Local

Automatically fix trailing commas, single quotes, missing fields, duplicate names and dangling connections, with a report of every change

Local

Convert a cURL command into an HTTP Request node ready to paste into n8n, with secret redaction, timeout and retry

Local