Skip to content
Guides

What is schema markup and how do you add it?

How-to · 13 min read · Updated September 15, 2026

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

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.

One graph: Organization, WebSite and WebPage wired together
<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

  1. 01Structured data markup that Google Search supportsGoogle Search Central, 2026
  2. 02FAQ (FAQPage) structured data — eligibilityGoogle Search Central, 2023
  3. 03FAQPage schema definitionSchema.org, 2026
  4. 04AI features and your websiteGoogle Search Central, 2026
  5. 05GEO: Generative Engine OptimizationAggarwal, 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

Let's talk about your project.

A new brand, a website that needs rebuilding, or visibility in search — tell us where you want to start and we will map the route with you.