# Ruescan signal glossary

By [Rues](https://ruesandora.com/about) · Published 18 October 2026 · Updated 18 October 2026 · Scoring version 2.5

Short answer

Ruescan measures a site with 275 signals in 10 categories. A signal answers one question: does robots.txt let GPTBot in, does the page have a single H1. This glossary explains 249 of them: what each measures, why it matters and how to fix it. The remaining 26 signals are unique to Ruescan; only their number is given. For how the score is calculated, see the [method page](https://ruesandora.com/how-ruescan-scores).

## How to read an entry

Each entry has three lines: what it measures, why it matters, how to fix it. The label tells the type of signal.

- Issue A measured gap or error.
- Possible issue May be an error depending on context.
- Opportunity Not a gap; adding it brings a gain.
- Information, not scored Noted, but not scored and not a finding.

Each entry carries an evidence label. "Observed" means the measurement was seen directly in HTTP, DNS or HTML. "Inferred" means the result rests on a heuristic rule or on context; it is not counted as a certain error.

## AI access and readability

26 signals: 22 explained here, 4 unique to Ruescan.

### OAI-SearchBot access

[AI-01](https://ruesandora.com/glossary#ai-01) Issue Observed

- **What it measures**: robots.txt lets OAI-SearchBot read the home page.
- **Why it matters**: OAI-SearchBot is the bot ChatGPT search uses to read sites while answering. If it is blocked, the site may not appear as a source in those answers.
- **How to fix it**: Remove the block for OAI-SearchBot in robots.txt: add `Allow: /` to a `User-agent: OAI-SearchBot` group or delete the `Disallow: /` line that covers it. Republish robots.txt afterwards.[Guide: Robots.txt for AI bots: who to allow](https://ruesandora.com/writing/robots-txt-for-ai-bots#what-is-the-difference-between-a-search-bot-and-a-training-bot) [Source: platform.openai.com](https://platform.openai.com/docs/bots)

### Claude-SearchBot access

[AI-02](https://ruesandora.com/glossary#ai-02) Issue Observed

- **What it measures**: robots.txt lets Claude-SearchBot read the home page.
- **Why it matters**: Claude-SearchBot is the bot Claude uses to read sites while answering. If it is blocked, the site may not appear as a source in those answers.
- **How to fix it**: Remove the block for Claude-SearchBot in robots.txt: add `Allow: /` to a `User-agent: Claude-SearchBot` group or delete the `Disallow: /` line that covers it. Republish robots.txt afterwards.[Guide: Robots.txt for AI bots: who to allow](https://ruesandora.com/writing/robots-txt-for-ai-bots#what-is-the-difference-between-a-search-bot-and-a-training-bot) [Source: www.rfc-editor.org](https://www.rfc-editor.org/rfc/rfc9309)

### PerplexityBot access

[AI-03](https://ruesandora.com/glossary#ai-03) Issue Observed

- **What it measures**: robots.txt lets PerplexityBot read the home page.
- **Why it matters**: PerplexityBot is the bot Perplexity uses to read sites while answering. If it is blocked, the site may not appear as a source in those answers.
- **How to fix it**: Remove the block for PerplexityBot in robots.txt: add `Allow: /` to a `User-agent: PerplexityBot` group or delete the `Disallow: /` line that covers it. Republish robots.txt afterwards.[Guide: Robots.txt for AI bots: who to allow](https://ruesandora.com/writing/robots-txt-for-ai-bots#what-is-the-difference-between-a-search-bot-and-a-training-bot) [Source: www.rfc-editor.org](https://www.rfc-editor.org/rfc/rfc9309)

### AI bots that fetch pages for a user

[AI-04](https://ruesandora.com/glossary#ai-04) Issue Observed

- **What it measures**: ChatGPT-User, Claude-User and Perplexity-User are not blocked in robots.txt.
- **Why it matters**: These bots come when a user asks ChatGPT, Claude or Perplexity to open the page. If they are blocked, the AI cannot read it.
- **How to fix it**: Remove `Disallow: /` lines for ChatGPT-User, Claude-User and Perplexity-User in robots.txt; these bots only come when a user asks for the page.[Guide: Robots.txt for AI bots: who to allow](https://ruesandora.com/writing/robots-txt-for-ai-bots#what-about-user-triggered-fetchers) [Source: platform.openai.com](https://platform.openai.com/docs/bots)

### Training bot status

[AI-05](https://ruesandora.com/glossary#ai-05) Possible issue Inferred

- **What it measures**: Training bots (GPTBot, ClaudeBot, Google-Extended, Applebot-Extended, CCBot) are not blocked; blocking can be a deliberate choice.
- **Why it matters**: These bots collect content for model training. Blocking them can be deliberate; it does not switch off AI search answers directly, but it can limit how well models know the brand.
- **How to fix it**: Decide first: if you do not want your content used for model training, the block is correct. If you do, remove the `Disallow: /` lines for GPTBot, ClaudeBot, Google-Extended, Applebot-Extended and CCBot.[Guide: Robots.txt for AI bots: who to allow](https://ruesandora.com/writing/robots-txt-for-ai-bots#what-is-the-difference-between-a-search-bot-and-a-training-bot) [Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/overview-google-crawlers)

### Bot identity at the firewall

[AI-06](https://ruesandora.com/glossary#ai-06) Information, not scored Observed

- **What it measures**: The home page opens when requested as GPTBot, ClaudeBot, PerplexityBot, OAI-SearchBot and ChatGPT-User (no firewall block by user agent).
- **Why it matters**: A request from our server using a bot identity was blocked; the real bot may get a different result. So the result counts as not measured and does not affect the score. To verify: in your server or firewall log, check the status codes of requests from real bot IPs (GPTBot: openai.com/gptbot.json; OAI-SearchBot: openai.com/searchbot.json; ChatGPT-User: openai.com/chatgpt-user.json; PerplexityBot: perplexity.ai/perplexitybot.json).
- **How to fix it**: Find the block on these bot identities in your firewall (WAF/CDN) logs. Let real bots through with IP verification (the IP ranges the bots publish); remove rules that block on the user-agent text alone.[Guide: Robots.txt for AI bots: who to allow](https://ruesandora.com/writing/robots-txt-for-ai-bots#why-your-robots-txt-may-not-be-the-whole-story) [Source: platform.openai.com](https://platform.openai.com/docs/bots)

### Tags that block quoting

[AI-07](https://ruesandora.com/glossary#ai-07) Issue Observed

- **What it measures**: No noai, noimageai, nosnippet or max-snippet:0 in meta robots or X-Robots-Tag.
- **Why it matters**: These directives stop search engines and AI answers from quoting the page; it may not be usable as a source in answers.
- **How to fix it**: Remove `nosnippet`, `max-snippet:0`, `noai` and `noimageai` from the meta robots tag and the X-Robots-Tag header (unless deliberate). If needed, hide only specific parts with `data-nosnippet`.[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/robots-meta-tag)

### Text in the server HTML

[AI-08](https://ruesandora.com/glossary#ai-08) Issue Observed

- **What it measures**: Whether the HTML the server sends holds enough readable text.
- **Why it matters**: Most AI bots do not run JavaScript. If the text loads later, they see an empty or partial page and find nothing to quote.
- **How to fix it**: Send the main content as HTML from the server (SSR or static generation); do not load the text only via JavaScript. Put at least 300 words of on-topic text on the page.[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics)

### Visible text ratio

[AI-09](https://ruesandora.com/glossary#ai-09) Possible issue Inferred

- **What it measures**: The share of visible text in the HTML.
- **Why it matters**: If most of the HTML is scripts, styles and markup, bots read many bytes to reach the text; the risk of truncation and slowness grows.
- **How to fix it**: Move large inline script and style blocks into external files, reduce unused markup (extra divs, inline SVG) and add more visible text.

### The llms.txt file

[AI-11](https://ruesandora.com/glossary#ai-11) Information, not scored Observed

- **What it measures**: Whether the site has an llms.txt file (optional; no effect on Google Search).
- **Why it matters**: llms.txt is an optional proposal (llmstxt.org). Google says such files are not needed for Google Search and will neither help nor harm. The one measured example is similar: in one site's two-month server log (Evil Martians, July 2026), only 37 of about 770 direct requests for llms.txt and llms-full.txt came from named AI assistants. That is a single site's data, not a general rule. Information only; it does not affect the score.
- **How to fix it**: Optional: llms.txt is not needed for Google Search (Google: it will neither help nor harm). In the one measured example, AI assistants rarely requested this file (a single site's two-month log). If you still want it, publish /llms.txt at the root: `# Brand name`, `> one-sentence summary`, `- [Page name](https://domain.com/path): short description` lines under a `## Pages` heading (format: llmstxt.org).[Guide: How AI answers pick which brands to name, and how we track it weekly](https://ruesandora.com/writing/how-ai-answers-pick-brands#do-i-need-llms-txt-or-special-schema-to-appear-in-google-s-ai-overviews) [Source: developers.google.com](https://developers.google.com/search/docs/fundamentals/ai-optimization-guide)

### The llms-full.txt file

[AI-13](https://ruesandora.com/glossary#ai-13) Information, not scored Observed

- **What it measures**: Whether llms-full.txt exists (the site text in one file; optional).
- **Why it matters**: llms-full.txt is optional. It has no effect on Google Search, and we have no measurement showing it raises citations (in the single-site log, named AI assistants rarely requested it). Information only; it does not affect the score.
- **How to fix it**: Optional: publish the plain text (Markdown) of key pages in a single /llms-full.txt file; not needed for Google Search, and no measurement shows it raises citations. Regenerate it when content changes.[Source: developers.google.com](https://developers.google.com/search/docs/fundamentals/ai-optimization-guide)

### Content-Signal line

[AI-14](https://ruesandora.com/glossary#ai-14) Information, not scored Observed

- **What it measures**: A Content-Signal line in robots.txt (search, ai-input, ai-train preference).
- **Why it matters**: Content-Signal states whether content may be used for search, AI answers and model training (a Cloudflare proposal). Draft standard: it is not yet clear that major AI crawlers honour it, so it is shown as information only and does not affect the score.
- **How to fix it**: Add a line stating your preference to the `User-agent: *` group in robots.txt, e.g. `Content-Signal: search=yes, ai-input=yes, ai-train=no`.

### robots.txt server errors

[AI-15](https://ruesandora.com/glossary#ai-15) Issue Observed

- **What it measures**: robots.txt does not return a server error (5xx).
- **Why it matters**: Under the standard (RFC 9309), bots treat the whole site as off-limits while robots.txt returns a server error.
- **How to fix it**: Find in server logs why the robots.txt request returns 5xx and fix it; the file must return 200. A 5xx robots.txt makes bots stop crawling the site.[Source: www.rfc-editor.org](https://www.rfc-editor.org/rfc/rfc9309)

### robots.txt size and syntax

[AI-16](https://ruesandora.com/glossary#ai-16) Possible issue Inferred

- **What it measures**: Whether robots.txt is a reasonable size with no unknown directives or broken lines.
- **Why it matters**: Google reads only the first 500 KiB of robots.txt and ignores unknown or broken lines. A typo can mean the intended rule is not applied.
- **How to fix it**: Keep robots.txt under 500 KiB; use only `User-agent`, `Allow`, `Disallow`, `Sitemap` (and optionally `Content-Signal`); delete lines without a colon or with unknown directives.[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/robots/intro)

### The robots.txt file

[AI-18](https://ruesandora.com/glossary#ai-18) Opportunity Inferred

- **What it measures**: robots.txt exists at the root.
- **Why it matters**: Bots can still crawl everything, but the easiest way to state AI bot preferences and point to the sitemap is unused.
- **How to fix it**: Create /robots.txt at the root (plain text, 200): `User-agent: *` / `Allow: /` / `Sitemap: https://domain.com/sitemap.xml`.[Guide: Robots.txt for AI bots: who to allow](https://ruesandora.com/writing/robots-txt-for-ai-bots#robots-txt-examples-for-three-common-choices) [Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/robots/intro)

### Bingbot access

[AI-24](https://ruesandora.com/glossary#ai-24) Issue Observed

- **What it measures**: robots.txt lets Bingbot read the home page.
- **Why it matters**: Bing's index is used by Copilot and among ChatGPT search sources. If Bingbot is blocked, the site may not appear as a source in those answers.
- **How to fix it**: Remove the block for Bingbot in robots.txt: add `Allow: /` to a `User-agent: Bingbot` group or delete the `Disallow: /` line that covers it.[Source: www.rfc-editor.org](https://www.rfc-editor.org/rfc/rfc9309)

### Decisions for other AI bots

[AI-25](https://ruesandora.com/glossary#ai-25) Information, not scored Observed

- **What it measures**: The robots.txt decision for Applebot, Meta-ExternalAgent, Amazonbot, DuckAssistBot, MistralAI-User and OAI-AdsBot (allowed, blocked, unspecified) is noted.
- **Why it matters**: Siri and Spotlight (Applebot), Meta AI (Meta-ExternalAgent), Alexa (Amazonbot), DuckDuckGo answers (DuckAssistBot) and Mistral (MistralAI-User) read sites with their own bots. If you blocked them on purpose, that is fine; if not, you may not appear as a source in those answers. OAI-AdsBot is different: it only checks pages submitted as ads on ChatGPT and is not used for training; if you do not run ads it does not concern you. Information only; it does not affect the score.
- **How to fix it**: Information only. If you want these bots (Applebot, Meta-ExternalAgent, Amazonbot, DuckAssistBot, MistralAI-User) to use you as a source in answers, add `Allow: /` to a `User-agent: <bot name>` group or delete the `Disallow: /` line that covers them. If you do not, the block is correct. OAI-AdsBot is not a source in answers; it matters only if you run ads on ChatGPT.

### Image address only through JavaScript

[AI-26](https://ruesandora.com/glossary#ai-26) Possible issue Inferred

- **What it measures**: Whether the raw HTML holds the image addresses or they sit only in an attribute such as data-src.
- **Why it matters**: Most AI crawlers do not run JavaScript. If src is empty or a placeholder in the raw HTML and the real address sits in data-src, that image does not exist for them; its alt text and context are lost too. A <noscript> fallback or srcset fixes it.
- **How to fix it**: Fill `src` with the real address on important images (do not leave it only in `data-src`) and use the browser's own `loading="lazy"`: `<img src="/product.jpg" loading="lazy" width="600" height="400" alt="...">`. If you use a lazy-load library, add a `<noscript><img src="/product.jpg" alt="..."></noscript>` fallback to each image.[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics)

### Do subdomain robots.txt files block AI search bots

[AI-27](https://ruesandora.com/glossary#ai-27) Information, not scored Observed

- **What it measures**: Whether the robots.txt of subdomains linked from the home page (such as blog or docs) blocks OAI-SearchBot, Claude-SearchBot and PerplexityBot; a difference is shown for bots the main domain allows. Information only.
- **Why it matters**: Each subdomain's robots.txt applies only to itself. If the main domain is open but the blog or docs subdomain is closed, that content may not appear as a source in AI answers. If you closed it on purpose, that is fine. Information only; it does not affect the score.
- **How to fix it**: Information only. If a subdomain (blog, docs, etc.) blocks OAI-SearchBot, Claude-SearchBot or PerplexityBot in its own robots.txt and you want that content to appear in AI answers, add the same `User-agent` blocks as the main domain to that subdomain's `/robots.txt`. If the block is deliberate, do nothing.[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/robots/intro)

### Crawl-delay for Bing

[AI-28](https://ruesandora.com/glossary#ai-28) Information, not scored Observed

- **What it measures**: Whether robots.txt sets a high Crawl-delay for Bingbot (or for all bots if none is named).
- **Why it matters**: Bing obeys Crawl-delay and with a high value crawls very few pages a day. Because ChatGPT search relies on the Bing index, a slowly crawled site can appear late and incompletely in AI search. Google ignores this line. Information only; it does not affect the score.
- **How to fix it**: Remove the "Crawl-delay" line from robots.txt or lower it to 1-2 s. Setting Bing's crawl rate in Bing Webmaster Tools is safer.

### Links in the raw HTML

[AI-30](https://ruesandora.com/glossary#ai-30) Information, not scored Observed

- **What it measures**: Whether most links of the rendered page are also in the raw HTML (bots that do not run JavaScript see only the raw HTML).
- **Why it matters**: Bots that do not run JS, and most AI crawlers, see only links in the raw HTML; if menus and internal links are JS-rendered, discovery suffers. Information only; it does not affect the score.
- **How to fix it**: Information only. Provide the menu and internal links as real `<a href>` in the server-sent HTML (server-side rendering or prerendering); do not add links only with JavaScript.[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics)

### Raw and rendered H1 agree

[AI-31](https://ruesandora.com/glossary#ai-31) Information, not scored Observed

- **What it measures**: Whether the H1 in the raw HTML and the H1 in the rendered page say the same thing.
- **Why it matters**: Bots that do not run JS, and AI crawlers, read the main heading from the raw HTML; a heading that changes after rendering leads to wrong topic inference. Information only; it does not affect the score.
- **How to fix it**: Information only. Put the main heading (H1) in the server-sent HTML and do not let JavaScript replace it with different text later; the rendered heading should say the same topic as the one in the raw HTML.[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics)

The 4 unique signals in this category are not detailed.

## Brand brain: identity and entity

22 signals: 19 explained here, 3 unique to Ruescan.

### Identity schema (Organization)

[BEY-01](https://ruesandora.com/glossary#bey-01) Issue Observed

- **What it measures**: Organization, LocalBusiness or Person JSON-LD exists.
- **Why it matters**: An identity schema states the brand name, logo, address and accounts in one machine-readable place. AI systems recognize the brand from it.
- **How to fix it**: Add Organization (or a fitting subtype) JSON-LD to the home page: `{"@context":"https://schema.org","@type":"Organization","name":"…","url":"https://domain.com/","logo":"https://domain.com/logo.png","sameAs":[…]}`.[Source: developers.google.com](https://developers.google.com/search/docs/appearance/structured-data/organization)

### Persistent identity (@id)

[BEY-02](https://ruesandora.com/glossary#bey-02) Opportunity Inferred

- **What it measures**: The identity node has a stable @id and @id references on the page resolve.
- **Why it matters**: @id lets every page and schema point to the same entity by one name, so AI systems connect the pieces to one brand.
- **How to fix it**: Give the identity node a stable `@id` (e.g. `https://domain.com/#organization`) and reference that same `@id` from other nodes (WebSite publisher, Article author).[Source: developers.google.com](https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data)

### Brand name consistency

[BEY-03](https://ruesandora.com/glossary#bey-03) Issue Observed

- **What it measures**: The brand name matches across title, og:site_name, JSON-LD name and the llms.txt title.
- **Why it matters**: AI systems recognize a brand by its name. If the name differs between title, schema and sharing tags, they may not see one entity.
- **How to fix it**: Write the brand name the same everywhere: title, og:site_name, JSON-LD `name` and the llms.txt heading. Add `alternateName` to the WebSite schema if needed.[Source: developers.google.com](https://developers.google.com/search/docs/appearance/site-names)

### Brand name distinctiveness

[BEY-20](https://ruesandora.com/glossary#bey-20) Information, not scored Inferred

- **What it measures**: Whether the brand name consists only of common words.
- **Why it matters**: If the brand name is made of common words, branded searches may be read as topic searches. Add alternateName to the WebSite schema and track branded queries separately in Search Console. Information only; it does not affect the score.
- **How to fix it**: Information only. Add `alternateName` to the WebSite schema and track branded queries separately in Search Console.

### Logo in the schema

[BEY-04](https://ruesandora.com/glossary#bey-04) Issue Observed

- **What it measures**: The logo URL in the schema opens and returns an image.
- **Why it matters**: Search engines and AI systems show this logo on the brand card; a logo that does not open is ignored.
- **How to fix it**: Replace the schema `logo` with an absolute https image URL that opens (at least 112×112 pixels is recommended).[Source: developers.google.com](https://developers.google.com/search/docs/appearance/structured-data/organization)

### Official profiles (sameAs)

[BEY-05](https://ruesandora.com/glossary#bey-05) Issue Observed

- **What it measures**: Whether the identity schema lists the brand's official profiles (sameAs).
- **Why it matters**: sameAs ties the brand's social accounts, Wikipedia/Wikidata entries and profiles to one entity and helps AI systems recognize it.
- **How to fix it**: Add the brand's official profiles to the identity schema in a `sameAs` array (LinkedIn, Instagram, X, YouTube, Wikipedia/Wikidata…); at least 3 URLs.[Source: schema.org](https://schema.org/sameAs)

### About page

[BEY-08](https://ruesandora.com/glossary#bey-08) Issue Observed

- **What it measures**: The home page links to an About page and it opens.
- **Why it matters**: An About page says who the brand is, what it does and who stands behind it; AI answers and trust signals draw on it.
- **How to fix it**: Put an "About us" link in the home page menu or footer; the page should return 200 and describe the brand, founders and contact.

### Contact signal

[BEY-09](https://ruesandora.com/glossary#bey-09) Issue Observed

- **What it measures**: A contact signal: a contact page link, a tel:/mailto: link, or an address/phone in the schema.
- **Why it matters**: A reachable contact route signals a real business; AI answers use it for "how do I reach them". Note: numbers and addresses are not stored, only presence is checked.
- **How to fix it**: Add a contact page link or a `tel:`/`mailto:` link to the home page; add `address`, `telephone` or `contactPoint` to the schema.[Source: developers.google.com](https://developers.google.com/search/docs/appearance/structured-data/organization)

### Meta and schema description match

[BEY-10](https://ruesandora.com/glossary#bey-10) Possible issue Inferred

- **What it measures**: Whether the meta description and the schema description say the same thing.
- **Why it matters**: If the two descriptions say different things, AI systems may summarize what the brand does inconsistently.
- **How to fix it**: Write the meta description and the schema `description` around the same core message (same key words, same promise).

### Founder and author entity

[BEY-11](https://ruesandora.com/glossary#bey-11) Opportunity Inferred

- **What it measures**: A founder, author or person entity (founder, author, Person) is defined.
- **Why it matters**: Founder or author information is an expertise and trust (E-E-A-T) signal; AI answers use it for "who is behind this".
- **How to fix it**: Add the person behind the brand to the schema: a Person node as `founder` on the Organization or `author` on content (name, optional `sameAs`).[Source: schema.org](https://schema.org/Person)

### Service area and expertise

[BEY-12](https://ruesandora.com/glossary#bey-12) Opportunity Inferred

- **What it measures**: Whether the identity schema carries service area, expertise and offers (areaServed, knowsAbout, makesOffer).
- **Why it matters**: These fields say what the brand offers, where and to whom, so AI systems connect it to the right questions.
- **How to fix it**: Add at least two of `areaServed` (service area), `knowsAbout` (expertise topics) and `makesOffer`/`hasOfferCatalog` (offers) to the identity schema.[Source: schema.org](https://schema.org/Organization)

### Brand definition sentence

[BEY-13](https://ruesandora.com/glossary#bey-13) Possible issue Inferred

- **What it measures**: The first two paragraphs contain a definition sentence that names the brand.
- **Why it matters**: AI answers to "what is X?" often quote the definition sentence near the top. A clear definition that names the brand makes that quote easy.
- **How to fix it**: Put a sentence that defines the brand in the first or second paragraph: "Brand is a [type] that does [what] for [whom]."

### Knowledge base page

[BEY-15](https://ruesandora.com/glossary#bey-15) Opportunity Inferred

- **What it measures**: A knowledge base page exists: FAQ, help, docs or glossary (linked from the home page or in the sitemap).
- **Why it matters**: Q&A and documentation pages are among the most quoted by AI answers; they offer brand knowledge in ready-to-quote form.
- **How to fix it**: Create an FAQ, help or glossary page, link it from the home page and add it to the sitemap.

### Social links and sameAs match

[BEY-16](https://ruesandora.com/glossary#bey-16) Opportunity Inferred

- **What it measures**: Social profile links on the page are also listed in the schema sameAs.
- **Why it matters**: When the visible profiles and the schema sameAs agree, AI systems can be sure those accounts belong to the brand.
- **How to fix it**: Add the social profiles linked on the page to the schema `sameAs` array too (same URLs).[Source: schema.org](https://schema.org/sameAs)

### Local business address (PostalAddress)

[BEY-21](https://ruesandora.com/glossary#bey-21) Issue Observed

- **What it measures**: Whether the local business schema has its address as a PostalAddress (the address is not stored).
- **Why it matters**: Maps and AI answers match a local business by its address. Without a PostalAddress (street, locality, region, country) in the schema the business may not show up in "near me" searches.
- **How to fix it**: Add the address to the local business schema as a PostalAddress: `"address": {"@type":"PostalAddress","streetAddress":"Street No","addressLocality":"District","addressRegion":"City","postalCode":"34000","addressCountry":"TR"}`; show the same address on the page too.[Source: developers.google.com](https://developers.google.com/search/docs/appearance/structured-data/local-business)

### Depth of the About page

[BEY-24](https://ruesandora.com/glossary#bey-24) Information, not scored Observed

- **What it measures**: Whether the About page has enough text, with traces of a founding year, team and address. The text is not stored.
- **Why it matters**: An About page says who the brand is, when and where it was founded and who stands behind it; AI answers and trust signals draw on it. A one or two sentence page does not do that. Note: only whether a founding year, team and address trace exist is kept, not the text. Information only; it does not affect the score.
- **How to fix it**: Information only. Grow the About page to at least 150 words: when and why you were founded, the team (names and roles) and the address or place of work; put the same facts in Organization schema (`foundingDate`, `address`, `founder`).

### Wikipedia or Wikidata link

[BEY-22](https://ruesandora.com/glossary#bey-22) Information, not scored Observed

- **What it measures**: Whether the identity schema's sameAs list holds a Wikipedia or Wikidata URL. For small brands its absence is normal.
- **Why it matters**: Wikipedia and Wikidata are the reference sources search engines and AI systems trust most to tie a brand to a single entity. Creating an artificial entry for a brand without one is not right; if an entry already exists, add it to sameAs. Information only; it does not affect the score.
- **How to fix it**: Information only. If your brand already has a Wikipedia or Wikidata entry, add its URL to `sameAs` in the Organization schema. If not, do not create an artificial entry; only subjects with sourced, encyclopedic notability are accepted.[Source: developers.google.com](https://developers.google.com/search/docs/appearance/structured-data/organization)

### Legal name and official identifiers

[BEY-23](https://ruesandora.com/glossary#bey-23) Information, not scored Observed

- **What it measures**: Whether the Organization schema has legalName and an official identifier such as vatID or taxID. Only the field's presence is stored.
- **Why it matters**: Google treats fields such as vatID/taxID as an important trust signal for users (they can be looked up in public registries); legalName separates the registered legal name from the brand name. Add fields only where applicable. Never put a personal ID number for a sole proprietorship. Information only; it does not affect the score.
- **How to fix it**: Information only. Add the registered legal name as `legalName` and an official identifier such as the tax number as `vatID` or `taxID` to the Organization schema. For a sole proprietorship, never write a personal ID number.[Source: developers.google.com](https://developers.google.com/search/docs/appearance/structured-data/organization)

### Trust and safety pages

[GVN-01](https://ruesandora.com/glossary#gvn-01) Information, not scored Inferred

- **What it measures**: Whether privacy/KVKK, terms and company-information pages exist (returns and delivery for stores).
- **Why it matters**: Privacy, terms, returns and company-information pages show users and search and AI systems that a real business stands behind the site.
- **How to fix it**: Information only. Publish privacy/KVKK, terms and company-information (name, address, contact) pages and link them from the footer; if you run a store, add returns and delivery terms too.

The 3 unique signals in this category are not detailed.

## Content and answer blocks

42 signals: 36 explained here, 6 unique to Ruescan.

### A single H1

[ICR-01](https://ruesandora.com/glossary#icr-01) Issue Observed

- **What it measures**: Exactly one H1 heading.
- **Why it matters**: The H1 is the first place that tells bots and readers what the page is about; a single, clear H1 makes the topic plain.
- **How to fix it**: Keep a single H1 on the page: the heading stating the main topic. Turn the others into H2/H3.

### Heading order

[ICR-02](https://ruesandora.com/glossary#icr-02) Possible issue Inferred

- **What it measures**: Heading levels do not skip (H1 → H2 → H3).
- **Why it matters**: The heading tree is the page's table of contents; skips make it harder for bots and screen readers to group sections.
- **How to fix it**: Use headings in order: H2 after H1, H3 under H2; do not skip levels for looks (style size with CSS).

### Question-style headings

[ICR-03](https://ruesandora.com/glossary#icr-03) Opportunity Inferred

- **What it measures**: Whether some headings are phrased as questions ("what", "how", "?").
- **Why it matters**: People ask AI questions. A question heading with a short answer right below is the easiest structure for answer engines to quote.
- **How to fix it**: Turn the questions users ask into headings (e.g. "What is X?", "How do I …?"); at least two.

### FAQ block

[ICR-04](https://ruesandora.com/glossary#icr-04) Opportunity Inferred

- **What it measures**: An FAQ block: FAQPage schema or collapsible Q&A (details/summary).
- **Why it matters**: An FAQ block offers short, self-contained answers; AI answers and search results use them directly.
- **How to fix it**: Put frequently asked questions in a visible block (e.g. `<details><summary>Question</summary>Answer</details>`). FAQPage schema has not produced a rich result in Google since 7 May 2026 (its documentation was removed on 15 June 2026). It does no harm but do not invest new effort; the visible block is enough.[Guide: How AI answers pick which brands to name, and how we track it weekly](https://ruesandora.com/writing/how-ai-answers-pick-brands#2-answer-blocks-and-structured-data) [Source: developers.google.com](https://developers.google.com/search/updates#removing-faq-rich-result)

### Upfront answer

[ICR-05](https://ruesandora.com/glossary#icr-05) Opportunity Inferred

- **What it measures**: Whether the first paragraph after the H1 names the topic and answers it directly.
- **Why it matters**: Answer engines quote the short paragraph at the top that answers the heading directly. A clear opening that names the topic and carries facts (numbers, dates, names) raises the chance of being quoted.
- **How to fix it**: Put a 25-150 word paragraph right under the H1 that answers the topic directly and mentions the H1's main concept.[Guide: How AI answers pick which brands to name, and how we track it weekly](https://ruesandora.com/writing/how-ai-answers-pick-brands#2-answer-blocks-and-structured-data)

### Lists and tables

[ICR-06](https://ruesandora.com/glossary#icr-06) Opportunity Inferred

- **What it measures**: The page has a list or table (quotable structure).
- **Why it matters**: Lists and tables give steps, comparisons and features to AI answers in ready-made form.
- **How to fix it**: Present comparisons, steps or features as lists (`<ul>`/`<ol>`) or tables (`<table>`).

### Content freshness

[ICR-07](https://ruesandora.com/glossary#icr-07) Possible issue Inferred

- **What it measures**: Whether the page shows a recent update date (dateModified or <time>).
- **Why it matters**: AI answers and search engines prefer fresh sources; a machine-readable date says when the content was updated.
- **How to fix it**: Update the content and show the date: `<time datetime="2026-10-10">10 October 2026</time>`; use `dateModified` in the schema.[Source: developers.google.com](https://developers.google.com/search/docs/appearance/structured-data/article)

### Author byline

[ICR-08](https://ruesandora.com/glossary#icr-08) Opportunity Inferred

- **What it measures**: An author or byline: meta author, rel=author or an article with an author in the schema.
- **Why it matters**: Who wrote the content is an expertise and trust signal; AI systems look at it when weighing a source.
- **How to fix it**: Name the author or responsible person: `<meta name="author" content="Full Name">` or `author` in the schema.[Guide: Google's guide to generative AI content: the October 2026 update](https://ruesandora.com/writing/google-generative-ai-content-guide#what-should-you-check-on-your-own-site) [Source: developers.google.com](https://developers.google.com/search/docs/appearance/structured-data/article)

### Citing outside sources

[ICR-09](https://ruesandora.com/glossary#icr-09) Opportunity Inferred

- **What it measures**: Whether the page links to another source as a citation (social networks do not count).
- **Why it matters**: Content that cites sources is seen as more trustworthy; AI answers look for the basis of what they quote.
- **How to fix it**: Link to at least one trustworthy external source (official body, research, standard) that supports your claims.

### Fact density

[ICR-10](https://ruesandora.com/glossary#icr-10) Opportunity Inferred

- **What it measures**: Whether the text carries enough concrete facts such as numbers, percentages, dates or amounts.
- **Why it matters**: Sentences with concrete numbers and dates get quoted more in AI answers; vague statements do not.
- **How to fix it**: Add concrete facts: numbers, percentages, dates, prices (at least one per 100 words). Use only verified figures.

### Image alt text

[ICR-11](https://ruesandora.com/glossary#icr-11) Issue Observed

- **What it measures**: Every image has alt text.
- **Why it matters**: An image without alt text tells screen readers and bots nothing. The first 50 images on the page are checked.
- **How to fix it**: Give every meaningful image an `alt` that describes it; give purely decorative ones `alt=""`.[Source: developers.google.com](https://developers.google.com/search/docs/appearance/google-images)

### Blog or guide freshness

[ICR-14](https://ruesandora.com/glossary#icr-14) Opportunity Inferred

- **What it measures**: Whether a blog or guide section exists and was updated recently.
- **Why it matters**: Regularly published guides grow the pool of sources AI answers can cite and show the brand's expertise.
- **How to fix it**: Update the blog or guides regularly (a new or updated post at least every 90 days) and report it with `lastmod` in the sitemap.[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap)

### Keyword consistency

[ICR-15](https://ruesandora.com/glossary#icr-15) Possible issue Inferred

- **What it measures**: Whether the main concepts of the text also appear in the title, description and headings.
- **Why it matters**: If the text covers one topic while the title and description use other words, search engines and AI systems may misread the topic.
- **How to fix it**: Use the text's key concepts in the title, meta description and H1/H2 too (naturally, without stuffing).

### Internal link anchors

[ICR-16](https://ruesandora.com/glossary#icr-16) Opportunity Inferred

- **What it measures**: Whether internal link anchors describe the target (generic anchors such as "click here", very long anchors, the same anchor pointing to different targets).
- **Why it matters**: Anchor text tells bots what the target page is. "Click here", or the same text pointing to different pages, erases that information.
- **How to fix it**: Replace generic anchors like "click here" or "read more" with words describing the target; keep anchors under 10 words; do not use the same anchor for different pages.[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/links-crawlable)

### Placeholder and duplicate text

[ICR-17](https://ruesandora.com/glossary#icr-17) Issue Inferred

- **What it measures**: Whether there is placeholder text, duplicated paragraphs or overly long sentences.
- **Why it matters**: Placeholder text looks unfinished; duplicated text and very long sentences tire both readers and AI summaries.
- **How to fix it**: Delete placeholder text (lorem ipsum), merge duplicate paragraphs and split long sentences.

### Readability

[ICR-18](https://ruesandora.com/glossary#icr-18) Opportunity Inferred

- **What it measures**: Whether the share of long sentences hurts readability.
- **Why it matters**: Short sentences are easy for readers and AI summaries; long ones get cut or lose meaning when quoted.
- **How to fix it**: Split sentences over 20 words in two; bring the share of long sentences under 25%.

### Sentence-opening variety

[ICR-19](https://ruesandora.com/glossary#icr-19) Opportunity Inferred

- **What it measures**: Whether consecutive sentences start with the same word.
- **Why it matters**: Consecutive sentences starting with the same word make text monotonous; readers and AI summaries read it as repetition.
- **How to fix it**: Vary the openings of consecutive sentences that start with the same word.

### Transition words

[ICR-20](https://ruesandora.com/glossary#icr-20) Opportunity Inferred

- **What it measures**: Whether transition words (also, because, for example...) are used enough; Turkish and English.
- **Why it matters**: Transition words make the link between sentences (cause, example, result) explicit, so readers and AI summaries can follow.
- **How to fix it**: Use transition words that connect sentences ("also", "because", "for example", "therefore"); in about a third of sentences.

### Title, H1 and og:title match

[ICR-30](https://ruesandora.com/glossary#icr-30) Possible issue Inferred

- **What it measures**: Whether the <title>, the first H1 and og:title share words.
- **Why it matters**: Google builds the title in search results from sources such as <title>, H1 and og:title. If they say different things, the title shown may be one you did not choose; shared links show yet another title.
- **How to fix it**: Bring the three places to the same topic: `<title>`, the H1 and `og:title` should carry the same main phrase (adding the brand name to the title is fine). If you want a different slogan for sharing, still keep the main words.[Source: developers.google.com](https://developers.google.com/search/docs/appearance/title-link)

### Author page and Person schema

[ICR-31](https://ruesandora.com/glossary#icr-31) Opportunity Inferred

- **What it measures**: Whether the article's author link goes to a working page and the author is defined as a Person.
- **Why it matters**: A named author, a working author page and Person markup show readers, search engines and AI systems who the content comes from (an E-E-A-T practice). It is an opportunity: if missing the page does not drop from the index, only the trust signal is weak. Schema alone is not proven to raise citations.
- **How to fix it**: Link the author's name to an author page in articles (`<a href="/author/jane-doe" rel="author">Jane Doe</a>`), make that page open and carry a short bio. Define the author as a Person in the schema: `"author": {"@type":"Person","name":"Jane Doe","url":"https://domain.com/author/jane-doe","jobTitle":"Ceramics expert"}`; add profile links with `sameAs` if you have them.[Source: developers.google.com](https://developers.google.com/search/docs/appearance/structured-data/article)

### Section-by-section quotability

[ICR-32](https://ruesandora.com/glossary#icr-32) Opportunity Inferred

- **What it measures**: Whether each H2/H3 section can be quoted on its own: length, naming the topic and not leaning on other sections. The report lists the three weakest sections.
- **Why it matters**: AI answers quote a single section, not the whole page. A section should name its topic, not lean on another part with "this" or "above", and make sense on its own in 40-200 words.
- **How to fix it**: Write each H2/H3 section so it can be read alone: name the topic in the first sentence ("Ceramic mug making…", not "This…"), finish in 40-200 words and remove references that lean on other sections such as "above/below". The report lists the three weakest sections.

### Link density

[ICR-33](https://ruesandora.com/glossary#icr-33) Possible issue Inferred

- **What it measures**: How much of the visible text is link text, and whether the page looks like a menu.
- **Why it matters**: A page whose text is almost all links looks like a menu to AI crawlers and search engines; there is no plain text left to quote.
- **How to fix it**: Add plain text to the home page beyond link lists: a few paragraphs on what the brand does and whom it serves. Shorten long menus and tag clouds.

### Pricing, trial and integrations pages

[ICR-39](https://ruesandora.com/glossary#icr-39) Information, not scored Observed

- **What it measures**: Whether a service or software site has the pages people look for when deciding: pricing, trial/demo and integrations. A heuristic check.
- **Why it matters**: Someone about to buy first looks for pricing, a trial/demo and whether it works with their tools (integrations); AI answers quote these pages for such questions. If missing, no answer is found at decision time. There is no official threshold; this is a heuristic. Information only; it does not affect the score.
- **How to fix it**: Information only. Open the pages people look for when deciding: pricing/plans (`/pricing`), trial or demo (`/demo`) and integrations (`/integrations`). Even if you do not publish prices, have a page explaining how to get a quote. This is a heuristic, not an official rule.

### Case studies and references

[ICR-40](https://ruesandora.com/glossary#icr-40) Information, not scored Observed

- **What it measures**: Whether a service or software site has a case study, references or customer reviews page. Absence is an observation, not a fault.
- **Why it matters**: Case studies, references and customer reviews answer the buyer's "does anyone else use this" question; AI answers also look at them for trust. Not finding one is an observation, not a fault. Information only; it does not affect the score.
- **How to fix it**: Information only. Add a page of real customer case studies, references or reviews (with permission and verifiable; never invent reviews) and link it from the home page. This is a heuristic.

### Near-duplicate template pages

[ICR-41](https://ruesandora.com/glossary#icr-41) Information, not scored Observed

- **What it measures**: Whether the text of sampled pages is almost identical (template pages where only a place or product name changes).
- **Why it matters**: If template-built city, product or topic pages have almost identical text, Google may treat them as doorway pages or scaled low-value content; AI answers pick just one. Each page needs its own useful text. The page text includes menu/footer words, so short pages can look slightly more alike than they are. Information only; it does not affect the score.
- **How to fix it**: Information only. Give each template-built page (city, product, topic) its own text, data and examples; merge or noindex pages where only the place name changes.[Source: developers.google.com](https://developers.google.com/search/docs/essentials/spam-policies#doorways)

### File-name alt texts

[ICR-35](https://ruesandora.com/glossary#icr-35) Information, not scored Observed

- **What it measures**: Whether image alt texts look like file names given by a camera or software.
- **Why it matters**: If the alt text is a file name such as "IMG_1234.jpg", screen readers and bots cannot learn what the image shows. Observation only; it does not affect the score.
- **How to fix it**: Information only. Replace file-name alt texts ("IMG_1234.jpg", "image1") with a short phrase saying what the image shows: "Close-up of a blue-glazed ceramic mug". Leave alt="" only on purely decorative images.[Source: developers.google.com](https://developers.google.com/search/docs/appearance/google-images)

### Stock photo traces

[ICR-42](https://ruesandora.com/glossary#icr-42) Information, not scored Observed

- **What it measures**: Whether image addresses show traces of known stock-photo sites. Observation only; no verdict on originality.
- **Why it matters**: Stock images appear on other sites too; original images signal trust and distinctiveness. Using stock is not wrong. Does not affect the score.
- **How to fix it**: Information only. Using stock images is not wrong; for the places that set you apart (product, team, premises, process) use your own photos. If you use stock images, keep their licence.

### Stale year in headings

[ICR-34](https://ruesandora.com/glossary#icr-34) Information, not scored Inferred

- **What it measures**: Whether a year used with "best, guide, price" in the title, H1 or og:title is old and the page was not updated since.
- **Why it matters**: Titles such as "Best of 2022" look stale when the content was not updated; readers and AI summaries pick fresher sources. Use a year only if the content was truly refreshed for it. The threshold is not official (heuristic); it does not affect the score.
- **How to fix it**: Information only. If the year in the title is old, truly refresh the content and update the year, or drop the year from the title; after refreshing, update `dateModified` in the schema too.

### rel marking on affiliate links

[ICR-36](https://ruesandora.com/glossary#icr-36) Information, not scored Observed

- **What it measures**: Whether affiliate links are marked with rel="sponsored" or nofollow.
- **Why it matters**: Google asks paid or affiliate links to be marked rel="sponsored"; unmarked links can count as a link scheme. Information only; it does not affect the score.
- **How to fix it**: Information only. Add `rel="sponsored nofollow"` to affiliate links and add a short disclosure at the top of affiliate content.[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/qualify-outbound-links)

### Empty and repeated headings

[ICR-37](https://ruesandora.com/glossary#icr-37) Information, not scored Observed

- **What it measures**: Whether there are empty H2/H3 headings or headings with the same text repeated many times.
- **Why it matters**: An empty heading is a blank stop for screen readers; repeated headings such as "Details" do not tell sections apart and AI summaries mix them up. Information only; it does not affect the score.
- **How to fix it**: Information only. Delete empty heading tags or put text in them; turn repeated headings such as "Details" into distinct headings that name the section topic.[Source: developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Heading_Elements)

### Header cells in tables

[ICR-38](https://ruesandora.com/glossary#icr-38) Information, not scored Observed

- **What it measures**: Whether data tables have header cells (th).
- **Why it matters**: Without header cells (th) a screen reader or AI cannot tell which value belongs to which column. Give layout tables role="presentation". Information only; it does not affect the score.
- **How to fix it**: Information only. Mark the first row of data tables with `<th scope="col">`; give `role="presentation"` to tables used only for layout, or move to a CSS layout.[Source: www.w3.org](https://www.w3.org/WAI/tutorials/tables/)

### Comparison and alternatives pages

[KRS-01](https://ruesandora.com/glossary#krs-01) Information, not scored Inferred

- **What it measures**: Whether the site has comparison pages such as "X vs Y" and "X alternatives", and whether they are thorough enough.
- **Why it matters**: AI answers quote comparison pages for "which is better" and "X alternatives" questions; without such pages the site is less likely to be quoted.
- **How to fix it**: Information only. For the most-asked competitor comparisons, write "X vs Y" and "X alternatives" pages: an honest table, who each option suits and at least 300 words. Link them from the home page.

### Release notes and compatibility

[SRM-01](https://ruesandora.com/glossary#srm-01) Information, not scored Inferred

- **What it measures**: Whether a software site has a current release-notes page and supported-system information.
- **Why it matters**: Current version and supported-system information answers "is it still maintained, does it work on my system" for users and AI answers.
- **How to fix it**: Information only. Publish a `/changelog` or release-notes page for your software; each entry should show the version number, date and supported systems. Add `softwareVersion` and `operatingSystem` to the schema.

### FAQ coverage and quality

[SSS-01](https://ruesandora.com/glossary#sss-01) Information, not scored Inferred

- **What it measures**: Whether the FAQ has enough questions and substantial answers, and the schema questions are visible in the text.
- **Why it matters**: Short, self-contained question-and-answer pairs are the form AI answers and search summaries quote most.
- **How to fix it**: Information only. Write an FAQ section of at least five real customer questions; each answer should stand on its own, a few sentences long, and the questions in the schema should be visible on the page.

### Content freshness and date reliability

[TAZ-01](https://ruesandora.com/glossary#taz-01) Information, not scored Inferred

- **What it measures**: Whether page dates are recent enough, and whether sitemap lastmod values have become unreliable by being stamped with the same day everywhere.
- **Why it matters**: Current, accurately dated content affects crawl priority and which sources AI answers pick; every page looking updated the same day lowers trust in the dates.
- **How to fix it**: Information only. Truly refresh old content and fix the visible and schema update date; in the sitemap update `lastmod` only when the page really changed, and do not stamp every URL with the same day.[Source: developers.google.com](https://developers.google.com/search/docs/appearance/publication-dates)

### Author expertise

[YZR-01](https://ruesandora.com/glossary#yzr-01) Information, not scored Inferred

- **What it measures**: Whether articles carry the author name, Person identity, expertise statement and author-page link together.
- **Why it matters**: A named author with stated expertise and a page shows readers and search and AI systems who the content comes from; this matters most in health, finance and legal topics.
- **How to fix it**: Information only. Add the author name, a short expertise statement and an author-page link to articles; the author page should carry Person schema and real credentials (essential in health, finance and legal). Never invent an author.

The 6 unique signals in this category are not detailed.

## Technical SEO

55 signals: 50 explained here, 5 unique to Ruescan.

### Home page response

[TEK-01](https://ruesandora.com/glossary#tek-01) Issue Observed

- **What it measures**: The home page answers with success (2xx).
- **Why it matters**: Search engines and AI bots do not index a page that returns an error, and the rest of the site is discovered from it.
- **How to fix it**: Find in server logs why the home page answers with a non-2xx status (redirect end, 4xx/5xx) and make it return 200.[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/http-network-errors)

### Indexability (noindex)

[TEK-02](https://ruesandora.com/glossary#tek-02) Issue Observed

- **What it measures**: The home page is indexable: no noindex in meta robots or X-Robots-Tag.
- **Why it matters**: noindex tells search engines not to show the page; AI search will not use it as a source either.
- **How to fix it**: Remove `<meta name="robots" content="noindex">` and the `X-Robots-Tag: noindex` header from the home page (it may be left over from staging).[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/block-indexing)

### Canonical tag

[TEK-03](https://ruesandora.com/glossary#tek-03) Issue Observed

- **What it measures**: A rel="canonical" tag exists.
- **Why it matters**: The page does not state its main address. If the same content opens at several addresses, a search engine may pick the wrong one.
- **How to fix it**: Add the page's preferred address in `<head>`: `<link rel="canonical" href="https://domain.com/">`.[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls)

### Canonical correctness

[TEK-04](https://ruesandora.com/glossary#tek-04) Possible issue Inferred

- **What it measures**: The canonical points to the same domain and to the page itself, as an absolute URL (https://…).
- **Why it matters**: If that is not intended, search engines index that address instead of this page.
- **How to fix it**: Point the canonical to the page's own absolute URL: `<link rel="canonical" href="https://domain.com/page">` (a full https address; not a relative path or http://). Point elsewhere only on true duplicates.[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls)

### Title tag

[TEK-05](https://ruesandora.com/glossary#tek-05) Issue Observed

- **What it measures**: A non-empty <title> exists.
- **Why it matters**: Search results and AI answers read the page name from the <title> tag.
- **How to fix it**: Add a descriptive title in `<head>`: `<title>Topic: short description | Brand</title>`.[Source: developers.google.com](https://developers.google.com/search/docs/appearance/title-link)

### Title length

[TEK-06](https://ruesandora.com/glossary#tek-06) Issue Observed

- **What it measures**: Whether the title is short enough to show in a search result without being cut.
- **Why it matters**: Google cuts the title at about 580 px on desktop. A very short title cannot say both what the page is and who the brand is.
- **How to fix it**: Bring the title to 30-60 characters; put the key words first and the brand name last.[Source: developers.google.com](https://developers.google.com/search/docs/appearance/title-link)

### Meta description

[TEK-07](https://ruesandora.com/glossary#tek-07) Issue Observed

- **What it measures**: A meta description exists.
- **Why it matters**: The short text in search results usually comes from this tag; without it, the search engine picks a snippet itself.
- **How to fix it**: Add a meta description summarising the page: `<meta name="description" content="…">` (120-160 characters).[Source: developers.google.com](https://developers.google.com/search/docs/appearance/snippet)

### Meta description length

[TEK-08](https://ruesandora.com/glossary#tek-08) Issue Observed

- **What it measures**: Whether the meta description fits a search result and still describes the page.
- **Why it matters**: A short description leaves space unused; a long one gets cut. 120-160 characters says enough without being cut.
- **How to fix it**: Bring the meta description to 120-160 characters; give the main message in the first sentence.[Source: developers.google.com](https://developers.google.com/search/docs/appearance/snippet)

### Sitemap presence

[TEK-09](https://ruesandora.com/glossary#tek-09) Issue Observed

- **What it measures**: A sitemap is found (Sitemap line in robots.txt or /sitemap.xml).
- **Why it matters**: A sitemap tells bots which pages exist and when they changed.
- **How to fix it**: Create an XML sitemap (/sitemap.xml) and add `Sitemap: https://domain.com/sitemap.xml` to robots.txt.[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap)

### Sitemap validity

[TEK-10](https://ruesandora.com/glossary#tek-10) Issue Observed

- **What it measures**: The sitemap is valid XML (<urlset> or <sitemapindex>).
- **Why it matters**: The address answers, but there is no <urlset> or <sitemapindex>. Bots will not recognize it as a sitemap.
- **How to fix it**: Produce the sitemap as valid XML: root element `<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">` (or `<sitemapindex>`), content type application/xml.[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap)

### URLs in the sitemap

[TEK-11](https://ruesandora.com/glossary#tek-11) Issue Observed

- **What it measures**: Whether the sitemap lists any URLs.
- **Why it matters**: There is no <loc> in the sitemap, so it points bots to no pages.
- **How to fix it**: Add the pages you want indexed to the sitemap as `<url><loc>https://domain.com/path</loc></url>`.[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap)

### Sitemap lastmod

[TEK-12](https://ruesandora.com/glossary#tek-12) Issue Observed

- **What it measures**: Whether the URLs in the sitemap carry a <lastmod> date.
- **Why it matters**: Dates help bots crawl changed pages first.
- **How to fix it**: Add `<lastmod>2026-10-10</lastmod>` to each URL with the page's real last update date.[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap)

### Sitemap line in robots.txt

[TEK-13](https://ruesandora.com/glossary#tek-13) Issue Observed

- **What it measures**: robots.txt has a Sitemap: line with an absolute (https://…) URL.
- **Why it matters**: That line lets every bot find the sitemap on its own.
- **How to fix it**: Add the sitemap's FULL (absolute) URL to robots.txt: `Sitemap: https://domain.com/sitemap.xml`. A relative line such as `Sitemap: /sitemap.xml` is not valid.[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/robots/create-robots-txt)

### Custom 404 page

[TEK-15](https://ruesandora.com/glossary#tek-15) Issue Observed

- **What it measures**: A non-existent address returns 404 (or 410) with a custom error page.
- **Why it matters**: If a missing page returns 200, search engines and bots treat empty pages as real content (soft 404). A custom 404 page guides visitors back.
- **How to fix it**: Have the server return a 404 (or 410) status for missing URLs (not 200 or a redirect to the home page); show a custom 404 template with the site menu and search.[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/http-network-errors)

### www and bare domain

[TEK-16](https://ruesandora.com/glossary#tek-16) Issue Observed

- **What it measures**: www and the bare domain resolve to one address (the other variant redirects or does not exist).
- **Why it matters**: If both addresses open without redirecting, the same site is indexed twice and links and signals are split.
- **How to fix it**: Pick either www or the bare domain; 301-redirect the other to it and make the canonical use the same variant.[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls)

### Home page redirects

[TEK-17](https://ruesandora.com/glossary#tek-17) Issue Observed

- **What it measures**: Whether the home page is reached without a needless redirect chain.
- **Why it matters**: Each redirect delays loading and spends the bots' crawl budget.
- **How to fix it**: Point internal links and redirects straight at the final URL; reduce the chain to one 301 (e.g. http://domain.com → https://www.domain.com/ in one step).[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/http-network-errors)

### Tracking parameters in internal links

[TEK-19](https://ruesandora.com/glossary#tek-19) Issue Observed

- **What it measures**: No tracking or session parameters (utm_, gclid, sessionid...) in internal links.
- **Why it matters**: Parameterized internal links create many copies of the same page; bots waste time and signals are split.
- **How to fix it**: Remove parameters like `utm_`, `gclid`, `sessionid` from internal links; track with your analytics tool's own method instead.[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls)

### Internal links from the home page

[TEK-21](https://ruesandora.com/glossary#tek-21) Issue Observed

- **What it measures**: Whether the home page links to enough distinct inner pages.
- **Why it matters**: Bots discover the rest of the site through home page links; with few links, important pages go unfound.
- **How to fix it**: Give at least 10 distinct crawlable `<a href>` links from the home page to key sections and pages (menu, highlights, footer).[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/links-crawlable)

### Content type (text/html)

[TEK-22](https://ruesandora.com/glossary#tek-22) Issue Observed

- **What it measures**: The home page is served as HTML (text/html).
- **Why it matters**: Browsers and bots may not read a page served with the wrong type as HTML.
- **How to fix it**: Serve the home page with the `Content-Type: text/html; charset=utf-8` header.[Source: developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type)

### Charset in the HTTP header

[TEK-23](https://ruesandora.com/glossary#tek-23) Issue Observed

- **What it measures**: The character set is in the HTTP header (Content-Type: text/html; charset=utf-8).
- **Why it matters**: A charset in the header lets browsers and bots decode the page correctly from the first byte and prevents broken characters.
- **How to fix it**: Set the `Content-Type: text/html; charset=utf-8` header for HTML responses in the server or CDN settings.[Source: developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type)

### Googlebot access

[TEK-29](https://ruesandora.com/glossary#tek-29) Issue Observed

- **What it measures**: robots.txt lets Googlebot read the home page.
- **Why it matters**: If Googlebot is blocked, Google cannot crawl the site; pages are not refreshed in search and can drop out of results over time. It is usually a "Disallow: /" line left by mistake.
- **How to fix it**: Remove the robots.txt line that blocks Googlebot: delete the `Disallow: /` line in the `User-agent: Googlebot` group (or the `User-agent: *` group that covers it), or add `Allow: /`. If the page is open but its style/script files are blocked (e.g. `Disallow: /assets/`), remove that line or add `Allow: /assets/*.css` and `Allow: /assets/*.js`.[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/robots/intro)

### Single canonical

[TEK-30](https://ruesandora.com/glossary#tek-30) Issue Observed

- **What it measures**: The page has a single canonical and it is inside <head>.
- **Why it matters**: Google accepts a canonical only inside <head>; a tag in the body is ignored. If several canonicals point to different addresses, Google may ignore them.
- **How to fix it**: Keep a single `<link rel="canonical" href="…">` and put it inside `<head>`; remove canonical tags in the body or a second one with a different address (usually a plugin and theme clash).[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls)

### Charset conflict

[TEK-31](https://ruesandora.com/glossary#tek-31) Possible issue Inferred

- **What it measures**: Whether the meta charset and the HTTP header charset agree.
- **Why it matters**: If the header and the meta tag name different character sets, the browser picks the header; if the page was written for the other one, accented characters can break.
- **How to fix it**: Make the meta charset match the HTTP header (usually both UTF-8): `<meta charset="utf-8">` and `Content-Type: text/html; charset=utf-8`.

### Bing verification tag

[TEK-34](https://ruesandora.com/glossary#tek-34) Information, not scored Observed

- **What it measures**: A Bing Webmaster verification tag (msvalidate.01) was seen.
- **Why it matters**: The site has a Bing Webmaster Tools verification tag; it may be registered with Bing (a source for Copilot and ChatGPT search). Information only; it does not affect the score.
- **How to fix it**: Information only; nothing to do.

### Sitemap size limit

[TEK-36](https://ruesandora.com/glossary#tek-36) Issue Observed

- **What it measures**: Whether the sitemap file exceeds Google's size and URL limit.
- **Why it matters**: Google accepts a single sitemap up to 50 MB (uncompressed) and 50,000 URLs; the rest is not processed. Large sites split the sitemap into parts and give a sitemap index.
- **How to fix it**: Split the sitemap into parts: at most 50,000 URLs and 50 MB (uncompressed) per file; collect the parts in a sitemap index (`<sitemapindex>`) file and give the index address in robots.txt.[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap)

### The max-image-preview directive

[TEK-37](https://ruesandora.com/glossary#tek-37) Opportunity Inferred

- **What it measures**: Meta robots or X-Robots-Tag has max-image-preview:large.
- **Why it matters**: Without it Google may show a default-size preview. For a large image preview (Discover included) the page should say "max-image-preview:large".
- **How to fix it**: Add `<meta name="robots" content="max-image-preview:large">` to the page (or send the same value in the `X-Robots-Tag` header). Remove `max-image-preview:none` or `standard` unless it is deliberate. The page should also have an image at least 1200 px wide.[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/robots-meta-tag)

### HTTP canonical header

[TEK-38](https://ruesandora.com/glossary#tek-38) Issue Observed

- **What it measures**: Whether there is no HTTP Link: rel="canonical" header, or it names the same address as the HTML canonical.
- **Why it matters**: The server header names one address as canonical and the page's <link rel="canonical"> another. Google says using both is error prone; a conflicting signal may be ignored and an address you did not choose may be picked. Pick one method.
- **How to fix it**: Pick one method for canonical. On HTML pages `<link rel="canonical">` is enough: remove the `Link: <…>; rel="canonical"` header on the server. If you keep the header, delete the HTML tag or point both to the same address.[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls)

### Sitemap cache time

[TEK-39](https://ruesandora.com/glossary#tek-39) Possible issue Inferred

- **What it measures**: Whether the sitemap cache time (CDN included) stays within a reasonable limit.
- **Why it matters**: If the sitemap stays in cache for a long time, newly published pages reach search engines and AI crawlers late. Keep its Cache-Control short (e.g. max-age=3600) or purge the CDN cache when a page is added. The threshold is a heuristic.
- **How to fix it**: Keep the sitemap Cache-Control short (e.g. `max-age=3600`) or purge the CDN cache when a page is added, so the CDN does not serve an old sitemap for days.[Source: developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control)

### Response on the first request

[TEK-28](https://ruesandora.com/glossary#tek-28) Possible issue Inferred

- **What it measures**: Whether the home page answers successfully on the first request.
- **Why it matters**: During the scan the home page first returned an error (e.g. 503 during a deploy). This may have been a brief outage, so the score is marked provisional. If it happens often, deploy without downtime or send Retry-After on the maintenance page.
- **How to fix it**: Deploy without downtime (e.g. prepare the new version, then switch traffic); if you need a maintenance page, send 503 together with a `Retry-After` header.[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/http-network-errors)

### Noindex pages in the sitemap

[TEK-40](https://ruesandora.com/glossary#tek-40) Issue Observed

- **What it measures**: Sampled sitemap pages have no noindex in meta robots or X-Robots-Tag.
- **Why it matters**: A sitemap says "index this page"; if the page says noindex the signals conflict. Google will not index these addresses and Search Console reports "Submitted URL marked noindex". Either remove noindex from the page or remove the address from the sitemap.
- **How to fix it**: For the noindex pages in the sitemap either remove noindex (meta robots and X-Robots-Tag) or remove the addresses from the sitemap. The sitemap should hold indexable pages only.[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/block-indexing)

### Pagination canonical

[TEK-41](https://ruesandora.com/glossary#tek-41) Issue Observed

- **What it measures**: Whether the canonical of paginated pages points to the page itself rather than to the first page.
- **Why it matters**: If page 2, 3, 4... name page 1 as canonical, Google treats them as copies of page 1; products or posts on later pages may not be discovered or indexed. Each paginated page should be self-canonical (rel=next/prev is no longer used by Google).
- **How to fix it**: On paginated pages (?page=2, /page/2/) point the canonical to the page's own address, not to page 1: `<link rel="canonical" href="https://domain.com/blog?page=2">`.[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls)

### Canonical target opens

[TEK-42](https://ruesandora.com/glossary#tek-42) Issue Observed

- **What it measures**: Whether a canonical that points elsewhere opens normally, does not redirect and carries no noindex.
- **Why it matters**: The canonical tells search engines "this is the main address". If that address does not open, is noindex or redirects elsewhere, search engines ignore the signal or quietly drop the page from the index. Some CDNs and security layers also redirect to the canonical target; a wrong canonical hides the page.
- **How to fix it**: The address the canonical points to must open with 200, must not redirect and must not carry noindex. If the target is wrong, point the canonical to the page's own final (non-redirecting) address: `<link rel="canonical" href="https://domain.com/page/">`. Remove any "redirect to canonical" rule in your CDN or security layer.[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls)

### Analytics tag loaded twice

[TEK-43](https://ruesandora.com/glossary#tek-43) Possible issue Inferred

- **What it measures**: Whether each measurement ID is loaded once on the page and whether gtag.js and Tag Manager sit together.
- **Why it matters**: If the same ID loads twice, every visit is counted twice: sessions, page views and conversions inflate, and reports and ad optimisation run on wrong data. If gtag.js and Tag Manager sit together, the container may also send the same GA4 ID (we cannot see inside the container), so this is flagged as "possible".
- **How to fix it**: Load each measurement ID once per page. If you use Tag Manager, keep the GA4 tag inside the container only and remove the separate gtag.js file and the gtag `config` code from the page; if the container has no GA4 tag, do the opposite. Check: in Tag Assistant or the browser network tab only one page-view request should go out for the same ID.

### Same lastmod day across the sitemap

[TEK-44](https://ruesandora.com/glossary#tek-44) Possible issue Inferred

- **What it measures**: Whether nearly all dated sitemap URLs share one day; if so, lastmod may be auto-generated.
- **Why it matters**: If every URL looks updated on the same day, the date may come from when the sitemap was generated rather than from a page change. Google uses lastmod only when it is consistent and accurate, so in that case crawl priority cannot use it. If the whole site really was republished that day, this is not an error.
- **How to fix it**: `lastmod` should change only when the page really changes: the sitemap generator should not stamp today's date on every URL each time it runs; take the date from the page's last edit time (the CMS "updated" field). If you cannot keep real dates, omitting `lastmod` is better than giving every URL the same date.[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap)

### Invalid element inside <head>

[TEK-45](https://ruesandora.com/glossary#tek-45) Issue Observed

- **What it measures**: Whether a non-metadata element inside head pushes the head tags after it into the body.
- **Why it matters**: Browsers and Google close <head> at the first invalid element. Canonical, hreflang, robots or description tags after it fall into the body and Google may ignore them.
- **How to fix it**: Keep only meta, link, title, style, script, base, noscript and template inside `<head>`. Move elements such as div, img, iframe or a (often left by a plugin or tracking code) into `<body>`, or put the canonical, hreflang and meta tags before them.[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/valid-page-metadata)

### Links that go nowhere

[TEK-46](https://ruesandora.com/glossary#tek-46) Possible issue Inferred

- **What it measures**: Whether links go to a real address, or are empty, "#" or javascript: links.
- **Why it matters**: An href="#" or javascript: link is a dead end for search engines and AI crawlers; it carries no real address. Use a button element for things like opening a menu.
- **How to fix it**: Turn `href="#"` and `javascript:` links into links with a real address; use a button element (`type="button"`) for elements that only perform an action (open a menu, switch a tab).[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/links-crawlable)

### http:// in internal links

[TEK-47](https://ruesandora.com/glossary#tek-47) Issue Observed

- **What it measures**: Whether internal links on an HTTPS site use http://.
- **Why it matters**: An internal link given as http:// hits a redirect on every click and every bot visit; crawl budget is wasted and the canonical address signal weakens.
- **How to fix it**: Use `https://` or relative paths (`/page`) instead of `http://` in links to your own pages; bulk-replace old addresses in menus, footers and the content editor.

### tel: and mailto: syntax

[TEK-48](https://ruesandora.com/glossary#tek-48) Issue Observed

- **What it measures**: Whether tel: and mailto: links carry a valid number or email address (values are not stored).
- **Why it matters**: A broken tel: link does not start a call and a broken mailto: does not open email. Visitors cannot get in touch, and AI and search engines cannot read the contact details.
- **How to fix it**: Put only the number in international format in tel: links (`href="tel:+902120000000"`); mailto: links need a valid address (`href="mailto:info@domain.com"`).

### Development address (localhost)

[TEK-49](https://ruesandora.com/glossary#tek-49) Issue Observed

- **What it measures**: Whether a development address such as localhost or .local is left on the page.
- **Why it matters**: A localhost or .local address only opens on the developer's computer. For visitors and bots the link, image or script is broken; in a canonical it names the wrong main address.
- **How to fix it**: Replace localhost, 127.0.0.1 or .local/.test addresses with your live domain or a relative path; search the template and database for them before going live.

### Boilerplate title and description

[TEK-54](https://ruesandora.com/glossary#tek-54) Information, not scored Observed

- **What it measures**: Whether the title and meta description are leftover boilerplate such as "Home" or "Just another WordPress site".
- **Why it matters**: Leftover text such as "Home" or "Just another WordPress site" does not say what the page is; the brand and topic are missing in search results and AI summaries. Information only; it does not affect the score.
- **How to fix it**: Replace the home page title and meta description with your own wording that names the brand and what you do. Remove leftovers such as "Home" or "Just another WordPress site".

### Duplicate tags and conflicting robots

[TEK-55](https://ruesandora.com/glossary#tek-55) Information, not scored Observed

- **What it measures**: Whether the page has one title and one meta description, and whether robots directives conflict (index with noindex, follow with nofollow).
- **Why it matters**: Google applies the most restrictive of conflicting robots directives, so a stray "noindex" or "nofollow" may be in effect. With two titles or descriptions it is unclear which is used (a plugin and the theme often both write the tag). Information only; it does not affect the score.
- **How to fix it**: Let only one of the theme or SEO plugin write the title, description and robots tags; turn the other off. The source should have one <title>, one meta description, and no index/noindex or follow/nofollow together.

### Links blocked with nofollow

[TEK-56](https://ruesandora.com/glossary#tek-56) Information, not scored Observed

- **What it measures**: Whether the page has page-level nofollow, and whether many internal links carry rel="nofollow".
- **Why it matters**: Page-level nofollow stops every link on the page from being followed; nofollow on internal links cuts link equity and the crawl path. Information only; it does not affect the score.
- **How to fix it**: Turn off "nofollow" in the page settings or SEO plugin and remove rel="nofollow" from internal links (keep it only on user-generated or paid links).

### Helpful links on the 404 page

[TEK-57](https://ruesandora.com/glossary#tek-57) Information, not scored Observed

- **What it measures**: Whether, when a missing address returns 404, the page has enough links leading visitors to the home page or categories.
- **Why it matters**: A visitor or bot that lands on a wrong address and finds no link to the home page, categories or search leaves the site. Information only; it does not affect the score.
- **How to fix it**: Add links to the home page, main categories, popular pages and a search box on the 404 page; at least 3 links.

### Internal search addresses closed in robots.txt

[TEK-58](https://ruesandora.com/glossary#tek-58) Information, not scored Observed

- **What it measures**: Whether, if the site has a search form, search-result addresses are closed to Googlebot in robots.txt.
- **Why it matters**: Every query the search form makes is its own address. If not closed, bots can crawl endless thin pages and spend crawl budget. Information only; it does not affect the score.
- **How to fix it**: Close the search address in robots.txt: under "User-agent: *" add "Disallow: /search" and "Disallow: /*?s=" (use your own search path).

### Sitemap pages blocked by robots.txt

[TEK-59](https://ruesandora.com/glossary#tek-59) Information, not scored Observed

- **What it measures**: Whether addresses listed in the sitemap are blocked for Googlebot by robots.txt.
- **Why it matters**: Listing a page in the sitemap while closing it in robots.txt means the bot cannot read it, so it never sees a noindex tag on it and the address can still be indexed. The two should agree. Information only; it does not affect the score.
- **How to fix it**: Find which Disallow line blocks the sitemap pages. If the page should be indexed, remove the line; if not, drop it from the sitemap and use noindex (noindex is seen only when the bot can read the page).

### Filter and session-parameter links

[TEK-62](https://ruesandora.com/glossary#tek-62) Information, not scored Observed

- **What it measures**: Whether many internal links on the home page carry filter, sort or session parameters.
- **Why it matters**: Every filter and sort combination becomes its own address; bots get lost in them and burn crawl budget, and a session id serves the same page at endless addresses. Information only; it does not affect the score.
- **How to fix it**: Give filter, sort and session-parameter links a canonical and, where possible, close them in robots.txt (e.g. "Disallow: /*?*sort="); keep session ids in cookies, not in the address.

### Open user-generated pages

[TEK-60](https://ruesandora.com/glossary#tek-60) Information, not scored Observed

- **What it measures**: Whether sampled pages under profile, share, paste or forum paths are open without noindex. It gives no verdict, only a note.
- **Why it matters**: Anyone can create profile, share, paste and forum pages; unmoderated they fill with spam, and Google's user-generated spam policy can affect the whole site. If open on purpose (a moderated forum), that is fine. Information only; it does not affect the score.
- **How to fix it**: Information only. Public profile, share, paste or forum pages can attract spam if unmoderated. If you do not want them indexed, add `<meta name="robots" content="noindex">`; give user links `rel="ugc nofollow"`; if open on purpose, moderate the content.[Source: developers.google.com](https://developers.google.com/search/docs/essentials/spam-policies)

### Soft 404 pages

[TEK-61](https://ruesandora.com/glossary#tek-61) Information, not scored Observed

- **What it measures**: Whether a page that says "not found" returns a success status instead of 404.
- **Why it matters**: If a page says "not found" but the server returns 200 (success), Google treats it as a soft 404 and drops it from the index; crawl budget is wasted. A page that is really gone should return 404 or 410. Information only; it does not affect the score.
- **How to fix it**: Information only. If a page that says "not found" returns 200, make the server return 404 (or 410 if removed for good); if the page really exists, show its real content. Put noindex on empty search-result pages.[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/http-network-errors)

### Broken internal links

[TEK-53](https://ruesandora.com/glossary#tek-53) Information, not scored Observed

- **What it measures**: Whether the first internal links on the home page return 404 or 410. Blocking responses are not counted as broken.
- **Why it matters**: A broken internal link sends visitors and crawlers to an empty page, wastes crawl budget and makes the site look neglected. Only the first 10 links are tried. Information only; it does not affect the score.
- **How to fix it**: Information only. Point the broken internal link to the right address; if the page is gone, 301-redirect it to the closest topic or remove the link. Check menu and footer links first.[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/301-redirects)

### Internal link depth

[IBG-01](https://ruesandora.com/glossary#ibg-01) Information, not scored Inferred

- **What it measures**: Whether pages link to enough internal targets, are reachable in few clicks from the home page and have few broken internal links.
- **Why it matters**: Internal links let crawlers and AI systems find pages and understand how topics relate; pages buried deep are crawled less.
- **How to fix it**: Information only. Make important pages reachable within three clicks of the home page; link from each page to a few related inner pages with descriptive anchor text, and fix broken internal links.[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/links-crawlable)

The 5 unique signals in this category are not detailed.

## Speed and code

44 signals.

### PageSpeed mobile performance

[KOD-01](https://ruesandora.com/glossary#kod-01) Issue Observed

- **What it measures**: The Google PageSpeed mobile performance score.
- **Why it matters**: Google PageSpeed (Lighthouse) mobile test. 90+ is good, 50-89 needs work, below 50 is poor. Visitors and bots abandon slow pages.
- **How to fix it**: Start with the biggest wins in the PageSpeed report: shrink large images, defer render-blocking scripts (`defer`), remove unused JavaScript.[Source: web.dev](https://web.dev/articles/lcp)

### LCP: largest contentful paint

[KOD-02](https://ruesandora.com/glossary#kod-02) Issue Observed

- **What it measures**: LCP, the time the main content takes to appear, against Google's Core Web Vitals guidance.
- **Why it matters**: Time until the largest element is on screen; one of the three Core Web Vitals Google uses in ranking.
- **How to fix it**: Shrink and prioritise the LCP element (usually the large hero image): `fetchpriority="high"`, a modern format (WebP/AVIF), no lazy loading; speed up the server response.[Source: web.dev](https://web.dev/articles/lcp)

### CLS: layout shift

[KOD-03](https://ruesandora.com/glossary#kod-03) Issue Observed

- **What it measures**: CLS, how much the layout shifts while loading, against Google's Core Web Vitals guidance.
- **Why it matters**: How much elements move while loading; it causes mis-clicks and is one of Google's Core Web Vitals.
- **How to fix it**: Give images, videos and ad slots `width`/`height` or `aspect-ratio`; do not insert content above existing content later; set `font-display` for fonts.[Source: web.dev](https://web.dev/articles/cls)

### TBT: total blocking time

[KOD-04](https://ruesandora.com/glossary#kod-04) Issue Observed

- **What it measures**: TBT, the total time the main thread is blocked.
- **Why it matters**: Heavy JavaScript locks the page while loading; taps and clicks lag.
- **How to fix it**: Break up long JavaScript tasks, reduce or defer third-party scripts, remove unused code.[Source: web.dev](https://web.dev/articles/inp)

### FCP: first contentful paint

[KOD-05](https://ruesandora.com/glossary#kod-05) Issue Observed

- **What it measures**: FCP, the time the first content takes to appear.
- **Why it matters**: Visitors see the first thing on screen after this long; if it is long, the page feels empty.
- **How to fix it**: Reduce render-blocking CSS/JS, inline critical CSS, shorten server response time.[Source: web.dev](https://web.dev/articles/fcp)

### Real-user data (CrUX)

[KOD-06](https://ruesandora.com/glossary#kod-06) Issue Observed

- **What it measures**: LCP, INP and CLS in real Chrome user data (CrUX). Without data the signal is not measured.
- **Why it matters**: This is not a lab test; it comes from the site's real Chrome users, and Google uses it in ranking.
- **How to fix it**: Focus on the poor real-user metric: speed up the hero image for LCP, break up long JS tasks for INP, give elements dimensions for CLS. Changes show up over 28 days.[Source: web.dev](https://web.dev/articles/inp)

### Server response time (TTFB)

[KOD-07](https://ruesandora.com/glossary#kod-07) Issue Observed

- **What it measures**: How quickly the server sends its first response (TTFB).
- **Why it matters**: A slow first response delays every page; bots crawl slow sites less. Measured from our server (Cloudflare).
- **How to fix it**: Speed up the server response: enable page or CDN caching, fix slow database queries, serve from a region close to users.[Source: web.dev](https://web.dev/articles/ttfb)

### Text compression

[KOD-08](https://ruesandora.com/glossary#kod-08) Issue Observed

- **What it measures**: Text compression (br, gzip or zstd) is on.
- **Why it matters**: Compression usually shrinks HTML, CSS and JavaScript by about 70%, so pages reach visitors and bots faster.
- **How to fix it**: Enable Brotli or gzip compression for text responses (HTML, CSS, JS, JSON) on the server or CDN.[Source: developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTTP/Compression)

### HTTP/3

[KOD-09](https://ruesandora.com/glossary#kod-09) Opportunity Inferred

- **What it measures**: HTTP/3 is advertised (Alt-Svc: h3).
- **Why it matters**: HTTP/3 speeds up connections, especially on mobile and lossy networks. Note: only the header is checked.
- **How to fix it**: Enable HTTP/3 on the CDN or server (a single setting on most CDNs); the server should send an `Alt-Svc: h3=":443"` header.

### HTML size

[KOD-10](https://ruesandora.com/glossary#kod-10) Possible issue Inferred

- **What it measures**: The size of the home page HTML.
- **Why it matters**: Large HTML (often inline scripts and styles) hits bots' read limits and delays first render.
- **How to fix it**: Make the HTML smaller: move large inline scripts, styles and SVGs to external files and reduce large embedded JSON state.

### Render-blocking scripts

[KOD-11](https://ruesandora.com/glossary#kod-11) Issue Observed

- **What it measures**: No external scripts in <head> without async or defer (render-blocking).
- **Why it matters**: The browser does not draw the page until a blocking script in <head> is downloaded and run; first render is delayed.
- **How to fix it**: Add `defer` (if order matters) or `async` to external scripts in `<head>`, or move them before `</body>`.

### Render-blocking stylesheets

[KOD-12](https://ruesandora.com/glossary#kod-12) Issue Observed

- **What it measures**: How many stylesheets block rendering.
- **Why it matters**: Each blocking CSS file delays first render by another request; fewer, combined files are faster.
- **How to fix it**: Combine stylesheets, inline critical CSS and load non-critical ones later via `media` or `rel="preload"`.

### Third-party scripts

[KOD-13](https://ruesandora.com/glossary#kod-13) Possible issue Inferred

- **What it measures**: How many third-party domains load scripts.
- **Why it matters**: Each outside domain means another connection, more delay and a privacy risk; the page depends on others' servers.
- **How to fix it**: Audit third-party scripts; remove unneeded ones and defer the rest, ideally through a single tag manager.

### Image dimensions (width, height)

[KOD-14](https://ruesandora.com/glossary#kod-14) Issue Observed

- **What it measures**: Whether most images have width and height set.
- **Why it matters**: An image without a known size makes the page shift when it loads (CLS); the browser cannot reserve space.
- **How to fix it**: Write `width` and `height` with the real dimensions on every `<img>` (responsive sizing in CSS still works).[Source: web.dev](https://web.dev/articles/cls)

### Lazy loading

[KOD-15](https://ruesandora.com/glossary#kod-15) Opportunity Inferred

- **What it measures**: Whether images after the first few use loading="lazy".
- **Why it matters**: Loading off-screen images later lightens the first load and saves mobile data.
- **How to fix it**: Add `loading="lazy"` to images below the fold; do not add it to the first-screen (especially LCP) image.[Source: web.dev](https://web.dev/articles/browser-level-image-lazy-loading)

### Modern image formats

[KOD-16](https://ruesandora.com/glossary#kod-16) Opportunity Inferred

- **What it measures**: Whether images use modern formats such as WebP or AVIF.
- **Why it matters**: WebP and AVIF usually deliver the same image in a 25-50% smaller file.
- **How to fix it**: Serve images as WebP or AVIF (with a `<picture>` fallback or via CDN image conversion).

### Web font loading

[KOD-17](https://ruesandora.com/glossary#kod-17) Opportunity Inferred

- **What it measures**: If a web font service is used, there is a preconnect or display=swap.
- **Why it matters**: Preconnecting to the font server or using font-display: swap keeps text visible while fonts load.
- **How to fix it**: Add `<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>` for the font service and append `display=swap` to the font URL.[Source: developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display)

### Cache lifetime

[KOD-18](https://ruesandora.com/glossary#kod-18) Issue Observed

- **What it measures**: Whether CSS and JS files are cached for a long time.
- **Why it matters**: A long cache lifetime saves returning visitors and bots from downloading the same files again.
- **How to fix it**: Serve versioned (content-hashed) CSS/JS files with `Cache-Control: public, max-age=31536000, immutable`.[Source: developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control)

### doctype, charset and viewport

[KOD-19](https://ruesandora.com/glossary#kod-19) Issue Observed

- **What it measures**: Whether the doctype comes first, the charset is declared early and a viewport tag exists.
- **Why it matters**: Without viewport the page opens as a shrunken desktop page on phones (Google evaluates the phone view); doctype and an early charset make browsers read the page in the right mode and encoding.
- **How to fix it**: Start the document with `<!doctype html>`; put `<meta charset="utf-8">` and `<meta name="viewport" content="width=device-width, initial-scale=1">` at the top of `<head>`.

### PageSpeed accessibility

[KOD-22](https://ruesandora.com/glossary#kod-22) Issue Observed

- **What it measures**: The Google PageSpeed accessibility score.
- **Why it matters**: An accessible page (contrast, labels, heading order) serves screen readers and bots alike.
- **How to fix it**: Fix the items in the PageSpeed accessibility section: colour contrast, form labels, button and link names, image alt text.

### PageSpeed SEO

[KOD-23](https://ruesandora.com/glossary#kod-23) Issue Observed

- **What it measures**: The Google PageSpeed SEO score.
- **Why it matters**: Lighthouse's basic SEO checks (crawlability, title, description, link text) add up to this score.
- **How to fix it**: Fix the items in the PageSpeed SEO section (title, meta description, crawlable links, valid robots.txt, hreflang).

### PageSpeed best practices

[KOD-24](https://ruesandora.com/glossary#kod-24) Issue Observed

- **What it measures**: The Google PageSpeed best practices score.
- **Why it matters**: Checks such as HTTPS, console errors, deprecated APIs and image ratios; browser warnings reduce trust.
- **How to fix it**: Fix the items in the PageSpeed best practices section (console errors, HTTPS, outdated libraries, image aspect ratios).

### Unused JavaScript

[KOD-26](https://ruesandora.com/glossary#kod-26) Issue Observed

- **What it measures**: How much unused JavaScript the page carries (Lighthouse).
- **Why it matters**: Unused code is downloaded and parsed anyway, making the page needlessly heavy.
- **How to fix it**: Remove unused JavaScript or code-split it so it loads only where needed; disable unused plugins.

### HTML download time

[KOD-28](https://ruesandora.com/glossary#kod-28) Issue Observed

- **What it measures**: Whether the home page HTML downloads quickly.
- **Why it matters**: Fetched from our server, the HTML took this long to complete. Slow HTML delays every page and bot crawling.
- **How to fix it**: Shorten the full HTML download: serve the page from cache, make the HTML smaller, enable compression.[Source: web.dev](https://web.dev/articles/ttfb)

### DOM size

[KOD-29](https://ruesandora.com/glossary#kod-29) Possible issue Inferred

- **What it measures**: The number of DOM elements on the page (Lighthouse).
- **Why it matters**: A large DOM raises memory use and render time; interactions slow down.
- **How to fix it**: Reduce the DOM size: remove unnecessary wrapper divs, paginate or lazily render long lists.

### Page weight

[KOD-30](https://ruesandora.com/glossary#kod-30) Possible issue Inferred

- **What it measures**: Whether the total page weight stays within what Lighthouse accepts.
- **Why it matters**: Heavy pages are slow and costly on mobile data; the resource breakdown is in the speed section.
- **How to fix it**: Reduce total page weight: compress and resize images, remove unused JS/CSS and extra font weights.

### JavaScript minification

[KOD-31](https://ruesandora.com/glossary#kod-31) Issue Observed

- **What it measures**: Whether JavaScript is minified (Lighthouse).
- **Why it matters**: Minifying removes whitespace and comments so files download faster.
- **How to fix it**: Minify JavaScript files at build time.

### CSS minification

[KOD-32](https://ruesandora.com/glossary#kod-32) Issue Observed

- **What it measures**: Whether CSS is minified (Lighthouse).
- **Why it matters**: Minified CSS downloads faster and holds up rendering less.
- **How to fix it**: Minify CSS files at build time.

### Image sizing

[KOD-33](https://ruesandora.com/glossary#kod-33) Issue Observed

- **What it measures**: Whether images are sized for the screen (Lighthouse).
- **Why it matters**: Downloading images larger than shown on phones wastes data and time; srcset can serve the right size.
- **How to fix it**: Offer screen-appropriate image variants with `srcset` and `sizes`; do not send images larger than they are displayed.

### Skip to content link

[KOD-34](https://ruesandora.com/glossary#kod-34) Opportunity Inferred

- **What it measures**: Whether the page starts with a "skip to content" link to the main content.
- **Why it matters**: Keyboard and screen reader users must tab through the menu on every page. A "skip to content" link at the top takes them straight to the main content.
- **How to fix it**: Add a "Skip to content" link to the main content as the first element of the body (`href="#content"`); give the main content container `id="content"`. It may be visually hidden but must appear on keyboard focus.

### Focus outline

[KOD-35](https://ruesandora.com/glossary#kod-35) Possible issue Inferred

- **What it measures**: Whether the page's style blocks remove the keyboard focus outline, and if so whether a visible focus style replaces it.
- **Why it matters**: People using a keyboard see where they are from the focus outline. If it is removed without a replacement, the site cannot be used with a keyboard.
- **How to fix it**: Remove the `outline: none` / `outline: 0` rule or add a visible focus style instead: `:focus-visible { outline: 2px solid currentColor; outline-offset: 2px; }`. If you do not want the ring on mouse clicks, use `:focus:not(:focus-visible) { outline: none }`.[Source: developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/CSS/:focus-visible)

### Zoom on phones

[KOD-36](https://ruesandora.com/glossary#kod-36) Issue Observed

- **What it measures**: Whether the viewport tag disables zoom on phones (user-scalable=no or a low maximum-scale).
- **Why it matters**: People with low vision pinch to enlarge text. user-scalable=no or maximum-scale=1 blocks this; Lighthouse also flags it as an accessibility error.
- **How to fix it**: Remove `user-scalable=no` and `maximum-scale=1` from the viewport tag: `<meta name="viewport" content="width=device-width, initial-scale=1">`.

### Button name

[KOD-37](https://ruesandora.com/glossary#kod-37) Issue Observed

- **What it measures**: Whether buttons have a name a screen reader can read: text, aria-label, title or an image with alt.
- **Why it matters**: A screen reader reads an icon-only button as just "button" and cannot say what it does. AI agents also recognise page buttons by their name.
- **How to fix it**: Give every icon-only button a name: add `aria-label="Open menu"` to the button and `aria-hidden="true"` to the icon inside; use `alt` on image buttons and `value` on `input type="button"`.[Source: developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-label)

### Form field label

[KOD-38](https://ruesandora.com/glossary#kod-38) Issue Observed

- **What it measures**: Whether form fields are tied to a label (label, aria-label); a placeholder alone does not count.
- **Why it matters**: A screen reader cannot say what goes into an unlabelled field; a placeholder disappears once typing starts. AI agents filling the form also recognise fields by their label.
- **How to fix it**: Tie every form field to a label: `<label for="email">Email</label><input id="email" type="email">`. If you do not want a visible label, use `aria-label`; a placeholder does not replace a label.[Source: developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/label)

### Link name

[KOD-39](https://ruesandora.com/glossary#kod-39) Issue Observed

- **What it measures**: Whether icon links have a readable name: text, aria-label, title or an image with alt.
- **Why it matters**: An icon-only link (social, cart, menu) is read out as a bare address. Search engines and AI crawlers also learn where a link goes from its text.
- **How to fix it**: Name icon links (social, cart, search): add `aria-label="Instagram"` to the link or give its image an `alt`; remove empty links.

### Semantic regions (main, nav)

[KOD-40](https://ruesandora.com/glossary#kod-40) Possible issue Inferred

- **What it measures**: Whether the page marks its main content (main) and menu (nav) regions.
- **Why it matters**: <main> and <nav> separate the main content from the menu. Screen readers jump between regions; AI crawlers use these markers to tell the main text from menus and footers.
- **How to fix it**: Wrap the main content in a single `<main>` and the menu in `<nav>`; use the article element for standalone pieces. If the template cannot change, add `role="main"` and `role="navigation"` to the containers.[Source: developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/main)

### Single HTML root, no meta in body

[KOD-41](https://ruesandora.com/glossary#kod-41) Issue Observed

- **What it measures**: Whether the HTML and body roots open only once, and whether there are meta tags in the body.
- **Why it matters**: An <html> or <body> opened twice usually means two templates were stacked; browsers ignore the second and its attributes are lost. A meta tag in the body (description, robots) may not be read by search engines.
- **How to fix it**: Open `<html>` and `<body>` only once in the template (no nested or stacked template parts). Move `<meta>` tags into `<head>`; only microdata (`itemprop`) meta may stay in the body.

### Broken and heavy content images

[KOD-42](https://ruesandora.com/glossary#kod-42) Information, not scored Observed

- **What it measures**: Whether any of the first content images on the home page is broken (404) or very large.
- **Why it matters**: A broken image makes the page look careless; a heavy one slows loading. Observation only; does not affect the score.
- **How to fix it**: Information only. Fix the broken image address or remove the image. Convert images over 200 KB to WebP or compressed JPEG and resize them to the size they are shown at.[Source: web.dev](https://web.dev/articles/choose-the-right-image-format)

### First image is lazy-loaded

[KOD-43](https://ruesandora.com/glossary#kod-43) Information, not scored Observed

- **What it measures**: Whether the first content image loads lazily or with low priority (which delays the main content).
- **Why it matters**: Lazy-loading the first on-screen image delays Largest Contentful Paint (LCP). Which image is above the fold depends on layout, so this is an observation.
- **How to fix it**: Information only. Remove `loading="lazy"` from the first image visible above the fold and, if possible, give it `fetchpriority="high"`. Keep lazy loading for images below the fold.[Source: web.dev](https://web.dev/articles/lcp)

### Lazy loading on video embeds

[KOD-46](https://ruesandora.com/glossary#kod-46) Information, not scored Observed

- **What it measures**: Whether YouTube and Vimeo embeds carry loading="lazy".
- **Why it matters**: YouTube and Vimeo embeds pull hundreds of KB of script and images. Without loading="lazy" even off-screen videos load on first open and slow the page. A single main video at the very top may load immediately on purpose. Information only; it does not affect the score.
- **How to fix it**: Information only. Add `loading="lazy"` to YouTube and Vimeo embeds: `<iframe src="..." loading="lazy" title="Video title">`. A single main video at the very top may load immediately on purpose.[Source: web.dev](https://web.dev/articles/browser-level-image-lazy-loading)

### iframe titles

[KOD-45](https://ruesandora.com/glossary#kod-45) Information, not scored Observed

- **What it measures**: Whether embedded iframes (maps, videos) have a title attribute.
- **Why it matters**: A screen reader cannot say what an iframe without a title is; accessibility audits flag it. Give every iframe a short title. Information only; it does not affect the score.
- **How to fix it**: Information only. Give every iframe a short `title` describing its content: `<iframe src="..." title="Store map">`.[Source: developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe)

### Conditional request and 304 support

[KOD-44](https://ruesandora.com/glossary#kod-44) Information, not scored Observed

- **What it measures**: Whether, if the home page sends ETag or Last-Modified, a conditional request gets a "not modified" reply.
- **Why it matters**: Validators and 304 support let bots re-check an unchanged page without downloading it again, which helps crawl budget and speed. Absence is normal for dynamic pages. Information only; it does not affect the score.
- **How to fix it**: Information only. Enable `ETag` and `Last-Modified` headers on the server or CDN; on a conditional request (`If-None-Match`, `If-Modified-Since`) return 304 when the page has not changed. For dynamic pages, having no validator is normal.[Source: developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTTP/Conditional_requests)

### Real-user speed decline (CrUX history)

[KOD-47](https://ruesandora.com/glossary#kod-47) Information, not scored Observed

- **What it measures**: Whether LCP, INP and CLS in real-visitor data (CrUX) have clearly worsened over weeks. Off by default.
- **Why it matters**: A lab test shows a single moment; real-visitor data worsening over weeks suggests releases or plugins hurt speed. Information only; it does not affect the score.
- **How to fix it**: Information only. Review the release, plugin and third-party script changes of recent weeks, working backwards; find the one that hurt speed by checking LCP, INP and CLS in PageSpeed Insights, then roll it back or lighten it.[Source: developer.chrome.com](https://developer.chrome.com/docs/crux)

### Third-party script cost

[KOD-48](https://ruesandora.com/glossary#kod-48) Information, not scored Observed

- **What it measures**: Whether the total main-thread blocking time in the PageSpeed third-party summary is high.
- **Why it matters**: Ad, analytics and chat scripts can freeze the page; their cost matters, not their count. Information only; it does not affect the score.
- **How to fix it**: Information only. In PageSpeed Insights, find the script taking the most time under "third-party code"; remove it if unneeded, otherwise load it with `async`/`defer` or after user interaction.[Source: web.dev](https://web.dev/articles/efficiently-load-third-party-javascript)

## Structured data

22 signals: 17 explained here, 5 unique to Ruescan.

### A JSON-LD block

[YAP-01](https://ruesandora.com/glossary#yap-01) Issue Observed

- **What it measures**: The page has a schema.org JSON-LD block.
- **Why it matters**: Structured data tells search engines and AI systems the brand name, products and accounts in machine-readable form.
- **How to fix it**: Add schema.org JSON-LD to the page: `<script type="application/ld+json">{"@context":"https://schema.org","@type":"…"}</script>` (at least Organization and WebSite).[Source: developers.google.com](https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data)

### Valid JSON

[YAP-02](https://ruesandora.com/glossary#yap-02) Issue Observed

- **What it measures**: Every JSON-LD block is valid JSON.
- **Why it matters**: Search engines ignore a broken block entirely; everything in it is lost.
- **How to fix it**: Fix the broken JSON-LD block with a JSON validator (trailing commas, unescaped quotes, truncated block).[Source: developers.google.com](https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data)

### @context and @type

[YAP-03](https://ruesandora.com/glossary#yap-03) Issue Observed

- **What it measures**: Every block has a schema.org @context and every node has an @type.
- **Why it matters**: Without @context and @type a block is not recognized as schema.org data.
- **How to fix it**: Add `"@context": "https://schema.org"` to every block and an `"@type"` to every node.[Source: developers.google.com](https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data)

### WebSite schema

[YAP-04](https://ruesandora.com/glossary#yap-04) Issue Observed

- **What it measures**: A WebSite type exists.
- **Why it matters**: The WebSite schema defines the site name and URL; the site name in search results comes from it.
- **How to fix it**: Add WebSite schema to the home page: `{"@type":"WebSite","name":"Brand","url":"https://domain.com/"}`.[Source: developers.google.com](https://developers.google.com/search/docs/appearance/site-names)

### WebSite name and alternateName

[YAP-18](https://ruesandora.com/glossary#yap-18) Opportunity Inferred

- **What it measures**: The WebSite schema has a filled name and an alternateName.
- **Why it matters**: Google reads the site name from the WebSite schema: name is required, alternateName is optional for a short or alternative name. With both filled, the site name in results is more likely to come out right.
- **How to fix it**: Add `name` (the site name) and, if useful, `alternateName` (a short or alternative name) to the WebSite schema: `{"@type":"WebSite","name":"Brand","alternateName":"Short name","url":"https://domain.com/"}`.[Source: developers.google.com](https://developers.google.com/search/docs/appearance/site-names)

### BreadcrumbList schema

[YAP-19](https://ruesandora.com/glossary#yap-19) Opportunity Inferred

- **What it measures**: Whether inner pages with a path two levels deep or more carry a JSON-LD BreadcrumbList.
- **Why it matters**: BreadcrumbList shows the page's place on the site (Home > Category > Page) in search results and tells AI systems which section the page belongs to. Google requires at least two ListItems. A trail given as microdata may not be seen here.
- **How to fix it**: Add the breadcrumb trail to inner pages as JSON-LD: `{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://domain.com/"},{"@type":"ListItem","position":2,"name":"Category","item":"https://domain.com/category/"}]}`. At least two ListItems are needed; the page itself does not need its own item.[Source: developers.google.com](https://developers.google.com/search/docs/appearance/structured-data/breadcrumb)

### Content-describing schema type

[YAP-06](https://ruesandora.com/glossary#yap-06) Opportunity Inferred

- **What it measures**: Beyond identity, a type describes the content (Product, Article, Service, LocalBusiness, SoftwareApplication, FAQPage...).
- **Why it matters**: Product, service or article schema feeds content to AI answers and rich results directly.
- **How to fix it**: Add a type that describes what the page offers: Product, Service, Article, LocalBusiness or SoftwareApplication.[Source: developers.google.com](https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data)

### Required fields in the schema

[YAP-07](https://ruesandora.com/glossary#yap-07) Issue Observed

- **What it measures**: Required fields per type are set (Product: name, price, currency; Article: headline, date, author; LocalBusiness: name, address; Event: name, date, location).
- **Why it matters**: A schema missing required fields gets no rich result and gives AI systems half the information.
- **How to fix it**: Fill the required fields for the type: Product name + offers.price + priceCurrency; Article headline + datePublished + author; LocalBusiness name + address; Event name + startDate + location.[Source: developers.google.com](https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data)

### FAQPage and visible text

[YAP-08](https://ruesandora.com/glossary#yap-08) Issue Observed

- **What it measures**: FAQPage questions also appear in the visible page text (no hidden schema).
- **Why it matters**: Google treats schema marking up invisible content as a violation. Note: the FAQ rich result is now shown only for well-known government and health sites; the schema should still match the visible text (for AI summaries and trust).
- **How to fix it**: If the page has FAQPage schema, show every question and answer visibly or remove the hidden ones from the schema. Google has not shown the FAQ rich result since 7 May 2026; do not add new FAQPage schema.[Source: developers.google.com](https://developers.google.com/search/updates#removing-faq-rich-result)

### Absolute URLs in the schema

[YAP-10](https://ruesandora.com/glossary#yap-10) Issue Observed

- **What it measures**: url, sameAs, logo and image addresses in the schema are absolute and https.
- **Why it matters**: Relative or http addresses cannot be resolved elsewhere; AI systems and search engines may not follow them.
- **How to fix it**: Write the schema `url`, `sameAs`, `logo` and `image` values as absolute https URLs (e.g. `https://domain.com/logo.png`).[Source: developers.google.com](https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data)

### Organization fields

[YAP-11](https://ruesandora.com/glossary#yap-11) Issue Observed

- **What it measures**: The Organization schema has name, url and logo.
- **Why it matters**: Name, URL and logo are the core trio of the brand card and knowledge panel.
- **How to fix it**: Fill all three of `name`, `url` and `logo` on the Organization schema.[Source: developers.google.com](https://developers.google.com/search/docs/appearance/structured-data/organization)

### Schema date format

[YAP-13](https://ruesandora.com/glossary#yap-13) Issue Observed

- **What it measures**: Whether date fields in the schema use the ISO 8601 format.
- **Why it matters**: A malformed date cannot be read; freshness and publish date information is lost.
- **How to fix it**: Write schema dates in ISO 8601: `2026-10-10` or `2026-10-10T09:00:00+03:00`.[Source: developers.google.com](https://developers.google.com/search/docs/appearance/structured-data/article)

### Placeholder text in the schema

[YAP-20](https://ruesandora.com/glossary#yap-20) Issue Observed

- **What it measures**: Whether schema values hold an unfilled template pattern such as [Business Name] or {{ ... }}.
- **Why it matters**: A leftover template value such as "[Business Name]" tells search engines and AI systems an empty pattern instead of the real name or address. Rich results fail, the data is read wrong and trust in the rest of the schema drops.
- **How to fix it**: Replace the leftover placeholder with the real value: use your real business name instead of `"name": "[Business Name]"` and the real city instead of `[City]`. A plugin or theme settings field may have been left empty; fill it in and check with the Google Rich Results Test.[Source: developers.google.com](https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data)

### Video schema (VideoObject)

[YAP-22](https://ruesandora.com/glossary#yap-22) Information, not scored Observed

- **What it measures**: Whether, when the page has a video, a VideoObject schema exists with name, thumbnailUrl and uploadDate filled.
- **Why it matters**: Even when Google finds the video on the page, it reads its title, thumbnail and publish date from the schema; a video missing the required fields (name, thumbnailUrl, uploadDate) is weakly represented in video results and AI summaries. Information only; it does not affect the score.
- **How to fix it**: Information only. Add a JSON-LD VideoObject for the video on the page and fill in `name`, `thumbnailUrl` and `uploadDate` (`description` and `contentUrl`/`embedUrl` are also recommended).[Source: developers.google.com](https://developers.google.com/search/docs/appearance/structured-data/video)

### Self-serving review markup

[YAP-23](https://ruesandora.com/glossary#yap-23) Information, not scored Observed

- **What it measures**: Whether the site's own Organization or LocalBusiness schema carries aggregateRating or review.
- **Why it matters**: Google does not make a page eligible for star results when an organization marks up reviews about itself in its own Organization/LocalBusiness schema; the markup earns no stars and only bloats the schema. Product reviews on a product page are separate. Information only; it does not affect the score.
- **How to fix it**: Information only. Remove `aggregateRating` and `review` about yourself from the Organization or LocalBusiness schema. Keep review markup only on product pages, attached to Product schema.[Source: developers.google.com](https://developers.google.com/search/docs/appearance/structured-data/review-snippet)

### Schema dates and visible dates

[YAP-24](https://ruesandora.com/glossary#yap-24) Information, not scored Observed

- **What it measures**: Whether dateModified is earlier than datePublished, and whether the schema date matches the visible date.
- **Why it matters**: A modified date cannot precede the publish date; if the schema date disagrees with the visible one, search engines and AI systems do not know which to trust and the freshness signal weakens. Information only; it does not affect the score.
- **How to fix it**: Information only. `dateModified` must never be earlier than `datePublished`, and schema dates should match the dates shown on the page; feeding both from the same field in the template is safest.[Source: developers.google.com](https://developers.google.com/search/docs/appearance/structured-data/article)

### Duplicate organization nodes

[YAP-25](https://ruesandora.com/glossary#yap-25) Information, not scored Observed

- **What it measures**: Whether the schema has several root nodes of the same type (Organization, WebSite) that conflict.
- **Why it matters**: When an SEO plugin and the theme or a second plugin write the same organization twice, search engines and AI systems see two different entities and do not know which to trust. Keep one main organization and one WebSite node and switch the others off. Information only; it does not affect the score.
- **How to fix it**: Information only. Switch off the second plugin or theme schema that writes the same organization and WebSite node; keep one main Organization and one WebSite node on the page, with the same name, address and domain.[Source: developers.google.com](https://developers.google.com/search/docs/appearance/structured-data/organization)

The 5 unique signals in this category are not detailed.

## Security and headers

31 signals.

### HTTPS

[GUV-01](https://ruesandora.com/glossary#guv-01) Issue Observed

- **What it measures**: The site opens over HTTPS.
- **Why it matters**: The home page arrives without encryption. Browsers mark it "not secure" and search engines prefer HTTPS.
- **How to fix it**: Install a TLS certificate for the domain (e.g. Let's Encrypt or a CDN certificate) and serve the site over https://.[Source: developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security)

### HTTP to HTTPS redirect

[GUV-02](https://ruesandora.com/glossary#guv-02) Issue Observed

- **What it measures**: http:// redirects permanently (301/308) to HTTPS.
- **Why it matters**: Visitors and bots arriving on http:// should not stay unencrypted; a permanent redirect also tells search engines the main address.
- **How to fix it**: Redirect http:// requests permanently (301 or 308) to the same path on https://.[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/http-network-errors)

### HSTS header

[GUV-03](https://ruesandora.com/glossary#guv-03) Issue Observed

- **What it measures**: An HSTS (Strict-Transport-Security) header exists with a max-age of at least one year.
- **Why it matters**: HSTS makes browsers always open the site over HTTPS; without it, or with a short lifetime, the first request may go unencrypted. Browser preload lists and web.dev ask for at least one year.
- **How to fix it**: Add `Strict-Transport-Security: max-age=31536000; includeSubDomains` to HTTPS responses.[Source: developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security)

### HSTS strength

[GUV-04](https://ruesandora.com/glossary#guv-04) Opportunity Inferred

- **What it measures**: Whether HSTS lasts long and covers subdomains.
- **Why it matters**: A one-year HSTS covering subdomains is required for browser preload lists and makes protection lasting.
- **How to fix it**: Set HSTS to `max-age=31536000; includeSubDomains` (if all subdomains work over HTTPS).[Source: developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security)

### Content-Security-Policy

[GUV-05](https://ruesandora.com/glossary#guv-05) Issue Observed

- **What it measures**: Content-Security-Policy limits script sources: script-src or default-src exists without unsafe-inline/unsafe-eval/* (nonce, hash, strict-dynamic neutralise unsafe-inline).
- **Why it matters**: CSP limits outside scripts being injected into the page (XSS). A CSP that only sets framing protection (frame-ancestors), or allows unsafe-inline/unsafe-eval/*, does not stop script injection.
- **How to fix it**: Add a Content-Security-Policy header; try it first as `Content-Security-Policy-Report-Only`, then enforce (e.g. `default-src 'self'; frame-ancestors 'none'`, adding the external sources you use).[Source: developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy)

### X-Content-Type-Options

[GUV-06](https://ruesandora.com/glossary#guv-06) Issue Observed

- **What it measures**: X-Content-Type-Options: nosniff.
- **Why it matters**: nosniff stops browsers from guessing file types and running them wrongly.
- **How to fix it**: Add the `X-Content-Type-Options: nosniff` header to responses.[Source: developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options)

### Framing protection

[GUV-07](https://ruesandora.com/glossary#guv-07) Issue Observed

- **What it measures**: Framing protection: CSP frame-ancestors or X-Frame-Options.
- **Why it matters**: Without it, the page can be shown inside another site and used for clickjacking.
- **How to fix it**: Add `frame-ancestors 'self'` to the CSP or send the `X-Frame-Options: SAMEORIGIN` header.[Source: developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options)

### Referrer-Policy

[GUV-08](https://ruesandora.com/glossary#guv-08) Issue Observed

- **What it measures**: A Referrer-Policy header exists.
- **Why it matters**: Referrer-Policy limits how much of the visitor's address is passed to outside sites.
- **How to fix it**: Add the `Referrer-Policy: strict-origin-when-cross-origin` header.[Source: developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy)

### Permissions-Policy

[GUV-09](https://ruesandora.com/glossary#guv-09) Opportunity Inferred

- **What it measures**: A Permissions-Policy header exists.
- **Why it matters**: Limits use of browser features such as camera, microphone and location on the page and in embeds.
- **How to fix it**: Add a header that disables browser features you do not use, e.g. `Permissions-Policy: camera=(), microphone=(), geolocation=()`.[Source: developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Permissions-Policy)

### Mixed content

[GUV-10](https://ruesandora.com/glossary#guv-10) Issue Observed

- **What it measures**: No scripts or styles loaded over http:// on an HTTPS page.
- **Why it matters**: Browsers block http:// scripts and styles on HTTPS pages; the page breaks and may show a "not secure" warning.
- **How to fix it**: Change script, style and image URLs loaded over http:// on the page to https://.[Source: developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/Security/Mixed_content)

### Version disclosure

[GUV-11](https://ruesandora.com/glossary#guv-11) Possible issue Inferred

- **What it measures**: Server and X-Powered-By headers do not reveal version numbers.
- **Why it matters**: A version number makes it easier for attackers to look up known flaws in that version.
- **How to fix it**: Remove version numbers from the `Server` and `X-Powered-By` headers (e.g. `server_tokens off;` in nginx, `expose_php = Off` in PHP).[Source: developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Server)

### The security.txt file

[GUV-12](https://ruesandora.com/glossary#guv-12) Opportunity Inferred

- **What it measures**: /.well-known/security.txt exists with Contact and a valid Expires.
- **Why it matters**: security.txt tells people who find a vulnerability how to reach you (RFC 9116).
- **How to fix it**: Publish /.well-known/security.txt with `Contact: mailto:security@domain.com` and an `Expires:` date within a year, e.g. `2027-10-01T00:00:00Z`.[Source: www.rfc-editor.org](https://www.rfc-editor.org/rfc/rfc9116)

### Cookie flags

[GUV-13](https://ruesandora.com/glossary#guv-13) Issue Observed

- **What it measures**: Whether the home page cookies carry the Secure, HttpOnly and SameSite flags.
- **Why it matters**: A cookie without Secure can leak over plain connections; HttpOnly and SameSite make cookie theft and cross-site request forgery harder. Cookie values are not stored.
- **How to fix it**: Set cookies with `Secure; HttpOnly; SameSite=Lax` (or `Strict` where suitable); drop only HttpOnly on cookies JavaScript must read.[Source: developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie)

### SPF record

[GUV-14](https://ruesandora.com/glossary#guv-14) Issue Observed

- **What it measures**: The domain has exactly one SPF record (v=spf1).
- **Why it matters**: SPF says who may send email for your domain; without it, spoofing your domain is easier. Multiple SPF records are invalid.
- **How to fix it**: Add a single SPF TXT record, e.g. `v=spf1 include:_spf.your-mail-provider -all` (merge multiple SPF records; if you send no mail, `v=spf1 -all`).[Source: www.rfc-editor.org](https://www.rfc-editor.org/rfc/rfc7208)

### DMARC record

[GUV-15](https://ruesandora.com/glossary#guv-15) Issue Observed

- **What it measures**: DMARC record with p=quarantine or p=reject.
- **Why it matters**: DMARC says what happens to spoofed mail failing SPF and DKIM; p=none only reports, it does not protect.
- **How to fix it**: Add a TXT record at `_dmarc`; start with `v=DMARC1; p=none; rua=mailto:…` to watch reports, then move to `p=quarantine` or `p=reject`.[Source: www.rfc-editor.org](https://www.rfc-editor.org/rfc/rfc7489)

### CAA record

[GUV-16](https://ruesandora.com/glossary#guv-16) Opportunity Inferred

- **What it measures**: A CAA record exists (which certificate authorities may issue).
- **Why it matters**: CAA lets only authorities you allow issue certificates for your domain, reducing mis-issuance risk.
- **How to fix it**: Add a CAA record allowing your certificate authority, e.g. `0 issue "letsencrypt.org"`.[Source: www.rfc-editor.org](https://www.rfc-editor.org/rfc/rfc8659)

### DNSSEC

[GUV-17](https://ruesandora.com/glossary#guv-17) Opportunity Inferred

- **What it measures**: DNSSEC validates (AD flag in the resolver answer).
- **Why it matters**: DNSSEC stops DNS answers being altered in transit, so visitors cannot be sent to a fake server.
- **How to fix it**: Enable DNSSEC at your DNS provider and add the DS record it gives you at your domain registrar.

### rel="noopener"

[GUV-18](https://ruesandora.com/glossary#guv-18) Possible issue Inferred

- **What it measures**: External links opening in a new tab have rel="noopener" or "noreferrer".
- **Why it matters**: Without noopener, the opened page can redirect your tab elsewhere in older browsers (tabnabbing).
- **How to fix it**: Add `rel="noopener"` (or `noopener noreferrer`) to external links with `target="_blank"`.[Source: developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/rel/noopener)

### Plain-text email address

[GUV-19](https://ruesandora.com/glossary#guv-19) Possible issue Inferred

- **What it measures**: No plain-text email address in the visible text (addresses are not stored, only counted).
- **Why it matters**: Plain-text addresses are harvested by spam bots; a contact form or obfuscated link is safer.
- **How to fix it**: Replace plain e-mail addresses in visible text with a contact form or a `mailto:` link (reduces spam harvesting).

### Hidden spam links

[GUV-20](https://ruesandora.com/glossary#guv-20) Issue Observed

- **What it measures**: Whether a hidden block on the page holds outbound links with spam terms such as betting, casino or pills, or many different outside domains (a sign of a hacklink attack).
- **Why it matters**: In a hacklink attack the attacker plants hidden links in your site's code; visitors do not see them but search engines do. They usually point to illegal betting, casino, pharmacy or adult sites. Without knowing it, you become a spam source and Google may penalise you.
- **How to fix it**: Your site has probably been compromised; work through these in order. 1) Find the file holding the hidden links (theme, plugin, footer, a post or widget in the database) and delete them; if unsure, restore a clean backup. 2) Change every password: admin panel, hosting, FTP, database. Delete admin accounts you do not recognise. 3) Update the theme, plugins and the CMS; remove plugins you do not use or cannot vouch for. 4) In Google Search Console open "Security and manual actions" then "Security issues"; if a problem is listed, request a review after cleaning up.

### Hidden keyword stuffing

[GUV-21](https://ruesandora.com/glossary#guv-21) Possible issue Inferred

- **What it measures**: Whether a hidden block on the page holds a long text that repeats the same words (keyword stuffing).
- **Why it matters**: Text that visitors cannot see but search engines read, repeating the same words, breaks Google's hidden text and keyword stuffing rules (spam policy). An old SEO practice, a theme or a compromised file may have placed it. The check is heuristic; legitimate hidden content may rarely be flagged.
- **How to fix it**: Find the hidden block (theme file, SEO plugin field, footer or content in the database) and delete it. If some of the text is worth ranking for, put it in a section visitors can see, in natural sentences without repetition. If you did not add the hidden block, the site may be compromised: change the passwords and update the theme and plugins.

### Conditional redirect trace

[GUV-22](https://ruesandora.com/glossary#guv-22) Issue Observed

- **What it measures**: Whether the raw HTML has a meta refresh to another domain or a script that sends visitors arriving from a search engine to another domain (a sign of a hidden redirect).
- **Why it matters**: Redirects that send visitors arriving from Google to another site, or automatically move the page to another domain, are a typical trace of a hacklink attack; showing bots one page and visitors another (cloaking) breaks Google's spam policy. Unless it is a deliberate domain move, the site may be compromised.
- **How to fix it**: If you did not add the redirect, the site may be compromised: find the file it comes from (theme header, plugin, `.htaccess`, a script in the database) and delete it, change all passwords, update the theme and plugins, and check "Security issues" in Search Console. If it is a deliberate domain move, use a permanent (301) server redirect instead of `<meta http-equiv="refresh">`.

### Does robots.txt list sensitive file paths

[GUV-23](https://ruesandora.com/glossary#guv-23) Information, not scored Observed

- **What it measures**: Whether any Disallow line in robots.txt names a sensitive file path such as .env, .git, a backup or .sql; admin paths are only noted. Information only.
- **Why it matters**: robots.txt is public. A line such as "Disallow: /.env" or "/backup/" does not guide bots, it points attackers: it says such a file may exist. The real fix is not hiding the path in robots.txt but blocking access on the server (and removing the file from the web root). Removing the line alone does not remove the risk. Information only; it does not affect the score.
- **How to fix it**: Information only. Lines in robots.txt such as `.env`, `.git`, backups or `.sql` reveal that such files may exist. The real fix is to remove these files from the web root and block access on the server; then delete the matching `Disallow` line too.[Source: developers.google.com](https://developers.google.com/search/docs/crawling-indexing/robots/intro)

### Cross-Origin-Opener-Policy header

[GUV-24](https://ruesandora.com/glossary#guv-24) Information, not scored Observed

- **What it measures**: Whether the home page response has a Cross-Origin-Opener-Policy header. Absence is only an observation.
- **Why it matters**: This header cuts the window link with other sites that open your page. Information only: with the wrong value it can break popup payment or sign-in (OAuth) flows, so it does not affect the score.
- **How to fix it**: Information only. If the site has no popup payment or sign-in (OAuth), `Cross-Origin-Opener-Policy: same-origin` can be added to the server response; if it has, try `same-origin-allow-popups` first and test the payment/sign-in flow.[Source: developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cross-Origin-Opener-Policy)

### SRI (integrity) on external scripts

[GUV-25](https://ruesandora.com/glossary#guv-25) Information, not scored Observed

- **What it measures**: Whether scripts loaded from CDNs such as cdnjs, jsDelivr and unpkg carry an integrity attribute.
- **Why it matters**: SRI checks that a script loaded from elsewhere matches the expected content; if the CDN file changes, the browser refuses to run it. Information only; it does not affect the score. Unversioned (@latest) URLs cannot be used with SRI because the file keeps changing.
- **How to fix it**: Information only. Pin the CDN script tag to a version and add `integrity="sha384-..." crossorigin="anonymous"` (the hash is on the CDN page or at srihash.org). Pin `@latest` URLs to a version.[Source: developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity)

### Outdated JavaScript library

[GUV-26](https://ruesandora.com/glossary#guv-26) Information, not scored Observed

- **What it measures**: Whether the jQuery or AngularJS version visible in a script URL is old and out of support.
- **Why it matters**: The version number in the script URL looks old. The jQuery 3.5.0 release notes include a security fix; AngularJS 1.x support ended in January 2022. Only the version in the URL was read; this check cannot tell whether the site is actually affected. Information only; it does not affect the score.
- **How to fix it**: Information only. Upgrade jQuery to 3.5.0 or newer (test plugin compatibility); plan a move from AngularJS 1.x to a maintained framework. If the URL has no version, check the version in the site's own file.[Source: blog.jquery.com](https://blog.jquery.com/2020/04/10/jquery-3-5-0-released/)

### End of the SPF record

[GUV-27](https://ruesandora.com/glossary#guv-27) Information, not scored Observed

- **What it measures**: Whether the SPF record ends in an all rule that allows everyone or enforces nothing.
- **Why it matters**: The trailing "all" in an SPF record says what to do with senders not on the list. "+all" lets anyone send as your domain, "?all" enforces nothing (RFC 7208). Information only; it does not affect the score.
- **How to fix it**: Information only. Replace the trailing `+all` or `?all` in the SPF record with `-all` (strict) or `~all` (soft); first make sure every legitimate sender is listed (`include:`).[Source: www.rfc-editor.org](https://www.rfc-editor.org/rfc/rfc7208)

### DMARC report address (rua)

[GUV-28](https://ruesandora.com/glossary#guv-28) Information, not scored Observed

- **What it measures**: Whether the DMARC record has an aggregate report address (rua).
- **Why it matters**: The rua= address says where aggregate reports about mail sent as your domain go (RFC 7489). Without it you cannot see spoofed or broken mail. Information only; it does not affect the score.
- **How to fix it**: Information only. Add `rua=mailto:reports@yourdomain.com` to the DMARC record; pick a mailbox or DMARC report service to read the reports.[Source: www.rfc-editor.org](https://www.rfc-editor.org/rfc/rfc7489)

### Cookie consent tool trace

[GUV-29](https://ruesandora.com/glossary#guv-29) Information, not scored Observed

- **What it measures**: Whether a trace of a known cookie consent tool is seen when a tracking script is present. Not a legal assessment.
- **Why it matters**: The page has a tracking script but no trace of a known cookie consent manager was seen. This is not a legal assessment: a consent tool may run via inline script or server-side, which this check cannot see. Assessing KVKK and ePrivacy compliance is up to the site owner. Information only; it does not affect the score.
- **How to fix it**: Information only; not a legal assessment. If you use tracking scripts, verify yourself that your cookie consent tool runs on the page; compliance assessment (KVKK, ePrivacy) belongs to the site owner and legal counsel.

### MTA-STS mail transport security

[GUV-30](https://ruesandora.com/glossary#guv-30) Information, not scored Observed

- **What it measures**: Whether the domain has an MTA-STS record and an enforcing policy. Not applicable to domains that receive no mail.
- **Why it matters**: MTA-STS asks that mail to your domain travels between servers over encrypted connections (RFC 8461). "testing" mode only reports and does not enforce. Information only; it does not affect the score.
- **How to fix it**: Information only. Add a `v=STSv1; id=...` TXT record at `_mta-sts.yourdomain.com` and a policy file at `https://mta-sts.yourdomain.com/.well-known/mta-sts.txt`; start with `mode: testing`, check reports, then switch to `enforce`.[Source: www.rfc-editor.org](https://www.rfc-editor.org/rfc/rfc8461)

### Google Web Risk unsafe-site lists

[GUV-31](https://ruesandora.com/glossary#guv-31) Information, not scored Observed

- **What it measures**: Whether the home address is listed in Google Web Risk lists (malware, phishing). Off by default.
- **Why it matters**: This comes from the Google Web Risk list; the list belongs to Google, may be incomplete or wrong, and this check does not judge the actual state of the site. Verify the entry under "Security issues" in Google Search Console. Information only; it does not affect the score.
- **How to fix it**: Information only. Verify the entry under "Security issues" in Google Search Console; if the issue is real, clean up and request a review. The list belongs to Google and can be wrong.[Source: cloud.google.com](https://cloud.google.com/web-risk/docs/lookup-api)

## Sharing

14 signals.

### og:title

[PAY-01](https://ruesandora.com/glossary#pay-01) Issue Observed

- **What it measures**: An og:title tag exists.
- **Why it matters**: The title shown when the link is shared on social media or in chat comes from this tag.
- **How to fix it**: Add `<meta property="og:title" content="Page title">`.[Source: ogp.me](https://ogp.me/)

### og:description

[PAY-02](https://ruesandora.com/glossary#pay-02) Issue Observed

- **What it measures**: An og:description tag exists.
- **Why it matters**: The description under a shared link comes from this tag.
- **How to fix it**: Add `<meta property="og:description" content="Short description">`.[Source: ogp.me](https://ogp.me/)

### og:image

[PAY-03](https://ruesandora.com/glossary#pay-03) Issue Observed

- **What it measures**: An og:image tag exists.
- **Why it matters**: Share cards without an image get fewer clicks; some AI interfaces also use it on source cards.
- **How to fix it**: Add a share image with an absolute URL: `<meta property="og:image" content="https://domain.com/share.jpg">` (1200×630).[Source: ogp.me](https://ogp.me/)

### og:image loading and size

[PAY-04](https://ruesandora.com/glossary#pay-04) Issue Observed

- **What it measures**: Whether og:image opens and is large enough for a share card.
- **Why it matters**: An image that does not open leaves the card empty; below 1200×630 it shows blurry or as a small card.
- **How to fix it**: Make sure the og:image URL opens and the image is at least 1200×630 pixels.[Source: ogp.me](https://ogp.me/)

### og:url

[PAY-05](https://ruesandora.com/glossary#pay-05) Issue Observed

- **What it measures**: og:url is the same address as the canonical.
- **Why it matters**: Shares accumulate on og:url; if it differs from the canonical, share signals go to another address.
- **How to fix it**: Make `og:url` the same as the canonical URL.[Source: ogp.me](https://ogp.me/)

### og:type, og:site_name and og:locale

[PAY-06](https://ruesandora.com/glossary#pay-06) Issue Observed

- **What it measures**: og:type, og:site_name and og:locale exist.
- **Why it matters**: These tags state the content type, site name and language; cards and AI source displays become more accurate.
- **How to fix it**: Add the missing Open Graph tags: `og:type` (website), `og:site_name` (brand), `og:locale` (e.g. en_US).[Source: ogp.me](https://ogp.me/)

### twitter:card

[PAY-07](https://ruesandora.com/glossary#pay-07) Issue Observed

- **What it measures**: A twitter:card tag exists.
- **Why it matters**: This tag sets how a link shared on X looks; without it, a small card may be shown.
- **How to fix it**: Add `<meta name="twitter:card" content="summary_large_image">`.

### twitter:image

[PAY-08](https://ruesandora.com/glossary#pay-08) Issue Observed

- **What it measures**: A twitter:image tag exists.
- **Why it matters**: X usually falls back to og:image, but no image cropped for X is given. Without og:image too, the card has no image.
- **How to fix it**: Add `<meta name="twitter:image" content="https://domain.com/share.jpg">`.

### Favicon and apple-touch-icon

[PAY-09](https://ruesandora.com/glossary#pay-09) Issue Observed

- **What it measures**: The site icon (favicon) opens and an apple-touch-icon is defined.
- **Why it matters**: The icon shows the brand in tabs, bookmarks, search results and AI answer source lists.
- **How to fix it**: Add a working site icon (`<link rel="icon" href="/favicon.ico">`) and `<link rel="apple-touch-icon" href="/apple-touch-icon.png">` (180×180).[Source: developers.google.com](https://developers.google.com/search/docs/appearance/favicon-in-search)

### Web app manifest

[PAY-10](https://ruesandora.com/glossary#pay-10) Opportunity Inferred

- **What it measures**: A web app manifest (link rel=manifest) and theme-color exist.
- **Why it matters**: A manifest and theme color let the site be added like an app on phones and tint the browser bar in brand color.
- **How to fix it**: Add `<link rel="manifest" href="/site.webmanifest">` (name, icons, colours) and `<meta name="theme-color" content="#…">`.[Source: developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/Manifest)

### Share image ratio

[PAY-11](https://ruesandora.com/glossary#pay-11) Information, not scored Observed

- **What it measures**: Whether og:image has a ratio suited to a wide share card, or is square or tall.
- **Why it matters**: Social cards crop the image to a wide (about 1.91:1) box; square or tall images may lose their edges. Observation only.
- **How to fix it**: Information only. Prepare the share image in landscape, about 1200×630 pixels (1.91:1), with the key text and faces in the centre so square or tight crops do not cut them.[Source: ogp.me](https://ogp.me/)

### Share image format

[PAY-12](https://ruesandora.com/glossary#pay-12) Information, not scored Observed

- **What it measures**: Whether og:image uses a format such as SVG or AVIF that may not show on every social network.
- **Why it matters**: Some social platforms and chat apps may not show SVG/AVIF share images. JPEG or PNG is safe everywhere. Observation only.
- **How to fix it**: Information only. Use JPEG or PNG for `og:image`; SVG and AVIF may not show on many social networks and chat apps.[Source: ogp.me](https://ogp.me/)

### Share image alt text

[PAY-13](https://ruesandora.com/glossary#pay-13) Information, not scored Observed

- **What it measures**: Whether og:image:alt is defined when og:image is present.
- **Why it matters**: The share image alt text describes the card to users who cannot see the image. Observation only.
- **How to fix it**: Information only. Add `<meta property="og:image:alt" content="Short sentence describing the image">`; if your SEO plugin has an alt text field for the share image, fill it in.[Source: ogp.me](https://ogp.me/)

### Favicon size and availability

[PAY-14](https://ruesandora.com/glossary#pay-14) Information, not scored Observed

- **What it measures**: Whether the favicon file opens, is square and meets the smallest size Google asks for.
- **Why it matters**: Google shows the favicon in results only if it is square and at least 48×48 pixels. Observation only.
- **How to fix it**: Information only. The favicon file must open, be square and at least 48×48 pixels (SVG also works): `<link rel="icon" href="/favicon.svg" type="image/svg+xml">`. Google shows only an icon that meets this in search results.[Source: developers.google.com](https://developers.google.com/search/docs/appearance/favicon-in-search)

## Language and hreflang

13 signals: 10 explained here, 3 unique to Ruescan.

### The html lang attribute

[ULU-01](https://ruesandora.com/glossary#ulu-01) Issue Observed

- **What it measures**: The <html> tag has a lang attribute.
- **Why it matters**: The language lets search engines and screen readers handle the page correctly; AI answers pick sources in the right language.
- **How to fix it**: Set the page language on the `<html>` tag: `<html lang="en">`. Note: Google does not use `lang` for language detection [G]; it is still needed by screen readers, browsers and other systems.[Source: developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/lang)

### Language code and text language

[ULU-02](https://ruesandora.com/glossary#ulu-02) Issue Observed

- **What it measures**: lang is a valid language code and matches the text language (detection for Turkish and English).
- **Why it matters**: A wrong language code makes the page show up in searches and AI answers for the wrong language.
- **How to fix it**: Match `lang` to the text language and use a valid language code (tr, en, en-GB). Note: Google does not use `lang` for language detection [G]; its real value is for screen readers and browsers.[Source: developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/lang)

### hreflang x-default

[ULU-03](https://ruesandora.com/glossary#ulu-03) Issue Observed

- **What it measures**: If hreflang is used, x-default is present.
- **Why it matters**: No default page (x-default) is declared for visitors whose language does not match.
- **How to fix it**: Add the default page to the hreflang list: `<link rel="alternate" hreflang="x-default" href="https://domain.com/">`.[Guide: How we built our bilingual EN/TR site: hreflang, redirects, language detection](https://ruesandora.com/writing/bilingual-site-hreflang-redirects#how-is-hreflang-set-up) [Source: developers.google.com](https://developers.google.com/search/docs/specialty/international/localized-versions)

### hreflang codes

[ULU-04](https://ruesandora.com/glossary#ulu-04) Issue Observed

- **What it measures**: hreflang codes are valid (language, optional region: tr, en-GB, x-default).
- **Why it matters**: Google ignores invalid hreflang codes (e.g. "en-UK" should be "en-GB").
- **How to fix it**: Write hreflang codes as ISO 639-1 language (+ optional ISO 3166-1 region): `tr`, `en-GB`; fix invalid codes like `en-UK`.[Guide: How we built our bilingual EN/TR site: hreflang, redirects, language detection](https://ruesandora.com/writing/bilingual-site-hreflang-redirects#how-is-hreflang-set-up) [Source: developers.google.com](https://developers.google.com/search/docs/specialty/international/localized-versions)

### og:locale match

[ULU-07](https://ruesandora.com/glossary#ulu-07) Issue Observed

- **What it measures**: og:locale states the same language as the page lang.
- **Why it matters**: If the share card language contradicts the page language, platforms may display it in the wrong language.
- **How to fix it**: Make `og:locale` the same language as `lang` (e.g. `en_US` for lang="en").[Source: ogp.me](https://ogp.me/)

### hreflang self-reference

[ULU-08](https://ruesandora.com/glossary#ulu-08) Issue Observed

- **What it measures**: The hreflang set includes the page's own address (self-reference).
- **Why it matters**: Google expects each language version to list itself in its hreflang set; otherwise the group may be treated as incomplete.
- **How to fix it**: Include the page itself in its hreflang list (a self-referencing line).[Guide: How we built our bilingual EN/TR site: hreflang, redirects, language detection](https://ruesandora.com/writing/bilingual-site-hreflang-redirects#how-is-hreflang-set-up) [Source: developers.google.com](https://developers.google.com/search/docs/specialty/international/localized-versions)

### Do hreflang methods agree

[ULU-15](https://ruesandora.com/glossary#ulu-15) Information, not scored Observed

- **What it measures**: Whether the hreflang language sets and addresses in the HTML or HTTP header and in the sitemap are the same.
- **Why it matters**: Google reads hreflang from HTML, the HTTP header and the sitemap, and the methods do not complement each other; if they give different language sets or different addresses for the same language, it is unclear which one to trust. Giving the same information in one consistent method is safest. Information only; it does not affect the score.
- **How to fix it**: Information only. Give hreflang with one method (HTML `<link>`, HTTP `Link` header or sitemap) and the same language set and addresses everywhere; remove the second method or match it exactly to the first.[Source: developers.google.com](https://developers.google.com/search/docs/specialty/international/localized-versions)

### Language-version traces without hreflang

[ULU-12](https://ruesandora.com/glossary#ulu-12) Information, not scored Observed

- **What it measures**: Whether a language switcher or og:locale:alternate trace exists while no hreflang is found in HTML, HTTP header or sitemap.
- **Why it matters**: The site seems to have pages in other languages but search engines are not told which page matches which language; language versions may be treated as duplicates. Information only; it does not affect the score.
- **How to fix it**: Information only. If you have language versions, add reciprocal `hreflang` to every page (including itself, with `x-default`): HTML `<link>`, HTTP `Link` header or sitemap; pick only one of the methods.[Source: developers.google.com](https://developers.google.com/search/docs/specialty/international/localized-versions)

### Content-Language and html lang match

[ULU-13](https://ruesandora.com/glossary#ulu-13) Information, not scored Observed

- **What it measures**: Whether the HTTP Content-Language header and the html lang attribute name the same language.
- **Why it matters**: Bing may read the Content-Language header as a language signal; if it differs from the page language the page may show for the wrong language. Information only; it does not affect the score.
- **How to fix it**: Information only. Set the HTTP `Content-Language` header to the same language as `<html lang>`, or do not send the header; on a multilingual page do not put a single language in the header.[Source: developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Language)

### Language-based automatic redirect

[ULU-14](https://ruesandora.com/glossary#ulu-14) Information, not scored Observed

- **What it measures**: Whether a request with Accept-Language: en is redirected to another address (a bot sees only one language).
- **Why it matters**: Automatic language redirects make a bot see only one language version; other versions may go undiscovered. Information only; it does not affect the score.
- **How to fix it**: Information only. Instead of redirecting automatically by browser language, show visitors a link to pick the language; keep each language version open to everyone and to bots at its own address.[Source: developers.google.com](https://developers.google.com/search/docs/specialty/international/managing-multi-regional-sites)

The 3 unique signals in this category are not detailed.

## App links

6 signals.

### apple-app-site-association

[APP-02](https://ruesandora.com/glossary#app-02) Issue Observed

- **What it measures**: If there is an iOS app, apple-app-site-association is valid JSON with applinks (universal links).
- **Why it matters**: Without this file, site links do not open the app on iPhone; users and search traffic cannot hand over to the app.
- **How to fix it**: Publish /.well-known/apple-app-site-association (no extension, application/json) with appIDs and paths in `applinks.details`.[Source: developer.apple.com](https://developer.apple.com/documentation/xcode/supporting-associated-domains)

### assetlinks.json

[APP-03](https://ruesandora.com/glossary#app-03) Issue Observed

- **What it measures**: If there is an Android app, assetlinks.json is valid with package_name and sha256_cert_fingerprints (App Links).
- **Why it matters**: Without this file, site links do not open the app on Android in a verified way.
- **How to fix it**: Publish /.well-known/assetlinks.json with the `package_name` and the signing certificate's `sha256_cert_fingerprints`.[Source: developer.android.com](https://developer.android.com/training/app-links/verify-android-applinks)

### Smart App Banner

[APP-04](https://ruesandora.com/glossary#app-04) Opportunity Inferred

- **What it measures**: If there is an iOS app, a Smart App Banner (apple-itunes-app meta) exists.
- **Why it matters**: The banner atop the site in Safari moves visitors to the app with one tap.
- **How to fix it**: Add `<meta name="apple-itunes-app" content="app-id=YOUR_APP_ID">`.[Source: developer.apple.com](https://developer.apple.com/documentation/webkit/promoting-apps-with-smart-app-banners)

### App Links meta tags

[APP-05](https://ruesandora.com/glossary#app-05) Opportunity Inferred

- **What it measures**: If there is an app, App Links meta tags (al:ios:url, al:android:package) exist.
- **Why it matters**: These tags help shared links open in the app and app content get indexed.
- **How to fix it**: Add the App Links meta tags: `al:ios:url`, `al:ios:app_store_id`, `al:android:package`, `al:android:url`.

### App schema

[APP-06](https://ruesandora.com/glossary#app-06) Opportunity Inferred

- **What it measures**: If there is an app, a SoftwareApplication/MobileApplication schema with operatingSystem and offers.
- **Why it matters**: An app schema gives the app name, platform and price to AI answers and search results.
- **How to fix it**: Add SoftwareApplication or MobileApplication schema: `name`, `operatingSystem` ("iOS, Android") and `offers` (`"price": "0"` if free).[Source: schema.org](https://schema.org/SoftwareApplication)

### apple-app-site-association paths

[APP-09](https://ruesandora.com/glossary#app-09) Issue Observed

- **What it measures**: apple-app-site-association defines paths or components.
- **Why it matters**: Without paths, it is unclear which site addresses open in the app; deep links do not work.
- **How to fix it**: Define the paths to open in apple-app-site-association with `components` (or legacy `paths`), e.g. `{"/": "/product/*"}`.[Source: developer.apple.com](https://developer.apple.com/documentation/xcode/supporting-associated-domains)

## Next

How the score is calculated and the guide articles are linked below.

- [How the score is calculated](https://ruesandora.com/how-ruescan-scores)
- [Writing](https://ruesandora.com/writing/)

## Early access list

Join the list and hear first when Ruescan opens.

[Join the early access list](https://ruesandora.com/#bekleme)

[Email info@ruesandora.com](mailto:info@ruesandora.com)

Page: https://ruesandora.com/glossary
