Baki Bilişim

Schema.org and JSON-LD for corporate sites

Schema.org structured data labels the information on a page with a shared vocabulary, so that search engines and language models read it instead of inferring it. On corporate sites, the carrier format for that labelling is JSON-LD.

Last updated: Estimated reading time: 15 minutes Written by: Erdi Baki

Summary

Structured data labels page information with the schema.org vocabulary and is written as JSON-LD. A correctly built graph states who you are, what you do, where you are and which question you answer — from one source. It guarantees no rich result; it guarantees that machines read you correctly.

What is schema.org structured data?

Answer

Schema.org structured data is the practice of labelling information on a page with a shared vocabulary so machines do not have to guess. A person sees that a line reading Karabaş Mah., İzmit is an address; a machine cannot. The markup states precisely that the line is a PostalAddress, which organisation it belongs to and which city it names.

The vocabulary is called schema.org; the carrier format is called JSON-LD. The two are frequently confused. Schema.org defines which words you may use — Organization, Service, FAQPage — while JSON-LD defines how those words are written into the page. The vocabulary is shared; the format is a choice.

Structured data is not a marketing layer, it is a data contract. What the page says and what the graph says have to be the same thing. In the graph published on this site the telephone, address and email fields are filled with verified values, while postal code, opening hours and coordinates are absent entirely, because they were never verified. They were not left blank and they were not invented — they were removed.

JSON-LD, Microdata or RDFa: which should you choose?

Answer

Choose JSON-LD on a corporate site. All three formats carry the same schema.org vocabulary, but JSON-LD separates the markup from the HTML: the data sits in one script block, survives design changes and is straightforward to generate server-side. Google recommends JSON-LD in its documentation. Microdata and RDFa remain valid, but cost noticeably more to maintain.

How the three markup formats compare
Format Where it lives Strength Weakness
JSON-LD One script block, independent of the HTML Easy to maintain, unaffected by design changes, supports graph relationships The match with visible content has to be audited separately
Microdata Attributes inside the HTML elements The markup is physically attached to the visible content Breaks easily when templates change; complex relations are awkward
RDFa Attributes inside the HTML elements Broad compatibility with the wider linked-data ecosystem The steepest learning curve for corporate teams

A practical rule: if your current site has Microdata and it works, do not delete it in a hurry. Build the new structure in JSON-LD first, then remove the old markup. Two formats live at the same time with different values is, on its own, the single most frequent fault type we encounter.

Which schema types should a corporate site use?

Answer

Every page carries the same corporate core: Organization, WebSite, WebPage, plus BreadcrumbList on every page except the home page. The page's own type sits on top: Service on a service page, TechArticle on a guide, ContactPage on contact, LocalBusiness on a branch page. A type that does not describe an entity genuinely present on the page is not added.

Decision table: which node belongs on which page
Page type Page-specific node Conditional / caution
Home page WebPage + ItemList (service index) LocalBusiness only if the address and telephone are verified
Service detail Service + FAQPage offers is written only where a price is actually published
Sector / solution Service or CollectionPage audience can state the target sector
Guide / article TechArticle + Person (author) HowTo and DefinedTerm only if that content really exists
Frequently asked questions FAQPage Question and answer must be visible on the page
Contact ContactPage + ContactPoint NAP data identical in the footer and in the graph
Branch / dealer location LocalBusiness (a separate @id per location) Linked to head office through parentOrganization
Product / e-commerce Product + Offer Price, currency and availability must be real-time
Legal text WebPage No extra type needed; markup is never forced

If a type you are considering is missing from the table, the question to ask is this: does this type describe an entity that genuinely exists on the page? If the answer is no, it is not added. Schema.org defines more than eight hundred types; a corporate site normally needs between ten and fifteen of them.

What is @id and why does the entity graph matter?

Answer

@id is the permanent identifier given to an entity. Instead of redefining the same company on thirty-six pages, you define it once under a single @id and reference that identifier everywhere else. A search engine then sees one company mentioned on thirty-six pages, not thirty-six separate companies.

The schema.org entity graph of this site The WebPage node links to the WebSite node through isPartOf and to the Organization node through about. The TechArticle node links to the WebPage node through mainEntityOfPage, the ProfessionalService node links to the Organization node through parentOrganization, and the Organization node links to the Person node through founder. #website #article #webpage #erdibaki #organization #localbusiness isPartOf mainEntityOfPage about founder parentOrganization WebSite TechArticle WebPage Person Organization ProfessionalService
The skeleton of the graph published in this page's source code. Boxes are entities, arrows are relationships.

