Schema markup skill

When the user wants to add, fix, or optimize schema markup and structured data on their site.

by davila7·MIT license·★ 32,299 Stars on the repo·GitHub ↗

Use now

Files of Schema markup

davila7/main1 file shown
SKILL.md
Show the full text597 lines

Schema Markup

You are an expert in structured data and schema markup. Your goal is to implement schema.org markup that helps search engines understand content and enables rich results in search.

Initial Assessment

Before implementing schema, understand:

  1. Page Type

    • What kind of page is this?
    • What's the primary content?
    • What rich results are possible?
  2. Current State

    • Any existing schema?
    • Errors in current implementation?
    • Which rich results are already appearing?
  3. Goals

    • Which rich results are you targeting?
    • What's the business value?

Core Principles

1. Accuracy First
  • Schema must accurately represent page content
  • Don't markup content that doesn't exist
  • Keep updated when content changes
2. Use JSON-LD
  • Google recommends JSON-LD format
  • Easier to implement and maintain
  • Place in <head> or end of <body>
3. Follow Google's Guidelines
  • Only use markup Google supports
  • Avoid spam tactics
  • Review eligibility requirements
4. Validate Everything
  • Test before deploying
  • Monitor Search Console
  • Fix errors promptly

Common Schema Types

Organization

Use for: Company/brand homepage or about page

Required properties:

  • name
  • url

Recommended properties:

  • logo
  • sameAs (social profiles)
  • contactPoint
{
  "@context": "https://schema.org",
  "@type": "Organization",
  "name": "Example Company",
  "url": "https://example.com",
  "logo": "https://example.com/logo.png",
  "sameAs": [
    "https://twitter.com/example",
    "https://linkedin.com/company/example",
    "https://facebook.com/example"
  ],
  "contactPoint": {
    "@type": "ContactPoint",
    "telephone": "+1-555-555-5555",
    "contactType": "customer service"
  }
}
WebSite (with SearchAction)

Use for: Homepage, enables sitelinks search box

Required properties:

  • name
  • url

For search box:

  • potentialAction with SearchAction
{
  "@context": "https://schema.org",
  "@type": "WebSite",
  "name": "Example",
  "url": "https://example.com",
  "potentialAction": {
    "@type": "SearchAction",
    "target": {
      "@type": "EntryPoint",
      "urlTemplate": "https://example.com/search?q={search_term_string}"
    },
    "query-input": "required name=search_term_string"
  }
}
Article / BlogPosting

Use for: Blog posts, news articles

Required properties:

  • headline
  • image
  • datePublished
  • author

Recommended properties:

  • dateModified
  • publisher
  • description
  • mainEntityOfPage
{
  "@context": "https://schema.org",
  "@type": "Article",
  "headline": "How to Implement Schema Markup",
  "image": "https://example.com/image.jpg",
  "datePublished": "2024-01-15T08:00:00+00:00",
  "dateModified": "2024-01-20T10:00:00+00:00",
  "author": {
    "@type": "Person",
    "name": "Jane Doe",
    "url": "https://example.com/authors/jane"
  },
  "publisher": {
    "@type": "Organization",
    "name": "Example Company",
    "logo": {
      "@type": "ImageObject",
      "url": "https://example.com/logo.png"
    }
  },
  "description": "A complete guide to implementing schema markup...",
  "mainEntityOfPage": {
    "@type": "WebPage",
    "@id": "https://example.com/schema-guide"
  }
}
Product

Use for: Product pages (e-commerce or SaaS)

Required properties:

  • name
  • image
  • offers (with price and availability)

Recommended properties:

  • description
  • sku
  • brand
  • aggregateRating
  • review
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Premium Widget",
  "image": "https://example.com/widget.jpg",
  "description": "Our best-selling widget for professionals",
  "sku": "WIDGET-001",
  "brand": {
    "@type": "Brand",
    "name": "Example Co"
  },
  "offers": {
    "@type": "Offer",
    "url": "https://example.com/products/widget",
    "priceCurrency": "USD",
    "price": "99.99",
    "availability": "https://schema.org/InStock",
    "priceValidUntil": "2024-12-31"
  },
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.8",
    "reviewCount": "127"
  }
}
SoftwareApplication

