{"ruleset":5,"definitions":1,"published":"https://crawlwise.site/methodology","licence":"Published so the rules can be read and disagreed with. Use them however you like.","topics":{"seo":{"label":"SEO","blurb":"Whether search engines can discover, crawl, and understand this page."},"aeo":{"label":"Answer clarity","blurb":"Whether the page answers the question a reader arrived with, and whether that answer is reachable."},"geo":{"label":"AI search","blurb":"The evidence a generative answer could draw on, plus any visibility that has actually been measured."},"supporting":{"label":"Additional improvements","blurb":"Worth doing for readers and assistive technology. Not search ranking signals, and never scored as such."}},"retired":["agents","llms","llms-full","social","heading-order","language"],"checks":[{"id":"https","title":"HTTPS connection","category":"seo","topic":"seo","scored_in_checklist":true,"measures":"Whether the URL that answered is served over HTTPS, after following redirects.","cannot":["Whether the certificate is valid for every hostname the page loads from.","Whether the HTTP address still resolves and answers."],"fix":"Serve the site over HTTPS and redirect the HTTP address to it.","free_tool":"/tools/mixed-content"},{"id":"title","title":"Page title","category":"seo","topic":"seo","scored_in_checklist":true,"measures":"Whether the head contains a title element and how long it is.","cannot":["Whether Google will use it. Google rewrites titles it considers unhelpful, whatever this says.","Whether the title reads well, which is a judgement about your copy."],"fix":"Write one title per page, specific to that page, and put the distinguishing words first.","free_tool":"/tools/serp"},{"id":"description","title":"Meta description","category":"seo","topic":"seo","scored_in_checklist":true,"measures":"Whether a meta description is present and its length.","cannot":["Whether it will be shown. Google frequently writes its own snippet from page text.","Whether a missing description costs you clicks — that depends on the query."],"fix":"Add a meta description. A missing one is a missed opportunity rather than an error.","free_tool":"/tools/serp"},{"id":"index","title":"Indexing directives","category":"seo","topic":"seo","scored_in_checklist":true,"measures":"The robots meta tag and X-Robots-Tag as sent, read as data rather than as prose.","cannot":["Whether a page is actually indexed. That requires Search Console or an index check.","Whether a directive came from your code or a CDN rule."],"fix":"Remove a noindex you did not intend. A deliberate one should stay.","free_tool":"/tools/robots-tester"},{"id":"canonical","title":"Canonical URL","category":"seo","topic":"seo","scored_in_checklist":true,"measures":"Whether the page declares a canonical and what it points at.","cannot":["Which URL wins when two pages disagree. Google decides that.","Whether a canonical sent as an HTTP header says something different — see the headers tool."],"fix":"Declare a self-referencing canonical unless duplicates genuinely exist.","free_tool":"/tools/canonical-checker"},{"id":"h1","title":"Main heading","category":"seo","topic":"seo","scored_in_checklist":true,"measures":"Whether the source HTML contains exactly one h1 and its text.","cannot":["Whether the heading is visually hidden or styled to look like something else.","Whether the outline reads well to a person."],"fix":"Use one h1 that describes the page, and let the sections below it be h2s.","free_tool":"/tools/structured-data"},{"id":"viewport","title":"Mobile viewport","category":"seo","topic":"seo","scored_in_checklist":true,"measures":"Whether a viewport meta tag is present.","cannot":["Whether the layout actually works on a phone. That needs rendering at a mobile width.","Whether a CSS media query does the same job instead."],"fix":"Add a viewport meta tag with width=device-width and an initial scale of 1.","free_tool":"/tools/meta-tags"},{"id":"alt","title":"Image alternative text","category":"seo","topic":"seo","scored_in_checklist":true,"measures":"How many images in the source HTML carry an alt attribute, including empty ones.","cannot":["Whether the text describes the image, which no tool can judge.","Whether an image is decorative, where an empty alt is the correct answer."],"fix":"Give informative images real alt text and decorative ones an empty alt.","free_tool":"/tools/structured-data"},{"id":"link-text","title":"Descriptive link labels","category":"seo","topic":"seo","scored_in_checklist":true,"measures":"The anchor text of internal links, looking for generic labels like \"click here\" or \"read more\".","cannot":["Whether the destination is any good.","Whether a generic label is fine in context, which it sometimes is."],"fix":"Name the destination in the link text. \"View the pricing page\" beats \"click here\".","free_tool":"/tools/broken-link-checker"},{"id":"schema-presence","title":"Structured data formats","category":"schema","topic":"seo","scored_in_checklist":true,"measures":"Which structured data formats appear: JSON-LD, microdata, RDFa, and their @type values.","cannot":["Whether the markup is valid. That is the JSON-LD syntax check.","Whether the values are true statements about the business."],"fix":"Add JSON-LD for the entity the page represents, when the page actually represents one.","free_tool":"/tools/schema-validator"},{"id":"schema-json","title":"JSON-LD syntax","category":"schema","topic":"seo","scored_in_checklist":true,"measures":"Whether each JSON-LD block parses as JSON.","cannot":["Whether the parsed markup is eligible for a rich result. That is a feature-requirements question.","Whether microdata or RDFa on the page is valid — neither is parsed here."],"fix":"Fix the JSON. A block that does not parse is invisible to every consumer.","free_tool":"/tools/schema-validator"},{"id":"schema-context","title":"JSON-LD context","category":"schema","topic":"seo","scored_in_checklist":true,"measures":"Whether each JSON-LD block declares an @context of schema.org.","cannot":["Whether the types used inside it exist in the vocabulary. An unknown type parses and means nothing.","Whether a nested node inherits the context correctly, beyond the depth we walk."],"fix":"Add \"@context\": \"https://schema.org\" to every block.","free_tool":"/tools/schema-validator"},{"id":"schema-fields","title":"Common schema properties","category":"schema","topic":"seo","scored_in_checklist":true,"measures":"Which commonly expected properties are present on each entity type.","cannot":["Whether the values are correct.","Whether these properties are the ones Google asks for today — that list changes without notice."],"fix":"Fill in the properties the entity genuinely has. Never invent a value to satisfy a checker.","free_tool":"/tools/schema-validator"},{"id":"robots","title":"robots.txt discovery","category":"files","topic":"seo","scored_in_checklist":true,"measures":"Whether /robots.txt answers and whether its content parses as a robots file.","cannot":["Whether the rules inside it are the ones you want. Use the robots tester for a specific URL and crawler.","Whether a CDN or WAF answers differently for a bot."],"fix":"Serve a robots.txt that parses, and point it at your sitemap.","free_tool":"/tools/robots-tester"},{"id":"sitemap","title":"Sitemap discovery","category":"files","topic":"seo","scored_in_checklist":true,"measures":"Whether /sitemap.xml answers and how many URLs it contains.","cannot":["Whether the listed URLs work. The sitemap validator samples them.","Whether every page on the site is listed."],"fix":"Publish a sitemap, keep it current, and declare it in robots.txt.","free_tool":"/tools/sitemap-validator"},{"id":"image-size","title":"Reserved image dimensions","category":"performance","topic":"seo","scored_in_checklist":true,"measures":"How many images in the source declare width and height attributes.","cannot":["The real layout shift this page causes. That is a field measurement, and it needs traffic.","Whether a CSS rule or aspect-ratio already reserves the space."],"fix":"Set width and height on images, or reserve the space in CSS.","free_tool":"/tools/vitals"},{"id":"html-size","title":"HTML response weight","category":"performance","topic":"seo","scored_in_checklist":true,"measures":"The byte size of the HTML response as received, compressed or not as sent.","cannot":["Whether the page is slow. HTML is usually a small part of the total, and assets are separate requests.","The rendered size after JavaScript runs."],"fix":"Send less HTML, or compress it. Check the content-encoding header first.","free_tool":"/tools/vitals"},{"id":"response-time","title":"Server response time","category":"performance","topic":"seo","scored_in_checklist":true,"measures":"Time to first byte for the audited request, from our machine.","cannot":["What a visitor experiences. One measurement from one location is a sample, not a field number.","Whether the delay is your origin, your CDN, or the network between."],"fix":"Cache at the edge, and look at the server side if the first byte is slow everywhere.","free_tool":"/tools/headers"},{"id":"blocking-scripts","title":"Synchronous head scripts","category":"performance","topic":"seo","scored_in_checklist":true,"measures":"Script tags in the head with neither async nor defer.","cannot":["Whether the script is actually blocking in practice, which depends on where and how it is inserted.","The cost in milliseconds. That is a lab measurement."],"fix":"Add async or defer, or move the script out of the head.","free_tool":"/tools/vitals"},{"id":"image-loading","title":"Image loading strategy","category":"performance","topic":"seo","scored_in_checklist":true,"measures":"Which images declare loading=\"lazy\" and which declare fetchpriority.","cannot":["Whether lazy-loading is correct for a particular image. The largest one above the fold should not be lazy.","The effect on Core Web Vitals, which needs a measurement."],"fix":"Lazy-load below-the-fold images and leave the hero image eager.","free_tool":"/tools/vitals"},{"id":"geo-readable","title":"Text available in source","category":"geo","topic":"aeo","scored_in_checklist":false,"measures":"How much readable text is present in the HTML the server returns.","cannot":["Whether that text is any good.","What a browser would show after JavaScript runs — a client-rendered page looks thin here and may be fine."],"fix":"Serve the content in the HTML if you want anything outside a browser to read it.","free_tool":"/tools/visibility"},{"id":"geo-outline","title":"Content structure","category":"geo","topic":"aeo","scored_in_checklist":false,"measures":"The heading outline of the document as sent.","cannot":["Whether the structure reflects the argument the page makes.","Anything about headings a script inserts later."],"fix":"Use headings that describe their sections, in a single sensible hierarchy.","free_tool":"/tools/visibility"},{"id":"geo-author","title":"Author or contributor signal","category":"geo","topic":"geo","scored_in_checklist":false,"measures":"Whether the page declares an author, by name, by link, or in structured data.","cannot":["Whether that person exists or knows the subject.","Whether a byline is appropriate — plenty of good pages correctly have none."],"fix":"Attribute the page to a real person and link to something that shows why they would know.","free_tool":"/tools/visibility"},{"id":"geo-date","title":"Published or updated date","category":"geo","topic":"geo","scored_in_checklist":false,"measures":"Whether the page declares a published or modified date a machine can read.","cannot":["Whether the date is true.","Whether the content is current — a fresh date on stale text is worse than none."],"fix":"Declare a modified date that changes when the content actually changes.","free_tool":"/tools/visibility"},{"id":"geo-sources","title":"Links to supporting sources","category":"geo","topic":"geo","scored_in_checklist":false,"measures":"Outbound links, and whether any point at primary or reference sources.","cannot":["Whether the sources support the claim. That is a reading of the page.","Whether a link to a .gov domain is relevant to your subject."],"fix":"Link to the primary source for each claim that has one.","free_tool":"/tools/visibility"},{"id":"geo-identity","title":"About or contact discovery","category":"geo","topic":"geo","scored_in_checklist":false,"measures":"Whether the page or its navigation links to an about or contact page.","cannot":["Whether the business is real or reachable.","Whether the entity is who it says it is."],"fix":"Link to a page that says who publishes this site and how to reach them.","free_tool":"/tools/visibility"},{"id":"geo-eligibility","title":"Generative search eligibility needs review","category":"geo","topic":"geo","scored_in_checklist":false,"measures":"Whether anything we recorded blocks or discourages a generative search engine from using this page.","cannot":["Whether the page is cited by any AI answer. That is measured elsewhere, and only when it has been bought.","Anything about a model that never crawls the page."],"fix":"Check the blocked-crawler findings above before changing anything else.","free_tool":"/tools/ai-crawler-check"},{"id":"aeo-snippet-controls","title":"Snippet controls","category":"seo","topic":"aeo","scored_in_checklist":false,"measures":"Whether directives limit how much of the page a search engine may show.","cannot":["Whether the directive is being honoured, which the engine does not report.","Whether limiting the snippet is the right choice for you."],"fix":"Remove nosnippet or max-snippet limits if you want the full text quotable.","free_tool":"/tools/meta-tags"},{"id":"aeo-answer-lead","title":"Opening answer passage","category":"seo","topic":"aeo","scored_in_checklist":false,"measures":"Whether the page opens with a self-contained passage that answers the obvious question.","cannot":["Whether that passage is the one anyone would quote.","Whether a quote would ever be displayed — that is not something a page controls."],"fix":"Open with a direct answer in two or three sentences, before the build-up.","free_tool":"/tools/query-fanout"},{"id":"a11y-heading-structure","title":"Heading structure","category":"a11y","topic":"supporting","scored_in_checklist":false,"measures":"Whether heading levels are sequential and no level is skipped.","cannot":["Whether the document is usable with a screen reader, which needs a real assistive technology.","Whether a skipped level matters on a particular page."],"fix":"Do not skip levels. Use h3 because the section is a subsection, not because it looks right.","free_tool":"/tools/visibility"},{"id":"a11y-document-language","title":"Document language","category":"a11y","topic":"supporting","scored_in_checklist":false,"measures":"Whether the html element declares a language and whether it is a valid language tag.","cannot":["Whether the page is actually written in that language.","What to do about a page that mixes languages, which the specification leaves to the author."],"fix":"Set lang on the html element to the language the page is written in.","free_tool":"/tools/meta-tags"}]}