SEO blog · Technical SEO

Structured Data with Schema.org JSON-LD: A Practical Guide

Key takeaways

  • Structured data describes a page’s content in a standard vocabulary (schema.org); Google recommends the JSON-LD format, placed in a script tag.
  • Markup must match visible content. It does not guarantee rich results and is not a direct ranking factor.
  • Start with Organization, Article and BreadcrumbList, plus Product on stores; connect entities with @id.
  • FAQ rich results stopped appearing in Google Search in May 2026, and HowTo was retired in 2023, so they are no longer a reason to add markup.
  • Validate with the Rich Results Test and the Schema Markup Validator, then watch the enhancement reports in Search Console.

Structured data schema in JSON-LD is a block of code on your page that tells search engines exactly what the content represents: a company, an article, a product, a navigation trail. It uses the schema.org vocabulary, and Google recommends the JSON-LD format. The markup does not guarantee rich results and is not a direct ranking factor, but it removes ambiguity and can make a page eligible for certain search features.

In 2026 the picture has changed: Google retired FAQ rich results, after having dropped HowTo earlier. Schema is not useless because of that, but the priorities shift. Below you will see which types are worth implementing, what the code looks like for a company, an article and a product, how to validate everything and which mistakes appear most often. Correct implementation is part of technical SEO, and if you want a starter snippet fast, use our schema generator.

What is structured data, and what does JSON-LD do?

Structured data is information about a page written in a standardized vocabulary so machines can read it without interpreting the prose. That vocabulary is schema.org, founded by Google, Microsoft, Yahoo and Yandex. It defines types (Organization, Product, Article) and properties (name, url, price).

JSON-LD (JavaScript Object Notation for Linked Data) is the format you write that vocabulary in. It sits inside a <script type="application/ld+json"> element, separate from the visible HTML. The alternatives, Microdata and RDFa, attach directly to page elements. Google supports all three but recommends JSON-LD because it is easier to maintain: you change one block instead of dozens of attributes in a template.

Three things to keep in mind:

  1. Markup must describe what the user sees. Do not mark up hidden content or anything that does not appear on the page.
  2. Google does not promise rich results just because your markup is valid.
  3. Structured data does not replace content. It explains it.

Which schema types are worth adding in 2026?

Google’s feature gallery now includes, among others, Article, Breadcrumb, Local business, Organization, Product, Review snippet, Video, Event, Recipe and Software app. For most service sites and stores, the practical list is shorter:

Schema.org typeWhat you use it forNotes
OrganizationCompany identity: name, logo, official profiles (sameAs)On the homepage or the About page
LocalBusinessBusinesses with an address and opening hoursComplements your Google Business Profile
Article / BlogPostingArticles: headline, author, publication datesAuthor and dates also visible on the page
BreadcrumbListA page’s position in the hierarchyMay appear in results in place of the URL
Product + OfferProducts with price, stock, reviewsEssential for stores
PersonThe author or specialistSupports trust signals
FAQPageQuestions and answers visible on the pageRich result retired in May 2026

About FAQ: according to Google’s documentation, FAQ rich results stopped appearing in Search in May 2026. Since 2023 they had been limited to well-known government and health sites, and HowTo rich results had been retired in 2023 as well. If you already have FAQPage markup, there is no urgency to delete it. If you were planning it now purely for rich results, it is no longer worth it. The questions remain useful as reader-facing text, and clear structure helps with being cited, a topic covered in our guide to GEO for AI search.

How do you write JSON-LD step by step?

The procedure is the same for every type.

  1. Choose the most specific type for the page (for example Dentist rather than LocalBusiness, if schema.org has it).
  2. Check required and recommended properties in Google’s documentation for that type. Each feature has its own requirements.
  3. Write the JSON-LD block using data that also appears on the page.
  4. Connect entities with @id so you do not repeat the same data and so you show relationships (an article written by a person and published by a company).
  5. Place the script in <head> or <body>; both are accepted.
  6. Validate before publishing and monitor afterward.