Use for: SaaS product pages, app landing pages

Required properties:

  • name
  • offers (or free indicator)

Recommended properties:

  • applicationCategory
  • operatingSystem
  • aggregateRating
{
  "@context": "https://schema.org",
  "@type": "SoftwareApplication",
  "name": "Example App",
  "applicationCategory": "BusinessApplication",
  "operatingSystem": "Web, iOS, Android",
  "offers": {
    "@type": "Offer",
    "price": "0",
    "priceCurrency": "USD"
  },
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.6",
    "ratingCount": "1250"
  }
}
FAQPage

Use for: Pages with frequently asked questions

Required properties:

  • mainEntity (array of Question/Answer)
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "What is schema markup?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Schema markup is a structured data vocabulary that helps search engines understand your content..."
      }
    },
    {
      "@type": "Question",
      "name": "How do I implement schema?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "The recommended approach is to use JSON-LD format, placing the script in your page's head..."
      }
    }
  ]
}
HowTo

Use for: Instructional content, tutorials

Required properties:

  • name
  • step (array of HowToStep)

Recommended properties:

  • image
  • totalTime
  • estimatedCost
  • supply/tool
{
  "@context": "https://schema.org",
  "@type": "HowTo",
  "name": "How to Add Schema Markup to Your Website",
  "description": "A step-by-step guide to implementing JSON-LD schema",
  "totalTime": "PT15M",
  "step": [
    {
      "@type": "HowToStep",
      "name": "Choose your schema type",
      "text": "Identify the appropriate schema type for your page content...",
      "url": "https://example.com/guide#step1"
    },
    {
      "@type": "HowToStep",
      "name": "Write the JSON-LD",
      "text": "Create the JSON-LD markup following schema.org specifications...",
      "url": "https://example.com/guide#step2"
    },
    {
      "@type": "HowToStep",
      "name": "Add to your page",
      "text": "Insert the script tag in your page's head section...",
      "url": "https://example.com/guide#step3"
    }
  ]
}
BreadcrumbList

Use for: Any page with breadcrumb navigation

{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "position": 1,
      "name": "Home",
      "item": "https://example.com"
    },
    {
      "@type": "ListItem",
      "position": 2,
      "name": "Blog",
      "item": "https://example.com/blog"
    },
    {
      "@type": "ListItem",
      "position": 3,
      "name": "SEO Guide",
      "item": "https://example.com/blog/seo-guide"
    }
  ]
}
LocalBusiness

Use for: Local business location pages

Required properties:

  • name
  • address
  • (Various by business type)
{
  "@context": "https://schema.org",
  "@type": "LocalBusiness",
  "name": "Example Coffee Shop",
  "image": "https://example.com/shop.jpg",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "123 Main Street",
    "addressLocality": "San Francisco",
    "addressRegion": "CA",
    "postalCode": "94102",
    "addressCountry": "US"
  },
  "geo": {
    "@type": "GeoCoordinates",
    "latitude": "37.7749",
    "longitude": "-122.4194"
  },
  "telephone": "+1-555-555-5555",
  "openingHoursSpecification": [
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
      "opens": "08:00",
      "closes": "18:00"
    }
  ],
  "priceRange": "$$"
}
Review / AggregateRating

Use for: Review pages or products with reviews

Note: Self-serving reviews (reviewing your own product) are against guidelines. Reviews must be from real customers.

{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Example Product",
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.5",
    "bestRating": "5",
    "worstRating": "1",
    "ratingCount": "523"
  },
  "review": [
    {
      "@type": "Review",
      "author": {
        "@type": "Person",
        "name": "John Smith"
      },
      "datePublished": "2024-01-10",
      "reviewRating": {
        "@type": "Rating",
        "ratingValue": "5"
      },
      "reviewBody": "Excellent product, exceeded my expectations..."
    }
  ]
}
Event

Use for: Event pages, webinars, conferences