Three rules are enough for @id. One: make the identifier an absolute URL (https://www.bakibilisim.com/#organization). Two: keep the protocol and subdomain identical across the site; mixing http with https, or www with the non-www version, produces two separate entities. Three: never change an identifier again — changing it resets the entity.

The second pillar of entity clarity is the sameAs field, which lists the organisation's verifiable external profiles. This site has one verified Instagram profile, so sameAs has exactly one entry. Listing profiles that do not exist does not increase entity clarity; it reduces it.

How is schema built for multi-location and multilingual structures?

Answer

Every physical location gets its own page and its own @id, and each links to head office through parentOrganization. In a multilingual structure the graph is republished in each language: the @id values stay identical, while inLanguage and the text fields change. Identity does not vary by language.

In dealer, branch and store networks, the most common setup error is collecting every location under a single LocalBusiness node. That tells a search engine, in effect, "I have one business and its address keeps changing." The correct setup is one page per location and one identifier per location, with head office as the single, unchanging Organization node.

  • Location page: its own LocalBusiness node, its own address, its own telephone, its own @id.
  • Head office: a single Organization; locations attach to it through parentOrganization.
  • Multiple languages: inLanguage correct on every page, with hreflang tags and the graph confirming each other.
  • Consistency: name, address and telephone written identically on the page, in the graph and in business profiles.

The operational side of this setup is detailed on our dealer and branch network management and retail chain solution pages.

How do you validate structured data?

Answer

Two tools answer two different questions. The Schema Markup Validator measures vocabulary validity: are the type and property names correct? Google's Rich Results Test measures search-engine eligibility: which rich result type is this graph a candidate for? Before a corporate release, both must report zero errors.

Validation tools and what each one covers
Tool What it validates What it does not validate
Schema Markup Validator Vocabulary validity: type, property name, data type, syntax Whether the markup matches the content on the page
Google Rich Results Test Eligibility for the rich result types Google supports Whether the rich result will actually be shown
Search Console reports Error and warning counts on live pages over time New pages that have not been crawled yet
Human review Exact match between visible information and graph values Cannot be automated; repeated before every release

Direct links to the tools: Schema Markup Validator (external link, opens in a new tab) and Google Rich Results Test (external link, opens in a new tab). Paste this page's URL into both and read the output yourself — we publish our own measurements, with measurement dates, on the proof page.

Does structured data help in AI engines?

Answer

Indirectly, yes. Language models parse a page before they answer; structured data makes that parsing easier and removes ambiguity about who the entity is. But no search engine or assistant promises "add schema and we will cite you". Markup is a precondition for citability, not a guarantee of it.

Here is what is verifiable: when the same organisation name, address and description are consistent on the page, in the graph and across external profiles, entity ambiguity falls. As ambiguity falls, the chance of a model confusing you with another company falls with it. That is a description of a mechanism, not a promise about an outcome.

The answer-engine and generative-engine sides are covered in two separate guides: what is AEO and what is GEO. Structured data is the infrastructure layer beneath both; on its own it replaces neither.

Three verifiable facts, each with a source

Answer

Most claims circulating about structured data have no source. The three figures below rest on public, checkable documentation: who founded the vocabulary, what the search engine actually guarantees, and how many markup formats are recognised. Every line carries its source and access date; we publish no number without one.

2011

The year the schema.org vocabulary was published as a shared vocabulary by Google, Microsoft, Yahoo and Yandex.

Source: schema.org — Frequently Asked Questions · Accessed: 2026-07-29

0

The rich result guarantee that valid structured data provides. Google documents explicitly that markup does not guarantee the appearance.

Source: Google Search Central — Intro to structured data · Accessed: 2026-07-29

3

The number of markup formats Google recognises: JSON-LD, Microdata and RDFa. Of the three, Google recommends JSON-LD.

Source: Google Search Central — Structured data general guidelines · Accessed: 2026-07-29

Copyable JSON-LD examples

Answer

The six blocks below cover the core a corporate site needs. All of them are written with this site's real values; for your own organisation you only change the address, telephone and identifier values. Every block belongs inside the single script tag at the top of the document, as one @graph array.

Where does the script tag go?

JSON-LD is placed in the document head inside a single script tag. The skeleton below shows where the later examples go.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@graph": [
    /* Organization */,
    /* ProfessionalService */,
    /* Person */,
    /* WebSite */,
    /* WebPage */,
    /* BreadcrumbList */
  ]
}
</script>

