Schema Markup Generator
Generate JSON-LD structured data for rich results, AI citations, and enhanced search visibility.
Install
git clone https://github.com/thatrebeccarae/claude-marketing.git && cp -r claude-marketing/skills/schema-markup-generator ~/.claude/skills/
When to Use
- Adding structured data to new or existing pages
- Generating JSON-LD for specific schema types
- Auditing existing schema for errors or missing fields
- Improving AI search visibility (pairs with aeo-geo-optimizer)
- Enabling rich results (FAQ dropdowns, star ratings, how-to steps)
Workflow
Step 1: Identify Content Type
| Content |
Primary Schema |
Rich Result |
| Blog post |
Article |
Enhanced listing with author, date |
| FAQ section |
FAQPage |
Expandable Q&A in SERPs |
| Tutorial |
HowTo |
Step-by-step with images/time |
| Product page |
Product |
Price, availability, ratings |
| Review |
Review + Rating |
Star ratings in SERPs |
| Recipe |
Recipe |
Cooking time, ingredients, ratings |
| Event |
Event |
Date, location, ticket info |
| Local business |
LocalBusiness |
Maps, hours, contact |
| Person/author |
Person |
Knowledge panel |
| Breadcrumbs |
BreadcrumbList |
Breadcrumb trail in SERPs |
| Video |
VideoObject |
Video carousel, thumbnails |
| Software |
SoftwareApplication |
App info in SERPs |
| Course |
Course |
Course info in SERPs |
| Dataset |
Dataset |
Dataset search results |
Step 2: Generate JSON-LD
Generate a <script type="application/ld+json"> block with all required and recommended fields for the schema type. Always use JSON-LD format (not Microdata or RDFa).
Step 3: Validate
Schema Templates
Article
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "Article Title (max 110 chars)",
"description": "Brief description of the article",
"author": {
"@type": "Person",
"name": "Author Name",
"url": "https://example.com/author/name",
"jobTitle": "Author Title",
"sameAs": ["https://linkedin.com/in/author", "https://twitter.com/author"]
},
"publisher": {
"@type": "Organization",
"name": "Publisher Name",
"logo": {"@type": "ImageObject", "url": "https://example.com/logo.png"}
},
"datePublished": "2026-03-18T00:00:00Z",
"dateModified": "2026-03-18T00:00:00Z",
"image": "https://example.com/article-image.jpg",
"mainEntityOfPage": {"@type": "WebPage", "@id": "https://example.com/article-url"}
}
FAQPage
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "What is the question?",
"acceptedAnswer": {
"@type": "Answer",
"text": "The complete answer text. Can include <a href=url>HTML links</a>."
}
}
]
}
HowTo
{
"@context": "https://schema.org",
"@type": "HowTo",
"name": "How to Do Something",
"description": "Brief description",
"totalTime": "PT30M",
"estimatedCost": {"@type": "MonetaryAmount", "currency": "USD", "value": "0"},
"step": [
{
"@type": "HowToStep",
"name": "Step 1 Title",
"text": "Detailed step instructions",
"image": "https://example.com/step1.jpg"
}
]
}
Product
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Product Name",
"description": "Product description",
"image": "https://example.com/product.jpg",
"brand": {"@type": "Brand", "name": "Brand Name"},
"sku": "SKU-12345",
"offers": {
"@type": "Offer",
"price": "29.99",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"url": "https://example.com/product"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.5",
"reviewCount": "127"
}
}
BreadcrumbList
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{"@type": "ListItem", "position": 1, "name": "Home", "item": "https://example.com"},
{"@type": "ListItem", "position": 2, "name": "Category", "item": "https://example.com/category"},
{"@type": "ListItem", "position": 3, "name": "Current Page"}
]
}
Required vs Recommended Fields
| Schema Type |
Required Fields |
Recommended Fields |
| Article |
headline, author, datePublished, image |
dateModified, publisher, description |
| FAQPage |
mainEntity (Question + Answer) |
— |
| HowTo |
name, step |
totalTime, estimatedCost, image |
| Product |
name, offers (price + currency + availability) |
brand, sku, aggregateRating, image |
| LocalBusiness |
name, address |
phone, hours, geo, image, priceRange |
| Event |
name, startDate, location |
endDate, offers, image, performer |
| Person |
name |
jobTitle, url, sameAs, image |
Common Mistakes
- Missing required fields — always check per-type requirements
- Incorrect date format — use ISO 8601 (YYYY-MM-DDTHH:MM:SSZ)
- Markup does not match visible content — schema must reflect what users see
- Using Microdata instead of JSON-LD — Google recommends JSON-LD
- Nesting errors — validate JSON syntax before deploying
- Duplicate schema — one schema block per type per page
- Self-referencing Organization — publisher should be the organization, not the page
Integration with Other Skills
- aeo-geo-optimizer — Schema is a key AEO signal; implement types recommended by the AEO audit
- technical-seo-audit — Audit identifies missing/broken schema; this skill generates the fixes
- seo-content-writer — Content structure should align with schema structure
1---2name: schema-markup-generator3description: Generate structured data markup (JSON-LD) for rich results, AI search visibility, and enhanced SERP features. Supports Article, FAQ, HowTo, Product, Review, LocalBusiness, Event, BreadcrumbList, Person, Organization, and more. Use when the user needs schema markup, structured data, rich snippets, JSON-LD, or wants to improve search appearance.4license: MIT5---67# Schema Markup Generator89Generate JSON-LD structured data for rich results, AI citations, and enhanced search visibility.1011## Install1213```bash14git clone https://github.com/thatrebeccarae/claude-marketing.git && cp -r claude-marketing/skills/schema-markup-generator ~/.claude/skills/15```1617## When to Use1819- Adding structured data to new or existing pages20- Generating JSON-LD for specific schema types21- Auditing existing schema for errors or missing fields22- Improving AI search visibility (pairs with aeo-geo-optimizer)23- Enabling rich results (FAQ dropdowns, star ratings, how-to steps)2425## Workflow2627### Step 1: Identify Content Type2829| Content | Primary Schema | Rich Result |30|---------|---------------|------------|31| Blog post | Article | Enhanced listing with author, date |32| FAQ section | FAQPage | Expandable Q&A in SERPs |33| Tutorial | HowTo | Step-by-step with images/time |34| Product page | Product | Price, availability, ratings |35| Review | Review + Rating | Star ratings in SERPs |36| Recipe | Recipe | Cooking time, ingredients, ratings |37| Event | Event | Date, location, ticket info |38| Local business | LocalBusiness | Maps, hours, contact |39| Person/author | Person | Knowledge panel |40| Breadcrumbs | BreadcrumbList | Breadcrumb trail in SERPs |41| Video | VideoObject | Video carousel, thumbnails |42| Software | SoftwareApplication | App info in SERPs |43| Course | Course | Course info in SERPs |44| Dataset | Dataset | Dataset search results |4546### Step 2: Generate JSON-LD4748Generate a `<script type="application/ld+json">` block with all required and recommended fields for the schema type. Always use JSON-LD format (not Microdata or RDFa).4950### Step 3: Validate5152- Google Rich Results Test: https://search.google.com/test/rich-results53- Schema.org Validator: https://validator.schema.org/54- Check Google Search Console for structured data errors5556## Schema Templates5758### Article5960```json61{62 "@context": "https://schema.org",63 "@type": "Article",64 "headline": "Article Title (max 110 chars)",65 "description": "Brief description of the article",66 "author": {67 "@type": "Person",68 "name": "Author Name",69 "url": "https://example.com/author/name",70 "jobTitle": "Author Title",71 "sameAs": ["https://linkedin.com/in/author", "https://twitter.com/author"]72 },73 "publisher": {74 "@type": "Organization",75 "name": "Publisher Name",76 "logo": {"@type": "ImageObject", "url": "https://example.com/logo.png"}77 },78 "datePublished": "2026-03-18T00:00:00Z",79 "dateModified": "2026-03-18T00:00:00Z",80 "image": "https://example.com/article-image.jpg",81 "mainEntityOfPage": {"@type": "WebPage", "@id": "https://example.com/article-url"}82}83```8485### FAQPage8687```json88{89 "@context": "https://schema.org",90 "@type": "FAQPage",91 "mainEntity": [92 {93 "@type": "Question",94 "name": "What is the question?",95 "acceptedAnswer": {96 "@type": "Answer",97 "text": "The complete answer text. Can include <a href=url>HTML links</a>."98 }99 }100 ]101}102```103104### HowTo105106```json107{108 "@context": "https://schema.org",109 "@type": "HowTo",110 "name": "How to Do Something",111 "description": "Brief description",112 "totalTime": "PT30M",113 "estimatedCost": {"@type": "MonetaryAmount", "currency": "USD", "value": "0"},114 "step": [115 {116 "@type": "HowToStep",117 "name": "Step 1 Title",118 "text": "Detailed step instructions",119 "image": "https://example.com/step1.jpg"120 }121 ]122}123```124125### Product126127```json128{129 "@context": "https://schema.org",130 "@type": "Product",131 "name": "Product Name",132 "description": "Product description",133 "image": "https://example.com/product.jpg",134 "brand": {"@type": "Brand", "name": "Brand Name"},135 "sku": "SKU-12345",136 "offers": {137 "@type": "Offer",138 "price": "29.99",139 "priceCurrency": "USD",140 "availability": "https://schema.org/InStock",141 "url": "https://example.com/product"142 },143 "aggregateRating": {144 "@type": "AggregateRating",145 "ratingValue": "4.5",146 "reviewCount": "127"147 }148}149```150151### BreadcrumbList152153```json154{155 "@context": "https://schema.org",156 "@type": "BreadcrumbList",157 "itemListElement": [158 {"@type": "ListItem", "position": 1, "name": "Home", "item": "https://example.com"},159 {"@type": "ListItem", "position": 2, "name": "Category", "item": "https://example.com/category"},160 {"@type": "ListItem", "position": 3, "name": "Current Page"}161 ]162}163```164165## Required vs Recommended Fields166167| Schema Type | Required Fields | Recommended Fields |168|------------|----------------|-------------------|169| Article | headline, author, datePublished, image | dateModified, publisher, description |170| FAQPage | mainEntity (Question + Answer) | — |171| HowTo | name, step | totalTime, estimatedCost, image |172| Product | name, offers (price + currency + availability) | brand, sku, aggregateRating, image |173| LocalBusiness | name, address | phone, hours, geo, image, priceRange |174| Event | name, startDate, location | endDate, offers, image, performer |175| Person | name | jobTitle, url, sameAs, image |176177## Common Mistakes1781791. **Missing required fields** — always check per-type requirements1802. **Incorrect date format** — use ISO 8601 (YYYY-MM-DDTHH:MM:SSZ)1813. **Markup does not match visible content** — schema must reflect what users see1824. **Using Microdata instead of JSON-LD** — Google recommends JSON-LD1835. **Nesting errors** — validate JSON syntax before deploying1846. **Duplicate schema** — one schema block per type per page1857. **Self-referencing Organization** — publisher should be the organization, not the page186187## Integration with Other Skills188189- **aeo-geo-optimizer** — Schema is a key AEO signal; implement types recommended by the AEO audit190- **technical-seo-audit** — Audit identifies missing/broken schema; this skill generates the fixes191- **seo-content-writer** — Content structure should align with schema structure