Structured Data
[← Back to Home](/docs/rules)
Checks JSON-LD, Microdata, and RDFa markup against schema.org requirements for the most common types (Organization, WebSite, Article, Product, FAQPage, BreadcrumbList, LocalBusiness, Person, Event). Source: src/lib/structuredDataAudit.ts (analyzeStructuredData).
42 rules in this category.
jsonld-parse-error
N JSON-LD block(s) failed to parse
| Severity | Weight | Category |
|---|---|---|
| High | 10 pts | Structured Data |
What triggers it & why it matters: One or more <script type="application/ld+json"> tags contain invalid JSON, so search engines will silently ignore them.
How to fix it & effect on score: Validate JSON-LD with a linter (or the Rich Results Test) and fix syntax errors like trailing commas or unescaped quotes. Fixing this removes the 10 pts deduction from the Structured Data category score on the next scan.
schema-article-required-Article
Article schema is missing one or more required properties
| Severity | Weight | Category |
|---|---|---|
| Medium–High | 6–9 pts (scales with how much of the page is affected — see source) | Structured Data |
What triggers it & why it matters: A JSON-LD node typed Article is missing at least one of its required properties (headline, author, datePublished). Article-family rich results require headline, author, datePublished; missing fields can prevent the article rich result from showing in search.
How to fix it & effect on score: Add the missing propert(y/ies) — one or more of headline, author, datePublished — to the Article JSON-LD block. Fixing this removes the 6–9 pts (scales with how much of the page is affected — see source) deduction from the Structured Data category score on the next scan.
What a pass looks like: Article schema has all required properties
schema-article-required-BlogPosting
BlogPosting schema is missing one or more required properties
| Severity | Weight | Category |
|---|---|---|
| Medium–High | 6–9 pts (scales with how much of the page is affected — see source) | Structured Data |
What triggers it & why it matters: A JSON-LD node typed BlogPosting is missing at least one of its required properties (headline, author, datePublished). Article-family rich results require headline, author, datePublished; missing fields can prevent the article rich result from showing in search.
How to fix it & effect on score: Add the missing propert(y/ies) — one or more of headline, author, datePublished — to the BlogPosting JSON-LD block. Fixing this removes the 6–9 pts (scales with how much of the page is affected — see source) deduction from the Structured Data category score on the next scan.
What a pass looks like: BlogPosting schema has all required properties
schema-article-required-NewsArticle
NewsArticle schema is missing one or more required properties
| Severity | Weight | Category |
|---|---|---|
| Medium–High | 6–9 pts (scales with how much of the page is affected — see source) | Structured Data |
What triggers it & why it matters: A JSON-LD node typed NewsArticle is missing at least one of its required properties (headline, author, datePublished). Article-family rich results require headline, author, datePublished; missing fields can prevent the article rich result from showing in search.
How to fix it & effect on score: Add the missing propert(y/ies) — one or more of headline, author, datePublished — to the NewsArticle JSON-LD block. Fixing this removes the 6–9 pts (scales with how much of the page is affected — see source) deduction from the Structured Data category score on the next scan.
What a pass looks like: NewsArticle schema has all required properties
jsonld-missing
No JSON-LD structured data found
| Severity | Weight | Category |
|---|---|---|
| Medium | 8 pts | Structured Data |
What triggers it & why it matters: No <script type="application/ld+json"> blocks were found on the page. JSON-LD is the format Google recommends for rich results (Organization, WebSite, Breadcrumbs, FAQs, Articles, Products, etc.).
How to fix it & effect on score: Add JSON-LD structured data describing the page, e.g. Organization/WebSite on the homepage, Article on blog posts, or Product on product pages. Fixing this removes the 8 pts deduction from the Structured Data category score on the next scan.
schema-breadcrumb-invalid
BreadcrumbList schema has N issue(s)
| Severity | Weight | Category |
|---|---|---|
| Medium | 5–8 pts (scales with how much of the page is affected — see source) | Structured Data |
What triggers it & why it matters: Breadcrumb rich results require each itemListElement to have position, name, and item: (actual value found on the page, truncated).
How to fix it & effect on score: Ensure every itemListElement has "position" (integer), "name", and an absolute "item" URL. Fixing this removes the 5–8 pts (scales with how much of the page is affected — see source) deduction from the Structured Data category score on the next scan.
schema-event-required
Event schema is missing required property/ies: N
| Severity | Weight | Category |
|---|---|---|
| Medium | 5–8 pts (scales with how much of the page is affected — see source) | Structured Data |
What triggers it & why it matters: Event rich results require "name", "startDate", and "location" at minimum.
How to fix it & effect on score: Add N to the Event JSON-LD block. Fixing this removes the 5–8 pts (scales with how much of the page is affected — see source) deduction from the Structured Data category score on the next scan.
schema-faq-invalid
FAQPage schema has N issue(s)
| Severity | Weight | Category |
|---|---|---|
| Medium | 5–8 pts (scales with how much of the page is affected — see source) | Structured Data |
What triggers it & why it matters: FAQ rich results require each mainEntity Question to have a name and an acceptedAnswer.text: (actual value found on the page, truncated).
How to fix it & effect on score: Ensure every Question has "name" and an acceptedAnswer with "text". Fixing this removes the 5–8 pts (scales with how much of the page is affected — see source) deduction from the Structured Data category score on the next scan.
schema-missing-type
N JSON-LD node(s) missing "@type"
| Severity | Weight | Category |
|---|---|---|
| Medium | 8 pts | Structured Data |
What triggers it & why it matters: Every JSON-LD node needs an "@type" so search engines know which schema.org vocabulary applies.
How to fix it & effect on score: Add an appropriate "@type" (e.g. "Organization", "Article", "Product") to each JSON-LD node. Fixing this removes the 8 pts deduction from the Structured Data category score on the next scan.
schema-org-required
Organization schema is missing required property/ies: N
| Severity | Weight | Category |
|---|---|---|
| Medium | 5–8 pts (scales with how much of the page is affected — see source) | Structured Data |
What triggers it & why it matters: Organization schema needs at least "name" and "url" to be usable for knowledge panel / logo rich results.
How to fix it & effect on score: Add N to the Organization JSON-LD block. Fixing this removes the 5–8 pts (scales with how much of the page is affected — see source) deduction from the Structured Data category score on the next scan.
structured-data-none
No structured data detected on the page (JSON-LD, Microdata, or RDFa)
| Severity | Weight | Category |
|---|---|---|
| Medium | 8 pts | Structured Data |
What triggers it & why it matters: Without any structured data, this page is not eligible for rich results like sitelinks search boxes, breadcrumbs, FAQs, product pricing, or article cards.
How to fix it & effect on score: Add JSON-LD structured data appropriate to the page type (Organization/WebSite on the homepage, Article on posts, Product on product pages, etc.). Fixing this removes the 8 pts deduction from the Structured Data category score on the next scan.
schema-invalid-type
Unrecognized schema type(s): (actual value found on the page, truncated)
| Severity | Weight | Category |
|---|---|---|
| Medium | 7 pts | Structured Data |
What triggers it & why it matters: These "@type" values don't match standard schema.org type names (case-sensitive), which likely means a typo or an invalid/custom type that rich results won't recognize.
How to fix it & effect on score: Check spelling/casing against schema.org and use a valid registered type (e.g. "LocalBusiness", not "localbusiness" or "Local_Business"). Fixing this removes the 7 pts deduction from the Structured Data category score on the next scan.
schema-localbusiness-required
LocalBusiness schema is missing required property/ies: N
| Severity | Weight | Category |
|---|---|---|
| Medium | 7 pts | Structured Data |
What triggers it & why it matters: LocalBusiness schema needs "name" and "address" for local search / map pack eligibility.
How to fix it & effect on score: Add N to the LocalBusiness JSON-LD block. Fixing this removes the 7 pts deduction from the Structured Data category score on the next scan.
schema-missing-context
N JSON-LD node(s) missing a schema.org "@context"
| Severity | Weight | Category |
|---|---|---|
| Medium | 6 pts | Structured Data |
What triggers it & why it matters: Without "@context": "https://schema.org", the "@type" values are ambiguous and may be ignored by search engines.
How to fix it & effect on score: Add "@context": "https://schema.org" to each top-level JSON-LD object. Fixing this removes the 6 pts deduction from the Structured Data category score on the next scan.
schema-product-offers
Product schema is missing a valid "offers" with price/priceCurrency
| Severity | Weight | Category |
|---|---|---|
| Medium | 6 pts | Structured Data |
What triggers it & why it matters: Google requires Product rich results to include an offers object with "price" and "priceCurrency" (or an aggregateOffer) to show pricing.
How to fix it & effect on score: Add an "offers" object with "price", "priceCurrency", and "availability". Fixing this removes the 6 pts deduction from the Structured Data category score on the next scan.
schema-product-required
Product schema is missing required property/ies: N
| Severity | Weight | Category |
|---|---|---|
| Medium | 6 pts | Structured Data |
What triggers it & why it matters: Product schema needs at least a "name" to be valid.
How to fix it & effect on score: Add N to the Product JSON-LD block. Fixing this removes the 6 pts deduction from the Structured Data category score on the next scan.
schema-website-required
WebSite schema is missing required property/ies: N
| Severity | Weight | Category |
|---|---|---|
| Medium | 6 pts | Structured Data |
What triggers it & why it matters: WebSite schema needs "name" and "url" at minimum.
How to fix it & effect on score: Add N to the WebSite JSON-LD block. Fixing this removes the 6 pts deduction from the Structured Data category score on the next scan.
microdata-missing-itemtype
N microdata element(s) missing "itemtype"
| Severity | Weight | Category |
|---|---|---|
| Medium | 5 pts | Structured Data |
What triggers it & why it matters: Elements using itemscope without a matching itemtype have no defined vocabulary, so parsers can't interpret the properties inside them.
How to fix it & effect on score: Add an itemtype attribute (e.g. itemtype="https://schema.org/Product") to every itemscope element. Fixing this removes the 5 pts deduction from the Structured Data category score on the next scan.
schema-person-required
Person schema is missing required property: name
| Severity | Weight | Category |
|---|---|---|
| Medium | 5 pts | Structured Data |
What triggers it & why it matters: Person schema is not useful to search engines without at least a "name".
How to fix it & effect on score: Add a "name" property to the Person JSON-LD block. Fixing this removes the 5 pts deduction from the Structured Data category score on the next scan.
schema-searchaction-invalid
SearchAction is malformed (invalid target/urlTemplate / invalid query-input)
| Severity | Weight | Category |
|---|---|---|
| Medium | 5 pts | Structured Data |
What triggers it & why it matters: The SearchAction target must contain "{search_term_string}" as a placeholder and query-input must reference "search_term_string".
How to fix it & effect on score: Set target.urlTemplate to something like "https://example.com/search?q={search_term_string}" and query-input to "required name=search_term_string". Fixing this removes the 5 pts deduction from the Structured Data category score on the next scan.
microdata-invalid-itemtype
N microdata element(s) use a non-schema.org itemtype
| Severity | Weight | Category |
|---|---|---|
| Low | 4 pts | Structured Data |
What triggers it & why it matters: itemtype values should be absolute schema.org URLs (https://schema.org/Type) for search engines to recognize them.
How to fix it & effect on score: Point itemtype attributes at https://schema.org/ type URLs. Fixing this removes the 4 pts deduction from the Structured Data category score on the next scan.
rdfa-missing-vocab
RDFa "typeof" attributes found without a "vocab" declaration
| Severity | Weight | Category |
|---|---|---|
| Low | 4 pts | Structured Data |
What triggers it & why it matters: RDFa typeof values are ambiguous without a vocab attribute (typically vocab="https://schema.org/") establishing which vocabulary the types come from.
How to fix it & effect on score: Add vocab="https://schema.org/" to the <html> or a wrapping element that contains the RDFa markup. Fixing this removes the 4 pts deduction from the Structured Data category score on the next scan.
schema-searchaction-missing
WebSite schema has no SearchAction (sitelinks search box)
| Severity | Weight | Category |
|---|---|---|
| Low | 4 pts | Structured Data |
What triggers it & why it matters: Without a potentialAction/SearchAction, Google cannot show a sitelinks search box for your site in search results.
How to fix it & effect on score: Add a potentialAction with @type "SearchAction", a target urlTemplate containing "{search_term_string}", and query-input "required name=search_term_string". Fixing this removes the 4 pts deduction from the Structured Data category score on the next scan.
jsonld-empty
N empty JSON-LD script tag(s)
| Severity | Weight | Category |
|---|---|---|
| Low | 3 pts | Structured Data |
What triggers it & why it matters: A <script type="application/ld+json"> tag exists but contains no content.
How to fix it & effect on score: Remove empty JSON-LD script tags or populate them with valid structured data. Fixing this removes the 3 pts deduction from the Structured Data category score on the next scan.
schema-localbusiness-phone
LocalBusiness schema is missing "telephone"
| Severity | Weight | Category |
|---|---|---|
| Low | 3 pts | Structured Data |
What triggers it & why it matters: A phone number helps LocalBusiness listings qualify for click-to-call rich results.
How to fix it & effect on score: Add a "telephone" property in E.164 or national format. Fixing this removes the 3 pts deduction from the Structured Data category score on the next scan.
schema-org-logo
Organization schema is missing "logo"
| Severity | Weight | Category |
|---|---|---|
| Low | 3 pts | Structured Data |
What triggers it & why it matters: Google uses the Organization logo for knowledge panels and search result branding.
How to fix it & effect on score: Add a "logo" property with an absolute image URL to the Organization schema. Fixing this removes the 3 pts deduction from the Structured Data category score on the next scan.
schema-product-image
Product schema is missing "image"
| Severity | Weight | Category |
|---|---|---|
| Low | 3 pts | Structured Data |
What triggers it & why it matters: Product rich results display an image; without it, the listing looks incomplete.
How to fix it & effect on score: Add an "image" property with one or more absolute image URLs. Fixing this removes the 3 pts deduction from the Structured Data category score on the next scan.
jsonld-present
N JSON-LD block(s) found
| Severity | Weight | Category |
|---|---|---|
| Positive signal | 0 pts | Structured Data |
What triggers it & why it matters: This rule only ever surfaces as a passing signal in the current source — it fires (as a pass) when: N JSON-LD block(s) found. There is no separate failing issue() call under this exact id; the failure condition is the logical negation of the pass condition, and in most cases is covered by a related rule id documented elsewhere in this category (see the table above for a sibling rule on the same feature).
Effect on score: Meeting this condition costs nothing and confirms a positive signal. Missing it doesn't directly deduct points under this id — it typically shows up as a deduction under the related failing rule instead.
microdata
Microdata found on N element(s) and looks well-formed
| Severity | Weight | Category |
|---|---|---|
| Positive signal | 0 pts | Structured Data |
What triggers it & why it matters: This rule only ever surfaces as a passing signal in the current source — it fires (as a pass) when: Microdata found on N element(s) and looks well-formed. There is no separate failing issue() call under this exact id; the failure condition is the logical negation of the pass condition, and in most cases is covered by a related rule id documented elsewhere in this category (see the table above for a sibling rule on the same feature).
Effect on score: Meeting this condition costs nothing and confirms a positive signal. Missing it doesn't directly deduct points under this id — it typically shows up as a deduction under the related failing rule instead.
rdfa
RDFa markup found on N element(s) with a vocab declared
| Severity | Weight | Category |
|---|---|---|
| Positive signal | 0 pts | Structured Data |
What triggers it & why it matters: This rule only ever surfaces as a passing signal in the current source — it fires (as a pass) when: RDFa markup found on N element(s) with a vocab declared. There is no separate failing issue() call under this exact id; the failure condition is the logical negation of the pass condition, and in most cases is covered by a related rule id documented elsewhere in this category (see the table above for a sibling rule on the same feature).
Effect on score: Meeting this condition costs nothing and confirms a positive signal. Missing it doesn't directly deduct points under this id — it typically shows up as a deduction under the related failing rule instead.
schema-article-Article
Article schema has all required properties
| Severity | Weight | Category |
|---|---|---|
| Positive signal | 0 pts | Structured Data |
What triggers it & why it matters: This rule only ever surfaces as a passing signal in the current source — it fires (as a pass) when: Article schema has all required properties (headline, author, datePublished). There is no separate failing issue() call under this exact id; the failure condition is the logical negation of the pass condition, and in most cases is covered by a related rule id documented elsewhere in this category (see the table above for a sibling rule on the same feature).
Effect on score: Meeting this condition costs nothing and confirms a positive signal. Missing it doesn't directly deduct points under this id — it typically shows up as a deduction under the related failing rule instead.
schema-article-BlogPosting
BlogPosting schema has all required properties
| Severity | Weight | Category |
|---|---|---|
| Positive signal | 0 pts | Structured Data |
What triggers it & why it matters: This rule only ever surfaces as a passing signal in the current source — it fires (as a pass) when: BlogPosting schema has all required properties (headline, author, datePublished). There is no separate failing issue() call under this exact id; the failure condition is the logical negation of the pass condition, and in most cases is covered by a related rule id documented elsewhere in this category (see the table above for a sibling rule on the same feature).
Effect on score: Meeting this condition costs nothing and confirms a positive signal. Missing it doesn't directly deduct points under this id — it typically shows up as a deduction under the related failing rule instead.
schema-article-NewsArticle
NewsArticle schema has all required properties
| Severity | Weight | Category |
|---|---|---|
| Positive signal | 0 pts | Structured Data |
What triggers it & why it matters: This rule only ever surfaces as a passing signal in the current source — it fires (as a pass) when: NewsArticle schema has all required properties (headline, author, datePublished). There is no separate failing issue() call under this exact id; the failure condition is the logical negation of the pass condition, and in most cases is covered by a related rule id documented elsewhere in this category (see the table above for a sibling rule on the same feature).
Effect on score: Meeting this condition costs nothing and confirms a positive signal. Missing it doesn't directly deduct points under this id — it typically shows up as a deduction under the related failing rule instead.
schema-breadcrumb
BreadcrumbList schema is valid
| Severity | Weight | Category |
|---|---|---|
| Positive signal | 0 pts | Structured Data |
What triggers it & why it matters: This rule only ever surfaces as a passing signal in the current source — it fires (as a pass) when: BreadcrumbList schema is valid. There is no separate failing issue() call under this exact id; the failure condition is the logical negation of the pass condition, and in most cases is covered by a related rule id documented elsewhere in this category (see the table above for a sibling rule on the same feature).
Effect on score: Meeting this condition costs nothing and confirms a positive signal. Missing it doesn't directly deduct points under this id — it typically shows up as a deduction under the related failing rule instead.
schema-event
Event schema has required properties
| Severity | Weight | Category |
|---|---|---|
| Positive signal | 0 pts | Structured Data |
What triggers it & why it matters: This rule only ever surfaces as a passing signal in the current source — it fires (as a pass) when: Event schema has required properties. There is no separate failing issue() call under this exact id; the failure condition is the logical negation of the pass condition, and in most cases is covered by a related rule id documented elsewhere in this category (see the table above for a sibling rule on the same feature).
Effect on score: Meeting this condition costs nothing and confirms a positive signal. Missing it doesn't directly deduct points under this id — it typically shows up as a deduction under the related failing rule instead.
schema-faq
FAQPage schema is valid
| Severity | Weight | Category |
|---|---|---|
| Positive signal | 0 pts | Structured Data |
What triggers it & why it matters: This rule only ever surfaces as a passing signal in the current source — it fires (as a pass) when: FAQPage schema is valid. There is no separate failing issue() call under this exact id; the failure condition is the logical negation of the pass condition, and in most cases is covered by a related rule id documented elsewhere in this category (see the table above for a sibling rule on the same feature).
Effect on score: Meeting this condition costs nothing and confirms a positive signal. Missing it doesn't directly deduct points under this id — it typically shows up as a deduction under the related failing rule instead.
schema-localbusiness
LocalBusiness schema has required properties
| Severity | Weight | Category |
|---|---|---|
| Positive signal | 0 pts | Structured Data |
What triggers it & why it matters: This rule only ever surfaces as a passing signal in the current source — it fires (as a pass) when: LocalBusiness schema has required properties. There is no separate failing issue() call under this exact id; the failure condition is the logical negation of the pass condition, and in most cases is covered by a related rule id documented elsewhere in this category (see the table above for a sibling rule on the same feature).
Effect on score: Meeting this condition costs nothing and confirms a positive signal. Missing it doesn't directly deduct points under this id — it typically shows up as a deduction under the related failing rule instead.
schema-org
Organization schema has required properties
| Severity | Weight | Category |
|---|---|---|
| Positive signal | 0 pts | Structured Data |
What triggers it & why it matters: This rule only ever surfaces as a passing signal in the current source — it fires (as a pass) when: Organization schema has required properties. There is no separate failing issue() call under this exact id; the failure condition is the logical negation of the pass condition, and in most cases is covered by a related rule id documented elsewhere in this category (see the table above for a sibling rule on the same feature).
Effect on score: Meeting this condition costs nothing and confirms a positive signal. Missing it doesn't directly deduct points under this id — it typically shows up as a deduction under the related failing rule instead.
schema-person
Person schema has required properties
| Severity | Weight | Category |
|---|---|---|
| Positive signal | 0 pts | Structured Data |
What triggers it & why it matters: This rule only ever surfaces as a passing signal in the current source — it fires (as a pass) when: Person schema has required properties. There is no separate failing issue() call under this exact id; the failure condition is the logical negation of the pass condition, and in most cases is covered by a related rule id documented elsewhere in this category (see the table above for a sibling rule on the same feature).
Effect on score: Meeting this condition costs nothing and confirms a positive signal. Missing it doesn't directly deduct points under this id — it typically shows up as a deduction under the related failing rule instead.
schema-product
Product schema has required properties
| Severity | Weight | Category |
|---|---|---|
| Positive signal | 0 pts | Structured Data |
What triggers it & why it matters: This rule only ever surfaces as a passing signal in the current source — it fires (as a pass) when: Product schema has required properties. There is no separate failing issue() call under this exact id; the failure condition is the logical negation of the pass condition, and in most cases is covered by a related rule id documented elsewhere in this category (see the table above for a sibling rule on the same feature).
Effect on score: Meeting this condition costs nothing and confirms a positive signal. Missing it doesn't directly deduct points under this id — it typically shows up as a deduction under the related failing rule instead.
schema-searchaction
SearchAction is present and correctly configured
| Severity | Weight | Category |
|---|---|---|
| Positive signal | 0 pts | Structured Data |
What triggers it & why it matters: This rule only ever surfaces as a passing signal in the current source — it fires (as a pass) when: SearchAction is present and correctly configured. There is no separate failing issue() call under this exact id; the failure condition is the logical negation of the pass condition, and in most cases is covered by a related rule id documented elsewhere in this category (see the table above for a sibling rule on the same feature).
Effect on score: Meeting this condition costs nothing and confirms a positive signal. Missing it doesn't directly deduct points under this id — it typically shows up as a deduction under the related failing rule instead.
schema-website
WebSite schema has required properties
| Severity | Weight | Category |
|---|---|---|
| Positive signal | 0 pts | Structured Data |
What triggers it & why it matters: This rule only ever surfaces as a passing signal in the current source — it fires (as a pass) when: WebSite schema has required properties. There is no separate failing issue() call under this exact id; the failure condition is the logical negation of the pass condition, and in most cases is covered by a related rule id documented elsewhere in this category (see the table above for a sibling rule on the same feature).
Effect on score: Meeting this condition costs nothing and confirms a positive signal. Missing it doesn't directly deduct points under this id — it typically shows up as a deduction under the related failing rule instead.