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
Indexable content page carries noindex
How we would know it is wrong: If these pages are intentionally excluded (staging, thin utility), reclassify, otherwise removal must restore indexing in GSC.
Canonical points to a different URL form than the live URL
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.
Page is noindex but canonicalises to another URL
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.
Content pages are served uncacheable (no-store / private)
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.
Mixed content: http:// assets on https page
How we would know it is wrong: Browser console shows mixed-content warnings before, none after.
Page returns 4xx/5xx
How we would know it is wrong: Re-fetch after fix: status 200 and (re)indexing in GSC coverage report confirm resolution.
No XML sitemap found
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.
Missing viewport meta (mobile rendering)
How we would know it is wrong: Mobile-friendly test fails without it; passes after adding, binary check.
hreflang self-reference disagrees with the page canonical
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.
hreflang values with invalid or non-canonical 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).
hreflang set does not reference the page itself
How we would know it is wrong: Google's hreflang docs require each page to list itself; add the self row and re-validate.
Missing canonical
How we would know it is wrong: If GSC shows no duplicate-URL clustering for these pages, impact was low; still cheap insurance.
Byte-identical duplicate pages at different URLs
How we would know it is wrong: Consolidate with canonical/redirect or unpublish; after the fix no two indexable URLs share a content hash.
No favicon declared
How we would know it is wrong: After adding icon set, SERP favicon should replace the generic globe within days (site: query check).
HTML larger than the 2 MB processing 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.
robots.txt declares a sitemap that does not resolve
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.
Crawled pages missing from the sitemap
How we would know it is wrong: Add the listed URLs to the sitemap; discovery-dependent indexing lag for them should shrink in GSC.
Sitemap contains 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.
Sitemap exists but is empty or unparseable
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.
Discovered URL redirects to another URL
How we would know it is wrong: Update sitemap/internal links to final URLs; crawl again, zero redirected entries confirms.
hreflang sets without an x-default
How we would know it is wrong: x-default routes unmatched-language users; without it Google picks arbitrarily, add and watch international impressions.
Internal links using http://
How we would know it is wrong: Each such link costs one redirect hop; crawl after fix shows zero internal 301s to https.
No robots.txt
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.
Missing security headers (HSTS / nosniff / XFO)
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.
Every sitemap lastmod is identical
How we would know it is wrong: Google only honors verifiably accurate lastmod; uniform stamps read as generated-at-build noise.
Sitemap <lastmod> values are not valid W3C datetimes
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.
Site mixes trailing-slash and non-trailing-slash URLs
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
Missing H1
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.
Missing <title>
How we would know it is wrong: If pages without a title still earn normal SERP snippets and CTR, this finding was irrelevant.
Overlay covers the mobile screen on load
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.
AI-generated product image carries no IPTC DigitalSourceType
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.
Images only load with JavaScript (no src in the HTML)
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.
Missing html lang attribute
How we would know it is wrong: If engines consistently detect the right language anyway, this is hygiene, but it costs nothing to fix.
Images without alt text
How we would know it is wrong: If image search traffic and accessibility audits show no gap, remaining alts are decorative.
Missing meta description
How we would know it is wrong: If SERP snippets for these pages read well (auto-extracted), impact is limited to CTR control.
og:url points to a different page than the live URL
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.
Duplicate titles across pages
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.
Title longer than 60 characters
How we would know it is wrong: If Google renders the full title untruncated in SERP for these pages, length was fine.
Tap targets smaller than 24x24 px on mobile
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.
Interactive controls with no accessible name
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.
Image alt text outside the 10-125 character 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.
Camera-default or meaningless image filenames
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.
IPTC DigitalSourceType is present but not an IPTC NewsCodes value
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.
Content pages more than 3 clicks from the home page
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.
Long article cites no external source
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.
Generic anchor text (“click here” style)
How we would know it is wrong: Descriptive anchors carry relevance; generic ones waste it. Replace and watch linked pages' queries in GSC.
Multiple H1 elements
How we would know it is wrong: Modern engines tolerate multiple H1s; treat as hygiene unless heading extraction visibly breaks.
Heading level skipped (e.g. H2 → H4)
How we would know it is wrong: If outline parsers (and AI passage extraction) still segment the page correctly, the skip is cosmetic.
Long post with very few in-body internal links
How we would know it is wrong: Quality-gate target is 3-10 internal links for 1500+ word posts; add contextual links and watch crawl/discovery of targets.
Duplicate meta descriptions
How we would know it is wrong: Unique descriptions restore per-page snippet control; if engines rewrite snippets anyway, impact is limited.
Meta description outside the 120-160 character band
How we would know it is wrong: Inside the band Google truncates less and rewrites less often; verify via SERP snippet.
Pages with no inbound internal links (within the crawled sample)
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.
Title shorter than 30 characters
How we would know it is wrong: Quality-gate band is 30-60 chars; a longer descriptive title should lift SERP CTR measurably.
No twitter:card meta
How we would know it is wrong: Share on X: without card markup the preview degrades; with it a summary card renders.
URL longer than 100 characters
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
Ranks on page one but is almost never clicked
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.
Blog post has no in-body link to a money page
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.
Mobile page shows much less content than desktop
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.
Blog post has no visible author byline
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.
No contact information anywhere in the crawl (no tel:/mailto:)
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.
No privacy or terms page found
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.
Blog post exposes no publication date
How we would know it is wrong: Recency drives AI citation eligibility; a machine-readable date (meta/time/schema) makes the post datable.
Pages are mostly shared template text with little unique content
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.
Thin content page (<300 words)
How we would know it is wrong: Expand or consolidate; if the page ranks and converts as-is (utility page), reclassify as intentional.
First mobile screen carries almost no text
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.
Homepage H1 does not mention the brand
How we would know it is wrong: Entity clarity: if AI answers already attribute the site to the right brand, skip.
Hands-on content shows no sign of first-hand experience
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.
English content is hard to read (Flesch below 30)
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.
Post older than 12 months with no visible update
How we would know it is wrong: Pages left stale 6+ months lose AI-citation eligibility (SE Ranking); refresh + dateModified should recover it.
Ranks just outside the positions that get clicks
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.
Paragraphs far beyond the 2-4 sentence guideline
How we would know it is wrong: Short paragraphs are an AI-extraction structural signal; split and watch passage-level citations.
Content below the word-count floor for its page type
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
Product schema missing required fields (name / image / offers)
How we would know it is wrong: Google Merchant listing requires all three; Rich Results Test reports the same missing fields.
LocalBusiness schema missing required fields (name / address)
How we would know it is wrong: Google's LocalBusiness docs require name + PostalAddress; Rich Results Test reports the same.
Article schema missing required fields (image / datePublished / publisher.logo)
How we would know it is wrong: Rich Results Test lists the exact missing required fields before the fix and passes after.
Invalid JSON-LD (parse error)
How we would know it is wrong: Rich Results Test must pass after fix; before, it reports the same parse failure.
Offer fields malformed (price / currency / availability)
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.
aggregateRating missing ratingValue or reviewCount
How we would know it is wrong: Both fields are required for star rich results; Rich Results Test reports the missing one.
Schema phone number does not match the phone on the page
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.
Schema URLs use a different trailing-slash form than the live URL
How we would know it is wrong: Align schema URLs with canonical form; Rich Results Test entity URLs should match live URLs exactly.
Structured data hygiene issues (context / relative URLs / placeholder / bad dates)
How we would know it is wrong: Rich Results Test reports these exact classes of error; clean markup validates silently.
Homepage has no Organization schema
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.
SaaS landing uses Product schema instead of SoftwareApplication
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.
Content page has no structured data at all
How we would know it is wrong: Rich Results Test shows zero detected items before, at least one after.
Product offer declares no shipping or return policy
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.
Product schema omits the fields merchants are matched on
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.
LocalBusiness geo coordinates below 4-decimal 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.
LocalBusiness priceRange is not a short symbolic range
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.
BlogPosting schema without datePublished
How we would know it is wrong: Recency drives AI citation eligibility; dated posts are extractable as fresh sources.
Deprecated schema types in use (HowTo / SpecialAnnouncement / …)
How we would know it is wrong: Google retired these rich results (HowTo 2023, SpecialAnnouncement 2025, FAQ rich results 2026); the markup earns nothing.
Structured data uses Microdata/RDFa instead of JSON-LD
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.
Organization schema has no sameAs links
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
The first (likely LCP) image is lazy-loaded
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.
Images without width/height (CLS risk)
How we would know it is wrong: Reserved dimensions eliminate late layout shifts; CLS field data improves after the fix.
Preloaded asset is never used on the page
How we would know it is wrong: DevTools console warns 'preloaded but not used within a few seconds', reproduce before, gone after.
Content images without decoding="async"
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.
Image-heavy page loads every image eagerly
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.
Mostly JPEG/PNG images with no responsive/modern delivery
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
Question headings are identical template boilerplate across articles
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.
Long content with no lists or tables
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.
Click handlers on non-interactive elements (agent-invisible)
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.
FAQ content present but no FAQPage schema
How we would know it is wrong: If the page's Q&A block already earns AI citations without schema, markup is optional reinforcement.
Opening paragraph buries the answer (BLUF)
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.
Form inputs without labels
How we would know it is wrong: Labeled inputs are operable by agents and assistive tech; a11y audit flags the same fields.
No <main>/<article> landmark
How we would know it is wrong: Landmarks let extractors isolate primary content from chrome; boilerplate-stripping quality improves.
Content page has no question-form 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
AI crawlers blocked in robots.txt
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.
Content invisible to AI crawlers (client-side rendered)
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.
Comparison-intent page has no comparison table
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.
Snippet controls block engines from quoting the page
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.
Question-intent page does not answer in the opening passage
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.
llms.txt points at URLs that are not live
How we would know it is wrong: Open the listed URLs: each should return 200. We sampled the first 10 same-origin links from llms.txt; if they all resolve now, the file was fixed or the sample was unlucky: re-run the audit.
No section falls in the citable passage band (~134-167 words)
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.
Definition page does not open with a definition sentence
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.
ProvenVisible's IndexNow key is not installed
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.
No llms.txt
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.
Sectioned post has no question-form headings
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.
Long article contains no specific figures to quote
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.
robots.txt advertises an RSL license that is missing or malformed
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.
Your RSL license document refuses ordinary clients
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.
Your RSL license prohibits AI use of this content
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.