What is Schema.org JSON-LD?
Schema.org JSON-LD is machine-readable data that describes the entities and facts already visible on a web page. It is placed in a <script type="application/ld+json"> element, usually in the document head or body. Search engines can use supported structured data to understand a page and determine whether it is eligible for particular search features.
JSON-LD does not replace visible content, technical SEO, or quality signals. It does not guarantee a rich result, ranking improvement, knowledge panel, or AI citation. Google explicitly describes structured-data eligibility as separate from whether a feature is ultimately shown in search. Its structured data introduction also identifies JSON-LD as the generally recommended format because it is easier to implement and maintain at scale.
The implementation process at a glance
- Define the page's primary purpose and entity.
- Select a supported Schema.org type and search feature.
- Map only facts that users can verify on the page.
- Add the required and useful recommended properties.
- Connect related entities with stable identifiers.
- Validate syntax, eligibility, and rendered output.
- Deploy, monitor, and update the markup with the page.
The order matters. Starting with a copied JSON-LD template before understanding the page often creates incorrect types, invented values, and markup that drifts away from the content.
Step 1: define the page's primary entity and purpose
Write one sentence that explains what the page is mainly about. Examples:
- “This is an editorial guide written by AppWebSeo Studio.”
- “This is the canonical product page for a specific software subscription.”
- “This page describes a local business location in Vienna.”
- “This is a category page listing several services, not one service detail.”
That sentence identifies the main entity and reduces the temptation to attach every possible schema type. A page can describe several entities, but one usually carries the main content.
Separate the page entity from the publisher. An Article may be the main entity, while an Organization is its publisher and a Person or Organization is its author. Reusing the same organization node across pages creates consistency without pretending that the organization is the article itself.
Step 2: choose an eligible type, not merely a familiar label
Use two references:
- Schema.org documentation defines the vocabulary and relationships.
- Google Search structured-data documentation lists the types Google currently supports for search features and the properties each feature requires.
These are related but not identical. Schema.org contains many types that can describe a page accurately even when Google does not provide a special visual result for them. Conversely, a type supported by Google must still follow Google's content and feature-specific policies.
Common mappings include:
| Page | Typical main type | Important caution |
|---|---|---|
| Editorial article | Article, BlogPosting, or a specific subtype | Dates and authors must be truthful |
| Product detail | Product with an Offer when a real offer is present | Price and availability must match the page |
| Local location | A relevant LocalBusiness subtype | Use real address and contact facts |
| Breadcrumb trail | BreadcrumbList | Match the navigation hierarchy |
| Video page | VideoObject | The video must be accessible on the page |
| Organization identity | Organization | Keep name, URL, logo, and identifiers consistent |
Do not add a type solely because it once produced a prominent result. Search features change. For example, Google removed support for FAQ rich results in May 2026, so an on-page FAQ may still help readers but should not be sold as a current Google rich-result tactic.
Step 3: create a visible-fact inventory
Before writing code, list each property and where a user can verify it.
| Property | Page source | Owner |
|---|---|---|
headline | Visible H1 | Editorial CMS |
description | Article summary | Editorial CMS |
datePublished | Published date | Editorial CMS |
dateModified | Last material update | Editorial workflow |
author | Visible byline | Author directory |
image | Article hero asset | Media library |
mainEntityOfPage | Canonical URL | Routing layer |
publisher | Organization entity | Site configuration |
Google's general structured data guidelines require markup to represent the page's visible main content. Hidden reviews, fictional availability, inflated ratings, or unrelated entities can make markup ineligible and can lead to manual action.
When a value is uncertain, leave it out until the source of truth is clear. Incomplete but accurate markup is safer than a comprehensive fiction.
Step 4: write the JSON-LD
This simplified article example uses stable identifiers and values that should be generated from the same CMS fields as the visible page:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"@id": "https://example.com/insights/json-ld-guide#article",
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "https://example.com/insights/json-ld-guide"
},
"headline": "How to Implement Schema.org JSON-LD",
"description": "A practical step-by-step implementation guide.",
"datePublished": "2026-08-18",
"dateModified": "2026-08-18",
"author": {
"@type": "Organization",
"@id": "https://example.com/#organization",
"name": "Example Studio"
},
"publisher": {
"@type": "Organization",
"@id": "https://example.com/#organization",
"name": "Example Studio",
"url": "https://example.com/"
}
}
</script>Use absolute canonical URLs. Encode data through a JSON serializer rather than string concatenation, especially when titles or names can contain quotation marks. Never insert untrusted user input directly into a script element.
Step 5: connect entities with @id
An @id is a stable identifier for an entity. It does not need to be a separate page, but an absolute URL with a fragment is practical:
https://example.com/#organizationhttps://example.com/people/alex#personhttps://example.com/products/widget#producthttps://example.com/insights/guide#article
When the same organization is referenced as the website publisher, article publisher, and product brand, use the same @id. This makes the relationship explicit and prevents multiple near-duplicate nodes from describing the same business.
Use @graph when a page needs several connected top-level nodes. It is not required for every page, and adding more nodes is not inherently better. Model only the relationships needed to describe the page accurately.
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"@id": "https://example.com/#organization",
"name": "Example Studio",
"url": "https://example.com/"
},
{
"@type": "WebSite",
"@id": "https://example.com/#website",
"url": "https://example.com/",
"publisher": { "@id": "https://example.com/#organization" }
}
]
}External identifiers such as official profiles can be included through appropriate properties when they genuinely identify the same entity. Avoid a long sameAs list of directories that merely mention the brand.
Step 6: validate three different layers
One green check is not enough. Validate:
1. JSON syntax
Confirm that the output is valid JSON: no trailing commas, duplicate keys, broken quotation marks, or comments. A production serializer should make this repeatable.
2. Schema vocabulary
Use the Schema.org Validator to inspect types and properties. This helps find vocabulary errors, but it does not determine eligibility for a Google feature.
3. Search-feature eligibility
Use Google's Rich Results Test for types Google supports. Test both a code sample and the deployed URL. A valid Schema.org node may correctly produce no rich-result preview because not every vocabulary type maps to a Google feature.
Also inspect the final rendered HTML. A client-side implementation can pass in a component test while failing on the deployed route because the script is missing, duplicated, stale, or blocked during rendering.
Step 7: deploy and monitor the source of truth
Structured data should be generated from the same records as visible content. If editors update a price, author, availability state, or publication date, the JSON-LD should update in the same release.
After deployment:
- Crawl representative templates and count JSON-LD blocks.
- Compare critical properties with visible values.
- Check canonical and
mainEntityOfPageURLs. - Inspect Search Console enhancement reports for supported types.
- Monitor template changes and validation errors.
- Recheck documentation before major releases because supported features and requirements can change.
Search Console reports sampled processing outcomes, not a guarantee that every eligible result will be displayed.
Dynamic sites and headless architectures
In a headless or React site, generate structured data on the server or during prerendering whenever possible. This gives crawlers and validators the complete page without depending on a later client-side render.
Create typed schema builders rather than copying large JSON objects between templates. A builder can enforce required internal fields, centralize canonical URL rules, and omit empty optional values. Add automated tests for:
- one primary node per canonical page;
- stable organization and author IDs;
- valid ISO dates;
- absolute image and page URLs;
- price and currency parity;
- no
undefined, empty arrays, or duplicate nodes; - successful server-rendered output.
For a wider architecture view, see the GEO audit checklist and our work on semantic entity knowledge graphs.
Common JSON-LD mistakes
Marking up content that users cannot see
If a claim, review, offer, or event is absent from the page, do not place it only in JSON-LD.
Choosing the most specific type without satisfying it
A precise subtype is useful only when the entity truly fits it and its important properties are available. Start from reality, not from the desired search appearance.
Adding fabricated aggregate ratings
An AggregateRating must reflect genuine, accessible rating data that follows the applicable platform policy. A marketing team's internal score is not a customer rating.
Duplicating nodes from multiple plugins
A CMS plugin, theme, tag manager, and custom frontend can each inject markup. Crawl the final HTML and consolidate overlapping organization, product, and breadcrumb nodes.
Treating schema as an AI-search switch
Google states that no special schema is required for its AI search features. Accurate structured data can clarify entities and support supported Search features, but crawlability, indexing, useful content, source quality, and query relevance remain separate requirements. The same evidence-first principle underpins generative engine optimization.
A production-ready JSON-LD checklist
- The main type matches the page's real purpose.
- Every important fact is visible or directly verifiable.
- Required properties follow the current feature documentation.
- Dates, prices, availability, author, and URLs come from authoritative fields.
- Canonical URLs and
@ididentifiers are absolute and stable. - Reused entities keep the same identifier across templates.
- JSON is serialized safely and included in rendered HTML.
- Schema.org validation and relevant feature tests pass.
- No duplicate plugin or template output conflicts with the graph.
- Monitoring catches content-to-markup drift after launch.
The best JSON-LD implementation is not the largest graph. It is the smallest accurate model that remains synchronized with the page and can be tested every time the site changes.