Example: the company as an Organization

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Organization",
  "@id": "https://www.example.com/#organization",
  "name": "Example LLC",
  "url": "https://www.example.com/",
  "logo": "https://www.example.com/img/logo.png",
  "sameAs": [
    "https://www.linkedin.com/company/example",
    "https://www.facebook.com/example"
  ],
  "contactPoint": {
    "@type": "ContactPoint",
    "telephone": "+40-700-000-000",
    "contactType": "customer service",
    "areaServed": "RO",
    "availableLanguage": ["ro", "en"]
  }
}
</script>

Schema.org also has properties for tax identifiers (vatID, taxID) and for the address (address with PostalAddress), which are useful for companies. Use them only with real data that matches your Contact page. For companies registered in Romania, that means the same legal name, VAT number and address you show to customers.

Example: an article tied to its author and company

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Article",
  "headline": "Article headline",
  "datePublished": "2026-08-18T09:00:00+03:00",
  "dateModified": "2026-08-18T09:00:00+03:00",
  "image": "https://www.example.com/img/article.jpg",
  "author": {
    "@type": "Person",
    "name": "First Last",
    "url": "https://www.example.com/team/first-last/"
  },
  "publisher": { "@id": "https://www.example.com/#organization" },
  "mainEntityOfPage": "https://www.example.com/blog/article-headline/"
}
</script>

Notice that the publisher is only a reference to the entity defined above through @id. The author, dates and headline must appear identically on the page; for building author credibility, see our E-E-A-T guide.

Example: a product with an offer in Romanian lei

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Ergonomic school backpack",
  "image": ["https://www.example.com/img/backpack.jpg"],
  "description": "Backpack with an orthopedic back panel, 18 liters.",
  "sku": "GH-018",
  "brand": { "@type": "Brand", "name": "Example" },
  "offers": {
    "@type": "Offer",
    "url": "https://www.example.com/ergonomic-backpack/",
    "priceCurrency": "RON",
    "price": "249.00",
    "availability": "https://schema.org/InStock",
    "itemCondition": "https://schema.org/NewCondition"
  }
}
</script>

The price and availability in the markup must match the page and your product feed. For stores, more on page structure is in our ecommerce SEO guide. For local firms, the LocalBusiness type complements local SEO.

Where do you put the code: WordPress, a static site or JavaScript?

Where you generate JSON-LD matters for maintenance, not for Google.

  • WordPress. The big SEO plugins generate Organization, WebSite, Article and BreadcrumbList automatically. Check which details they output: logo, name, social profiles. Missing or wrong data spreads across the whole site. If you add JSON-LD blocks by hand, switch off the same type in the plugin.
  • Static or generated sites. The cleanest option: a template builds JSON-LD from the same fields as the page (title, date, author), so the markup and the visible text cannot drift apart.
  • JavaScript or Google Tag Manager injection. Google can process JSON-LD added dynamically, but it depends on rendering, which adds risk. Use it when you cannot touch the template, and always test with URL Inspection. Rendering is explained in our JavaScript SEO guide.

Why @id and @graph matter

