Check registry

126 checks. Each one can be proven wrong.

Every finding in an audit comes from one of these rules. Scores are computed from them deterministically; a language model never decides a score. Each rule states how you would know it is wrong, so a finding is an argument you can test, not a verdict.

Technical 30 checks

  1. Indexable content page carries noindex

    CriticalPer pageSEOAEOGEOtechnical.noindex-accident

    How we would know it is wrong: If these pages are intentionally excluded (staging, thin utility), reclassify, otherwise removal must restore indexing in GSC.

  2. Canonical points to a different URL form than the live URL

    HighPer pageSEOtechnical.canonical-inconsistent

    How we would know it is wrong: Align canonical with the live (sitemap) form; GSC duplicate/canonical warnings for these URLs should clear within weeks.

  3. Page is noindex but canonicalises to another URL

    HighPer pageSEOtechnical.canonical-noindex-conflict

    How we would know it is wrong: Check the canonical target in GSC URL Inspection: if it is still indexed and serving, the conflicting signal was absorbed. Pick one intent (noindex with a self-canonical, or index with the cross-canonical) and re-inspect.

  4. Content pages are served uncacheable (no-store / private)

    HighSite-wideSEOtechnical.content-pages-uncached

    How we would know it is wrong: Enable ISR/s-maxage on the route; response headers flip to cacheable and CDN cache HIT ratios become observable.

  5. Mixed content: http:// assets on https page

    HighPer pageSEOtechnical.mixed-content

    How we would know it is wrong: Browser console shows mixed-content warnings before, none after.

  6. Page returns 4xx/5xx

    HighSite-wideSEOtechnical.page-error-status

    How we would know it is wrong: Re-fetch after fix: status 200 and (re)indexing in GSC coverage report confirm resolution.

  7. No XML sitemap found

    HighSite-wideSEOtechnical.sitemap-missing

    How we would know it is wrong: Add /sitemap.xml (and reference it from robots.txt); GSC's sitemap report should accept it and coverage discovery should widen.

  8. Missing viewport meta (mobile rendering)

    HighPer pageSEOtechnical.viewport-missing

    How we would know it is wrong: Mobile-friendly test fails without it; passes after adding, binary check.

  9. hreflang self-reference disagrees with the page canonical

    MediumPer pageSEOhreflang.canonical-mismatch

    How we would know it is wrong: When the canonical points somewhere else than the hreflang self row, Google discards the language cluster. Make them identical and re-validate in a hreflang tester.

  10. hreflang values with invalid or non-canonical codes

    MediumPer pageSEOhreflang.invalid-codes

    How we would know it is wrong: Validate in a hreflang testing tool: invalid codes are ignored by Google entirely; canonical form is lang-REGION (tr-TR).

  11. hreflang return tags broken (within crawled sample)

    MediumSite-wideSEOhreflang.return-tags-broken

    How we would know it is wrong: A→B without B→A invalidates the pair for Google; crawl sampling can hide linkers, confirm with a full-site hreflang crawl before large fixes.

  12. hreflang set does not reference the page itself

    MediumPer pageSEOhreflang.self-reference-missing

    How we would know it is wrong: Google's hreflang docs require each page to list itself; add the self row and re-validate.

  13. Missing canonical

    MediumPer pageSEOtechnical.canonical-missing

    How we would know it is wrong: If GSC shows no duplicate-URL clustering for these pages, impact was low; still cheap insurance.

  14. Byte-identical duplicate pages at different URLs

    MediumSite-wideSEOtechnical.duplicate-content-pages

    How we would know it is wrong: Consolidate with canonical/redirect or unpublish; after the fix no two indexable URLs share a content hash.

  15. No favicon declared

    MediumSite-wideSEOtechnical.favicon-missing

    How we would know it is wrong: After adding icon set, SERP favicon should replace the generic globe within days (site: query check).

  16. HTML larger than the 2 MB processing cap

    MediumPer pageSEOGEOAEOtechnical.html-size-cap

    How we would know it is wrong: Google processes roughly the first 2 MB of an HTML file. Fetch the page and check whether your main content and JSON-LD fall before that offset: if they do, this is only a payload-weight issue, not a truncation risk.

  17. robots.txt declares a sitemap that does not resolve

    MediumSite-wideSEOtechnical.robots-sitemap-declaration-broken

    How we would know it is wrong: Open each Sitemap: URL from robots.txt in a browser, a live sitemap returns XML, not a 404 or an HTML page. Fix the URL or drop the line; GSC's Sitemaps report should stop showing a fetch error.

  18. Crawled pages missing from the sitemap

    MediumSite-wideSEOtechnical.sitemap-coverage-gap

    How we would know it is wrong: Add the listed URLs to the sitemap; discovery-dependent indexing lag for them should shrink in GSC.

  19. Sitemap contains http:// URLs

    MediumSite-wideSEOtechnical.sitemap-http-urls

    How we would know it is wrong: Every http entry costs a redirect hop at crawl; swap to https and the hop disappears.

  20. Sitemap exists but is empty or unparseable

    MediumSite-wideSEOtechnical.sitemap-invalid

    How we would know it is wrong: Validate the XML; once it parses with at least one <url><loc>, this finding disappears on the next audit.

  21. Discovered URL redirects to another URL

    MediumSite-wideSEOtechnical.sitemap-url-redirects

    How we would know it is wrong: Update sitemap/internal links to final URLs; crawl again, zero redirected entries confirms.

  22. hreflang sets without an x-default

    LowSite-wideSEOhreflang.x-default-missing

    How we would know it is wrong: x-default routes unmatched-language users; without it Google picks arbitrarily, add and watch international impressions.

  23. Missing Open Graph tags

    LowPer pageSEOtechnical.og-tags-missing

    How we would know it is wrong: Share the URL on a social platform: without OG, the preview card falls back to guesswork.

  24. No robots.txt

    LowSite-wideSEOGEOtechnical.robots-missing

    How we would know it is wrong: Crawlers assume full allow without it, but you lose the place to declare sitemaps and AI-crawler policy; add one and this clears.

  25. Missing security headers (HSTS / nosniff / XFO)

    LowSite-wideSEOtechnical.security-headers-missing

    How we would know it is wrong: Not a ranking factor per se; treat as trust hygiene. If headers exist at CDN level but not origin, verify live response.

  26. Sitemap carries <priority>/<changefreq> (ignored by Google)

    LowSite-wideSEOtechnical.sitemap-deprecated-tags

    How we would know it is wrong: Google documents both as ignored; removing them shrinks the file and removes false signals.

  27. Every sitemap lastmod is identical

    LowSite-wideSEOtechnical.sitemap-identical-lastmod

    How we would know it is wrong: Google only honors verifiably accurate lastmod; uniform stamps read as generated-at-build noise.

  28. Sitemap <lastmod> values are not valid W3C datetimes

    LowSite-wideSEOtechnical.sitemap-lastmod-invalid

    How we would know it is wrong: Run the sitemap through any XML sitemap validator (or GSC's Sitemaps report): valid lastmod is YYYY-MM-DD or a full ISO 8601 timestamp. If the values are already valid in the live file, the crawl sampled a stale copy.

  29. Site mixes trailing-slash and non-trailing-slash URLs

    LowSite-wideSEOtechnical.trailing-slash-inconsistent

    How we would know it is wrong: Request both forms of one URL: if one 301-redirects to the other, the site is consistent at the server level and this is cosmetic. Otherwise both forms can be indexed as duplicates: pick one and redirect the other.

On-page 28 checks

  1. Missing H1

    HighPer pageSEOAEOonpage.h1-missing

    How we would know it is wrong: If rankings and AI citations for these pages are unaffected after adding H1s elsewhere, H1 was not the constraint.

  2. Missing <title>

    HighPer pageSEOAEOonpage.title-missing

    How we would know it is wrong: If pages without a title still earn normal SERP snippets and CTR, this finding was irrelevant.

  3. Overlay covers the mobile screen on load

    HighPer pageSEOrender.intrusive-interstitial

    How we would know it is wrong: Load the page on a 375x812 mobile viewport and look at the first screen. If no layer covers half of it before interaction, or the layer is a legal notice (cookie / KVKK / GDPR / age gate, which we exclude), this finding is wrong.

  4. AI-generated product image carries no IPTC DigitalSourceType

    MediumPer pageSEOimages.iptc-ai-source-missing

    How we would know it is wrong: Read the file's XMP with exiftool: if DigitalSourceType is present with an IPTC AI value (e.g. trainedAlgorithmicMedia), this finding is wrong. If the image was not AI-generated, the generator signature we matched is wrong: send us the file and we will drop the pattern.

  5. Images only load with JavaScript (no src in the HTML)

    MediumPer pageSEOGEOimages.js-lazy-without-src

    How we would know it is wrong: Fetch the page with JavaScript disabled (curl) and look for <img src>: if the images are there, this is resolved. Moving the URL into src and keeping loading="lazy" preserves the performance win without hiding the image from non-JS consumers.

  6. Missing html lang attribute

    MediumPer pageSEOGEOonpage.html-lang-missing

    How we would know it is wrong: If engines consistently detect the right language anyway, this is hygiene, but it costs nothing to fix.

  7. Images without alt text

    MediumPer pageSEOonpage.img-alt-missing

    How we would know it is wrong: If image search traffic and accessibility audits show no gap, remaining alts are decorative.

  8. Missing meta description

    MediumPer pageSEOonpage.meta-description-missing

    How we would know it is wrong: If SERP snippets for these pages read well (auto-extracted), impact is limited to CTR control.

  9. og:url points to a different page than the live URL

    MediumPer pageSEOonpage.og-url-mismatch

    How we would know it is wrong: Share the URL: the preview should resolve to this page, not the homepage; after fix og:url equals the canonical URL.

  10. Duplicate titles across pages

    MediumSite-wideSEOonpage.title-duplicate

    How we would know it is wrong: GSC 'duplicate title' style clustering disappears once titles are unique; if pages target identical queries intentionally, consolidate instead.

  11. Title longer than 60 characters

    MediumPer pageSEOonpage.title-too-long

    How we would know it is wrong: If Google renders the full title untruncated in SERP for these pages, length was fine.

  12. Tap targets smaller than 24x24 px on mobile

    MediumPer pageSEOrender.touch-targets-small

    How we would know it is wrong: Open the page at 375px width and measure the listed elements. If each is at least 24x24 CSS px, or sits inside a sentence (WCAG 2.5.8 inline exception, which we already exclude), this finding is wrong.

  13. Interactive controls with no accessible name

    MediumPer pageSEOAEOrender.unnamed-controls

    How we would know it is wrong: Inspect the listed elements in the accessibility tree (browser devtools > Accessibility). If each exposes a name via text, aria-label, aria-labelledby, alt or title, this finding is wrong. Elements hidden with aria-hidden are already excluded.

  14. Image alt text outside the 10-125 character band

    LowPer pageSEOimages.alt-length-band

    How we would know it is wrong: Under 10 chars carries no meaning for retrieval; over 125 gets truncated by screen readers. Rewrite and confirm via image-SERP impressions.

  15. Camera-default or meaningless image filenames

    LowPer pageSEOimages.filename-syntax

    How we would know it is wrong: Descriptive kebab-case filenames are an image-search relevance input; rename (or serve via CDN alias) and watch image impressions for those assets.

  16. IPTC DigitalSourceType is present but not an IPTC NewsCodes value

    LowPer pageSEOimages.iptc-source-type-invalid

    How we would know it is wrong: Compare the value against the IPTC DigitalSourceType NewsCodes vocabulary. If the value is in that vocabulary and we flagged it, this finding is wrong.

  17. Content pages more than 3 clicks from the home page

    LowSite-wideSEOonpage.crawl-depth-deep

    How we would know it is wrong: Depth here is measured over the crawled sample only, a link from an uncrawled page can make the path shorter. Verify in a full crawl; if the depth is real, link the page from a hub or the main nav and watch crawl frequency in GSC.

  18. Long article cites no external source

    LowPer pageSEOGEOonpage.external-citations-missing

    How we would know it is wrong: Outbound links to primary sources are an authority signal for people and engines alike. Link the sources you actually used; if nothing changes for that page in a quarter, sourcing was not the gap.

  19. Generic anchor text (“click here” style)

    LowPer pageSEOonpage.generic-anchor-text

    How we would know it is wrong: Descriptive anchors carry relevance; generic ones waste it. Replace and watch linked pages' queries in GSC.

  20. Multiple H1 elements

    LowPer pageSEOonpage.h1-multiple

    How we would know it is wrong: Modern engines tolerate multiple H1s; treat as hygiene unless heading extraction visibly breaks.

  21. Heading level skipped (e.g. H2 → H4)

    LowPer pageSEOAEOonpage.heading-skip

    How we would know it is wrong: If outline parsers (and AI passage extraction) still segment the page correctly, the skip is cosmetic.

  22. Duplicate meta descriptions

    LowSite-wideSEOonpage.meta-description-duplicate

    How we would know it is wrong: Unique descriptions restore per-page snippet control; if engines rewrite snippets anyway, impact is limited.

  23. Meta description outside the 120-160 character band

    LowPer pageSEOonpage.meta-description-length

    How we would know it is wrong: Inside the band Google truncates less and rewrites less often; verify via SERP snippet.

  24. Pages with no inbound internal links (within the crawled sample)

    LowSite-wideSEOonpage.orphan-pages

    How we would know it is wrong: Crawl sampling can hide linkers; verify with a full crawl or GSC internal-links report, then add contextual links and watch discovery/crawl frequency.

  25. Title shorter than 30 characters

    LowPer pageSEOonpage.title-too-short

    How we would know it is wrong: Quality-gate band is 30-60 chars; a longer descriptive title should lift SERP CTR measurably.

  26. No twitter:card meta

    LowPer pageSEOonpage.twitter-card-missing

    How we would know it is wrong: Share on X: without card markup the preview degrades; with it a summary card renders.

  27. URL longer than 100 characters

    LowPer pageSEOonpage.url-too-long

    How we would know it is wrong: Long URLs truncate in SERPs and get copied/linked less; shorten the slug and 301 the old one.

Content 18 checks

  1. Ranks on page one but is almost never clicked

    HighPer pageSEOcontent.first-page-no-clicks

    How we would know it is wrong: Open Search Console for this URL: if the click-through rate is normal for its queries (branded navigational terms often sit low by nature), this finding is wrong. It is also wrong if the page ranks for queries it should not target at all: then the fix is targeting, not the title.

  2. Blog post has no in-body link to a money page

    HighPer pageSEOonpage.body-cta-missing

    How we would know it is wrong: Add end-of-post CTAs to these posts; if assisted conversions and internal-link flow do not move in 4-6 weeks, the finding was wrong.

  3. Mobile page shows much less content than desktop

    HighPer pageSEOAEOrender.mobile-content-parity

    How we would know it is wrong: Open the page at 375px and at 1280px and compare the visible text. If the mobile view carries the same content (only collapsed behind accordions or tabs, which still counts as present in the DOM but hidden: check whether it is display:none), this finding is wrong.

  4. Blog post has no visible author byline

    MediumPer pageSEOGEOcontent.byline-missing

    How we would know it is wrong: E-E-A-T proxy: add named bylines with bios; anonymous 'our editors' content is cited less by AI engines.

  5. No contact information anywhere in the crawl (no tel:/mailto:)

    MediumSite-wideSEOGEOcontent.contact-info-missing

    How we would know it is wrong: Trust (E-E-A-T) baseline: a working email/phone somewhere on the site; QRG treats unreachable operators as low-trust.

  6. No privacy or terms page found

    MediumSite-wideSEOcontent.legal-pages-missing

    How we would know it is wrong: Publish privacy/terms and link them from the footer; if the pages exist but the crawl missed them, mark this resolved, the check only reports what the crawl could see.

  7. Blog post exposes no publication date

    MediumPer pageSEOGEOcontent.publish-date-missing

    How we would know it is wrong: Recency drives AI citation eligibility; a machine-readable date (meta/time/schema) makes the post datable.

  8. Pages are mostly shared template text with little unique content

    MediumSite-wideSEOAEOcontent.template-heavy-pages

    How we would know it is wrong: Add 2-3 paragraphs that could only appear on that page (specific numbers, local detail, first-hand notes) to five pages; if impressions for their own queries do not move in 6-8 weeks, template ratio was not the blocker.

  9. Thin content page (<300 words)

    MediumPer pageSEOAEOcontent.thin-content

    How we would know it is wrong: Expand or consolidate; if the page ranks and converts as-is (utility page), reclassify as intentional.

  10. First mobile screen carries almost no text

    MediumPer pageSEOAEOrender.empty-first-screen

    How we would know it is wrong: Load the page at 375x812 and read the first screen. If readable text is present there without scrolling, this finding is wrong: check whether the text renders only after client-side hydration.

  11. Homepage H1 does not mention the brand

    LowSite-wideGEOcontent.brand-inconsistent-h1

    How we would know it is wrong: Entity clarity: if AI answers already attribute the site to the right brand, skip.

  12. Hands-on content shows no sign of first-hand experience

    LowPer pageSEOGEOcontent.first-hand-experience-missing

    How we would know it is wrong: E-E-A-T's first E is experience: reviews and how-tos that never say what was actually tried read as desk research. Add one concrete first-hand passage (what you did, what happened, a number you measured) and re-check rankings for that page's own queries in 6-8 weeks.

  13. English content is hard to read (Flesch below 30)

    LowPer pageSEOcontent.readability-hard

    How we would know it is wrong: Flesch is calibrated for English only, this check never runs on other languages. Shorten sentences and prefer common words; if engagement metrics do not move, readability was not the issue.

  14. Commercial page shows no customer proof

    LowSite-wideSEOcontent.social-proof-missing

    How we would know it is wrong: Reviews, testimonials or case references are a trust signal for both people and engines. Add real ones (with Review/AggregateRating markup where genuine): if conversion and rankings do not move in a quarter, proof was not the gap. Never invent them.

  15. Post older than 12 months with no visible update

    LowPer pageGEOcontent.stale-content

    How we would know it is wrong: Pages left stale 6+ months lose AI-citation eligibility (SE Ranking); refresh + dateModified should recover it.

  16. Ranks just outside the positions that get clicks

    LowPer pageSEOcontent.striking-distance

    How we would know it is wrong: Check the queries behind this page in Search Console. If they are irrelevant to the page's purpose, moving up would not help and this is not an opportunity. If the page already converts from its current position, the priority is lower than the number suggests.

  17. Paragraphs far beyond the 2-4 sentence guideline

    LowPer pageAEOcontent.wall-of-text

    How we would know it is wrong: Short paragraphs are an AI-extraction structural signal; split and watch passage-level citations.

  18. Content below the word-count floor for its page type

    LowPer pageSEOcontent.word-count-floor

    How we would know it is wrong: Floors (home 500 / service 800 / blog 1500) are competitive medians, not law; if the page already wins its query class in GSC, reclassify as intentional brevity.

Schema 21 checks

  1. Product schema missing required fields (name / image / offers)

    HighPer pageSEOecom.product-required-fields

    How we would know it is wrong: Google Merchant listing requires all three; Rich Results Test reports the same missing fields.

  2. LocalBusiness schema missing required fields (name / address)

    HighPer pageSEOlocal.localbusiness-required

    How we would know it is wrong: Google's LocalBusiness docs require name + PostalAddress; Rich Results Test reports the same.

  3. Article schema missing required fields (image / datePublished / publisher.logo)

    HighPer pageSEOGEOschema.article-required-fields

    How we would know it is wrong: Rich Results Test lists the exact missing required fields before the fix and passes after.

  4. Invalid JSON-LD (parse error)

    HighPer pageSEOGEOschema.jsonld-invalid

    How we would know it is wrong: Rich Results Test must pass after fix; before, it reports the same parse failure.

  5. Offer fields malformed (price / currency / availability)

    MediumPer pageSEOecom.offer-format

    How we would know it is wrong: price must be numeric (no symbols), priceCurrency ISO-4217, availability a schema.org enum URL, Rich Results Test flags each.

  6. aggregateRating missing ratingValue or reviewCount

    MediumPer pageSEOlocal.aggregaterating-fields

    How we would know it is wrong: Both fields are required for star rich results; Rich Results Test reports the missing one.

  7. Schema phone number does not match the phone on the page

    MediumPer pageSEOlocal.phone-mismatch

    How we would know it is wrong: Local ranking depends on consistent NAP. Make the visible tel: link and the schema telephone identical; if the two numbers are deliberately different (sales vs support), reclassify as intentional.

  8. Schema URLs use a different trailing-slash form than the live URL

    MediumPer pageSEOschema.jsonld-url-slash-mismatch

    How we would know it is wrong: Align schema URLs with canonical form; Rich Results Test entity URLs should match live URLs exactly.

  9. Structured data hygiene issues (context / relative URLs / placeholder / bad dates)

    MediumPer pageSEOschema.markup-hygiene

    How we would know it is wrong: Rich Results Test reports these exact classes of error; clean markup validates silently.

  10. Homepage has no Organization schema

    MediumSite-wideSEOGEOschema.organization-missing

    How we would know it is wrong: Entity clarity: once Organization (@id, logo, sameAs) exists and articles reference it, knowledge-panel/entity signals have a root to attach to.

  11. SaaS landing uses Product schema instead of SoftwareApplication

    MediumPer pageSEOGEOschema.product-on-saas

    How we would know it is wrong: If Google's rich result docs for software explicitly accept Product for this case, downgrade; otherwise SoftwareApplication is the documented type.

  12. Content page has no structured data at all

    MediumPer pageSEOGEOschema.structured-data-missing

    How we would know it is wrong: Rich Results Test shows zero detected items before, at least one after.

  13. Product offer declares no shipping or return policy

    LowPer pageSEOecom.merchant-policies-missing

    How we would know it is wrong: Add shippingDetails and hasMerchantReturnPolicy to the offer; Search Console's Merchant listings report should stop reporting them as missing and the shipping/returns annotations become eligible.

  14. Product schema omits the fields merchants are matched on

    LowPer pageSEOecom.product-completeness

    How we would know it is wrong: brand, sku/gtin and description are what shopping surfaces use to match and display a product. Add the ones you actually have; Merchant listing reports should stop flagging them.

  15. LocalBusiness geo coordinates below 4-decimal precision

    LowPer pageSEOlocal.geo-precision

    How we would know it is wrong: 4-5 decimals ≈ 10m accuracy; coarser pins mislocate the business on map surfaces, fix and re-check the map pin.

  16. LocalBusiness priceRange is not a short symbolic range

    LowPer pageSEOlocal.pricerange-format

    How we would know it is wrong: Google's guidance expects a compact indicator like “$$” or “₺₺-₺₺₺”, not a sentence or a full price list. Shorten it and re-run the Rich Results Test.

  17. Article author is not a Person entity

    LowPer pageSEOGEOschema.author-not-a-person

    How we would know it is wrong: Google's article guidance and AI attribution both resolve authors as entities. Give author a Person object with a name (and ideally url/sameAs); Rich Results Test should stop reporting a bare-string author.

  18. BlogPosting schema without datePublished

    LowPer pageSEOGEOschema.blogposting-missing-dates

    How we would know it is wrong: Recency drives AI citation eligibility; dated posts are extractable as fresh sources.

  19. Deprecated schema types in use (HowTo / SpecialAnnouncement / …)

    LowPer pageSEOschema.deprecated-types

    How we would know it is wrong: Google retired these rich results (HowTo 2023, SpecialAnnouncement 2025, FAQ rich results 2026); the markup earns nothing.

  20. Structured data uses Microdata/RDFa instead of JSON-LD

    LowPer pageSEOAEOschema.microdata-only

    How we would know it is wrong: Paste the page into the Rich Results Test: if the entity is detected and eligible, the markup works and this is a maintainability preference, not a defect. Google recommends JSON-LD because it survives template edits that break inline attributes.

  21. Organization schema has no sameAs links

    LowSite-wideGEOSEOschema.organization-sameas-missing

    How we would know it is wrong: sameAs is how an engine ties your brand to its known entity (Wikipedia, LinkedIn, X, Crunchbase). Add 2-4 real profile URLs; if brand mentions still never resolve to your entity after a quarter, the gap was elsewhere.

Performance 6 checks

  1. The first (likely LCP) image is lazy-loaded

    MediumPer pageSEOimages.hero-image-lazy

    How we would know it is wrong: Lazy-loading the hero delays LCP by a round trip. Remove loading="lazy" from the first in-view image (add fetchpriority="high") and compare LCP before/after in a trace or CrUX.

  2. Images without width/height (CLS risk)

    MediumPer pageSEOperformance.img-dimensions-missing

    How we would know it is wrong: Reserved dimensions eliminate late layout shifts; CLS field data improves after the fix.

  3. Preloaded asset is never used on the page

    MediumPer pageSEOperformance.wasted-preload

    How we would know it is wrong: DevTools console warns 'preloaded but not used within a few seconds', reproduce before, gone after.

  4. Content images without decoding="async"

    LowPer pageSEOimages.decoding-async-missing

    How we would know it is wrong: decoding=async lets the main thread paint without waiting on image decode; add it and verify main-thread decode time drops in a trace.

  5. Image-heavy page loads every image eagerly

    LowPer pageSEOimages.lazy-loading-missing

    How we would know it is wrong: Add loading="lazy" to below-the-fold images; a repeat trace should show fewer bytes before first render. If images were already deferred by a script, mark resolved.

  6. Mostly JPEG/PNG images with no responsive/modern delivery

    LowPer pageSEOperformance.legacy-image-formats

    How we would know it is wrong: WebP/AVIF or srcset cuts image bytes 30-70%; transfer size per image drops verifiably.

AEO 8 checks

  1. Question headings are identical template boilerplate across articles

    MediumSite-wideAEOGEOaeo.boilerplate-question-headings

    How we would know it is wrong: Replace template questions with page-specific ones on 5 articles; if AI answers begin citing those sections within 4-6 weeks, uniqueness was the blocker, if not, reclassify as design choice.

  2. Long content with no lists or tables

    MediumPer pageAEOGEOaeo.no-extractable-structure

    How we would know it is wrong: AI answers favor extractable blocks; add lists/tables to top pages and watch citation share for their queries.

  3. Click handlers on non-interactive elements (agent-invisible)

    LowPer pageAEOGEOaeo.div-onclick

    How we would know it is wrong: AI agents and screen readers act on real <a>/<button>; a div with onclick is invisible to both.

  4. FAQ content present but no FAQPage schema

    LowPer pageAEOaeo.faq-schema-without-questions

    How we would know it is wrong: If the page's Q&A block already earns AI citations without schema, markup is optional reinforcement.

  5. Opening paragraph buries the answer (BLUF)

    LowPer pageAEOGEOaeo.first-answer-too-long

    How we would know it is wrong: 44% of AI citations come from the first 30% of a page; front-load a 40-60 word answer and watch citation share.

  6. Form inputs without labels

    LowPer pageAEOaeo.inputs-unlabeled

    How we would know it is wrong: Labeled inputs are operable by agents and assistive tech; a11y audit flags the same fields.

  7. No <main>/<article> landmark

    LowPer pageAEOGEOaeo.no-main-landmark

    How we would know it is wrong: Landmarks let extractors isolate primary content from chrome; boilerplate-stripping quality improves.

  8. Content page has no question-form headings

    LowPer pageAEOaeo.no-question-headings

    How we would know it is wrong: Question headings map to query patterns; if PAA/AI answers already cite these pages, structure suffices.

GEO 15 checks

  1. AI crawlers blocked in robots.txt

    CriticalSite-wideGEOAEOgeo.ai-crawler-blocked

    How we would know it is wrong: If blocking is a deliberate licensing decision, reclassify as policy; otherwise unblocking must show AI-crawler hits in logs.

  2. Content invisible to AI crawlers (client-side rendered)

    CriticalSite-wideGEOAEOSEOgeo.content-invisible-to-ai

    How we would know it is wrong: curl the URL: if the answer content is absent from raw HTML, no JS-less agent can cite it. SSR/prerender fixes it measurably.

  3. Comparison-intent page has no comparison table

    HighPer pageGEOAEOgeo.comparison-table-missing

    How we would know it is wrong: Add an HTML table; if AI answers for 'X vs Y / X alternatives' queries still never cite the page after 4-6 weeks, structure was not the blocker.

  4. Snippet controls block engines from quoting the page

    HighPer pageGEOAEOSEOgeo.snippets-suppressed

    How we would know it is wrong: nosnippet / max-snippet:0 / data-nosnippet tell engines they may not quote the text, which is exactly what an AI answer needs. Remove them and watch whether the page becomes quotable in answers.

  5. Question-intent page does not answer in the opening passage

    MediumPer pageGEOAEOgeo.direct-answer-missing

    How we would know it is wrong: Front-loaded answers (first 40-60 words) are what engines extract; move the direct answer above the fold of the text and re-check AI answers for the query.

  6. No section falls in the citable passage band (~134-167 words)

    LowPer pageGEOgeo.citable-passage-band

    How we would know it is wrong: Merge fragment sections / split monoliths toward 100-200 word passages; if AI citation of the page doesn't move in 4-6 weeks, passage size was not the blocker.

  7. Definition page does not open with a definition sentence

    LowPer pageGEOAEOgeo.definition-pattern-missing

    How we would know it is wrong: Answer engines lift the sentence that defines the term. Rewrite the opening as “X is …/X, …dır” and watch whether the page starts appearing in definition answers within 4-6 weeks.

  8. ProvenVisible's IndexNow key is not installed

    LowSite-wideSEOGEOgeo.indexnow-missing

    How we would know it is wrong: Host the generated key file and ping once: Bing Webmaster Tools' IndexNow report should show received submissions within days. If you already run IndexNow with another tool, or your engines ignore it, dismiss this.

  9. No llms.txt

    LowSite-wideGEOgeo.llmstxt-missing

    How we would know it is wrong: Google publicly rejects llms.txt as a ranking input; value is limited to non-Google agents that read it. If none of your target engines fetch it (server logs), skip.

  10. Sectioned post has no question-form headings

    LowPer pageAEOGEOgeo.question-headings-missing

    How we would know it is wrong: AI answer engines match question-form H2/H3s to user queries; reword 2-3 headings as questions and watch passage-level citations for those sections.

  11. Long article contains no specific figures to quote

    LowPer pageGEOAEOgeo.quotable-facts-missing

    How we would know it is wrong: Answer engines quote concrete numbers (percentages, prices, durations, dates). Add 2-3 real figures with their source; if the page still never appears in answers after 4-6 weeks, citability was not the blocker.

  12. robots.txt advertises an RSL license that is missing or malformed

    LowSite-wideGEOgeo.rsl-license-broken

    How we would know it is wrong: Open the License: URL from robots.txt: it must return an XML document whose root is <rsl> in the https://rslstandard.org/rsl namespace with at least one <content> and <license>. If it does and this still fires, the check is wrong.

  13. Your RSL license document refuses ordinary clients

    LowSite-widegeo.rsl-license-unreadable

    How we would know it is wrong: Fetch the License: URL with curl (no browser headers). If it returns the XML, this is resolved; if it returns 403 like it did for us, the crawlers your license is written for cannot read it either.

  14. Your RSL license prohibits AI use of this content

    LowSite-widegeo.rsl-prohibits-ai

    How we would know it is wrong: This is a licensing decision, not a defect: the file says answer engines may not use your content. If you want AI visibility, change the <prohibits type="usage"> rule; if the license is deliberate, dismiss this.

This page is generated from the live check registry, so it always lists exactly what the audit runs.