Short answer
What is structured data?
Schema markup is structured data that tells a machine, in JSON-LD, what a page is about. On a corporate site the order is clear: Organization first, then a WebPage per page, Service on service pages, Product on products, Article on posts. Linked together with @id, those nodes form one entity graph. There is one rule: everything stated in the markup must also be visible on the page.
Key takeaways
- JSON-LD is the format Google recommends, and because it is added in a script tag rather than woven into the HTML, it can be maintained independently of the content.
- Markup blocks standing alone do not make an entity; linking nodes with @id turns three separate fragments into one graph.
- Anything stated in the markup but not shown on the page is a violation; this rule is exactly where hidden claims get penalised.
- Google restricted FAQ rich results to well-known, authoritative government and health sites on 14 September 2023 — the markup is still worth writing, but the rich-result promise no longer holds.
- Markup is not a direct ranking factor; what it does is remove ambiguity about what the page is about.
- The Rich Results Test only checks the types Google produces rich results for; seeing the whole graph requires the Schema Markup Validator.
What is schema markup and where does it go?
A person reading a page can tell from the heading and the layout whether it is a service page or a news item. A machine cannot; what it sees is unlabelled text. Schema markup is the structured data added to close that gap — data that says "this page belongs to an Organisation, it describes a Service, it is located at this address".
There are three notations — JSON-LD, Microdata and RDFa — but in practice the choice is settled. JSON-LD sits in a script tag without touching the page's HTML; the markup does not break when the content changes, and the layout does not break when the markup does. Google recommends it. Migrating an old Microdata site to JSON-LD during a rebuild halves the maintenance cost on its own.
One rule: everything in the markup must also be visible on the page. Writing a price, a rating or an address into the markup that does not appear on the page does not merely forfeit a rich result — it is the direct target of structured data enforcement.
Which types do you actually need?
The schema.org vocabulary carries more than eight hundred types, and most of them have nothing to do with a corporate site. The set you will use is small, and its order is fixed:
The types a corporate site uses, and where each goes
Organization
- What it states
- The company's name, address, phone, logo and profiles
- Where it goes
- Across the whole site, as one identity
WebSite
- What it states
- The site itself and who publishes it
- Where it goes
- Once, on the home page
WebPage
- What it states
- This page's name, language and which site it belongs to
- Where it goes
- On every page
BreadcrumbList
- What it states
- The page's position in the site structure
- Where it goes
- On sub-pages
Service
- What it states
- The service offered, its provider and its area
- Where it goes
- On service pages
Product / Offer
- What it states
- The product, its price, currency and availability
- Where it goes
- On product pages
Article
- What it states
- The post's headline, publication date and author
- Where it goes
- On blog and guide pages
FAQPage
- What it states
- The question-and-answer pairs on the page
- Where it goes
- On pages carrying an FAQ
LocalBusiness
- What it states
- Physical location, opening hours, coordinates
- Where it goes
- On branch and location pages
| Type | What it states | Where it goes |
|---|---|---|
| Organization | The company's name, address, phone, logo and profiles | Across the whole site, as one identity |
| WebSite | The site itself and who publishes it | Once, on the home page |
| WebPage | This page's name, language and which site it belongs to | On every page |
| BreadcrumbList | The page's position in the site structure | On sub-pages |
| Service | The service offered, its provider and its area | On service pages |
| Product / Offer | The product, its price, currency and availability | On product pages |
| Article | The post's headline, publication date and author | On blog and guide pages |
| FAQPage | The question-and-answer pairs on the page | On pages carrying an FAQ |
| LocalBusiness | Physical location, opening hours, coordinates | On branch and location pages |
How do you wire the nodes together with @id?
This section is the difference between markup that has been "added" and markup that works. Most sites carry three separate script tags: one Organization, one WebPage, one Article. All three are valid, all three pass the validator, and all three are unaware of each other. What the machine sees is not a company but three unrelated records.
The fix is to give every node a stable identifier (@id) and have the nodes reference one another through those identifiers. An @id is written like an address and never changes for that organisation or page for the lifetime of the site. Collecting them in a single @graph array hands a crawler one coherent picture in one block.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"@id": "https://example.com/#organization",
"name": "Kuzey Furniture",
"url": "https://example.com/",
"logo": {
"@type": "ImageObject",
"url": "https://example.com/logo.png"
},
"telephone": "+902121234567",
"address": {
"@type": "PostalAddress",
"streetAddress": "Atatürk Mah. 12. Sok. No: 4",
"addressLocality": "Ümraniye",
"addressRegion": "İstanbul",
"postalCode": "34760",
"addressCountry": "TR"
},
"sameAs": [
"https://www.linkedin.com/company/kuzeymobilya",
"https://www.instagram.com/kuzeymobilya"
]
},
{
"@type": "WebSite",
"@id": "https://example.com/#website",
"url": "https://example.com/",
"name": "Kuzey Furniture",
"inLanguage": "tr-TR",
"publisher": { "@id": "https://example.com/#organization" }
},
{
"@type": "WebPage",
"@id": "https://example.com/products/office-chairs#webpage",
"url": "https://example.com/products/office-chairs",
"name": "Office chairs",
"inLanguage": "tr-TR",
"isPartOf": { "@id": "https://example.com/#website" },
"about": { "@id": "https://example.com/#organization" }
}
]
}
</script>Note that publisher and isPartOf point at the organisation by @id instead of describing it again. Repeating the company details on every page produces twenty slightly different records of the same company; a single reference ties twenty pages to one entity.
Does FAQ markup still work?
As a rich result, no. On 14 September 2023 Google restricted FAQ rich results to "well-known, authoritative government and health websites"; an ordinary corporate site should no longer expect an expandable question list in the results. Every guide written before that date is wrong on this point, and "take twice the space in the results with FAQ markup" is still being sold.
For machine understanding, though, yes — it is worth writing. FAQPage markup draws the boundary between question and answer explicitly, and for generative engines that boundary is valuable: where an answer starts and ends is unambiguous, so the passage comes away clean. Write the markup, but write it for quotability rather than for a rich result.
How do you validate the markup?
There are two tools answering two different questions, and using only one of them is the most common auditing mistake.
- The Rich Results Test only checks types Google produces rich results for. If you wrote Organization or WebPage it will report "no eligible items"; that is the tool's scope, not an error.
- The Schema Markup Validator reads the whole graph and surfaces type and field errors. If you want to see your entity graph, this is the tool.
- Search Console's Rich Results report, unlike a lab test, tells you what Google actually sees on live pages — and where it disagrees with the two tools, it is the one that is right.
- If the page injects markup with JavaScript it appears in the rendered page, not in the HTML source; the audit has to run against the rendered version.
What are the five most common mistakes?
- Writing information into the markup that is not visible on the page. An invisible price, an invisible rating, an invisible address — the direct target of enforcement.
- Putting a separate Organization block on every page. Twenty slightly different records of the same company are weaker than one consistent record.
- Publishing a rating you generated yourself as aggregateRating. A score a company awards itself is an unverifiable claim and drags down the credibility of the whole page.
- Not setting an @id, or changing the @id at the next redesign. A node whose identity changes loses its link to the entity an engine had already resolved.
- Sample values left in the template. A line reading "streetAddress: 123 Main St", forgotten during setup and shipped live, declares the wrong address for the company.
Frequently asked
Does markup raise rankings directly?
- No, it is not a direct ranking factor. What it does is remove ambiguity about what the page is about and make it eligible for rich result formats. On the generative side the effect is more concrete: markup turns the organisation from a string of text into a resolvable entity, and an engine does not recommend an entity it cannot resolve.
Is adding it with a plugin enough?
- It is enough to start, but it has two limits. First, most plugins drop their own Organization block on every page and do not wire the nodes together with @id; the result is valid but disconnected. Second, if two plugins emit markup at once the page ends up with two contradictory records. Opening the page source after setup and counting the blocks is a five-minute check that pays for itself.
How should markup be written on a multilingual site?
- Each language's page carries its own WebPage node with inLanguage set to that page's language, and its text fields — name, description — written in that language. The Organization node stays single: a company's name and address do not change by language. The link between language versions is made with hreflang, and there is no need to repeat it in the markup.
Which type should I start with?
- Start with Organization and get it right: name, address, phone, logo, and a sameAs list of verifiable profiles. That single block is the node every page on the site will attach to; if it is wrong, everything built on it is wrong. Step two is a WebPage on every page, step three the type that fits — Service, Product or Article.
Sources
- 01Structured data markup that Google Search supports — Google Search Central, 2026
- 02FAQ (FAQPage) structured data — eligibility — Google Search Central, 2023
- 03FAQPage schema definition — Schema.org, 2026
- 04AI features and your website — Google Search Central, 2026
- 05GEO: Generative Engine Optimization — Aggarwal, Murahari, Rajpurohit, Kalyan — KDD 2024, 2024
Queries this page answers
- what is schema markup
- structured data
- how to add json-ld
- schema.org markup
- faq schema still work