Organization — corporate identity

{
  "@type": "Organization",
  "@id": "https://www.bakibilisim.com/#organization",
  "name": "Baki Bilişim",
  "url": "https://www.bakibilisim.com/",
  "email": "bilgi@bakibilisim.com",
  "telephone": "+905078172717",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "Karabaş Mah. Salim Dervişoğlu Cad., Ncity AVM, Kat 2",
    "addressLocality": "İzmit",
    "addressRegion": "Kocaeli",
    "addressCountry": "TR"
  },
  "founder": { "@id": "https://www.bakibilisim.com/#erdibaki" },
  "foundingDate": "2019",
  "sameAs": ["https://www.instagram.com/bakibilisim"],
  "areaServed": [
    { "@type": "AdministrativeArea", "name": "Kocaeli" },
    { "@type": "Country", "name": "Türkiye" }
  ]
}

Note what is missing: postalCode, openingHours and geo are not in this example, because those values were never verified. Leaving an unverified field empty and inventing a value for it produce the same result: the graph loses its credibility.

LocalBusiness — a physical location

{
  "@type": "ProfessionalService",
  "@id": "https://www.bakibilisim.com/#localbusiness",
  "name": "Baki Bilişim",
  "url": "https://www.bakibilisim.com/",
  "telephone": "+905078172717",
  "email": "bilgi@bakibilisim.com",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "Karabaş Mah. Salim Dervişoğlu Cad., Ncity AVM, Kat 2",
    "addressLocality": "İzmit",
    "addressRegion": "Kocaeli",
    "addressCountry": "TR"
  },
  "parentOrganization": { "@id": "https://www.bakibilisim.com/#organization" },
  "knowsLanguage": ["tr", "en"],
  "areaServed": [
    { "@type": "AdministrativeArea", "name": "Kocaeli" },
    { "@type": "AdministrativeArea", "name": "İstanbul" }
  ]
}

ProfessionalService is a subtype of LocalBusiness and is more precise for consultancy and agency work. If you run a branch network, repeat this block on every location page and change only the @id, address and telephone fields.

Service — a service page

{
  "@type": "Service",
  "@id": "https://www.bakibilisim.com/en/services/structured-data-schema/#service",
  "name": "Structured data (schema.org) implementation",
  "serviceType": "Structured data engineering",
  "description": "Entity graph design, JSON-LD production and validation for corporate sites.",
  "provider": { "@id": "https://www.bakibilisim.com/#organization" },
  "areaServed": [
    { "@type": "AdministrativeArea", "name": "Kocaeli" },
    { "@type": "Country", "name": "Türkiye" }
  ],
  "availableChannel": {
    "@type": "ServiceChannel",
    "serviceUrl": "https://www.bakibilisim.com/en/contact/"
  }
}

The offers field is deliberately absent from this block: without a published price list, no price markup is written. If you do publish prices, add the Offer node and make its value identical to the price shown on the page.

FAQPage — question and answer

{
  "@type": "FAQPage",
  "@id": "https://www.bakibilisim.com/en/knowledge/schema-org-guide/#faq",
  "inLanguage": "en",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "Does structured data improve my rankings?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "It is not a direct ranking factor. It declares the subject and the
                 entities of a page instead of leaving them to inference."
      }
    }
  ]
}

One condition applies: the question and the answer must be visible on the page. The six questions further down this page carry exactly the same wording as the block above.

BreadcrumbList — position trail

{
  "@type": "BreadcrumbList",
  "@id": "https://www.bakibilisim.com/en/knowledge/schema-org-guide/#breadcrumb",
  "itemListElement": [
    { "@type": "ListItem", "position": 1, "name": "Home",
      "item": "https://www.bakibilisim.com/en/" },
    { "@type": "ListItem", "position": 2, "name": "Knowledge Centre",
      "item": "https://www.bakibilisim.com/en/knowledge/" },
    { "@type": "ListItem", "position": 3, "name": "Schema.org Guide",
      "item": "https://www.bakibilisim.com/en/knowledge/schema-org-guide/" }
  ]
}