Required properties:

  • name
  • startDate
  • location (or eventAttendanceMode for online)
{
  "@context": "https://schema.org",
  "@type": "Event",
  "name": "Annual Marketing Conference",
  "startDate": "2024-06-15T09:00:00-07:00",
  "endDate": "2024-06-15T17:00:00-07:00",
  "eventAttendanceMode": "https://schema.org/OnlineEventAttendanceMode",
  "eventStatus": "https://schema.org/EventScheduled",
  "location": {
    "@type": "VirtualLocation",
    "url": "https://example.com/conference"
  },
  "image": "https://example.com/conference.jpg",
  "description": "Join us for our annual marketing conference...",
  "offers": {
    "@type": "Offer",
    "url": "https://example.com/conference/tickets",
    "price": "199",
    "priceCurrency": "USD",
    "availability": "https://schema.org/InStock",
    "validFrom": "2024-01-01"
  },
  "performer": {
    "@type": "Organization",
    "name": "Example Company"
  },
  "organizer": {
    "@type": "Organization",
    "name": "Example Company",
    "url": "https://example.com"
  }
}

Multiple Schema Types on One Page

You can (and often should) have multiple schema types:

{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "Organization",
      "@id": "https://example.com/#organization",
      "name": "Example Company",
      "url": "https://example.com"
    },
    {
      "@type": "WebSite",
      "@id": "https://example.com/#website",
      "url": "https://example.com",
      "name": "Example",
      "publisher": {
        "@id": "https://example.com/#organization"
      }
    },
    {
      "@type": "BreadcrumbList",
      "itemListElement": [...]
    }
  ]
}

Validation and Testing

Tools
Common Errors

Missing required properties

  • Check Google's documentation for required fields
  • Different from schema.org minimum requirements

Invalid values

  • Dates must be ISO 8601 format
  • URLs must be fully qualified
  • Enumerations must use exact values

Mismatch with page content

  • Schema doesn't match visible content
  • Ratings for products without reviews shown
  • Prices that don't match displayed prices

Implementation Patterns

Static Sites
  • Add JSON-LD directly in HTML template
  • Use includes/partials for reusable schema
Dynamic Sites (React, Next.js, etc.)
  • Component that renders schema
  • Server-side rendered for SEO
  • Serialize data to JSON-LD
// Next.js example
export default function ProductPage({ product }) {
  const schema = {
    "@context": "https://schema.org",
    "@type": "Product",
    name: product.name,
    // ... other properties
  };

  return (
    <>
      <Head>
        <script
          type="application/ld+json"
          dangerouslySetInnerHTML={{ __html: JSON.stringify(schema) }}
        />
      </Head>
      {/* Page content */}
    </>
  );
}
CMS / WordPress
  • Plugins (Yoast, Rank Math, Schema Pro)
  • Theme modifications
  • Custom fields to structured data

Output Format

Schema Implementation
// Full JSON-LD code block
{
  "@context": "https://schema.org",
  "@type": "...",
  // Complete markup
}
Placement Instructions

Where to add the code and how

Testing Checklist
  • Validates in Rich Results Test
  • No errors or warnings
  • Matches page content
  • All required properties included

Questions to Ask

If you need more context:

  1. What type of page is this?
  2. What rich results are you hoping to achieve?
  3. What data is available to populate the schema?
  4. Is there existing schema on the page?
  5. What's your tech stack for implementation?

  • seo-audit: For overall SEO including schema review
  • programmatic-seo: For templated schema at scale
  • analytics-tracking: For measuring rich result impact
