Schema.org's @type tells search engines what kind of entity you're describing. Using generic types (CreativeWork, Thing, WebPage) when specific ones exist (Recipe, Product, NewsArticle) costs rich-result eligibility. Each specific type unlocks type-specific rich results: NewsArticle for Top Stories carousel, Recipe for recipe cards, Event for event search. This guide covers the schema.org hierarchy, the most-common type mappings, and how to pick the right one consistently.
# Across all pages, get unique types grep -roh '"@type":\s*"[^"]*"' . | sort -uShould match content categories. A blog with NewsArticle, Article, BlogPosting, CreativeWork all mixed is inconsistent — pick one per content type.
Types inherit from parents. Specific types are subtypes of more general types:
Thing ├── CreativeWork │ ├── Article │ │ ├── BlogPosting │ │ ├── NewsArticle │ │ ├── Report │ │ ├── ScholarlyArticle │ │ └── TechArticle │ ├── Book │ ├── Recipe │ ├── Movie │ ├── VideoObject │ └── WebPage │ ├── AboutPage │ ├── CheckoutPage │ ├── ContactPage │ ├── FAQPage │ ├── ItemPage ← product detail │ ├── ProfilePage │ ├── QAPage │ └── SearchResultsPage ├── Event │ ├── BusinessEvent │ ├── EducationEvent │ ├── ExhibitionEvent │ ├── Festival │ └── ... ├── Organization │ ├── Corporation │ ├── LocalBusiness ← geo-located businesses │ │ ├── Restaurant │ │ ├── Store │ │ └── ... │ ├── NGO │ └── ... ├── Person ├── Place │ ├── LocalBusiness (also subtype here) │ ├── TouristAttraction │ └── ... ├── Product │ ├── IndividualProduct │ ├── ProductModel │ └── SomeProducts └── ...
Subtypes inherit all properties from their parents. A NewsArticle has everything Article has, plus news-specific fields. Use the deepest applicable subtype.
| Content | Best @type | Why |
|---|---|---|
| News article | NewsArticle | Top Stories carousel eligibility |
| Blog post | BlogPosting | Blog-specific signals |
| Magazine article | Article | Generic article fallback |
| Opinion / editorial | OpinionNewsArticle | Opinion-piece specific |
| Recipe | Recipe | Recipe card rich result |
| How-to guide (non-recipe) | HowTo | HowTo step-by-step display |
| Product page | Product | Shopping carousel, Product rich result |
| Restaurant | Restaurant | Local Pack, restaurant-specific fields |
| Physical store | Store | Local Pack with shop-specific fields |
| Local business (generic) | LocalBusiness | Local Pack eligibility |
| Software product | SoftwareApplication | App rating, download links |
| Book | Book | Book-specific fields (ISBN, format) |
| Course | Course | Course-specific search features |
| Job posting | JobPosting | Google Jobs eligibility |
| Event | Event or subtype | Event search and tickets |
| FAQ section | FAQPage | Standard FAQ markup |
| Q&A discussion | QAPage | Single question, multiple answers |
| Video | VideoObject | Video rich result with thumbnail |
Some content fits multiple types. Schema.org allows arrays for @type:
// A recipe video that's also a how-to
{
"@type": ["Recipe", "HowTo"],
"name": "How to make sourdough",
// Recipe fields
"recipeIngredient": [...],
"recipeInstructions": [...],
// HowTo fields
"totalTime": "PT24H",
"tool": [
{ "@type": "HowToTool", "name": "Dutch oven" }
]
}
Google reads both. Page becomes eligible for Recipe rich results AND HowTo rich results.
// WRONG — blog post tagged generically
{ "@type": "WebPage", "name": "How we tripled conversions..." }
// RIGHT — specific Article subtype
{
"@type": "BlogPosting",
"headline": "How we tripled conversions through better onboarding",
"datePublished": "2024-01-15",
"author": { ... },
"publisher": { ... }
}
// SUBOPTIMAL — generic for news
{ "@type": "Article", "headline": "Breaking: Major event..." }
// BETTER — eligible for News carousel
{
"@type": "NewsArticle",
"headline": "Breaking: Major event...",
"datePublished": "2024-01-15T08:30:00-05:00",
"dateline": "London, UK",
// ... rest
}
// WRONG — restaurant tagged generically
{ "@type": "Thing", "name": "Joe's Pizza" }
// RIGHT — Local Pack eligible
{
"@type": "Restaurant",
"name": "Joe's Pizza",
"address": { ... },
"telephone": "+44 20 1234 5678",
"servesCuisine": "Italian",
"priceRange": "$$",
"openingHoursSpecification": [ ... ]
}
WebPage has specific subtypes Google understands for site navigation context:
"@type": "AboutPage" — your /about page "@type": "ContactPage" — your /contact page "@type": "FAQPage" — pages with Q&A content "@type": "QAPage" — single question + answers (forum-style) "@type": "ProfilePage" — author/team member pages "@type": "CollectionPage" — category/listing pages "@type": "ItemPage" — single product/item detail "@type": "CheckoutPage" — checkout flow steps "@type": "SearchResultsPage" — internal search results
These don't unlock specific rich results but help Google understand page purpose for ranking and indexing decisions.
Changing to a more specific type means meeting the required fields for that type's rich result. See the required fields guide for what each type needs.