JSON-LD Schema.org markup: increasing CTR through rich snippets

Pages don't get into rich snippets, and you lose clicks even though your content is stronger than competitors. We set up JSON-LD Schema.org markup turnkey: audit, implementation, validation, and documentation handover. You get rich snippets in search results and measurable click-through growth.

Development and maintenance of all types of websites:

Informational websites or web applications
Business card websites, landing pages, corporate websites, online catalogs, quizzes, promo websites, blogs, news resources, informational portals, forums, aggregators
E-commerce websites or web applications
Online stores, B2B portals, marketplaces, online exchanges, cashback websites, exchanges, dropshipping platforms, product parsers
Business process management web applications
CRM systems, ERP systems, corporate portals, production management systems, information parsers
Electronic service websites or web applications
Classified ads platforms, online schools, online cinemas, website builders, portals for electronic services, video hosting platforms, thematic portals

These are just some of the technical types of websites we work with, and each of them can have its own specific features and functionality, as well as be customized to meet the specific needs and goals of the client.

Frequently Asked Questions

JSON-LD markup: why pages don't get rich snippets

The markup is on the page, but there are no rich snippets in the search results — a typical situation.

The cause is almost always one of three: the JSON-LD block fails Schema.org validation, required properties are filled in formally, or the data in the markup diverges from the visible content.

The search engine cross-checks both sources and, in case of a discrepancy, simply ignores the block — the page stays with a regular snippet.

Then the effect kicks in, one that is noticed later through metrics: the position holds, but search CTR drops relative to competitors whose search results are occupied by rating stars, price, availability, breadcrumbs.

The user clicks on the more informative block, even if it's lower. Markup errors are not visible in the interface at the same time — the page looks fine, and the problem lives on for months.

A separate category is markup added template-style: the same block is served to all page types, fields are populated from shared variables, some properties are empty or contain placeholders. The validator shows warnings rather than errors, so the task never gets picked up.

We start by checking each page type: which entities are declared, whether they match what the user actually sees, and what exactly is blocking the display of the rich snippet.

We break down how this gets resolved — from an audit of the current JSON-LD markup to setting up regular Schema.org validation in the build so that new pages don't reproduce the same errors.

What correct markup delivers: measurable effects

Correct JSON-LD markup changes not the appearance of a page, but the way search engines read it: structured data describes entities — a product, an article, an organization, an event — and allows the search engine to build a rich snippet instead of a blue link with a fragment of text.

Markup is validated through the official validator and the structured data report in the webmaster panel, so the result is visible in measurable quantities, not in feelings.

The first effect is CTR growth. A rich snippet with a rating, price, availability, publication date, or breadcrumbs takes up more space in the SERP and answers part of the user's questions right in the search results.

Even with an unchanged position, the share of clicks grows, because the snippet captures attention from neighboring links without additional traffic from other channels.

The second is coverage of page types. We mark up not a single landing page, but the entire template range: product cards, categories, blog articles, service pages, contacts, FAQ, breadcrumbs.

Template-level markup at the level of frontend components means that new content receives structured data automatically, without manual work by an editor on each page.

The third is a reduction in manual edits. When markup is generated from the same data as the page itself, it does not diverge from the content when prices, stock, or headings are updated.

Errors are caught at the build stage, not weeks after publication, and a template fix closes hundreds of URLs at once instead of point-by-point corrections.

The fourth is markup automation. We embed JSON-LD generation into the build and into the CMS, add validation of required fields to the deployment process, and monitor the structured data report so that new page types do not fall out of coverage. Describe your project — we will come back with an estimate and an implementation plan.

Approaches to implementation: comparing options

Markup can be implemented in three fundamentally different ways, and the choice here determines not the "beauty of the code" but how predictably it will be updated along with the content.

Manually inserting a block into every page works only until the first mass update: edits to a product card template or changes to the breadcrumb structure have to be rolled out across hundreds of files.

Templates and server-side generation solve this in different ways, and each option has its own cost.

Option When it fits Limitations
Manual insertion into the page 5–20 static pages, infrequent edits, landing pages Inconsistencies between pages, manual errors in fields, does not scale
JSON-LD templates Same-type entities: products, articles, cards, events Logic gets more complex with conditional fields, the template duplicates data from the page markup
Application-side generation Catalogs, feeds, pages with data from a database or external sources Requires access to the data layer, needs cache and rendering control

How to choose between a template and generation

A template is convenient when the entity structure is stable: the set of fields is fixed, only the values change.

As soon as conditional blocks appear — the presence of a review, price variability, different page types within a single template — branching logic starts living inside the markup, and it becomes hard to maintain.

