229 SEO rules
What we check, why it matters and how it gets fixed. Balanseo fixes the ones tagged Auto on its own.
Indexability 58
Canonical chain Auto
The page the canonical points to has its own canonical to another page. Google may not follow the chain.
Fix: Point the canonical directly to the final target.
idx.canonical_chain · Medium
Canonical on HTTPS site points to an HTTP URL Auto
The HTTPS page's canonical points to its HTTP version.
Fix: Change the canonical to the HTTPS URL.
idx.canonical_http · Medium
No canonical tag Auto
A self-referencing canonical helps consolidate parameterized duplicates and protocol variations into a single URL.
Fix: Add <link rel="canonical" href="the page's full URL"> inside <head>.
idx.canonical_missing · Low
Multiple canonicals Auto
If there are multiple canonical tags, Google ignores all of them.
Fix: Keep a single canonical tag on the page.
idx.canonical_multiple · High
Canonical points to another domain
The page's canonical points to another domain; this page won't be indexed. If unintentional, it means serious traffic loss.
Fix: Unless intentional (syndication), point the canonical to a URL on this site.
idx.canonical_other_domain · Medium
Relative canonical URL Auto
A relative canonical (e.g. '/page') can resolve with the wrong domain or protocol.
Fix: Use an absolute URL with protocol and domain in the canonical.
idx.canonical_relative · Low
Canonical points to a noindex page Auto
The canonical target is noindex: Google gets two conflicting signals and may drop the page from the index.
Fix: Point the canonical to an indexable version, or remove the noindex on the target.
idx.canonical_to_noindex · High
Canonical points to a broken or redirecting URL Auto
The canonical target doesn't return 200. Google ignores the canonical and may choose the wrong URL.
Fix: Point the canonical to the final, indexable URL that returns 200.
idx.canonical_to_non200 · High
Page canonicalizes to another URL
This page marks another URL, not itself, as the preferred version.
Fix: If that's not intentional, set the canonical to the page's own URL.
idx.canonicalized · Info
Page is too deep (4+ clicks) Suggestion
Pages more than 4 clicks from the homepage get crawled less often and receive less authority.
Fix: Reduce depth by linking from category/hub pages or related posts.
idx.deep_page · Low
Page unreachable
Couldn't connect, timed out, or got stuck in a redirect loop.
Fix: Check server availability, DNS and SSL settings, and redirect rules.
idx.fetch_error · High
A large share of crawled pages return errors
More than 10% of pages return 4xx/5xx; search engines crawl the site less often.
Fix: Redirect or remove broken pages and update the internal links pointing to them.
idx.high_error_ratio · High
Homepage is noindex
The homepage has noindex: Google drops it from the index and finds the rest of the site harder. This is usually a leftover setting from a development environment.
Fix: Remove the meta robots noindex or X-Robots-Tag header from the homepage (WordPress: Settings → Reading → untick 'Discourage search engines').
idx.home_noindex · Critical
HTTP version doesn't redirect to HTTPS
The HTTP version of the site doesn't 301 to HTTPS. This creates duplicate content and a security risk.
Fix: Redirect all HTTP requests to HTTPS with a 301 on the server.
idx.https_redirect · High
Indexable page not in sitemap Auto
The sitemap is incomplete. This page can only be discovered through internal links.
Fix: Add the page to the sitemap.
idx.indexable_not_in_sitemap · Low
Meta refresh redirect Auto
Redirecting with <meta http-equiv="refresh"> is slow and link equity transfer is unclear.
Fix: Use a server-side 301 redirect.
idx.meta_refresh · Medium
Page is nofollow
Meta robots nofollow asks that no links on the page be followed; internal link equity isn't passed.
Fix: If it's not intentional, remove the 'nofollow' directive.
idx.nofollow_meta · Low
Page is noindex
The page is blocked from indexing via meta robots or X-Robots-Tag. If that's not intentional, you're losing traffic.
Fix: If you want the page to be searchable, remove noindex; if not, also remove its internal links and sitemap entry.
idx.noindex · Medium
noindex combined with canonical to another page
The page is both noindex and canonicalized to another URL; Google may ignore the canonical given this conflict.
Fix: Use only the canonical on duplicate pages; remove the noindex.
idx.noindex_canonical_conflict · Medium
noindex page in sitemap
A page listed in the sitemap is noindex. That sends Google a mixed signal.
Fix: Remove the page from the sitemap or remove noindex.
idx.noindex_in_sitemap · Medium
Orphan page (no internal links) Suggestion
A page that's in the sitemap but not linked from any page. Google treats it as unimportant.
Fix: Add internal links to the page from related content and category pages.
idx.orphan · Medium
Paginated pages canonicalize to the first page Auto
The canonical of pages like ?page=2 points to the first page; products/posts on later pages won't be discovered.
Fix: Each paginated page should have a self-referencing canonical.
idx.paginated_canonical_first · Medium
Parameterised URL is indexable Auto
A URL with query parameters is self-canonical or has no canonical, so the same content can be indexed under several URLs.
Fix: On parameterised pages, point the canonical to the URL without parameters.
idx.param_indexable · Low
Parameter trap: many variants of the same page
Filter, sort or tracking parameters create countless copies of the same page, wasting crawl budget.
Fix: Point the canonical of parameter variants to the main page and limit needless parameters via robots.txt or the link structure.
idx.param_trap · Medium
Removed page redirects to the homepage
Google treats redirecting unrelated pages to the homepage as a soft 404; the old page's value is not passed on.
Fix: Redirect to the closest relevant page; if there is none, return 410/404.
idx.redirect_to_home · Medium
robots.txt returns a server error
If robots.txt returns 5xx or 429, Google treats the whole site as uncrawlable for a while; if it persists, pages drop out of the index.
Fix: Make sure robots.txt always returns 200 (or 404 if intentional); check server, CDN and firewall rules.
idx.robots_5xx · Critical
Internal links point to pages blocked by robots.txt
Blocked pages cannot be crawled but, being linked, they can be indexed without their content; link value is wasted too.
Fix: If these pages really must be blocked, remove the links; if they should be indexed, update robots.txt.
idx.robots_blocked_linked · Info
robots.txt blocks CSS/JS files Auto
Google renders pages like a browser; if CSS and JavaScript are blocked it cannot see the content or mobile layout correctly.
Fix: Add Allow rules for the blocked CSS/JS folders (e.g. Allow: /folder/*.css$).
idx.robots_blocks_resources · High
robots.txt blocks the entire site Auto
Googlebot can't crawl the homepage. The site will drop out of search results.
Fix: Remove the 'Disallow: /' rule from robots.txt.
idx.robots_blocks_site · Critical
meta robots conflicts with X-Robots-Tag
The robots tag in the HTML and the X-Robots-Tag in the HTTP header say different things; the most restrictive one applies.
Fix: Align both signals to the same value; manage them from a single place.
idx.robots_conflict · Medium
Multiple conflicting robots meta tags
The page has several robots meta tags with different values; Google applies the most restrictive one.
Fix: Keep a single robots meta tag.
idx.robots_meta_multiple · Medium
robots.txt not found Auto
No robots.txt. It's not required, but recommended for declaring your sitemap location and managing crawl rules.
Fix: Add a robots.txt with a sitemap line to the root.
idx.robots_missing · Low
Unsupported noindex directive in robots.txt Auto
Since 2019 Google ignores noindex/nofollow lines in robots.txt; the pages stay indexed.
Fix: Remove these lines; to deindex a page use a meta robots noindex or X-Robots-Tag.
idx.robots_noindex_directive · Low
Invalid lines in robots.txt
Unknown directives and rules written before any User-agent line are ignored by search engines.
Fix: Start each group with a User-agent line and use only Allow, Disallow and Sitemap directives.
idx.robots_syntax · Low
robots.txt exceeds the 500 KB limit
Google reads only the first 500 KiB of robots.txt; rules after that are ignored.
Fix: Shrink the file by merging repeated rules with wildcards (*, $).
idx.robots_too_large · Medium
Sitemap URLs are blocked by robots.txt
The sitemap says 'index these' while robots.txt says 'don't crawl these'; Google gets mixed signals and cannot see the pages.
Fix: Either relax the robots.txt rule or remove these URLs from the sitemap.
idx.sitemap_blocked · High
Non-canonical URL in sitemap Auto
A URL in the sitemap is canonicalized to another page. The sitemap should only include preferred versions.
Fix: Add the canonical target to the sitemap and remove this URL.
idx.sitemap_canonicalized · Low
HTTP URLs in sitemap
The site uses HTTPS but the sitemap lists http:// URLs; Google does not want redirected URLs in sitemaps.
Fix: Generate every sitemap URL with https:// in its canonical form.
idx.sitemap_http_urls · Medium
Future lastmod dates in sitemap
Future dates, or a lastmod that changes on every crawl, make Google stop trusting the field.
Fix: Update lastmod only when the content really changes; check the server clock.
idx.sitemap_lastmod_future · Low
Invalid lastmod in sitemap
lastmod is ignored unless it uses the W3C date format (2026-10-13 or 2026-10-13T09:00:00+03:00).
Fix: Generate lastmod values in ISO 8601 format with the page's real last-modified date.
idx.sitemap_lastmod_invalid · Low
XML sitemap not found Auto
A sitemap helps search engines discover all your pages faster.
Fix: Create a sitemap.xml, declare it in robots.txt and submit it to Search Console.
idx.sitemap_missing · Medium
Sitemap URL doesn't return 200
The sitemap should only contain indexable URLs that return 200.
Fix: Remove redirecting and erroring URLs from the sitemap.
idx.sitemap_non200 · Medium
Sitemap not declared in robots.txt Auto
If the sitemap is declared in robots.txt with a 'Sitemap:' line, all bots can find it.
Fix: Add a 'Sitemap: https://yourdomain/sitemap.xml' line to robots.txt.
idx.sitemap_not_in_robots · Low
Sitemap lists URLs from another domain
A sitemap may only list URLs on its own domain; others are ignored.
Fix: Remove URLs from other domains or move them to that domain's own sitemap.
idx.sitemap_offhost · Medium
Sitemap file exceeds the limit
A single sitemap may hold at most 50,000 URLs and 50 MB (uncompressed); larger files are not read.
Fix: Split the sitemap into parts and link them from a sitemap index file.
idx.sitemap_too_large · High
Soft 404 (error page returns 200)
The page says 'not found' but the server returns 200. Google treats this as a soft 404 and crawl budget is wasted.
Fix: Return 404/410 for pages that truly don't exist, or 301 to a relevant page.
idx.soft_404 · High
Page returns a 4xx error Auto
A page your site links to returns 4xx (usually 404). Visitors and crawl budget are wasted.
Fix: Restore the page or add a 301 redirect to the most relevant page; update internal links.
idx.status_4xx · High
Server error (5xx)
The server can't generate the page. When Google sees repeated 5xx errors it slows crawling, and the page may drop out of the index.
Fix: Check the server logs; fix the application error, timeout or resource shortage.
idx.status_5xx · Critical
Inconsistent www / non-www version
Both the www and non-www versions serve content; authority is split between two hosts.
Fix: 301 redirect the version you don't prefer to the one you do.
idx.www_consistency · Medium
URLs differing only by case
Uppercase and lowercase versions of the same URL are crawled as separate pages (duplicate content).
Fix: Pick a single lowercase version and 301-redirect the others.
url.case_duplicate · Medium
Too many folder levels in URL
More than five folder levels signal a complex structure to users and bots.
Fix: Simplify your information architecture; move important pages to higher levels.
url.deep_path · Info
Double slash in URL path
Paths containing '//' usually come from faulty link generation and create duplicate URLs.
Fix: Fix the template that generates the links and redirect double-slash URLs to the single-slash version.
url.double_slash · Low
Too many parameters in URL
URLs with more than three parameters waste crawl budget and create duplicate pages.
Fix: Point filter/sort parameters to the main version with a canonical, or restrict them in robots.txt.
url.many_params · Low
Session ID in URL
URLs containing a session ID change on every visit, creating endless duplicate pages and wasted crawling.
Fix: Move the session to a cookie; remove the parameter from links.
url.session_id · High
URL is too long
URLs over 115 characters get truncated when shared and are hard to read in search results.
Fix: Use short, descriptive URLs by removing unnecessary folders and words.
url.too_long · Low
Inconsistent trailing slash
Both '/page' and '/page/' return 200; Google treats them as two separate pages.
Fix: Pick one and 301-redirect the other, or add a canonical.
url.trailing_slash_duplicate · Medium
Underscores in URL
Google recommends hyphens (-) as word separators; underscores join words together.
Fix: Use hyphens in new URLs; if existing ones rank well, there's no need to change them.
url.underscore · Info
Uppercase characters in URL
Servers often treat upper and lower case as different addresses; two versions of the same page can appear.
Fix: Convert URLs to lowercase and 301-redirect the old addresses.
url.uppercase · Low
Title & meta 27
Character set not declared
Without a charset, Turkish characters may display incorrectly.
Fix: Add <meta charset="utf-8"> at the top of <head>.
meta.charset_missing · Low
Meta description duplicated on other pages Auto
Duplicate descriptions make pages indistinguishable from each other in search results.
Fix: Write a unique description for each page.
meta.desc_duplicate · Medium
Meta description same as title Auto
The description repeats the title, missing the chance to add more information in search results.
Fix: Describe the page's content and value in 1-2 sentences.
meta.desc_eq_title · Low
No meta description Auto
Without a description, Google fills the snippet with a random excerpt from the page, and CTR drops.
Fix: Write a 70-160 character description with a benefit and a call to action.
meta.desc_missing · Medium
Meta description is too long Auto
Descriptions longer than 160 characters get truncated.
Fix: Shorten the description; put the key information first.
meta.desc_too_long · Low
Meta description too short Auto
Descriptions shorter than 70 characters waste snippet space.
Fix: Expand the description.
meta.desc_too_short · Low
Missing favicon
Google shows favicons in mobile results; without one, a generic icon appears.
Fix: Add a square favicon (at least 48x48).
meta.favicon_missing · Info
H1 duplicated on other pages
Pages sharing the same H1 may be targeting the same topic.
Fix: Make the H1 unique to the page.
meta.h1_duplicate · Low
Empty H1
The page has an H1 tag, but it's empty (or contains only an image).
Fix: Write H1 text that describes the page's topic.
meta.h1_empty · Medium
Missing H1 heading Auto
The H1 tells both users and search engines what the page is mainly about.
Fix: Add a single H1 at the top of the page that describes its topic.
meta.h1_missing · High
Multiple H1s
Using more than one H1 blurs the main topic.
Fix: Keep one H1 and turn the others into H2s.
meta.h1_multiple · Low
H1 too long
An H1 over 70 characters loses focus; the heading reads like a paragraph.
Fix: Keep the H1 short and clear; move details to a subheading.
meta.h1_too_long · Low
Heading hierarchy skips levels
Jumps like going from H2 to H4 break content structure and accessibility.
Fix: Use headings in order (H1 → H2 → H3).
meta.heading_skip · Low
Outdated meta keywords tag
Google has ignored meta keywords since 2009; it just hands competitors your keyword list.
Fix: Remove the tag.
meta.keywords_tag · Info
Missing html lang attribute Auto
The lang attribute helps with language detection and screen readers.
Fix: Add a language code, e.g. <html lang="en">.
meta.lang_missing · Low
No subheadings in long content
Content over 600 words without H2s is a wall of text that's hard to scan and read.
Fix: Break the content into sections with H2 subheadings.
meta.no_h2 · Low
Title is in all caps Auto
All-caps titles look like shouting and are hard to read; Google sometimes rewrites them.
Fix: Write the title in normal sentence case; capitalise only proper names.
meta.title_all_caps · Low
Title starts with the brand name Auto
With the brand first, the page topic risks being truncated and click-through rate drops (homepage excluded).
Fix: Put the topic first and the brand last, as ' | Brand'.
meta.title_brand_first · Info
Title is only the brand name Auto
The title consists only of the brand/site name; the page's topic isn't visible in search results.
Fix: Put the page topic first and the brand last.
meta.title_brand_only · Medium
Title duplicated on other pages Auto
Pages sharing the same title compete with each other (cannibalization) and CTR drops.
Fix: Give each page a unique title that describes its own content.
meta.title_duplicate · High
Title and H1 are identical
Having them match isn't an error, but different variations let you target more queries.
Fix: Write the title to encourage clicks, and the H1 as the on-page heading.
meta.title_eq_h1 · Info
No title tag Auto
The title is the blue headline in search results and one of the strongest on-page signals.
Fix: Write a unique 30-60 character title that covers the page's topic and main keyword.
meta.title_missing · Critical
Multiple title tags Auto
The page has multiple <title> tags; search engines have to guess which one to use.
Fix: Keep a single <title>.
meta.title_multiple · Medium
Title pixel width too long Auto
Even if the character count is fine, wide letters can cause the title to be truncated in search results (~580 px).
Fix: Choose shorter words or move the important part to the front.
meta.title_pixel_width · Info
Repeated words in title Auto
Using the same word three or more times in the title can be seen as keyword stuffing.
Fix: Use the word once; use the remaining space for the value proposition.
meta.title_stuffing · Medium
Title too long Auto
Titles longer than ~60 characters (≈580px) get truncated in search results.
Fix: Move the most important words to the front and shorten the title.
meta.title_too_long · Low
Title too short Auto
Titles shorter than 30 characters miss an opportunity.
Fix: Expand the title with your brand and qualifiers.
meta.title_too_short · Medium
Content 16
Duplicate content Auto
This page's text is identical to other pages.
Fix: Merge the duplicates, point to a single version with canonical, or differentiate the content.
content.duplicate · High
Duplicate subheadings
H2/H3 headings with the same text make sections hard to tell apart and make a table of contents meaningless.
Fix: Write each subheading to match the content of its section.
content.duplicate_headings · Low
Empty subheading
Empty H2–H6 tags break the page outline; screen readers announce an empty heading.
Fix: Remove empty headings or add text; use CSS for visual spacing.
content.empty_heading · Low
Sentences are too long
Average sentence length exceeds 25 words; the text is hard to read.
Fix: Split long sentences and cut unnecessary clauses.
content.hard_to_read · Info
Keyword overused
A single word makes up more than 4% of the text; this looks unnatural and can be a spam signal.
Fix: Use synonyms and natural language; reduce repetition.
content.keyword_stuffing · Medium
Paragraphs are too long
Paragraphs over 150 words are hard to read on mobile and less likely to be quoted in AI summaries.
Fix: Break paragraphs into chunks of 2-4 sentences.
content.long_paragraphs · Info
Placeholder text (lorem ipsum)
The page has leftover placeholder text from a template.
Fix: Replace it with real content.
content.lorem · High
Low text-to-HTML ratio
Only a tiny part of the HTML is visible text. This may signal code bloat or thin content.
Fix: Reduce unnecessary inline code and markup, and add content.
content.low_text_ratio · Info
Garbled characters (encoding error)
Garbled characters such as 'ü', 'ş' or 'ı' point to a character encoding (UTF-8) error; the text is unreadable and search engines index it wrongly.
Fix: Use UTF-8 in the database, the files and the HTTP header, and repair the corrupted text.
content.mojibake · High
Near-duplicate content Auto
The text is largely the same as other pages (only a few words differ). Google will pick one of them and hide the rest.
Fix: Merge the pages, add a canonical, or give each page unique content.
content.near_duplicate · Medium
No images in long content
A page with over 500 words has no images; images make reading easier and bring traffic from Google Images.
Fix: Add at least one descriptive image that supports the content.
content.no_images · Info
Long content has no table of contents
In content over 2,000 words with many sections, in-page links guide the reader; Google may show them as 'jump to' links.
Fix: Add a table of contents at the top that links to the H2 headings (give each H2 an id and link to #id).
content.no_toc · Info
Outdated year in title
An old year in the title or H1 ('2023 guide') tells searchers the page is out of date, which lowers the click-through rate.
Fix: Update the content and the year, or remove the year from the title.
content.outdated_year · Low
Under construction / placeholder text
The page contains signs of unfinished content such as 'coming soon', 'under construction' or 'test page'.
Fix: Finish the page, or noindex it until it's ready.
content.placeholder · Low
Thin content (low word count) Suggestion
Content under 200 words usually isn't enough to satisfy the query; it falls behind in 'helpful content' evaluation.
Fix: Expand the content to answer users' questions; add examples, data and FAQs.
content.thin · Medium
Title topic doesn't appear in the content
None of the main words in the title appear in the page text; the title and content look mismatched.
Fix: Cover the title's topic naturally in the content, or update the title to match the content.
content.title_terms_missing · Low
Links & redirects 22
Broken external link Auto
The page links to an external resource that no longer works. It hurts user experience and trust.
Fix: Replace the link with an up-to-date resource or remove it.
links.broken_external · Medium
In-page anchor target missing
The target of '#section' links doesn't exist on the page; clicking goes nowhere (tables of contents often break).
Fix: Match the anchor name to the target heading's id.
links.broken_fragment · Low
Broken internal link Auto
The page links to an internal page that returns 4xx/5xx.
Fix: Replace the link with the correct URL or remove it; add a 301 if the target has moved.
links.broken_internal · High
Link without anchor text
Links with no text, no image alt or aria-label: Google can't tell what the target is about, and screen readers can't convey its purpose.
Fix: Add visible text to the link, alt to its image, or an aria-label.
links.empty_anchor · Medium
Non-descriptive link text
Link text like 'click here' or 'read more' says nothing about the target page.
Fix: Write link text that describes the target page's topic.
links.generic_anchor · Low
Many internal links point to redirects
More than 10% of internal links point to redirected URLs; each one costs crawl budget and page speed.
Fix: Update links in menus, templates and content to the final URL.
links.high_redirect_ratio · Medium
Internal link from HTTPS page to HTTP
Internal links point to the HTTP version, adding an extra redirect on every click and sending mixed signals.
Fix: Update internal links to https://.
links.https_to_http · Medium
nofollow on internal link
nofollow links to your own pages cut off the flow of internal link equity.
Fix: Remove rel=nofollow from internal links.
links.internal_nofollow · Low
JavaScript-only links
Google cannot follow links without an href or that rely on onclick or javascript:; target pages may never be discovered.
Fix: Build navigation with <a href="/path"> and layer the JavaScript behaviour on top.
links.js_only · Medium
Anchor text too long
Anchor text over 100 characters blurs context; usually a whole paragraph has been turned into a link.
Fix: Keep anchor text to a short phrase that describes the target.
links.long_anchor · Info
No internal links on the page Suggestion
Dead-end page: crawlers and users can't move on to the rest of the site.
Fix: Link to related pages, the category and the homepage.
links.no_outlinks · Medium
Temporary (302/307) redirect Auto
A temporary redirect is used for a permanent move; passing authority may be delayed.
Fix: If the move is permanent, use 301/308.
links.redirect_302 · Low
Redirect chain Auto
The URL redirects through multiple hops. Each hop costs link equity and speed.
Fix: Collapse the chain into a single 301: the first URL should go straight to the final target.
links.redirect_chain · Medium
Redirect loop Auto
The URLs redirect to each other; the page never loads.
Fix: Remove one of the rules in the loop.
links.redirect_loop · Critical
Internal link redirects to another domain
A URL on the site redirects to another domain; internal links send users off the site without them noticing.
Fix: Check the redirect; if intentional, replace the link with the external URL directly.
links.redirect_offsite · Medium
Only one internal link Suggestion
Only one page on the site links to this indexable page; its importance signal is weak.
Fix: Add more internal links from related pages and category pages.
links.single_inlink · Info
Missing noopener on target="_blank" links
External links that open in a new tab can access the opening page in older browsers (tabnabbing).
Fix: Add rel="noopener" to external links.
links.target_blank_unsafe · Info
Internal links to canonicalised pages
The linked page declares another URL as canonical; internal links should go straight to the canonical URL.
Fix: Replace the link with the target page's canonical URL.
links.to_canonicalized · Low
Internal links to noindex pages
The linked page is noindex; link value flows to a page that will not be indexed.
Fix: Point these links to an indexable page or remove the noindex from the target page.
links.to_noindex · Low
Internal link points to a redirect Auto
An internal link points to a redirecting URL. Every redirect means latency and wasted crawl.
Fix: Update the link to point directly to the final URL.
links.to_redirect · Low
Too many links
More than 300 links dilutes link equity per page and overwhelms users.
Fix: Cut unnecessary links.
links.too_many · Info
Too many external links
More than 100 external links dilutes the page's link equity and can look spammy.
Fix: Remove unnecessary external links; add rel="sponsored" to ad/affiliate links.
links.too_many_external · Info
Images 13
ALT text looks like a file name
ALT text like 'IMG_1234.jpg' doesn't describe the image; it's no better than an empty ALT.
Fix: Write a natural ALT that describes what's in the image.
img.alt_filename · Medium
Image missing ALT text Auto
ALT text is needed for visually impaired users and Google Images.
Fix: Write a short, natural ALT text describing the image. Use alt="" for decorative images.
img.alt_missing · Medium
Duplicate ALT text
Three or more images on the page use the same ALT text; the images can't be told apart.
Fix: Write a unique ALT for each image based on its content.
img.alt_repeated · Info
ALT text is too long
ALT text over 125 characters gets cut off by screen readers and looks like keyword stuffing.
Fix: Keep the ALT to a short sentence describing the image.
img.alt_too_long · Low
Broken image
The image fails to load (4xx/5xx).
Fix: Fix the image path or remove the image.
img.broken · High
Image file name is not descriptive
File names like 'IMG_1234.jpg' tell Google Images nothing about the picture.
Fix: Upload images with short, hyphenated names that describe them (e.g. filter-coffee-brewing.jpg).
img.generic_filename · Info
Image file is too large
Images over 300 KB slow the page down and hurt LCP.
Fix: Resize the image to its display size, convert it to WebP/AVIF and compress it.
img.large_file · Medium
First image is lazy-loaded
The page's first image (most likely the LCP element) has loading="lazy"; the browser downloads it late and LCP suffers.
Fix: Remove loading="lazy" from the first image and add fetchpriority="high".
img.lcp_lazy · Medium
Outdated image format
Using WebP/AVIF instead of JPEG/PNG cuts image size by 25-50%.
Fix: Convert images to WebP or AVIF.
img.legacy_format · Info
Image missing width/height Auto
Images without set dimensions shift the page as they load (CLS).
Fix: Add width and height to img tags, or use CSS aspect-ratio.
img.no_dimensions · Low
Images aren't lazy-loaded Auto
Loading below-the-fold images right away slows down the initial load.
Fix: Add loading="lazy" to all images except the first.
img.no_lazy · Low
No responsive images (srcset)
Images are served in a single size; mobile devices download larger files than needed.
Fix: Serve multiple widths with srcset/sizes or <picture>.
img.no_srcset · Info
Too many images on the page
More than 100 images increase page weight and request count, slowing the page on mobile.
Fix: Paginate galleries, use lazy loading and move decorative images to CSS.
img.too_many · Info
Structured data 19
Missing image in Article markup
image is recommended for Article/BlogPosting; without it, no image is shown in Discover and rich results.
Fix: Add an image at least 1200 px wide to the image field.
sd.article_no_image · Medium
Invalid BreadcrumbList
Positions in itemListElement aren't sequential or name/item is missing; Google won't show the breadcrumb.
Fix: Give each item a sequential position starting at 1, a name and an item (except the last one).
sd.breadcrumb_invalid · Medium
Missing @context in JSON-LD
Without @context "https://schema.org" the markup can't be interpreted.
Fix: Add "@context": "https://schema.org" to every root object.
sd.context_missing · Medium
Schema type no longer produces rich results
Google retired HowTo rich results in 2023; this markup no longer changes how the page appears in search.
Fix: The markup does no harm, but don't invest in it for rich results; list the steps clearly in the content instead.
sd.deprecated_rich_result · Info
Duplicate schema type
The page has more than one of the same singular type (e.g. two Organization or two BreadcrumbList); Google picks one and ignores the other.
Fix: Merge the duplicate markup (usually a theme + plugin conflict).
sd.duplicate_type · Low
Invalid date in structured data
datePublished / dateModified must be in ISO 8601 format (e.g. 2026-10-12 or 2026-10-12T09:00:00+03:00).
Fix: Convert dates to ISO 8601 format.
sd.invalid_date · Medium
No structured data (schema.org) Auto
JSON-LD is used for rich results (stars, prices, FAQs) and to help AI search engines understand the page.
Fix: Add JSON-LD that fits the page type (Organization, Article, Product, BreadcrumbList...).
sd.missing · Low
No breadcrumb schema Auto
BreadcrumbList shows the site hierarchy instead of the URL in search results.
Fix: Add BreadcrumbList JSON-LD.
sd.no_breadcrumb · Info
No Organization/WebSite schema on homepage Auto
Organization and WebSite schemas feed the brand knowledge panel and site name.
Fix: Add Organization (logo, sameAs) and WebSite schema to the homepage.
sd.no_org_home · Low
Invalid stock status (availability)
availability is not a schema.org value; Google cannot show stock information.
Fix: Use one of the values such as https://schema.org/InStock, OutOfStock or PreOrder.
sd.offer_availability_invalid · Low
Missing logo or sameAs in Organization
A logo and social profiles (sameAs) in Organization markup boost brand recognition in knowledge panels and AI answers.
Fix: Add logo (absolute URL) and sameAs (social profile URLs).
sd.org_incomplete · Low
Broken JSON-LD Auto
The JSON-LD block isn't valid JSON; search engines ignore it completely.
Fix: Fix the JSON syntax (commas, quotes, escape characters).
sd.parse_error · High
Schema price not visible on the page
The price in the Product schema was not found in the page text; Google may treat a wrong or hidden price as misleading markup.
Fix: Make sure the schema price matches the price shown on the page (including discounts and VAT).
sd.price_mismatch · Low
Missing price in Product
Product rich results require price and priceCurrency in offers; without them Google won't show the price.
Fix: Add offers.price, offers.priceCurrency (e.g. TRY) and availability.
sd.product_offer_incomplete · High
Invalid rating markup
ratingValue is out of range or ratingCount/reviewCount is missing; Google will not show stars.
Fix: Keep ratingValue within bestRating/worstRating (1–5 by default) and add ratingCount or reviewCount.
sd.rating_invalid · Medium
Recommended schema field missing
Recommended fields let rich results show more information.
Fix: Fill in the recommended fields.
sd.recommended_missing · Info
Relative URL in structured data
url, image and logo fields in JSON-LD must be absolute (https://...); relative URLs may be ignored.
Fix: Write URLs in full, starting with https://.
sd.relative_url · Low
Required schema field missing Auto
Fields Google requires for rich results are missing.
Fix: Add the missing fields to the JSON-LD.
sd.required_missing · Medium
Self-serving review markup
Since 2019, ratings an Organization/LocalBusiness gives itself on its own site are not shown as stars.
Fix: Move aggregateRating to Product/Service markup; use Google Business Profile for business ratings.
sd.review_self_serving · Low
International 9
Page with hreflang is canonicalised elsewhere
When the canonical points to another URL, Google ignores the hreflang tags on this page.
Fix: Put hreflang only on self-canonical pages, or fix the canonical.
intl.hreflang_canonical_conflict · Medium
Invalid hreflang code Auto
hreflang must be an ISO 639-1 language code (+ optional ISO 3166-1 region) or x-default.
Fix: Fix codes to the format 'tr', 'en-gb', 'x-default'.
intl.hreflang_invalid · Medium
hreflang isn't reciprocal Auto
If page A points to B, B must point back to A; otherwise Google ignores the hreflang.
Fix: Add the same hreflang set to all language versions.
intl.hreflang_no_return · Medium
hreflang doesn't include the page itself Auto
The hreflang set should also include the page's own URL.
Fix: Add an hreflang line for the page's own language.
intl.hreflang_no_self · Medium
No x-default hreflang Auto
x-default specifies the default version for users with no matching language.
Fix: Add an x-default line.
intl.hreflang_no_xdefault · Info
hreflang target doesn't return 200 Auto
A language version referenced by hreflang returns an error or redirect; Google may ignore the entire cluster.
Fix: Use only final (non-redirecting) URLs that return 200 in hreflang.
intl.hreflang_target_error · High
hreflang target is noindex or canonicalized elsewhere Auto
The language version can't be indexed (noindex or a different canonical); the hreflang cluster becomes invalid.
Fix: Use only indexable, self-canonical versions in hreflang.
intl.hreflang_target_noindex · Medium
Invalid html lang value
The html lang attribute isn't a valid language code (e.g. it should be 'tr', not 'turkish').
Fix: Use an ISO 639-1 code: tr, en, en-GB…
intl.lang_invalid · Low
html lang doesn't match hreflang
The page declares a different language in its own hreflang entry; the language signals conflict.
Fix: Set html lang and the page's own hreflang code to the same language.
intl.lang_mismatch · Low
Performance 19
Broken CSS / JavaScript file
A CSS or JS file loaded by the page returns an error; the page may look broken and Google renders it incompletely.
Fix: Fix the file path or remove it from the template.
perf.broken_asset · High
Excessive DOM size
More than 1500 HTML elements increase memory use, style calculation and interaction latency (INP).
Fix: Reduce unnecessary wrapper divs, hidden menu duplicates and long lists (pagination / lazy loading).
perf.dom_size · Medium
Page is too heavy
HTML plus images exceed 3 MB; the page loads slowly on mobile connections.
Fix: Compress images or convert them to WebP, lazy-load off-screen ones and remove unused resources.
perf.heavy_page · Medium
HTML is too large
HTML is larger than 500 KB. Parsing and first paint are delayed.
Fix: Reduce inline data/styles/scripts, use pagination.
perf.large_html · Low
Large inline CSS
Inline <style> blocks over 50 KB bloat the HTML and can't be cached.
Fix: Move non-critical CSS to an external file.
perf.large_inline_css · Info
Very large inline JavaScript
Script over 100 KB embedded in the HTML is downloaded and parsed again on every page view.
Fix: Move the inline script into a separate, cacheable file.
perf.large_inline_js · Low
Missing fetchpriority on hero image
The first large image lacks fetchpriority="high"; the browser gives the LCP image the same priority as other resources.
Fix: Add fetchpriority="high" to the page's first/main image.
perf.lcp_priority · Info
Too many web fonts
More than four font files/families slow down the initial load and delay text rendering.
Fix: Reduce the number of families and weights, use a variable font, and add font-display: swap.
perf.many_fonts · Low
Missing cache header
Cache-Control is not set; CDN and browser caching work inefficiently.
Fix: Add an appropriate Cache-Control header.
perf.no_cache_header · Info
Compression is off
HTML is sent without gzip/brotli compression; transfer size is 3-5x larger.
Fix: Enable gzip/brotli compression on your server or CDN.
perf.no_compression · Medium
Server does not return 304 Not Modified
ETag/Last-Modified is present but the server answers conditional requests with the full page instead of 304, wasting Google's crawl budget.
Fix: Make If-None-Match / If-Modified-Since requests return 304 (a setting on most servers and CDNs).
perf.no_conditional_get · Low
Missing preconnect for critical third-party origins
Critical resources load from other domains (such as fonts or a CDN), but the connection isn't opened in advance.
Fix: Add <link rel="preconnect" href="https://domain" crossorigin> (2-3 domains at most).
perf.no_preconnect · Info
Pages have no ETag / Last-Modified
Without validator headers, browsers and Googlebot download unchanged pages in full every time.
Fix: Enable the ETag or Last-Modified header on the server or CDN.
perf.no_validators · Low
Render-blocking script
Scripts in <head> without async/defer delay the page from appearing.
Fix: Add defer or async to scripts.
perf.render_blocking_js · Low
Slow server response
Server response time is over 800 ms. A high TTFB also worsens LCP.
Fix: Use page caching, a CDN, database query optimization or a more powerful server.
perf.slow_response · Medium
Short cache lifetime for static files
CSS, JS, fonts and images are cached for less than 7 days; returning visitors download everything again.
Fix: Serve versioned static files with Cache-Control: public, max-age=31536000, immutable.
perf.static_cache_short · Medium
Too many third-party scripts
Scripts load from more than ten different domains; each adds DNS, connection and main-thread cost.
Fix: Remove unused tags; use a tag manager and deferred loading.
perf.third_party_scripts · Medium
Too many CSS files
More than six stylesheets means a separate request and render blocking for each.
Fix: Combine CSS files; inline critical CSS and defer the rest.
perf.too_many_css · Low
Too many resources
The page loads more than 60 scripts/styles/images.
Fix: Combine resources and remove unnecessary third-party scripts.
perf.too_many_requests · Low
Mobile & accessibility 11
Autoplaying media with sound
Autoplaying video/audio that is not muted annoys users, and browsers usually block it.
Fix: If you use autoplay, add muted, or let the user start playback.
a11y.autoplay_media · Low
Button without an accessible name
Buttons without text or aria-label are announced just as 'button' by screen readers; their purpose is unclear.
Fix: Give the button visible text or an aria-label (especially icon buttons).
a11y.button_no_name · Medium
Deprecated HTML tags
Tags like <font>, <center> and <marquee> were removed in HTML5; they signal an old, unmaintained template.
Fix: Replace these tags with CSS.
a11y.deprecated_tags · Info
Duplicate id attributes
Repeated ids break form labels, aria references and in-page anchors.
Fix: Make every id unique on the page.
a11y.duplicate_ids · Low
Missing title on iframe
Iframes (video, maps) without a title attribute can't be described to screen readers.
Fix: Add a short title to every iframe (e.g. title="Product demo video").
a11y.iframe_no_title · Low
Unlabeled form field
Screen readers can't make sense of form fields without labels.
Fix: Add a <label for> or aria-label to every input.
a11y.input_no_label · Low
No <main> landmark
<main> lets screen readers jump straight to the content; AI and search engines also separate the main content more easily.
Fix: Wrap the page's main content in a single <main> element.
a11y.no_main · Info
Positive tabindex used
A tabindex greater than 0 makes the keyboard order diverge from the visual order.
Fix: Use tabindex="0" or -1 and set the order through the HTML structure.
a11y.positive_tabindex · Low
Fixed-width viewport Auto
A fixed viewport like width=1024 makes the page open on mobile as a shrunken desktop view.
Fix: Use width=device-width, initial-scale=1.
mobile.fixed_viewport · Medium
Missing viewport meta tag Auto
Without a viewport, the page renders at desktop width on mobile. Google uses mobile-first indexing.
Fix: Add <meta name="viewport" content="width=device-width, initial-scale=1">.
mobile.viewport_missing · High
Zoom is disabled Auto
user-scalable=no or maximum-scale=1 hurts accessibility.
Fix: Remove these restrictions from the viewport.
mobile.zoom_disabled · Medium
Security 14
Cookie without Secure flag
On an HTTPS site, cookies without the Secure flag can also be sent over unencrypted connections.
Fix: Add Secure to all cookies, plus HttpOnly and SameSite to session cookies.
sec.cookie_insecure · Low
Sensitive files are publicly accessible
Files such as .git or .env are publicly accessible: source code, database passwords or API keys may leak.
Fix: Block access to these paths on the server immediately (403/404) and rotate any exposed keys and passwords.
sec.exposed_files · Critical
Form submits to an HTTP URL
Form data on an HTTPS page goes to an unencrypted HTTP URL; browsers show a warning and the data can be read.
Fix: Change the form action URL to https://.
sec.form_insecure_action · High
HSTS max-age is too short Auto
Strict-Transport-Security max-age is under 6 months; browsers soon forget that HTTPS is required.
Fix: Use max-age=31536000 (1 year); add includeSubDomains if every subdomain uses HTTPS.
sec.hsts_weak · Low
Missing security headers Auto
X-Content-Type-Options, X-Frame-Options/CSP frame-ancestors and Referrer-Policy provide basic protection.
Fix: Add the missing headers on your server or CDN.
sec.missing_headers · Info
Mixed content (HTTP resource on HTTPS page) Auto
The HTTPS page loads scripts/images over HTTP; the browser may block them.
Fix: Change resource URLs to https://.
sec.mixed_content · High
Missing Content-Security-Policy
CSP limits malicious scripts from running even if the site has an XSS vulnerability; it's also a trust signal.
Fix: Start with Content-Security-Policy-Report-Only, then publish a restrictive policy.
sec.no_csp · Low
Missing HSTS header Auto
Strict-Transport-Security makes browsers always connect to the site over HTTPS.
Fix: Add Strict-Transport-Security: max-age=31536000; includeSubDomains.
sec.no_hsts · Low
Script from a public CDN has no integrity (SRI)
If the file on the public CDN is tampered with, malicious code reaches the site; the integrity attribute prevents this.
Fix: Add integrity="sha384-…" and crossorigin="anonymous" to the script tag.
sec.no_sri · Info
Page is not HTTPS
HTTPS is a ranking signal; browsers mark HTTP pages as 'not secure'.
Fix: Install an SSL certificate and redirect all traffic to HTTPS.
sec.not_https · High
Password field submitted via GET
In a form with method=GET, the password ends up in the address bar, server logs and browser history.
Fix: Use method="post" for forms with passwords.
sec.password_get · Medium
Server version exposed
The Server header reveals the software version, making attackers' job easier.
Fix: Remove version info from the Server header.
sec.server_version · Info
JavaScript library with known vulnerabilities
The site loads an old library version with known vulnerabilities; it may be open to client-side attacks.
Fix: Upgrade the library to a current version; on WordPress, update the theme and plugins.
sec.vulnerable_js_lib · Medium
X-Powered-By header reveals the stack
X-Powered-By reveals the language and version (e.g. PHP/7.4), making it easier for attackers to pick targets.
Fix: Turn the header off: expose_php=Off in PHP, app.disable('x-powered-by') in Express, remove it from customHeaders in IIS.
sec.x_powered_by · Info
Social sharing 7
og:image is broken Auto
The share image returns an error; the card appears without an image on social media.
Fix: Replace og:image with a working image of at least 1200×630.
social.og_image_broken · Medium
Missing og:image Auto
Open Graph is present but there's no image; shares appear as a small card without an image.
Fix: Add an og:image of at least 1200×630 px.
social.og_image_missing · Medium
Relative og:image URL
Facebook, LinkedIn and X don't resolve relative image URLs; the image won't show when shared.
Fix: Use an absolute URL starting with https:// for og:image.
social.og_image_relative · Low
Missing Open Graph tags Auto
og:title, og:description and og:image define the share preview on WhatsApp, LinkedIn and Facebook.
Fix: Add the missing og: tags (1200x630 recommended for the image).
social.og_missing · Low
Missing og:type Auto
Without og:type the share card falls back to 'website'; articles and products are not recognised correctly.
Fix: Add og:type (website on the homepage, article on posts, product on product pages).
social.og_type_missing · Info
og:url differs from canonical
Shares use og:url; if it differs from the canonical, like/share counts are split across two URLs.
Fix: Make og:url match the canonical URL.
social.og_url_mismatch · Low
No Twitter/X Card Auto
twitter:card is not set; share previews on X look small or empty.
Fix: Add twitter:card="summary_large_image".
social.twitter_card_missing · Info
AI search (GEO) 14
AI bots blocked in robots.txt Auto
If bots like GPTBot, ClaudeBot and PerplexityBot are blocked, your site can't be cited as a source in AI answers.
Fix: If you want to show up in AI search, allow the search bots (OAI-SearchBot, Claude-SearchBot, PerplexityBot).
geo.ai_bots_blocked · Medium
Content seems to depend on JavaScript
There's almost no text in the raw HTML. Most AI bots don't run JS, so they can't see the content.
Fix: Use server-side rendering (SSR) or static pre-rendering.
geo.client_rendered · Medium
Invalid llms.txt format Auto
llms.txt should start with a '# Site name' heading and contain links in '- [Title](url)' format; otherwise AI tools can't parse the file.
Fix: Update the file to follow the llmstxt.org format.
geo.llms_txt_invalid · Low
No llms.txt Auto
llms.txt is a new standard that gives language models your site's most important pages and a short summary.
Fix: Add an /llms.txt to the root with a site summary and links to key pages.
geo.llms_txt_missing · Low
No About / Contact page found
Pages that show who you are and how to reach you are a key signal for trust (E-E-A-T) and AI citations.
Fix: Create About and Contact pages and link to them from the main menu or footer.
geo.no_about_contact · Medium
No author / E-E-A-T signal Auto
Author and publish date on article pages matter both for Google's E-E-A-T evaluation and for AI citations.
Fix: Add author and datePublished to the Article schema, and show an author box on the page.
geo.no_author · Low
No date in content
Long content has no published/updated date; AI answer engines and Google can't judge freshness.
Fix: Add a visible date (<time datetime>) and datePublished/dateModified in the schema.
geo.no_date · Low
No Q&A structure Auto
AI engines love quoting question-style headings and short, clear answers.
Fix: Add question-style H2/H3s and FAQPage schema to long-form content.
geo.no_faq_structure · Info
No question-style subheadings
Headings phrased the way users ask ("How do I ...?") improve the chance of matching in AI and voice search.
Fix: Phrase relevant subheadings as user questions and give a short answer right below.
geo.no_question_headings · Info
No quotable intro paragraph
The intro of long content lacks a short (40-60 words) paragraph that answers the question directly; AI answers usually quote this paragraph.
Fix: Summarize the topic directly in 2-3 sentences in the first paragraph.
geo.no_quotable_lead · Info
No lists or tables in long content
Content over 1200 words has no bullet lists or tables; AI summaries and featured snippets favor structured information.
Fix: Turn steps into numbered lists and comparisons into tables.
geo.no_structure · Low
Page snippet is blocked
nosnippet or max-snippet:0 stops Google from showing a text snippet and from quoting the page in AI Overviews.
Fix: Apply it only to sections that really must stay hidden (data-nosnippet).
geo.nosnippet · Medium
Organization has no Wikidata/Wikipedia link
A Wikidata/Wikipedia URL in sameAs helps AI models match the brand to the right entity.
Fix: If the brand has a Wikidata entry, add its URL to the Organization sameAs list.
geo.org_no_wikidata · Info
Content not updated for over 2 years
AI answer engines and Google prefer fresh sources; old content is quoted less often.
Fix: Review the content, add current information and update dateModified.
geo.stale_content · Info