When a page contains several entities (company, website, page, author, article), you can group them in one block with @graph and link them through @id. Each entity gets a stable identifier, usually the page URL plus a fragment (#organization, #author). The benefit: you state once who the company is and reference it everywhere, instead of repeating the name and address in every block. Fewer copies mean fewer inconsistencies, and inconsistencies are the usual source of misread markup.

How do you validate and monitor structured data?

A wrong markup can stay invisible until you test it. The recommended routine:

  1. Rich Results Test (a Google tool): shows whether the page is eligible for supported features and which errors or warnings exist.
  2. Schema Markup Validator (validator.schema.org): checks general schema.org syntax, including types Google does not display.
  3. URL Inspection in Search Console: shows what Google saw on the last crawl, including after rendering.
  4. Enhancement reports in Search Console: they appear for eligible types (for example Breadcrumb or Products) and list valid pages, pages with warnings and pages with errors. How to read them is covered in the Google Search Console beginner’s guide.

The difference between an error and a warning: an error means a required property is missing and the page is not eligible; a warning flags a missing recommended property, and the page may stay eligible.

There is a lot of talk about schema as a “language for AI.” A little caution helps here. Google’s documentation says structured data helps it understand content, and in its guidance for AI features in Search it stresses that markup should match the visible text. It also states that structured data is not required for its generative AI features and that no special schema.org markup is needed.

The honest summary: schema clarifies entities (who you are, what you sell, who wrote it), and clarity cannot hurt. But do not treat it as a switch. What an AI system cites comes mainly from visible, well-structured, trustworthy content; see how to become a cited source in Google AI Overviews and how to measure visibility in ChatGPT and AI search.

Common structured data mistakes

  • Markup for content that is not on the page. Reviews, prices or questions that users cannot see. This can lead to manual actions from Google.
  • Your own reviews marked up as independent reviews. Google has strict rules about reviews.
  • Duplicate or contradictory data. The theme outputs one Organization, a plugin another, with different names.
  • Missing required properties. For example offers without price or priceCurrency.
  • Stale data. Price or stock changed on the page but old in the JSON-LD.
  • Invalid JSON. An extra comma or curly “smart” quotes break the whole block. Use straight quotes " in code.
  • The same schema on every page. An identical Article on each URL, with the same headline.
  • Blocking the page with robots.txt or noindex. Google cannot read markup on a page it does not crawl.

When structured data is not worth the effort

Not every page needs schema, and a few limits are worth knowing:

  • For a small brochure site, a correct Organization and a BreadcrumbList cover most of the practical value.
  • If a page does not match any type in Google’s gallery, the markup remains a general aid to understanding, with no visible effect in results.
  • Without good content, markup does not help. Fix indexing and page quality first.
  • Google’s features change. What works today can be retired tomorrow, as happened with FAQ. So choose markup that makes sense for readers too, not just for a results widget.

Conclusion and next steps

A realistic plan for the next few days:

  1. On the homepage, add Organization with a logo, sameAs and real contact details.
  2. On articles, add Article with author, dates and image, linked to the company through @id.
  3. On every page with a hierarchy, add BreadcrumbList; on stores, add Product with Offer.
  4. Check everything in the Rich Results Test and the Schema Markup Validator, then follow the Search Console reports.
  5. Remove duplicates between your theme and your plugin.

If you want the implementation, validation and monitoring handled for your site, see our technical SEO service or reach us through contact.

Sources and further reading

Frequently asked questions

Frequently asked questions

What is the difference between schema.org and JSON-LD?

Schema.org is the vocabulary: the list of types (Organization, Product, Article) and properties (name, price). JSON-LD is the format you write that vocabulary in, as a JSON block inside a script tag. The same vocabulary can also be written in Microdata or RDFa, but Google recommends JSON-LD.

Does structured data improve my Google rankings?

Not directly. Google says it helps understand the page and can make it eligible for rich results, with no guarantee of display. Any benefit comes from clarity and from the click-through rate of rich results, where Google still shows them.

Can I add structured data with Google Tag Manager?

Yes, Google supports JSON-LD generated dynamically with JavaScript. Markup in the server-delivered HTML is more reliable, though, because it does not depend on rendering. If you use Tag Manager, test with URL Inspection to confirm Google actually sees the markup.

What if my theme and my SEO plugin output the same markup twice?

Pick a single source. Duplication creates conflicting entities, such as two Organization or two Article blocks with different data. Turn off schema in either the theme or the plugin, then confirm in the Rich Results Test that one consistent set of entities remains on the page.

Should I keep FAQPage markup now that the rich result is gone?

You can keep it or remove it; removal is not required. The markup is still valid schema.org, and other systems may read it. What matters is that the questions and answers are visible on the page as useful text for readers, not only present in the code.

Related service

Technical SEO & speed

See the service →

Let’s grow your site’s organic traffic

Send us your website address and we’ll reply with a free initial analysis and a concrete SEO strategy — no strings attached.