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

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