
Schema Markup
- 25 installs
- 578 repo stars
- Updated July 15, 2026
- aitytech/agentkits-marketing
schema-markup is a skill that implements schema.org JSON-LD structured data to enable rich results in search.
About
A skill for adding and optimizing schema.org structured data on a site. A developer uses it to implement JSON-LD markup that helps search engines understand content and enables rich results. It provides ready templates for common schema types and rules for accuracy and validation.
- Implements schema.org JSON-LD structured data for rich results
- Covers Organization, WebSite, Article, Product and more schema types
- Emphasizes accuracy, validation and Google guidelines
Schema Markup by the numbers
- 25 all-time installs (skills.sh)
- Ranked #1,459 of 1,879 Marketing & SEO skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
schema-markup capabilities & compatibility
- Capabilities
- seo mastery · programmatic seo
- Works with
- github
- Use cases
- seo · marketing
- Pricing
- Free
What schema-markup says it does
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.
- Google recommends JSON-LD format - Easier to implement and maintain - Place in `<head>` or end of `<body>`
npx skills add https://github.com/aitytech/agentkits-marketing --skill schema-markupAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 25 |
|---|---|
| repo stars | ★ 578 |
| Last updated | July 15, 2026 |
| Repository | aitytech/agentkits-marketing ↗ |
What it does
Add or fix JSON-LD schema markup to enable rich results and improve search CTR.
Who is it for?
Adding, fixing or optimizing JSON-LD structured data for rich results
Skip if: Broader SEO issues (docs point to seo-audit)
When should I use this skill?
The user mentions schema markup, structured data, JSON-LD, rich snippets, schema.org, FAQ schema or product schema
What you get
Valid schema.org markup that enables rich snippets and improves CTR.
- JSON-LD schema blocks
- schema type selection
- validation guidance
By the numbers
- Covers 5+ common schema types with JSON-LD templates
Files
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
- Google Rich Results Test: https://search.google.com/test/rich-results
- Schema.org Validator: https://validator.schema.org/
- Search Console: Enhancements reports
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?
---
Related Skills
- seo-audit: For overall SEO including schema review
- programmatic-seo: For templated schema at scale
- analytics-tracking: For measuring rich result impact
Schema Markup Implementation Guide
Based on research from Schema.org, Google Search Central, Moz.
---
Schema Basics
What is Schema Markup?
Structured data vocabulary that helps search engines understand content and display rich results (rich snippets) in SERPs.
Implementation Formats
| Format | Recommended | Support |
|---|---|---|
| JSON-LD | ✓ Yes | Best |
| Microdata | - | Supported |
| RDFa | - | Supported |
Google recommends JSON-LD - easier to implement, maintain, and doesn't mix with HTML.
---
Priority Schema Types
By Business Type
| Business | Priority Schema |
|---|---|
| E-commerce | Product, Review, Offer, BreadcrumbList |
| SaaS | SoftwareApplication, FAQPage, HowTo |
| Local Business | LocalBusiness, Review, OpeningHours |
| Content Site | Article, FAQPage, HowTo, Video |
| Service Business | Service, Review, FAQPage |
By Rich Result Type
| Rich Result | Schema Required |
|---|---|
| Review stars | Product + AggregateRating |
| FAQ accordion | FAQPage |
| How-to steps | HowTo |
| Product info | Product + Offer |
| Event listing | Event |
| Recipe card | Recipe |
| Video carousel | VideoObject |
| Breadcrumbs | BreadcrumbList |
| Sitelinks searchbox | WebSite |
| Article | Article/NewsArticle/BlogPosting |
---
Essential Schema Templates
Organization Schema
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "Company Name",
"url": "https://www.example.com",
"logo": "https://www.example.com/logo.png",
"sameAs": [
"https://www.facebook.com/example",
"https://www.twitter.com/example",
"https://www.linkedin.com/company/example"
],
"contactPoint": {
"@type": "ContactPoint",
"telephone": "+1-800-555-1234",
"contactType": "customer service"
}
}LocalBusiness Schema
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"name": "Business Name",
"image": "https://example.com/image.jpg",
"address": {
"@type": "PostalAddress",
"streetAddress": "123 Main St",
"addressLocality": "Austin",
"addressRegion": "TX",
"postalCode": "78701",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 30.2672,
"longitude": -97.7431
},
"telephone": "+1-512-555-1234",
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "09:00",
"closes": "17:00"
}
],
"priceRange": "$$"
}Product Schema
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Product Name",
"image": "https://example.com/product.jpg",
"description": "Product description here.",
"brand": {
"@type": "Brand",
"name": "Brand Name"
},
"offers": {
"@type": "Offer",
"url": "https://example.com/product",
"priceCurrency": "USD",
"price": "29.99",
"availability": "https://schema.org/InStock",
"seller": {
"@type": "Organization",
"name": "Seller Name"
}
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.5",
"reviewCount": "127"
}
}SoftwareApplication Schema
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "App Name",
"operatingSystem": "Web, iOS, Android",
"applicationCategory": "BusinessApplication",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.8",
"ratingCount": "5000"
}
}FAQPage Schema
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "What is your return policy?",
"acceptedAnswer": {
"@type": "Answer",
"text": "We offer 30-day returns on all items."
}
},
{
"@type": "Question",
"name": "How long does shipping take?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Standard shipping takes 5-7 business days."
}
}
]
}HowTo Schema
{
"@context": "https://schema.org",
"@type": "HowTo",
"name": "How to Create an Account",
"description": "Step-by-step guide to create your account.",
"totalTime": "PT5M",
"step": [
{
"@type": "HowToStep",
"name": "Go to signup page",
"text": "Navigate to example.com/signup",
"url": "https://example.com/signup"
},
{
"@type": "HowToStep",
"name": "Enter your email",
"text": "Type your email address in the form"
},
{
"@type": "HowToStep",
"name": "Create password",
"text": "Choose a secure password"
}
]
}Article/BlogPosting Schema
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "Article Title",
"image": "https://example.com/article-image.jpg",
"author": {
"@type": "Person",
"name": "Author Name",
"url": "https://example.com/author"
},
"publisher": {
"@type": "Organization",
"name": "Publisher Name",
"logo": {
"@type": "ImageObject",
"url": "https://example.com/logo.png"
}
},
"datePublished": "2024-01-15",
"dateModified": "2024-01-20",
"description": "Article description here."
}BreadcrumbList Schema
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://example.com"
},
{
"@type": "ListItem",
"position": 2,
"name": "Products",
"item": "https://example.com/products"
},
{
"@type": "ListItem",
"position": 3,
"name": "Category",
"item": "https://example.com/products/category"
}
]
}Video Schema
{
"@context": "https://schema.org",
"@type": "VideoObject",
"name": "Video Title",
"description": "Video description",
"thumbnailUrl": "https://example.com/thumbnail.jpg",
"uploadDate": "2024-01-15",
"duration": "PT5M30S",
"contentUrl": "https://example.com/video.mp4",
"embedUrl": "https://example.com/embed/video"
}---
Page-Specific Schema Strategy
Homepage
// Combine: Organization + WebSite
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
// ... organization details
},
{
"@type": "WebSite",
"url": "https://example.com",
"potentialAction": {
"@type": "SearchAction",
"target": "https://example.com/search?q={search_term}",
"query-input": "required name=search_term"
}
}
]
}Product Page
- Product + Offer
- AggregateRating
- Review (if available)
- BreadcrumbList
Blog Post
- Article/BlogPosting
- Author (Person)
- BreadcrumbList
- FAQPage (if Q&A present)
Category Page
- ItemList
- BreadcrumbList
Contact Page
- Organization + ContactPoint
- LocalBusiness (if physical)
---
Implementation Best Practices
Placement
<head>
<!-- Place JSON-LD schema in <head> or end of <body> -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
// ...
}
</script>
</head>Multiple Schema Types
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
// ...
},
{
"@type": "BreadcrumbList",
// ...
},
{
"@type": "FAQPage",
// ...
}
]
}Common Errors to Avoid
| Error | Issue | Fix |
|---|---|---|
| Missing required fields | Schema incomplete | Check Google requirements |
| Invalid values | Wrong data type | Use correct format (dates, URLs) |
| Mismatched data | Schema ≠ visible content | Sync schema with page |
| Multiple same types | Confusion | Use @id for relationships |
| Outdated info | Stale data | Update regularly |
---
Validation & Testing
Testing Tools
1. Google Rich Results Test
- https://search.google.com/test/rich-results
- Tests eligibility for rich results
2. Schema Markup Validator
- https://validator.schema.org/
- Validates against schema.org
3. Google Search Console
- Enhancements reports
- Error notifications
Validation Checklist
- [ ] No errors in Rich Results Test
- [ ] No warnings in Schema Validator
- [ ] Data matches visible content
- [ ] Required properties present
- [ ] URLs are absolute
- [ ] Images accessible
- [ ] Dates in ISO 8601 format
---
Rich Result Eligibility
Requirements by Type
| Rich Result | Key Requirements |
|---|---|
| Product | name, image, offers, reviews |
| FAQ | question, acceptedAnswer |
| HowTo | step with text |
| Article | headline, image, author, date |
| Video | name, description, thumbnail, upload date |
| LocalBusiness | name, address, aggregateRating |
| Review | itemReviewed, reviewRating |
Not Guaranteed
Having schema doesn't guarantee rich results:
- Google decides what to show
- Content must be high quality
- Site must be trustworthy
- May take weeks to appear
- A/B tested by Google
---
Monitoring & Maintenance
Search Console Reports
Check regularly:
- Enhancements - Schema status
- Rich result reports - Errors/warnings
- URL inspection - Per-page validation
Update Triggers
| Change | Action Required |
|---|---|
| Price change | Update Offer |
| New reviews | Update rating count |
| Content edit | Update dateModified |
| New location | Add LocalBusiness |
| New product | Add Product schema |
Automation Tips
- Generate schema from CMS data
- Auto-update dateModified
- Pull ratings from review system
- Sync product data from catalog
- Use variables for dynamic content
Related skills
FAQ
What schema format does this skill recommend?
JSON-LD, because Google recommends it and it is easier to implement and maintain, placed in the head or end of body.
What is the first principle of schema markup?
Accuracy first: schema must accurately represent page content and never mark up content that does not exist.