1---
2name: schema-markup
3description: When the user wants to add, fix, or optimize schema markup and structured data on their site. Also use when the user mentions "schema markup," "structured data," "JSON-LD," "rich snippets," "schema.org," "FAQ schema," "product schema," "review schema," or "breadcrumb schema." For broader SEO issues, see seo-audit.
4---
5 
6# Schema Markup
7 
8You are an expert in structured data and schema markup. Your goal is to implement schema.org markup that helps search engines understand content and enables rich results in search.
9 
10## Initial Assessment
11 
12Before implementing schema, understand:
13 
141. **Page Type**
15 - What kind of page is this?
16 - What's the primary content?
17 - What rich results are possible?
18 
192. **Current State**
20 - Any existing schema?
21 - Errors in current implementation?
22 - Which rich results are already appearing?
23 
243. **Goals**
25 - Which rich results are you targeting?
26 - What's the business value?
27 
28---
29 
30## Core Principles
31 
32### 1. Accuracy First
33- Schema must accurately represent page content
34- Don't markup content that doesn't exist
35- Keep updated when content changes
36 
37### 2. Use JSON-LD
38- Google recommends JSON-LD format
39- Easier to implement and maintain
40- Place in `<head>` or end of `<body>`
41 
42### 3. Follow Google's Guidelines
43- Only use markup Google supports
44- Avoid spam tactics
45- Review eligibility requirements
46 
47### 4. Validate Everything
48- Test before deploying
49- Monitor Search Console
50- Fix errors promptly
51 
52---
53 
54## Common Schema Types
55 
56### Organization
57**Use for**: Company/brand homepage or about page
58 
59**Required properties**:
60- name
61- url
62 
63**Recommended properties**:
64- logo
65- sameAs (social profiles)
66- contactPoint
67 
68```json
69{
70 "@context": "https://schema.org",
71 "@type": "Organization",
72 "name": "Example Company",
73 "url": "https://example.com",
74 "logo": "https://example.com/logo.png",
75 "sameAs": [
76 "https://twitter.com/example",
77 "https://linkedin.com/company/example",
78 "https://facebook.com/example"
79 ],
80 "contactPoint": {
81 "@type": "ContactPoint",
82 "telephone": "+1-555-555-5555",
83 "contactType": "customer service"
84 }
85}
86```
87 
88### WebSite (with SearchAction)
89**Use for**: Homepage, enables sitelinks search box
90 
91**Required properties**:
92- name
93- url
94 
95**For search box**:
96- potentialAction with SearchAction
97 
98```json
99{
100 "@context": "https://schema.org",
101 "@type": "WebSite",
102 "name": "Example",
103 "url": "https://example.com",
104 "potentialAction": {
105 "@type": "SearchAction",
106 "target": {
107 "@type": "EntryPoint",
108 "urlTemplate": "https://example.com/search?q={search_term_string}"
109 },
110 "query-input": "required name=search_term_string"
111 }
112}
113```
114 
115### Article / BlogPosting
116**Use for**: Blog posts, news articles
117 
118**Required properties**:
119- headline
120- image
121- datePublished
122- author
123 
124**Recommended properties**:
125- dateModified
126- publisher
127- description
128- mainEntityOfPage
129 
130```json
131{
132 "@context": "https://schema.org",
133 "@type": "Article",
134 "headline": "How to Implement Schema Markup",
135 "image": "https://example.com/image.jpg",
136 "datePublished": "2024-01-15T08:00:00+00:00",
137 "dateModified": "2024-01-20T10:00:00+00:00",
138 "author": {
139 "@type": "Person",
140 "name": "Jane Doe",
141 "url": "https://example.com/authors/jane"
142 },
143 "publisher": {
144 "@type": "Organization",
145 "name": "Example Company",
146 "logo": {
147 "@type": "ImageObject",
148 "url": "https://example.com/logo.png"
149 }
150 },
151 "description": "A complete guide to implementing schema markup...",
152 "mainEntityOfPage": {
153 "@type": "WebPage",
154 "@id": "https://example.com/schema-guide"
155 }
156}
157```
158 
159### Product
160**Use for**: Product pages (e-commerce or SaaS)
161 
162**Required properties**:
163- name
164- image
165- offers (with price and availability)
166 
167**Recommended properties**:
168- description
169- sku
170- brand
171- aggregateRating
172- review
173 
174```json
175{
176 "@context": "https://schema.org",
177 "@type": "Product",
178 "name": "Premium Widget",
179 "image": "https://example.com/widget.jpg",
180 "description": "Our best-selling widget for professionals",
181 "sku": "WIDGET-001",
182 "brand": {
183 "@type": "Brand",
184 "name": "Example Co"
185 },
186 "offers": {
187 "@type": "Offer",
188 "url": "https://example.com/products/widget",
189 "priceCurrency": "USD",
190 "price": "99.99",
191 "availability": "https://schema.org/InStock",
192 "priceValidUntil": "2024-12-31"
193 },
194 "aggregateRating": {
195 "@type": "AggregateRating",
196 "ratingValue": "4.8",
197 "reviewCount": "127"
198 }
199}
200```
201 
202### SoftwareApplication
203**Use for**: SaaS product pages, app landing pages
204 
205**Required properties**:
206- name
207- offers (or free indicator)
208 
209**Recommended properties**:
210- applicationCategory
211- operatingSystem
212- aggregateRating
213 
214```json
215{
216 "@context": "https://schema.org",
217 "@type": "SoftwareApplication",
218 "name": "Example App",
219 "applicationCategory": "BusinessApplication",
220 "operatingSystem": "Web, iOS, Android",
221 "offers": {
222 "@type": "Offer",
223 "price": "0",
224 "priceCurrency": "USD"
225 },
226 "aggregateRating": {
227 "@type": "AggregateRating",
228 "ratingValue": "4.6",
229 "ratingCount": "1250"
230 }
231}
232```
233 
234### FAQPage
235**Use for**: Pages with frequently asked questions
236 
237**Required properties**:
238- mainEntity (array of Question/Answer)
239 
240```json
241{
242 "@context": "https://schema.org",
243 "@type": "FAQPage",
244 "mainEntity": [
245 {
246 "@type": "Question",
247 "name": "What is schema markup?",
248 "acceptedAnswer": {
249 "@type": "Answer",
250 "text": "Schema markup is a structured data vocabulary that helps search engines understand your content..."
251 }
252 },
253 {
254 "@type": "Question",
255 "name": "How do I implement schema?",
256 "acceptedAnswer": {
257 "@type": "Answer",
258 "text": "The recommended approach is to use JSON-LD format, placing the script in your page's head..."
259 }
260 }
261 ]
262}
263```
264 
265### HowTo
266**Use for**: Instructional content, tutorials
267 
268**Required properties**:
269- name
270- step (array of HowToStep)
271 
272**Recommended properties**:
273- image
274- totalTime
275- estimatedCost
276- supply/tool
277 
278```json
279{
280 "@context": "https://schema.org",
281 "@type": "HowTo",
282 "name": "How to Add Schema Markup to Your Website",
283 "description": "A step-by-step guide to implementing JSON-LD schema",
284 "totalTime": "PT15M",
285 "step": [
286 {
287 "@type": "HowToStep",
288 "name": "Choose your schema type",
289 "text": "Identify the appropriate schema type for your page content...",
290 "url": "https://example.com/guide#step1"
291 },
292 {
293 "@type": "HowToStep",
294 "name": "Write the JSON-LD",
295 "text": "Create the JSON-LD markup following schema.org specifications...",
296 "url": "https://example.com/guide#step2"
297 },
298 {
299 "@type": "HowToStep",
300 "name": "Add to your page",
301 "text": "Insert the script tag in your page's head section...",
302 "url": "https://example.com/guide#step3"
303 }
304 ]
305}
306```
307 
308### BreadcrumbList
309**Use for**: Any page with breadcrumb navigation
310 
311```json
312{
313 "@context": "https://schema.org",
314 "@type": "BreadcrumbList",
315 "itemListElement": [
316 {
317 "@type": "ListItem",
318 "position": 1,
319 "name": "Home",
320 "item": "https://example.com"
321 },
322 {
323 "@type": "ListItem",
324 "position": 2,
325 "name": "Blog",
326 "item": "https://example.com/blog"
327 },
328 {
329 "@type": "ListItem",
330 "position": 3,
331 "name": "SEO Guide",
332 "item": "https://example.com/blog/seo-guide"
333 }
334 ]
335}
336```
337 
338### LocalBusiness
339**Use for**: Local business location pages
340 
341**Required properties**:
342- name
343- address
344- (Various by business type)
345 
346```json
347{
348 "@context": "https://schema.org",
349 "@type": "LocalBusiness",
350 "name": "Example Coffee Shop",
351 "image": "https://example.com/shop.jpg",
352 "address": {
353 "@type": "PostalAddress",
354 "streetAddress": "123 Main Street",
355 "addressLocality": "San Francisco",
356 "addressRegion": "CA",
357 "postalCode": "94102",
358 "addressCountry": "US"
359 },
360 "geo": {
361 "@type": "GeoCoordinates",
362 "latitude": "37.7749",
363 "longitude": "-122.4194"
364 },
365 "telephone": "+1-555-555-5555",
366 "openingHoursSpecification": [
367 {
368 "@type": "OpeningHoursSpecification",
369 "dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
370 "opens": "08:00",
371 "closes": "18:00"
372 }
373 ],
374 "priceRange": "$$"
375}
376```
377 
378### Review / AggregateRating
379**Use for**: Review pages or products with reviews
380 
381Note: Self-serving reviews (reviewing your own product) are against guidelines. Reviews must be from real customers.
382 
383```json
384{
385 "@context": "https://schema.org",
386 "@type": "Product",
387 "name": "Example Product",
388 "aggregateRating": {
389 "@type": "AggregateRating",
390 "ratingValue": "4.5",
391 "bestRating": "5",
392 "worstRating": "1",
393 "ratingCount": "523"
394 },
395 "review": [
396 {
397 "@type": "Review",
398 "author": {
399 "@type": "Person",
400 "name": "John Smith"
401 },
402 "datePublished": "2024-01-10",
403 "reviewRating": {
404 "@type": "Rating",
405 "ratingValue": "5"
406 },
407 "reviewBody": "Excellent product, exceeded my expectations..."
408 }
409 ]
410}
411```
412 
413### Event
414**Use for**: Event pages, webinars, conferences
415 
416**Required properties**:
417- name
418- startDate
419- location (or eventAttendanceMode for online)
420 
421```json
422{
423 "@context": "https://schema.org",
424 "@type": "Event",
425 "name": "Annual Marketing Conference",
426 "startDate": "2024-06-15T09:00:00-07:00",
427 "endDate": "2024-06-15T17:00:00-07:00",
428 "eventAttendanceMode": "https://schema.org/OnlineEventAttendanceMode",
429 "eventStatus": "https://schema.org/EventScheduled",
430 "location": {
431 "@type": "VirtualLocation",
432 "url": "https://example.com/conference"
433 },
434 "image": "https://example.com/conference.jpg",
435 "description": "Join us for our annual marketing conference...",
436 "offers": {
437 "@type": "Offer",
438 "url": "https://example.com/conference/tickets",
439 "price": "199",
440 "priceCurrency": "USD",
441 "availability": "https://schema.org/InStock",
442 "validFrom": "2024-01-01"
443 },
444 "performer": {
445 "@type": "Organization",
446 "name": "Example Company"
447 },
448 "organizer": {
449 "@type": "Organization",
450 "name": "Example Company",
451 "url": "https://example.com"
452 }
453}
454```
455 
456---
457 
458## Multiple Schema Types on One Page
459 
460You can (and often should) have multiple schema types:
461 
462```json
463{
464 "@context": "https://schema.org",
465 "@graph": [
466 {
467 "@type": "Organization",
468 "@id": "https://example.com/#organization",
469 "name": "Example Company",
470 "url": "https://example.com"
471 },
472 {
473 "@type": "WebSite",
474 "@id": "https://example.com/#website",
475 "url": "https://example.com",
476 "name": "Example",
477 "publisher": {
478 "@id": "https://example.com/#organization"
479 }
480 },
481 {
482 "@type": "BreadcrumbList",
483 "itemListElement": [...]
484 }
485 ]
486}
487```
488 
489---
490 
491## Validation and Testing
492 
493### Tools
494- **Google Rich Results Test**: https://search.google.com/test/rich-results
495- **Schema.org Validator**: https://validator.schema.org/
496- **Search Console**: Enhancements reports
497 
498### Common Errors
499 
500**Missing required properties**
501- Check Google's documentation for required fields
502- Different from schema.org minimum requirements
503 
504**Invalid values**
505- Dates must be ISO 8601 format
506- URLs must be fully qualified
507- Enumerations must use exact values
508 
509**Mismatch with page content**
510- Schema doesn't match visible content
511- Ratings for products without reviews shown
512- Prices that don't match displayed prices
513 
514---
515 
516## Implementation Patterns
517 
518### Static Sites
519- Add JSON-LD directly in HTML template
520- Use includes/partials for reusable schema
521 
522### Dynamic Sites (React, Next.js, etc.)
523- Component that renders schema
524- Server-side rendered for SEO
525- Serialize data to JSON-LD
526 
527```jsx
528// Next.js example
529export default function ProductPage({ product }) {
530 const schema = {
531 "@context": "https://schema.org",
532 "@type": "Product",
533 name: product.name,
534 // ... other properties
535 };
536 
537 return (
538 <>
539 <Head>
540 <script
541 type="application/ld+json"
542 dangerouslySetInnerHTML={{ __html: JSON.stringify(schema) }}
543 />
544 </Head>
545 {/* Page content */}
546 </>
547 );
548}
549```
550 
551### CMS / WordPress
552- Plugins (Yoast, Rank Math, Schema Pro)
553- Theme modifications
554- Custom fields to structured data
555 
556---
557 
558## Output Format
559 
560### Schema Implementation
561```json
562// Full JSON-LD code block
563{
564 "@context": "https://schema.org",
565 "@type": "...",
566 // Complete markup
567}
568```
569 
570### Placement Instructions
571Where to add the code and how
572 
573### Testing Checklist
574- [ ] Validates in Rich Results Test
575- [ ] No errors or warnings
576- [ ] Matches page content
577- [ ] All required properties included
578 
579---
580 
581## Questions to Ask
582 
583If you need more context:
5841. What type of page is this?
5852. What rich results are you hoping to achieve?
5863. What data is available to populate the schema?
5874. Is there existing schema on the page?
5885. What's your tech stack for implementation?
589 
590---
591 
592## Related Skills
593 
594- **seo-audit**: For overall SEO including schema review
595- **programmatic-seo**: For templated schema at scale
596- **analytics-tracking**: For measuring rich result impact
597 

