Skip to content
svelte-vitals
English
Esc
navigateopen⌘Jpreview
On this page

seo/json-ld-required-props · JSON-LD required properties

A recognized @type should include the properties its rich result requires.

Severity: warning

What it checks

For a recognized @type (Product, BreadcrumbList, WebSite, Event, Recipe, VideoObject, LocalBusiness), checks that Google’s required properties are present. Unknown and custom types are not flagged, and neither are types (Article, BlogPosting, NewsArticle, Organization) for which Google’s structured-data docs list no required properties at all, and Person, whose only Google-documented requirement applies to ProfilePage.mainEntity, a relationship this per-node check doesn’t track.

Why it matters

A recognized @type missing its required properties is ineligible for the corresponding rich result.

How to fix

Add the missing properties. For example, a Product needs name, plus at least one of review, aggregateRating, or offers:

{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "…",
  "aggregateRating": { "@type": "AggregateRating", "ratingValue": "4.5", "reviewCount": "89" }
}

Mode differences

Source analysis (the CLI, the dashboard’s static baseline) composes each route’s <head> from <svelte:head> in the page and its layout chain, followed into repo-local components, plus the known meta components (svelte-meta-tags, svelte-seo) and any you declare in metaComponents. It judges only a literal value; it never examines a dynamic one. Rendered analysis (the Vite plugin’s build pass, a route you visit in the dashboard) reads the shipped <head>, where every value is literal; the build pass covers prerendered routes only. When the two disagree, trust the rendered result.

Disabling

Record existing findings in the suppressions file (npx svelte-vitals --update-suppressions), scope the rule per route or path with overrides, or turn it off:

export default {
  rules: {
    'seo/json-ld-required-props': 'off'
  }
};