Application-side generation takes data from the same source as the page itself, so the markup does not diverge from the visible content. This is critical: a discrepancy between JSON-LD and what the user sees leads to rich snippets being dropped.

The limitation of this approach is that it requires access to the data layer and an understanding of how caching affects the block being served.

What to consider with any option

It is worth starting markup implementation with an inventory of page types: for each one, define the set of entities and required fields. Then — validation on a test set and error monitoring after release, because structured data breaks silently.

If the markup is currently inserted manually and diverges between sections, we will work out which implementation method will close this without rewriting the entire templating engine.

Work stages: from audit to handover

Markup breaks not at the implementation stage, but later: a content manager changes the product card template, a developer edits the price output — and Product with offers stops matching what the user sees.

That is why the work is structured not as "add a script" but as a process with a verifiable result at every step.

  1. Audit of the current markup. We collect all types that are already served on the pages: what is marked up, where duplicates are, where microdata conflicts with JSON-LD, which fields are empty or substituted from the template incorrectly. The output is a map of pages and a list of discrepancies between the markup and the actual content.
  2. Type schema. We determine which entities are needed for the business objectives — product, article, organization, breadcrumbs, questions and answers — and how they are linked via @id. We fix the required and recommended properties so that developers do not have to guess what to fill in.
  3. Output configuration. The markup is generated from the same data as the page itself: a single source for price, availability, rating, publication date. This eliminates the situation where the markup says one thing and the screen shows another.
  4. Validation. We run the templates through a validator and check how search engines see the result: which rich snippets are formed, where fields are dropped, where a type is not recognized.
  5. Handover and support regulations. We describe which fields are tied to which content blocks, and what to do when a template changes. The regulations answer a practical question: who checks the markup and at which step, so that it does not diverge from the content after the next edit.

This order delivers a predictable result: the markup remains valid not only on launch day, but also after releases. Describe your task — we will come back with an estimate and a plan for your website.

What the client receives

Markup lives not in a report, but in the repository and in the guidelines. That is why we hand over not "configured markup," but a set of artifacts by which your team or contractor can reproduce, verify, and extend it without us.

  • JSON-LD templates by page type: product page, service, article, contacts, FAQ, breadcrumbs. Each one with placeholder fields for your data structure, rather than hardcoded values.
  • A schema of relationships between entities — how Organization, WebSite, Product/Service, and BreadcrumbList reference each other via identifiers, so that the search engine assembles them into a single picture rather than reading them as disconnected blocks.
  • An implementation guide — where the block is embedded in the page template, how it is assembled from catalog or CMS data, and what to do when adding a new content type.
  • A validation procedure — which fields are mandatory, which are recommended, what counts as an error and what counts as a warning; the frequency of runs and the person responsible on your side.
  • A validation report — the result of a run across all page templates: which types were recognized, where mandatory fields remain unfilled, and which warnings were left in place intentionally.
  • A coverage map — a "page type → markup type → status" table, so that as the site grows it is clear where markup has not yet been deployed.
  • An acceptance checklist — a short list of checks by which you accept the work and repeat it with every release.

We separately record exactly what goes into monitoring: markup breaks silently — when a template changes, during a redesign, or when the catalog is updated, fields stop being populated, and this is only visible in the validation report. That is why the procedure includes regular runs, not a one-time setup.

Case study: how markup influenced visibility

The client — an online store with a catalog of several thousand items — came with a typical complaint: the positions are in the search results, but there are few clicks.

The audit showed that the site did have markup, but it was fragmentary: product cards returned only the name and link, there were no prices or availability in the structured data, and some pages contained validation errors that caused search engines to simply ignore the markup.

We started with an inventory: we went through the page templates and checked which entity types were actually described and which were inserted manually and diverged from the content.

Then we set up JSON-LD generation at the template level — so that the data was taken from the same sources as the page itself and could not diverge from it when the catalog was updated.

Schema.org in this case worked not on its own, but as a consequence of order: first a single data source, then the markup, then validation.

What changed in terms of metrics

Metric Before After
Share of pages with rich snippets about a third almost all product cards
CTR in search results for the catalog baseline growth of about a quarter on average
Markup validation errors hundreds isolated, under control

We separately noted the effect on pages with reviews and ratings: there the rich snippet takes up more space in the search results, and the growth in clicks turned out to be more noticeable than for regular product cards.

Errors that used to accumulate unnoticed are now caught at the build stage — the markup is checked automatically before publication, rather than after the page has already gone into the index.

The key takeaway for the client: markup pays off not on its own, but when it is tied to a live data source and checked in the build pipeline. Otherwise it quietly becomes outdated along with the catalog, and the site loses rich snippets without even noticing it.

How is JSON-LD different from microdata in HTML?

JSON-LD is a separate data block in <script type="application/ld+json"> that is not embedded in the markup itself.

