Structured Data for SEO
A practical guide to structured data for SEO, covering Schema.org, JSON-LD, common schema types, implementation, validation, rich results, relationships between entities and common mistakes.
Search engines do not only need to discover pages. They also need to understand what those pages contain. A page can be an article, product, organization profile, event, recipe, software application or another type of entity. Structured data gives search engines additional machine-readable information about that content.
Structured data is especially important for modern SEO because it provides a standardized way to describe entities, properties and relationships. One of the most widely used vocabularies is Schema.org, while JSON-LD is a common format for placing that structured information in a web page.
Structured data does not replace good content, crawling, indexing, links, page performance or other SEO fundamentals. It is an additional layer of information that helps search engines interpret content and, for supported types, can make a page eligible for enhanced search features.
What Is Structured Data?
Structured data is information expressed in a standardized machine-readable format. Instead of leaving a search engine to infer the meaning of every piece of text on a page, structured data explicitly describes what entities and properties the page contains.
For example, a product page might visibly contain the product name, price, availability and brand. Structured data can explicitly identify those values as properties of a Product entity.
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Example Laptop",
"brand": {
"@type": "Brand",
"name": "Example"
},
"offers": {
"@type": "Offer",
"price": "999.00",
"priceCurrency": "USD"
}
}The important difference is that the data is not merely a collection of strings. It describes an entity and gives semantic meaning to its properties.
Schema.org and Structured Data
Schema.org is a shared vocabulary for describing entities, properties, relationships and actions on the web. It provides types such as Article, Product, Organization, Person, Event and many others, along with properties that can be used with those types.
Schema.org is a vocabulary rather than a particular implementation format. Its vocabulary can be expressed using JSON-LD, Microdata or RDFa.
| Concept | Purpose |
|---|---|
| Schema.org | Defines types and properties |
| JSON-LD | Expresses structured data as JSON |
| Microdata | Embeds structured data into HTML elements |
| RDFa | Adds semantic metadata to HTML attributes |
| Search engine guidelines | Define how structured data may be used for search features |
JSON-LD vs Schema.org
Schema.org and JSON-LD are often mentioned together, but they are not the same thing. Schema.org defines the vocabulary, while JSON-LD is one of the formats used to represent that vocabulary.
For example, Product is a Schema.org type and name is a Schema.org property. JSON-LD provides the syntax used to express those concepts in a JSON object.
Why JSON-LD Is Commonly Used
JSON-LD separates structured data from the visible HTML markup. Instead of adding semantic attributes to individual HTML elements, a page can include a script element containing a JSON-LD object.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "Structured Data for SEO",
"author": {
"@type": "Person",
"name": "Example Author"
}
}
</script>This approach is convenient for developers because the structured data can often be generated from the same data used to render the page.
How Structured Data Helps SEO
Structured data can help search engines understand the entities and relationships represented by a page. For certain supported types, correctly implemented markup can also make a page eligible for enhanced search-result presentations.
Eligibility does not mean that an enhanced result is guaranteed. Search engines decide whether and how to display supported structured data, and their supported features and requirements can change.
This distinction is important. Structured data should be implemented because it accurately describes the page, not because it guarantees a particular visual treatment in search results.
Structured Data Is Not a Direct Ranking Shortcut
Adding Schema.org markup does not automatically move a page to the top of search results. Structured data provides additional information about content, but it does not compensate for weak content, poor technical SEO, irrelevant search intent or a lack of authority.
Common Structured Data Types
Schema.org contains a large vocabulary, but websites usually need only a small subset of types. The correct type depends on what the page actually represents.
| Type | Typical use |
|---|---|
| Article | Articles, guides and other editorial content |
| Organization | Companies, institutions and organizations |
| Product | Individual product pages |
| BreadcrumbList | Breadcrumb navigation |
| Event | Events with dates and locations |
| Recipe | Cooking and recipe pages |
| SoftwareApplication | Software and application pages |
| LocalBusiness | Local businesses and locations |
| Person | Pages primarily describing a person |
| WebSite | Information about a website |
| WebPage | Information about a specific web page |
Article Structured Data
Article structured data describes editorial content such as news articles, blog posts and other written publications. Depending on the page, more specific Article subtypes may be appropriate.
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "Understanding Structured Data",
"description": "A practical guide to structured data.",
"author": {
"@type": "Person",
"name": "Example Author"
},
"datePublished": "2026-09-27",
"dateModified": "2026-09-27",
"image": "https://example.com/images/structured-data.jpg"
}The values should describe the actual article. For example, headline should correspond to the visible article title rather than a different title invented specifically for structured data.
Organization Structured Data
Organization markup describes an organization and can include information such as its name, URL, logo and other relevant properties.
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "Example Company",
"url": "https://example.com",
"logo": "https://example.com/logo.png",
"sameAs": [
"https://www.linkedin.com/company/example"
]
}The sameAs property can connect an organization to other authoritative profiles representing the same entity. Only use URLs that genuinely represent that organization.
Product Structured Data
Product structured data describes products and can contain properties such as the product name, image, brand, offers, reviews and ratings when those properties genuinely exist on the page.
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Example Headphones",
"image": [
"https://example.com/images/headphones.jpg"
],
"brand": {
"@type": "Brand",
"name": "Example"
},
"offers": {
"@type": "Offer",
"price": "149.00",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock"
}
}Product markup is especially sensitive to accuracy because price, availability, ratings and review information can change frequently. Generated structured data should stay synchronized with the actual product information visible to users.
BreadcrumbList Structured Data
Breadcrumb structured data describes the hierarchy represented by breadcrumb navigation. It can help search engines understand how a page fits into the site's structure.
{
"@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": "Headphones"
}
]
}The breadcrumb hierarchy should correspond to the actual navigation and page structure rather than being created solely for search engines.
WebSite and WebPage Structured Data
WebSite can describe a website as a whole, while WebPage and its more specific subtypes can describe individual pages. These types can be useful as part of a broader entity model.
{
"@context": "https://schema.org",
"@type": "WebSite",
"name": "Example",
"url": "https://example.com"
}FAQ Structured Data
Schema.org provides types for representing questions and answers, including FAQPage and related entities. However, the existence of a Schema.org vocabulary does not mean that every search engine currently provides a corresponding rich result.
If a page contains a real FAQ section, structured data can still describe that content semantically. The markup should represent questions and answers that are actually present on the page.
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "What is structured data?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Structured data is machine-readable information that describes page content."
}
}
]
}Structured Data and Visible Content
One of the most important principles of structured data is consistency with the visible page. If structured data claims that a product costs $99 while the page displays $149, the markup is describing something different from what users see.
The same applies to reviews, ratings, authors, dates, product availability, business information and other properties. Structured data should not be treated as a hidden place to provide information that is absent from the page.
Required vs Recommended Properties
Different structured-data features can have different requirements. Some properties may be required for eligibility for a particular search feature, while others are recommended because they provide additional information.
Schema.org itself describes vocabulary relationships and expected properties, while search engines can define their own supported features and eligibility requirements. Therefore, developers should distinguish between what Schema.org technically allows and what a particular search engine requires for a specific search feature.
How to Choose the Right Schema Type
Start with the page itself rather than with an SEO feature you want to obtain. Ask what the page actually represents. A blog post may be an Article, a product page may be a Product, a company profile may be an Organization, and a page describing a specific event may be an Event.
After selecting the primary type, add properties that genuinely describe the entity. Do not try to use unrelated types simply because they have more properties or appear to offer more opportunities in search.
| Page | Potential primary type |
|---|---|
| Blog article | Article |
| Product detail page | Product |
| Company page | Organization |
| Local store | LocalBusiness |
| Conference page | Event |
| Recipe | Recipe |
| Software product | SoftwareApplication |
| Person profile | Person |
Can a Page Have Multiple Schema Types?
Yes. A page can describe multiple related entities when that accurately reflects the content. A product page, for example, can describe a Product and connect it with a Brand and an Organization.
Multiple entities are often easier to manage when they are connected explicitly rather than represented as unrelated blocks of JSON.
Using @id to Connect Entities
The @id property can provide a stable identifier for an entity within structured data. This is particularly useful when several structured-data objects refer to the same entity.
{
"@context": "https://schema.org",
"@type": "Organization",
"@id": "https://example.com/#organization",
"name": "Example Company",
"url": "https://example.com"
}Another object can reference the same entity using its @id instead of duplicating the entire organization definition.
{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "Example Product",
"publisher": {
"@id": "https://example.com/#organization"
}
}Using @graph
For pages containing several related entities, JSON-LD can use @graph to represent multiple objects within one structured-data document.
{
"@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",
"name": "Example",
"url": "https://example.com",
"publisher": {
"@id": "https://example.com/#organization"
}
}
]
}This approach can make a site's structured data model easier to reason about because related entities can share stable identifiers.
Structured Data in Next.js
Modern React and Next.js applications can generate JSON-LD from the same data used to render a page. The structured data should be generated from reliable server-side or page-level data rather than manually duplicated in several places.
const jsonLd = {
"@context": "https://schema.org",
"@type": "Article",
headline: post.title,
description: post.description,
datePublished: post.publishedAt,
dateModified: post.dateModified,
author: {
"@type": "Person",
name: post.author.name,
},
};
return (
<>
<article>{/* visible content */}</article>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{
__html: JSON.stringify(jsonLd),
}}
/>
</>
);The exact implementation can vary depending on the application architecture. The important point is that the generated JSON-LD should remain synchronized with the page's actual content.
Generating Structured Data Dynamically
For sites with many pages, manually writing JSON-LD for every URL is usually impractical. Instead, create reusable functions that transform application data into structured-data objects.
function createArticleSchema(post: {
title: string;
description: string;
url: string;
publishedAt: string;
dateModified: string;
}) {
return {
"@context": "https://schema.org",
"@type": "Article",
headline: post.title,
description: post.description,
mainEntityOfPage: post.url,
datePublished: post.publishedAt,
dateModified: post.dateModified,
};
}Reusable generators reduce duplication and make it easier to update the schema consistently when the site's content model changes.
Structured Data for Large Websites
Large websites should treat structured data as part of the content architecture rather than as a collection of manually maintained snippets. Product catalogs, articles, organizations and other entities should have a reliable source of data from which the markup is generated.
This approach is particularly important for frequently changing information such as prices, inventory, ratings and publication dates. If the visible page and structured data are generated from different sources, inconsistencies become much more likely.
Structured Data and Canonical URLs
Structured data should generally describe the canonical version of the page and use URLs that match the site's intended URL architecture.
This becomes especially important for sites with parameters, duplicate URLs, localized versions or multiple routes that can display similar content. Structured data should not accidentally identify a temporary or non-canonical URL as the main entity URL.
Structured Data and hreflang
Multilingual websites can use structured data together with hreflang. The two systems serve different purposes: hreflang connects language and regional versions, while structured data describes the entities and content on each page.
For example, an English product page and a French product page can each contain Product structured data while hreflang connects the two URLs as localized alternatives.
Structured Data and Open Graph
Structured data and Open Graph metadata are also different systems. Open Graph primarily describes how a URL should be represented when shared through supported social platforms, while Schema.org structured data provides semantic information about page entities.
A page can use both. There is no need to choose between Open Graph and structured data because they solve different problems.
How to Validate Structured Data
Validation should be part of the implementation process rather than something done only after a problem appears in search results. Start by validating the generated JSON-LD syntax and then use search-engine-specific testing tools when you are targeting a particular rich-result feature.
Google's Rich Results Test can determine whether supported structured data can be eligible for particular Google search features. Search Console and URL Inspection can then provide additional information about how Google accesses and processes the page.
| Check | What to verify |
|---|---|
| Syntax | JSON-LD is valid JSON |
| Vocabulary | Types and properties are valid |
| Content | Values match visible page content |
| URLs | Referenced URLs are correct and accessible |
| Requirements | Required properties for the target feature exist |
| Relationships | Connected entities reference the correct objects |
| Indexability | The page can be crawled and indexed |
Common Structured Data Errors
A common mistake is choosing a schema type based on the desired search appearance instead of the actual content. Marking an ordinary page as Product, Event or Review does not make it legitimately qualify as that entity.
Another common problem is adding properties with fabricated or misleading values. Ratings, reviews, prices, availability, authors and dates should correspond to real information.
Invalid JSON is a simpler but surprisingly common problem. A missing comma, incorrect quote or malformed object can prevent the structured-data parser from reading the intended information.
Incorrect URLs can also cause problems. Developers may accidentally generate localhost URLs, staging URLs, HTTP URLs or links to outdated routes.
Do Not Mark Up Invisible or Misleading Content
Structured data should not be used as a hidden SEO layer containing information that users cannot reasonably find on the page. If a property is important enough to include in structured data, make sure it accurately represents the underlying page or entity.
Do Not Add Every Possible Schema Type
More structured data is not automatically better. A page does not need to contain every schema type that can technically be attached to it.
Start with the primary entity and add related entities only when they provide meaningful information. A clean and accurate model is easier to maintain than a large collection of loosely related types.
Common Structured Data Mistakes
- Using a schema type that does not represent the actual page.
- Adding structured-data values that do not match visible content.
- Using incorrect or outdated URLs.
- Generating invalid JSON-LD.
- Adding fabricated reviews or ratings.
- Hard-coding data that changes frequently.
- Ignoring canonical URL changes.
- Creating disconnected entities instead of linking related objects.
- Assuming valid Schema.org syntax automatically guarantees a rich result.
- Failing to validate structured data after template changes.
A Practical Structured Data Workflow
Start with the page's purpose. Determine whether it represents an article, product, organization, event, software application or another meaningful entity.
Next, choose the appropriate Schema.org type and identify the properties that genuinely describe that entity. Do not begin with a list of properties and try to force the page into them.
Generate JSON-LD from the same source data used to render the page whenever possible. This reduces the risk of the structured data becoming outdated.
Validate the result, check the page-specific search-engine requirements and inspect the final HTML generated in production. For dynamic sites, test multiple examples rather than only one template.
Finally, monitor the implementation after major changes to templates, URLs, localization, product data or content models.
Example: Article with Related Organization
A more complete page model can connect an article to its author and publisher. Stable identifiers make those relationships easier to maintain.
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"@id": "https://example.com/#organization",
"name": "Example Publishing",
"url": "https://example.com"
},
{
"@type": "Article",
"@id": "https://example.com/blog/structured-data/#article",
"headline": "Structured Data for SEO",
"description": "A practical guide to structured data.",
"author": {
"@type": "Person",
"name": "Example Author"
},
"publisher": {
"@id": "https://example.com/#organization"
},
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "https://example.com/blog/structured-data"
},
"datePublished": "2026-09-27",
"dateModified": "2026-09-27"
}
]
}This example demonstrates an important principle: structured data can describe not only isolated objects but also relationships between them.
Structured Data for SEO: A Minimal Strategy
A practical SEO implementation does not require every page to contain a huge JSON-LD document. Start with the structured data that best represents the page and the search features relevant to your content.
For many sites, this might mean Organization and WebSite information at the site level, Article information for editorial pages, Product information for product pages and BreadcrumbList information where breadcrumb navigation exists.
From there, add more detailed entities only when the content model genuinely supports them. This keeps the implementation understandable and reduces unnecessary maintenance.
Structured Data Checklist
- Choose a schema type that accurately represents the page.
- Use valid Schema.org types and properties.
- Generate JSON-LD from reliable page data.
- Keep structured data synchronized with visible content.
- Use absolute production URLs where appropriate.
- Connect related entities with stable identifiers when useful.
- Use canonical URLs consistently.
- Add only properties that actually apply.
- Validate the generated markup.
- Check search-engine-specific requirements for the feature you are targeting.
- Test several pages when using a shared template.
- Revalidate after major content or template changes.
Frequently Asked Questions
What is structured data in SEO?
Structured data is machine-readable information that describes the entities, properties and relationships represented by a web page. It can help search engines understand content and can make eligible pages suitable for supported enhanced search features.
What is Schema.org?
Schema.org is a shared vocabulary containing types and properties used to describe entities and relationships on web pages. It can be represented using formats such as JSON-LD, Microdata and RDFa.
Is JSON-LD the same as Schema.org?
No. Schema.org is a vocabulary, while JSON-LD is a format used to represent structured data. A JSON-LD document can use Schema.org types and properties.
Does structured data improve rankings directly?
Structured data is not a direct ranking shortcut. Its primary purpose is to provide machine-readable information about page content and, for supported types, make pages eligible for enhanced search presentations.
Should structured data match visible content?
Yes. Structured data should accurately represent the content and entities users can find on the page. Important values such as prices, ratings, authors and dates should not contradict the visible content.
Can one page use multiple schema types?
Yes. A page can describe multiple related entities when they genuinely exist. For example, a product page can describe a Product, Brand and Organization and connect those entities.
How do I test structured data?
Start by validating the JSON-LD itself and then use the relevant search-engine testing and inspection tools. For Google Search, the Rich Results Test can check eligibility for supported rich-result features, while Search Console can provide additional information about indexed pages.
Helpful SEO Tools
A Schema.org Generator can help create structured-data objects for common entity types. An Article Schema Generator is useful when adding metadata to editorial content, while an Organization Schema Generator can create a structured description of a company or other organization. For product pages, a Product Schema Generator can help build Product and Offer data. An FAQ Schema Generator can generate FAQPage markup when a page contains a genuine FAQ section and the structured data accurately represents the visible questions and answers.
Conclusion
Structured data provides a standardized way to describe the meaning of web content. Schema.org supplies the vocabulary, while JSON-LD provides a convenient format for representing that vocabulary in a page.
The most effective approach is to start with the actual content and entity represented by the page, choose an appropriate schema type and generate only the properties that genuinely apply. Structured data should remain consistent with visible content, canonical URLs and the site's underlying data model.
For larger websites, structured data is best treated as part of the application's content architecture. Generating it from the same source data used for rendering pages makes it easier to keep prices, dates, authors, products, organizations and other entities synchronized.
Finally, validation matters. A technically valid Schema.org object is not automatically eligible for every search feature, and search engines can change their requirements over time. A reliable structured-data implementation combines accurate entity modeling, correct implementation, validation and ongoing maintenance.