Methodology
How we score
Most audit tools give you a number and no way to check it. This page is how ours is computed, in enough detail that you could reproduce it by hand from your own report.
The short version
We fetch and render your page, record what we find as evidence, and judge each check against a published threshold. The score is then plain arithmetic over those judgements — a division, done in PHP. No model is asked what your site is worth.
Why this isn’t an AI chatbot audit
You can paste a URL into a chatbot and ask for an SEO audit. Here is what differs.
We do use a model — to write the explanations. See section 6.
1. The collector records facts, never verdicts
The part of the system that visits your site writes down values: response codes, byte counts, whether a tag was present, what a header said. It never decides whether something is good. That separation is the reason a finding can always be traced to a measurement, and the reason we can tell “this check passed” apart from “we could not measure this check” — which are very different facts, and which most tools report identically.
Every check writes either a value or an explicit “not measured” note with the reason. Nothing is silently blank.
2. The denominator is published
A score out of 100 means nothing until you know what it divided by. Ours is a fixed count of the checks the collector measures, and it is counted from the same document that generates our public check list:
- 210 checks on a single-page scan, including the free one.
- 233 checks when you buy a crawl, which adds the site-wide checks a single page cannot answer.
Currently collector version 78, 2026-09-24.
Both totals come from TIER_CHECK_TOTAL in the code that renders your report, and this
page reads them from there rather than repeating them.
3. Checks that don’t apply leave the denominator
A shop with no physical storefront is not failing local SEO — local SEO does not apply to it. When a whole group of checks doesn’t apply, those checks are removed from the total rather than counted as passes or failures. The same happens when something genuinely could not be measured. Your report always prints how many checks were measured and how many were not, and the two add up to the total above.
4. The arithmetic
A failure costs a whole check. A warning costs half. Everything else passed.
score = (passed + 0.5 × warnings) ÷ measured × 100
So a report with 12 failures and 8 warnings out of 148 measured checks has 128 passes and scores 89/100 — and that number on this page was produced by calling the same function that scores your report, not typed in.
5. The same evidence always scores the same
Because the arithmetic lives in code rather than in a written answer, two runs over identical evidence produce an identical score. Re-running a report cannot quietly move your number, and we don’t re-render reports we’ve already delivered.
6. Where the writing comes from
The explanations in a paid report are written by a language model, in 11 separate passes — one per section, plus a final pass that only ever sees the list of checks and their statuses, never your page content. It is asked to explain and prioritise what was measured. It is never asked to compute the score, and it cannot change one.
On the free scan every verdict is a number against a published threshold. A model is used for one thing only: to write the short plain-language summary. It never touches the score.
7. Keyword & competitor check
A separate check, run on one page and not part of the audit: who ranks for the searches that page is evidently written for. A model reads your page’s title, headings and navigation and proposes three searches a customer might type. We fetch Google’s first page of results for each, in your country and language, and record your position — or that you were not in the top ten. Then we fetch the competitor pages that ranked (the page that ranked, not their home page) and measure them with the same parsers we ran on yours: title, H1, visible word count, subheadings, images, structured-data types, server response time. The table is those numbers side by side, your page first.
The “gaps” are counted, not guessed: a term is a gap when it recurs in the ranking pages’ titles and addresses, most of the readable competitor pages mention it, and yours does not. Competitor pages we could not read are left out of the count rather than assumed to mention anything. Page length and heading counts are a proxy — longer is not better — and the report says so where it prints them.
What this doesn’t cover
Some things no scanner can measure from outside: whether your backlinks are any good, what Search Console shows, whether your content is actually correct. We don’t score those, and we don’t pretend to. Your report lists them separately and tells you what data would answer them — because a check we can’t run is not a check you passed.