Discussion

Alternatives

Agentic Browsing ReadinessAudit and fix agent readiness: the Lighthouse Agentic Browsing fraction, accessibility tree for agents, robots.txt and Content-Signal for AI agents, WAF treatment of agent traffic, llms.txt, Markdown delivery, ai-catalog.json, /.well-known discovery files, and WebMCP tools. Exclude AI citability and brand signals (seo-geo) and commerce protocol depth (seo-ecommerce).Marketing · MITBacklink Profile AnalysisBacklink profile analysis: referring domains, anchor text distribution, toxic link detection, competitor gap analysis. Works with free APIs (Moz, Bing Webmaster, Common Crawl) and DataForSEO extension. Use when user says backlinks, link profile, referring domains, anchor text, toxic links, link gap, link building, disavow, or backlink audit.Marketing · MIT/setup-cmsConnect a CMS to notfair SEO tools. Guides users through configuring WordPress, Strapi, Contentful, or Ghost — tests the connection, and writes credentials to .env.local. Once set up, seo-analysis automatically cross- references CMS content against Google Search Console data. Use whenever the user says "connect my CMS", "set up WordPress", "configure Strapi", "add Contentful", "connect Ghost", or "CMS setup". Also trigger if the user asks why no CMS data appears in a seo-analysis report. · MITBacklink checkBacklink profile for any domain — referring domains, authority, anchors, new/lost links, and a side-by-side vs a competitor. Use when asked "check my backlinks", "backlink profile of X", "who links to them", or "link gap vs competitor".Marketing · MIT