Microdata and RDFa, by contrast, live directly in HTML attributes: itemscope, itemprop, itemtype are placed across the tags that describe the visible content.

For a search engine, both formats produce the same result — rich snippets in the search results — but they are maintained differently, and that determines the choice.

The key difference is how tightly the markup is coupled to the layout. In microdata, the data is spread across the DOM: to change a product's price or an article's date, you have to edit the same template that renders the page.

An error in a single itemprop breaks the entire entity, and during a redesign the markup is easily lost along with the old classes.

JSON-LD is moved into a separate node: the graph of objects is described as a whole, linked via @id, and does not depend on how the HTML is structured. A single block can be generated from the same data that goes to the API, and it will not suffer when the frontend changes.

The alternatives also have practical limitations. Microdata scales poorly on pages with repeating entities — product lists, catalogs, reviews: you have to duplicate attributes in every card, and any template edit is multiplied by the number of elements.

RDFa is more flexible, but it requires careful handling of namespaces and is less often supported by static site generators.

JSON-LD is free of these problems: it is assembled by a script, is easy to validate separately from the layout, and is supported by all major search engines.

JSON-LD itself has one limitation, but an important one: the data in it must match the visible content. If the markup specifies a price that is not on the page, the search engine will treat this as a violation and remove the rich snippet.

That is why we generate the block from the same sources as the page itself, rather than writing it by hand — then any discrepancy between the markup and the content is eliminated at the build level.

Common technical concerns

Markup rarely lives in a vacuum: most often it is already partially in place — from a theme template, from a plugin, from a previous contractor.

The first thing we do during an audit is take inventory: which object types are declared, where they are duplicated, where they diverge from the actual page content.

Search engines resolve duplicates and contradictions between JSON-LD markup blocks not in your favor — they simply ignore the conflicting block entirely, and the page loses its rich snippet.

We already have markup from a previous contractor — do we need to redo everything from scratch?

No. First we analyze the existing markup: what is valid, what is outdated, what conflicts. Usually we keep 60–70% of the blocks, fix types and relationships between objects, and remove duplicates.

A full rebuild is only needed where the markup was generated by a template without any connection to real data.

How do we avoid conflicts if markup is added by several systems?

We introduce a single source of truth: one JSON-LD markup generation layer, and we disable the other sources. If that is impossible, we establish priorities — which block is primary for each page type — and make sure fields are not overridden in conflicting directions.

A conflict between two blocks with the same @id is the most common reason a snippet fails to appear.

Is markup needed on every page without exception?

No, and trying to mark up everything indiscriminately is harmful. We set priorities by type: product and service cards, articles, contacts, breadcrumbs, questions and answers — wherever the search engine actually shows a rich result.

There is no point in marking up utility, technical, and thin pages — they do not participate in search results with rich snippets.

What happens if the markup diverges from the page content?

The search engine will compare the declared fields against the visible text and ignore mismatches, and with systemic discrepancies it may lower trust in the domain.

That is why we generate markup from the same data that is rendered on the page — then desynchronization is impossible in principle.

Let's discuss your task

To come back with an estimate and a plan rather than generalities, we need a minimum of input about your site: what types of pages there are (catalog, product pages, articles, services), what they are built on, and how the markup is currently delivered. That is enough to understand the scope and propose a workflow.

What we will request at the start:

  • the site address and access to a test environment or a database copy — to verify the markup on real templates rather than on examples;
  • a list of page types and priority: where rich snippets will deliver the greatest gain in impressions;
  • the current markup, if any: JSON-LD, microdata, or a mix of both — we will assess what to reuse and what to rewrite;
  • access to the webmaster panel and analytics — this will be needed for before-and-after comparison;
  • business requirements: what data about products, services, prices, and availability can be published openly;
  • a technical contact on the development side, if the site is managed by another team.

From there we work in stages: an audit of the current markup and page types, selection of suitable Schema.org schemas for each template, implementation of JSON-LD into the page markup, verification with validators and in the webmaster panel, then monitoring of rich snippets and adjustments. At each stage we record the result — what was done and how it is verified.

Describe the task and send the access credentials — we will come back with a timeline estimate, a work plan, and the team composition.

Our competencies:

Latest works

  • Development of a web application for FEEDME
    Development of a web application for FEEDME
    1393
  • Development of an online store for the company FURNORO
    Development of an online store for the company FURNORO
    1368
  • Development of a web application for Enviok
    Development of a web application for Enviok
    1139
  • CRM development for Chasseurs
    CRM development for Chasseurs
    1152
  • Website development for SBH Partners
    Website development for SBH Partners
    1231
  • Website development for Red Pear
    Website development for Red Pear
    641