Audit rules
The list of 95 rules the site audit checks. For each rule you find what it means and how to fix it.
The site audit checks every page, and the site as a whole, against 95 rules in three groups. Kritik (Critical, 10 rules): Google cannot see or understand the page, so fix these first. Uyarı (Warning, 48 rules): they slowly lower rankings and clicks. Bilgi (Info, 37 rules): small opportunities to improve. In the score, critical counts 40, warning 15 and info 3, and the number of pages a rule affects counts too.
The table gives the rule name shown on screen, what it means and the first step to fix it. The full fix text is on the finding card on screen. The last column is the rule ID, which shows up in the CSV file and in assistant answers.
Common terms
- canonical: a way to tell Google "this is the main address".
- noindex: a tag that hides a page from search.
- hreflang: the language version tag. It points to the same page in other languages.
- meta description: the gray summary under the title in a search result.
- structured data (JSON-LD): a hidden note that tells Google what the page is (a product, an article and so on). It can add extras to the search result, such as stars or an image (rich result).
- robots.txt: the file that tells Google which pages it may visit. A "Disallow" line forbids access.
- sitemap: the list of pages on your site. lastmod: the date the page last changed.
- redirect: sending visitors from one address to another.
- user agent: the name a browser or crawler gives itself.
- title (title tag): the title shown in the tab and in search. H1: the main heading of the page. alt text: a short text that says what an image shows.
- nofollow: a tag that says "do not follow this link". head: the top part of the page source.
- LCP: how long the main content of the page takes to appear. CLS: content shifting while the page loads. INP: how long the page takes to respond to a click.
- Lighthouse: Google's page-testing tool. SSL certificate: the document that makes your site https (a secure address).
Critical
| Rule | What it means | How to fix | ID |
|---|---|---|---|
| Crawler was blocked | Your site's bot protection stopped the crawler. Google may be blocked too. | In your firewall, allow the "seotracker-audit" user agent. | blocked-page |
| Server error (5xx) | The page returns a server error. Google removes such pages from search. | Find the error for this address in the server logs and fix it. | server-error |
| robots.txt file returns a server error | If Google cannot read the file, it may stop crawling the site completely. | Fix the error. Check that the robots.txt address opens normally. | robots-txt-server-error |
| Start address is blocked by robots.txt | The address the crawl starts from is forbidden in robots.txt. | If it should be crawled, delete the matching "Disallow" line. | robots-txt-blocks-start-url |
| Page in the sitemap does not open | A page you told Google exists returns an error. | If the page should exist, fix the error. If not, remove it from the sitemap. | sitemap-broken-page |
| A file the page needs is blocked by robots.txt | Google cannot reach the design or code file it needs to display the page. | Delete the rule in robots.txt that covers these files. | blocked-resource |
| Insecure file on a secure page | A secure (https) page loads a file from an insecure (http) address. Browsers block this. | Change the file's address so it starts with https. | mixed-content-resource |
| A hidden page is named as the main address | The page named as the main address is hidden from search. The two cancel each other out. | Remove noindex from the target page, or make the main address the page's own address. | canonical-to-noindex |
| Google treats the page as empty (soft 404) | Google treats the page as "does not exist" and keeps it out of search. | If the page really does not exist, return a 404 or 410 error code. If it exists, add real content. | google-soft-404 |
| Google cannot crawl the page because of robots.txt | Google's answer: robots.txt blocks it. | Find and delete the "Disallow" line in robots.txt that covers this address. | google-blocked-by-robots |
Warning
| Rule | What it means | How to fix | ID |
|---|---|---|---|
| Hit the request limit (429) | The site told the crawler "too many requests". | Raise the request limit on the server, or exempt "seotracker-audit" from the limit. | rate-limited-page |
| Crawl stopped early: request limit | The crawl stopped when the wait passed 30 minutes. | Restart the audit once the site's request limit resets. | crawl-rate-limited |
| Broken internal link | A link on your site goes to a page that does not open. | Point the link to the right address, or delete it. | broken-internal-link |
| Page returns an error when opened (4xx) | The page returns an error such as "not found". | If the page should exist, publish it again. If not, delete the links that go to it. | broken-page |
| Redirect chain | The address redirects several times before it reaches the final page. | Redirect the first address, and the links to it, straight to the final page. | redirect-chain |
| Redirect loop | The address redirects to itself or in a circle. | Follow the redirect rules and break the loop. | redirect-loop |
| Page that no page links to | The page exists only in the sitemap. Google gives it little value. | Link to it from the menu, from related posts or from a category page. | orphan-page |
| robots.txt could not be reached | The file did not respond at all. | Open the robots.txt address in a browser and check that it responds. | robots-txt-unreachable |
| robots.txt is over the 500 KB limit | Google does not read the end of the file. | Shorten the file. | robots-txt-truncated |
| Page in the sitemap redirects | The sitemap has an address that redirects to another address. | Put the final address it redirects to in the sitemap. | sitemap-redirect-page |
| Address in the sitemap is blocked by robots.txt | The sitemap says "come", robots.txt says "do not come". | If it should show up in search, remove the block. If not, delete it from the sitemap. | sitemap-disallowed-page |
| Sitemap file is too large to read | The file is over the 10 MB limit. | Split the sitemap into parts. | sitemap-too-large |
| Sitemap has more than 50,000 addresses | Google accepts at most 50,000 addresses in one file. | Split the file into parts under 50,000. Join the parts with one main sitemap file. | sitemap-too-many-urls |
| Sitemap has a lastmod date in the future | The date is later than today. Google stops trusting the dates. | Check what generates the dates. | sitemap-lastmod-future |
| Page opens over insecure http | The page is not secure (https). | Ask your hosting company to turn on the free SSL certificate. | not-https |
| Title tag is missing | The page has no title tag (title). | Add a title that describes the topic and is specific to the page. 50-60 characters is a good length. | missing-title |
| Meta description is missing | The gray summary in the search result is missing. | Write a description that summarizes the page and makes people click. | missing-meta-description |
| Images without alt text | Nothing says what the images show. | Write a short alt text for every image that carries meaning. | images-missing-alt |
| More than one title tag on the page | There are two title tags. Google picks one at random. | Search the page source for "title" and keep only one. | multiple-titles |
| More than one different meta description on the page | There are two descriptions. | Search the page source for name="description" and keep only one. | multiple-meta-descriptions |
| Title tag is placeholder text | The title is something like "Home" or "Untitled". | Write your own title that describes the topic of the page. | placeholder-title |
| Duplicate title | Several pages use the same title. | Give each page its own title that describes its own content. | duplicate-title |
| Duplicate main heading (H1) | Several pages have the same main heading. | Write a different H1 for each page. | duplicate-h1 |
| Duplicate meta description | Several pages use the same description. | Write each page its own description, or delete the repeated one. | duplicate-meta-description |
| Duplicate page content | Two pages carry the same text. | Choose the main page. Link the other one to it with canonical. | duplicate-content |
| Main address declarations contradict each other | The HTML and the server response name different main addresses. | Choose one main address and state it in one place only. | canonical-conflict |
| Page named as the main address does not open | The page named as the main address returns an error. | Change the main address to a working page, or publish the target again. | canonical-to-broken |
| A page that redirects is named as the main address | The main address is an address that redirects to another page. | Make the main address the final page it redirects to. | canonical-to-redirect |
| Google sees a hide tag (noindex) on the page | Google's answer: it saw noindex on the page. | Compare the page source with what Google sees. A plugin or a template may be adding the tag. | google-blocked-by-meta |
| Google chose a different main address | Google did not accept your main address. | Look at the address Google chose. Either make it the main address, or make the two pages clearly different. | google-chose-different-canonical |
| Language version code (hreflang) is invalid | A code that does not exist was written, such as "en-UK". | Write the right code. For the United Kingdom it is "en-GB". | hreflang-invalid-code |
| Page does not list itself among the language versions (hreflang) | The page lists the other languages but not itself. | Add the page's own address, with its own language code, to the list. | hreflang-missing-self |
| Page turns off its links with a robots directive | The page has turned off following its links (nofollow). | If you want its links to be followed, delete the "nofollow" text. | nofollow-page |
| Paginated page points to the first page as its main address | Page 2 names page 1 as its main address. Google ignores page 2. | Make each page's main address its own address. | paginated-canonical-to-first-page |
| Language versions do not link back to each other (hreflang) | Page A points to B but B does not point to A. | Add a hreflang line to page B that points to A. | hreflang-no-return-tag |
| Language version points to a page that does not open or is removed from the index | The language version it points to returns an error or is hidden from search. | Look at the address in the details. Fix it or take it off the list. | hreflang-target-broken |
| Main address (canonical) points to another domain or to http | The main address points to another site or to an insecure (http) address. | Unless you did it on purpose, make the main address the page's own https address. | canonical-cross-host-or-http |
| Structured data block is broken | The structured data block (JSON-LD) cannot be read. | Paste the block into a JSON checker. Usually there is an extra comma. | structured-data-invalid-json |
| Google crawled it but did not index it | Google's answer: it did not find the content good enough. | In Google's "URL Inspection Tool", check for noindex, blocked files or content that looks empty. | google-crawled-not-indexed |
| Google found it but has not crawled it yet | Google knows the address and has put it in the queue. | Waiting is usually enough. Link to it from pages that are crawled often. | google-discovered-not-indexed |
| Google saw duplicate content and no main address is set | Google found a copy of the page and you did not set a main address. | Add a canonical that points to the main address on every page in the group of copies. | google-duplicate-no-canonical |
| Google does not know this address at all | The address has never reached Google. | Add it to the sitemap and submit the sitemap to Search Console. | google-url-unknown |
| Google found an error in the structured data | A field is missing in the markup written for a rich result. | Open the address in Google's Rich Results Test. It shows the missing field there. | google-rich-results-invalid |
| Page declares main addresses that contradict each other | The page has more than one canonical tag. | Decide which one is right. Turn off the plugin that produces the other. | multiple-canonical-tags |
| Main content of the page loads late (LCP) | The largest element arrives later than 4 seconds. | Look at the largest element in the PageSpeed report. It is usually an image. Make it smaller and convert it to WebP. | cwv-lcp-poor |
| Content shifts while the page loads (CLS) | The shift score is greater than 0.25. | Give images and embedded boxes a width and a height. | cwv-cls-poor |
| Page responds slowly to clicks (INP) | The response to a click takes longer than 500 milliseconds. | Find the scripts that slow the page most. Delay them or remove them. | cwv-inp-poor |
| Google's SEO audit score is low | The Lighthouse SEO score is below 90. | Open the page in PageSpeed Insights. Look at the failed checks in the SEO section. | lighthouse-seo-low |
Info
| Rule | What it means | How to fix | ID |
|---|---|---|---|
| Server response is slow | The server's first answer comes late. | Look at server and database time. Turn on caching (keeping ready copies). | slow-response |
| Page in the sitemap points to another page as its main address | The sitemap has an address that is a copy. | Keep only main addresses in the sitemap. | sitemap-canonicalized-page |
| Page in the sitemap is hidden from search results | The sitemap has a page that is hidden from search. | If it should show up in search, remove noindex. If not, delete it from the sitemap. | sitemap-noindex-page |
| Page is too deep in the site structure | The page is many clicks away from the home page. | Shorten the path with links from categories, menus or featured lists. | deep-page |
| Sitemap has no lastmod dates at all | Google does not know the last change date. | In the setting that generates the sitemap, turn on lastmod for every address. | sitemap-lastmod-missing |
| Internal link goes to a redirect | The link goes to an old address and redirects from there. | Replace the link with the new address it redirects to. | internal-link-to-redirect |
| Character encoding is not declared | Turkish characters may break in some browsers. | Add the line meta charset="utf-8" at the start of the head section. | missing-charset |
| Page address is too long | The address is long and hard to read. | Keep the address short and meaningful. | url-too-long |
| Address has capital letters or underscores | Two separate spellings of the same page can appear. | Write addresses in lowercase with hyphens. | url-uppercase-or-underscore |
| H1 heading is missing | The page has no main heading. | Add a single H1 that describes the topic. | missing-h1 |
| More than one H1 heading | There is more than one main heading. | Keep a single H1. Make the others H2 or H3. | multiple-h1 |
| Page has almost no text | The crawler found no text. The text may be loading later with JavaScript. | Check in the page source whether the text shows up. | thin-content |
| Page has no links to anywhere else | A dead-end page: it goes nowhere else. | Add links to related pages, to the parent category or to the home page. | no-outgoing-links |
| Title is too long | Google cuts off anything after 60 characters. | Shorten the title to 50-60 characters. Put the important words first. | title-too-long |
| Title is too short | The title does not describe the page. | Write a title of 30-60 characters that says what you offer. | title-too-short |
| Meta description is too long | Google cuts off anything after 160 characters. | Put the main message first and shorten it to 70-160 characters. | meta-description-too-long |
| Meta description is too short | The description gives no reason to click. | Write 70-160 characters that summarize the page. | meta-description-too-short |
| Heading levels are skipped | It jumps from H1 straight to H3. | Use headings in order: H1, H2, H3. | heading-order-skip |
| Mobile view tag (viewport) is missing | The page looks tiny on a phone. | Add the viewport line to the head section. | missing-viewport |
| Page language is not declared | It does not say what language the page is in (no lang on the html tag). | For a Turkish page, write html lang="tr". | missing-lang |
| Images have no width and height | Content jumps while the page loads. | Write the real size of the image on every img tag. | images-missing-dimensions |
| Long text has no subheadings | The long post is one single block. | Split the text by topic. Give each section an H2 heading. | no-subheadings |
| Image alt text is a file name | The alt text is something like "IMG_1234.jpg". | In the alt text, write what is in the image. | alt-is-filename |
| Image alt text is too long | The alt text is as long as a paragraph. | Describe the image in one sentence. About 125 characters is enough. | alt-too-long |
| Main heading (H1) is too long | The H1 is as long as a paragraph. | Cut the H1 down to a short, one-sentence heading. | h1-too-long |
| Internal links without text | The link has no text or only an icon. | Add visible text or an aria-label (a name hidden for screen readers). | empty-anchor-text |
| Meaningless link texts such as "click here" | The link text does not say where it goes. | Replace the link text with the topic of the target page. | generic-anchor-text |
| Too many links on the page | The page has hundreds of links. | Limit the menu and the footer to the most important pages. | too-many-links |
| Nofollow links to your own site's pages | A link to your own pages has nofollow. | Delete rel="nofollow" from these links. | internal-nofollow-links |
| Page has no canonical (main address) tag | Google guesses the main address. | Add a canonical line to the head section that points to the page's own full address. | missing-canonical |
| Page is hidden from search results (noindex) | The page is hidden from search, on purpose or by mistake. | If it should show up in search, remove noindex. | noindex-page |
| Page points to another page as its main address | The page declares itself a copy. | If it should show up in search under its own name, make the main address its own address. | canonicalized-page |
| Language versions have no default version (x-default) | There is no default version for visitors whose language does not match. | Add an x-default line to the hreflang list. | hreflang-missing-x-default |
| Google's answer about some pages is out of date | Stored Google answers are older than 3 or 14 days. | On the Index status tab, press the "Check status on Google" button. | stale-google-verdicts |
| Site has no social media sharing tags (Open Graph) | No image or title appears when it is shared. | In the template's head section, add og:title, og:description and an og:image of 1200x630 pixels. | open-graph-missing-site |
| Site has no structured data at all | A rich result cannot appear in search. | Start with markup that fits the page type (such as Organization, Product or Article). | structured-data-missing-site |
| Google has not crawled this page for a long time | Google's last visit is older than 90 days. | Link to it from pages that are crawled often. Make sure the page is in the sitemap. | google-crawl-stale |
How do the rules work?
Most rules run per page and list every page they affect. Some concern the whole site and produce a single finding. These are the robots.txt rules, the sitemap rules, "Site has no social media sharing tags" and "Site has no structured data at all".
Rules whose name starts with "Google" do not come from the app's crawl. They are produced from the answers taken from Google on the Index status tab. If you have never asked a question on that tab, these rules never run. The speed rules (LCP, CLS, INP, SEO score) run only when "Also measure page speed" is on, and they use the phone measurement.