Person — the accountable individual

{
  "@type": "Person",
  "@id": "https://www.bakibilisim.com/#erdibaki",
  "name": "Erdi Baki",
  "jobTitle": "Founder",
  "url": "https://www.bakibilisim.com/en/about/",
  "worksFor": { "@id": "https://www.bakibilisim.com/#organization" },
  "knowsAbout": [
    "Schema.org structured data",
    "Answer Engine Optimization",
    "Core Web Vitals"
  ]
}

On guide and article pages the Person node is attached to the author field. In this page's TechArticle node the author value references the identifier above — the author's name is not written a second time, it is linked by identity.

How do you build an entity graph from scratch?

Answer

Seven steps: entity inventory, permanent identifier scheme, corporate core, page-type nodes, linking by identifier, matching markup to visible content, then validation and monitoring. Order matters — a graph written before the identifier scheme is fixed falls apart at the first restructure. Each step has one output and one control question.

  1. 01

    Take an entity inventory

    List the entities that genuinely exist on the site: the organisation, the accountable person, locations, services, products, content. This list is the boundary of the graph — nothing outside the inventory gets marked up.

    Output
    An entity list, with the page each entity lives on
    Control
    Does every entity have exactly one canonical page?
  2. 02

    Fix a permanent identifier scheme

    Give each entity an @id that will not change. Protocol, subdomain and trailing slash must follow one single form across the site. Decide the identifier syntax once, then write it down.

    Output
    An identifier convention: the https://www.example.com/#organization pattern
    Control
    Is the protocol and subdomain the same in every identifier?
  3. 03

    Write the corporate core

    The Organization, LocalBusiness, Person and WebSite nodes are written once and published on every page with identical values. Unverified fields are not written at all.

    Output
    A fixed core graph repeated on every page
    Control
    Are name, address and telephone identical in the footer and the graph?
  4. 04

    Add the page-type node

    Each page carries its own type: WebPage, Service, TechArticle, FAQPage, ContactPage or Product. Every page except the home page also carries BreadcrumbList.

    Output
    A page-type map: which template emits which node
    Control
    Is any type forced? A type without a counterpart is not added
  5. 05

    Link the nodes by identifier reference

    Reference an entity with @id rather than describing it again. Use one script tag and one @graph array per page.

    Output
    One script, one graph, nodes joined by reference
    Control
    Is a second, conflicting graph still left on the page?
  6. 06

    Match the markup to visible content

    Every marked-up field must have a visible counterpart on the page. A telephone number, price, rating or review that is not on the page is not marked up. This step cannot be automated; it is checked by eye.

    Output
    A field-to-content matching table
    Control
    Is there a single value in the graph that is absent from the page?
  7. 07

    Validate, then monitor after release

    Measure vocabulary validity with the Schema Markup Validator and search-engine eligibility with the Rich Results Test. After release, watch the structured data reports in Search Console.

    Output
    A dated validation output
    Control
    Is the error count zero in both tools?

What are the eight most common schema mistakes?

Answer

These eight come up most often in our audits: marking up invisible content, leaving empty fields, inconsistent identifiers, two conflicting graphs, invented reviews and ratings, the wrong type, compressing a multi-location structure into one node, and never updating the graph after a migration. All eight surface within minutes of inspection.

  1. Marking up invisible content. Putting a question inside FAQPage that does not appear on the page. Fix: add the content to the page first, then mark it up.
  2. Leaving empty fields. Values such as telephone: "" or addressLocality: "". Fix: if there is no value, remove the field entirely — an empty string is not a value.
  3. Inconsistent identifiers. @id values starting with http:// on one page and https://www on another. Fix: pick one canonical form and apply it in every template.
  4. Two conflicting graphs. Theme, plugin and hand-written code all emitting a graph at once. Fix: switch the sources off one by one until a single producer remains.
  5. Invented reviews and ratings. Writing AggregateRating without a real review system behind it. Fix: if there are no genuine reviews, the node is not written at all — the enforcement risk is high.
  6. Choosing the wrong type. Marking a service page up as Product. Fix: the type follows the real nature of the entity on the page.
  7. Compressing a multi-location structure into one node. Collecting ten branches under one LocalBusiness. Fix: one page and one identifier per location.
  8. Not updating the graph after a migration. Old values surviving in the graph after a domain or address change. Fix: add a graph audit to the migration checklist.

