We crawl each address, not a sample
Direct requests to every known address, without following redirects, with at most six concurrent requests so as not to disturb the server, and 23 columns per address: code, canonical address, title, description, hreflang, number of structured data blocks, amount of visible text. The result is a tabular file we hand over. On this site: 249 addresses, of which 244 respond 200 and 5 redirect.
The official address of a page, resolved once for the entire site
131 pages declared no canonical address, and 219 of 244 declared the home page as the share address — so any sharing on social networks showed a different page. Both were fixed with a relative declaration in the base layout, which resolves for each route separately. It is one line of code instead of a convention each new page would have had to remember on its own.
Sitemap generated from data, checked after publication
The sitemap is built from the content sources and goes through a final deduplication — on this site, 147 addresses, the same number in the code and in the production-served file. A script run after publication fails if the sitemap loses a page or if address variants appear that do not open. What is missing today, stated as missing: the entries do not carry a last-modified date, and 93 indexable addresses are not yet included.
Old addresses each get a decision
In a restructure, every existing address gets a verdict: stays, redirects permanently or disappears. On this site, 43 redirects resulted in the configuration. Verified separately are the things nobody tests: the jump from the domain without `www` to the one with `www` is a single one; the address with a trailing slash redirects correctly; the address written in uppercase returns 404, so there is no writing duplicate.
Titles, descriptions and thin content, counted
100 titles out of 244 exceed 60 characters, the longest having 106 — the risk is truncation in results. 33 descriptions exceed 160 characters, but zero are missing. More serious: 65 pages share a single template-generated description, and 30 of them differ between them by 240 bytes in total. Median visible text: 2,328 characters, with 96 pages under 2,000. These are numbers, not impressions, and each has a list of addresses behind it.
An in-house analyser, with modules and weights written in code
Our analyser has 16 modules — on-page, performance, sitemap, security, accessibility, name infrastructure, domain registration information, external links, social networks, technical stack, positions, keyword research, general audit — plus comparison modules: competitor finding, keyword gap, content gap, benchmarks. The overall score is explicitly weighted in code: performance 0.20, SEO 0.20, on-page 0.15, security 0.15, direct responses 0.10, accessibility 0.10, social 0.10. Modules that fail do not drag the score down — they fall out of the weighting, so a failed external service does not produce a false report.
Redirects that do not cost a whole page
A redirect made from inside the application builds the page and only then sends the redirect response. On this site there are 11 such cases, each producing over 200 KB of HTML before saying “go elsewhere”. It works, but it is wasteful; moving them into configuration is a small job with a direct effect on the crawl budget. It is on the fixes list, written as missing.
What a crawler sees, checked with the crawler, not assumed
We requested five addresses with 18 different user-agent identifiers and compared the code, size and fingerprint of the normalised content. All receive 200 and exactly the same content as a browser; `robots.txt` is identical, 129 bytes, for all; there is no blocking, challenge or rate limiting for crawlers. The only reproducible difference — 237 bytes less on one dynamic page, for three agents — comes from the framework itself, which sends them full unstreamed HTML, therefore more ready-rendered content, not less.
What we do not promise, written before the contract
We do not promise positions, growth percentages or a number of visits. We do not have publishable measurements for that and we do not invent them. What we deliver is verifiable in another way: the list of addresses with each one’s status, the fixes made, the check run after publication and the measurable difference between the before and after state — in bytes, codes and page counts, not in promises.