Seven of these eight are process faults rather than technical ones: a field that nobody owns becomes a field that nobody updates. We set out who is accountable, line by line, on the why Baki Bilisim page.

What should you check before publishing?

Answer

Fourteen checks are enough. The list answers two questions: is the graph technically valid, and does everything written in the graph genuinely exist on the page? The second question is the one automated tools cannot answer, and the one that produces the most findings in our audits.

  • The page has one JSON-LD script and one @graph array.
  • Every @id value uses the same protocol and subdomain.
  • The Organization node is identical on every page of the site.
  • telephone and addressLocality inside LocalBusiness are populated.
  • No unverified field (postal code, coordinates, opening hours, price) has been written.
  • Every page except the home page has a BreadcrumbList matching the visible trail.
  • Each page defines its own type (Service, TechArticle, ContactPage).
  • Every question and answer in FAQPage is visible on the page.
  • dateModified matches the update date shown on the page.
  • inLanguage agrees with the page language and the hreflang tags.
  • sameAs lists verified profiles only.
  • No AggregateRating or Review without a real review system.
  • The Schema Markup Validator output reports zero errors.
  • The Rich Results Test output reports zero errors, with warnings reviewed.

If you would like this list applied to your own site, the free digital asset audit measures structured data validity as one of its five axes.

Frequently asked questions

Answer

The six questions below are the ones corporate teams ask most often about structured data. The answers appear visibly on this page and, word for word, inside the FAQPage schema — this guide's own rule applied to itself. Each answer is self-contained and stays correct out of context.

Does structured data improve my rankings?

Structured data is not a direct ranking factor, and Google states this plainly in its documentation. What it does is declare the subject and the entities of a page instead of leaving them to inference. The indirect effect comes from there: the page matches the right query, becomes eligible for rich result components, and answer engines quote the content with more confidence.

Does adding schema guarantee a rich result?

No. Google documents that valid structured data does not guarantee a rich result appearance. Markup is an eligibility condition, not a decision. Whether a rich result is shown depends on the search engine's assessment of query, device and quality. That is why our contracts commit to zero validation errors, never to a rich result.

Is the schema added by a CMS plugin enough?

On most corporate sites it is not. Plugins produce one generic core graph; services, multi-location branches, dealer networks, multilingual structures and sector-specific relationships stay outside it. Worse, if two plugins emit a graph at the same time you end up with conflicting nodes. A plugin is a starting point, not a substitute for an entity model.

May I mark up content that is not visible on the page?

No. Google's structured data general guidelines require the markup to represent content that is visible to the user on the page. Marking up invisible content does not only forfeit rich result eligibility, it also creates manual action risk. The rule is simple: if it is not on the page, it is not in the graph.

How many JSON-LD blocks should a page have?

More than one block is technically valid, but on corporate sites we recommend a single block with a single @graph array. One block prevents the same entity being defined twice with different values and makes debugging far simpler. This site publishes exactly one JSON-LD block on every page.

Do I have to change my graph when schema.org is updated?

Usually not. Schema.org preserves backward compatibility and new releases mostly add types and properties. A change is needed when a property you use is deprecated, or when a search engine changes its requirements for a rich result type. For that reason we review the graph once a year and record the review date.

Who wrote this guide?

Erdi Baki

Founder · Baki Bilisim

This guide was written by Erdi Baki, founder of Baki Bilisim. He leads a team that combines corporate web delivery with search visibility engineering under a single line of accountability, and is technically responsible for the structured data, AEO and Core Web Vitals work.

Every number on this page carries a source and an access date. We publish the measured scores of our own site on the proof page; the team and the accountability structure are set out on the about page.

You may quote from this guide with attribution. Quotation terms: terms of use.

Find out within five working days whether your current graph is actually valid.

The audit is free and creates no obligation to work with us. The report itemises AEO answerability, AI crawler access, Core Web Vitals, structured data validity and WCAG 2.1 AA gaps.

We work with corporate-scale, multi-location or multilingual organisations. One-off small jobs fall outside our scope; in that case we point you to smaller studios.