Structured data remains a steady interest for SEO specialists and site owners, but over recent years search engines have noticeably cut the number of rich results. We break it down without myths: which markup businesses should actually implement, which does nothing in search, where penalty risk hides, and how to verify the result — with ready JSON-LD examples.
01 In short: what you need to know
- Starter set:
Organizationwith a logo and contacts,WebSite(withSearchActionif you have search),Articlefor the blog,BreadcrumbListfor navigation. - Commerce and services:
ServiceorProductdepending on the business model;AggregateRatingonly with real reviews — otherwise penalty risk. - Validation: Rich Results Test, Schema Markup Validator, and monitoring in Search Console. Markup supports content; it does not replace it.
- Markup does not raise rankings by itself. It helps the search engine understand entities on the page and unlocks rich results where they still exist.
- There are fewer rich results. FAQ and HowTo almost never show; the sitelinks searchbox was removed. Orient yourself to what Google actually supports now.
- Mark up only what the user sees and what is true. Fake ratings and hidden data can lead to manual actions.
02 What Schema.org is and why business needs it
Schema.org is a shared vocabulary of types and properties used to mark up entities on a page: organization, service, product, article, author, address, price, review. You add the markup to the page code, and search engines understand it without guessing.
The business benefit has three parts:
| Benefit | How it works |
|---|---|
| Entity understanding | The search engine more accurately determines who you are, what you offer, where you operate, and how to contact you |
| Rich results | For some types, the page can get extra elements in search (price, availability, rating, breadcrumbs, etc.) |
| Data consistency | A single source of truth about the company for different systems (search, maps, assistants) |
Formats: JSON-LD (recommended by Google), Microdata, RDFa. In practice use JSON-LD: it is separate from the markup and easier to maintain.
Important distinction: Schema.org contains hundreds of types, while Google supports only a limited subset for rich results. Markup for types outside Google's list does not always produce a visual effect, but it can still help understanding.
03 What changed: why there are fewer rich results
Over recent years Google has simplified the SERP. For business that means expectations of "stars and questions in the snippet" often do not come true.
| Markup type | Status in Google search (as of 2026) | What to do |
|---|---|---|
| FAQPage | Rich results only for a limited set of authoritative sites (government, medical) | Markup is allowed, but do not expect a visual effect on a commercial site |
| HowTo | Rich results discontinued | Do not invest resources for SERP appearance |
| WebSite + SearchAction (sitelinks searchbox) | Separate search field in the snippet removed | Markup is harmless and helps with the site name, but there is no search-box effect |
| Review snippet for your own organization | Self-serving reviews for LocalBusiness and Organization do not produce stars | Do not mark up your own reviews for stars |
| BreadcrumbList | Breadcrumb display in the snippet has changed over time | Keep it for understanding site structure |
| Several niche types (e.g. certain ad or info-block formats) | Support reduced or discontinued | Check the current list in Google documentation |
The list of types Google supports changes. Before investing in a specific markup, check the current documentation (Google Search Central → Structured data gallery) and Search Console reports.
Takeaway: markup remains useful, but its effect is primarily understanding and data accuracy, not a guaranteed "pretty" SERP.
04 Priority matrix: what to implement
The assessment is approximate and depends on the site type.
| Markup type | Rich result in Google | Real value | Complexity | Risk | Priority |
|---|---|---|---|---|---|
| Organization | Logo, brand info, help in knowledge panels | High: identity foundation | Low | Low | Required |
| WebSite | Site name in search; search box no longer shown | Medium | Low | Low | Recommended |
| BreadcrumbList | May vary | Medium: site structure | Low | Low | Recommended |
| Article / BlogPosting | For news and Discover; generally helps understanding | Medium | Low | Low | For the blog |
| Product + Offer | Price, availability, rating in snippets and shopping results | High for e-commerce | Medium | Medium (data must match) | Required for stores |
| LocalBusiness | Helps local search together with the business profile | High for local business | Medium | Low | For local companies |
| Service | No separate rich result | Medium: understanding services | Medium | Low | Desirable for service pages |
| Person (author) | Strengthens E-E-A-T, link to profiles | Medium | Low | Low | Desirable for the blog |
| VideoObject | Video in results | High if you have video | Medium | Low | When video is present |
| Event / JobPosting / Course / Recipe | Special results and carousels | High for matching sites | Medium | Medium | Only when relevant |
| AggregateRating / Review | Stars only for supported types and independent reviews | High but risky | Medium | High | Only with real reviews |
| FAQPage | Mostly absent on commercial sites | Low | Low | Low | Optional |
| HowTo | Discontinued | Low | Low | Low | Not a priority |
05 Starter set: Organization, WebSite, BreadcrumbList, Article
Describe entities as one connected graph (@graph) with @id identifiers so types reference each other instead of duplicating.
Example: homepage (Organization + WebSite + WebPage)
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"@id": "https://example.com/#organization",
"name": "CROPE",
"url": "https://example.com/",
"logo": {
"@type": "ImageObject",
"url": "https://example.com/assets/images/logo.png",
"width": 512,
"height": 512
},
"sameAs": [
"https://www.linkedin.com/company/your-company",
"https://www.facebook.com/your-company",
"https://clutch.co/profile/your-company"
],
"contactPoint": [{
"@type": "ContactPoint",
"telephone": "+380XXXXXXXXX",
"contactType": "customer service",
"areaServed": "UA",
"availableLanguage": ["uk", "en"]
}]
},
{
"@type": "WebSite",
"@id": "https://example.com/#website",
"url": "https://example.com/",
"name": "CROPE",
"inLanguage": "en",
"publisher": { "@id": "https://example.com/#organization" },
"potentialAction": {
"@type": "SearchAction",
"target": "https://example.com/search?q={search_term_string}",
"query-input": "required name=search_term_string"
}
},
{
"@type": "WebPage",
"@id": "https://example.com/#webpage",
"url": "https://example.com/",
"name": "CROPE: website and web platform development",
"isPartOf": { "@id": "https://example.com/#website" },
"about": { "@id": "https://example.com/#organization" }
}
]
}
</script>Nuances:
- Logo: square or with a supported aspect ratio; available at the URL; in a format the search engine understands.
- **
sameAs:** only real, up-to-date profiles (social networks, directories, Wikipedia/Wikidata when available). - **
SearchAction:** add only if the site has working search. Keep in mind Google no longer shows a search field in the snippet, so this block is optional. - Contacts: mark up the data that appears on the page (phone, email, address).
Example: BreadcrumbList
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://example.com/" },
{ "@type": "ListItem", "position": 2, "name": "Blog", "item": "https://example.com/blog" },
{ "@type": "ListItem", "position": 3, "name": "Schema.org for business" }
]
}
</script>Breadcrumbs in markup must match the visible navigation on the page.
Example: Article with author (Person)
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "Schema.org for business: which markup actually works",
"description": "Which structured data businesses should implement in 2026",
"image": ["https://example.com/assets/data/blog/schema-org.jpg"],
"datePublished": "2026-07-14T09:00:00+03:00",
"dateModified": "2026-10-15T10:00:00+03:00",
"inLanguage": "en",
"author": {
"@type": "Person",
"name": "Author Name",
"url": "https://example.com/about#author",
"jobTitle": "Lead Backend Developer"
},
"publisher": { "@id": "https://example.com/#organization" },
"mainEntityOfPage": "https://example.com/blog/schema-org-dlya-biznesu"
}
</script>- Change **
dateModified** only when the content actually changes. - The author must match what is shown on the page.
- For a company blog,
ArticleorBlogPostingare both fine.
06 Commerce and services: Product, Service, LocalBusiness
Product + Offer (online stores)
The foundation of e-commerce markup. Data must match the visible price and availability on the page and, when present, the Merchant Center feed.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Entrance door \"Model 12\"",
"image": ["https://example.com/img/door-12-1.webp"],
"description": "Insulated entrance door with anti-vandal lock",
"sku": "DOOR-12",
"brand": { "@type": "Brand", "name": "Brand" },
"offers": {
"@type": "Offer",
"url": "https://example.com/catalog/door-12",
"priceCurrency": "UAH",
"price": "15900",
"priceValidUntil": "2026-12-31",
"availability": "https://schema.org/InStock",
"itemCondition": "https://schema.org/NewCondition"
}
}
</script>Rules:
- Price and currency are current and match what the buyer sees.
availabilitychanges together with stock.- For variants (color, size) use a consistent scheme, not duplicates.
- Add a rating only with real reviews (see the next section).
- Extra shipping and return data can be marked up with supported properties.
Service (service pages)
Services have no separate rich result in Google, but the markup helps clarify what exactly you offer and for whom.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Service",
"name": "Online store development",
"serviceType": "Web development",
"description": "Online store development on MODX, WordPress, and Laravel with integrations",
"provider": { "@id": "https://example.com/#organization" },
"areaServed": { "@type": "Country", "name": "Ukraine" },
"url": "https://example.com/services/online-store-development"
}
</script>- Do not add invented prices. If you state them, use real ranges (
offerswithpriceSpecification) that match the content. - **Do not add
AggregateRatingtoServicewithout grounds:** there is no separate rich result for it, and the risk remains.
LocalBusiness (local companies)
For businesses with a physical address or service area. It works together with the business profile in maps.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "ProfessionalService",
"@id": "https://example.com/#localbusiness",
"name": "CROPE",
"url": "https://example.com/",
"telephone": "+380XXXXXXXXX",
"image": "https://example.com/assets/images/office.jpg",
"address": {
"@type": "PostalAddress",
"streetAddress": "1 Prykladna St.",
"addressLocality": "Vinnytsia",
"postalCode": "21000",
"addressCountry": "UA"
},
"geo": { "@type": "GeoCoordinates", "latitude": 49.2328, "longitude": 28.4810 },
"openingHoursSpecification": [{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
"opens": "09:00", "closes": "18:00"
}],
"priceRange": "$$"
}
</script>- Data (name, address, phone, hours) must match the Google business profile, the site, and directories (NAP consistency).
- Use the most specific subtype (e.g.
ProfessionalService,Dentist,Store), not genericLocalBusiness, when a subtype exists. - For local SEO, the Google Business Profile is often more important than the markup itself.
07 Reviews and ratings: where the line is
AggregateRating and Review are the most "tempting" and riskiest types.
Allowed:
- Mark up real reviews that are visible on the page.
- For
Product, mark up reviews from buyers of that product. - The rating must reflect the real count and average score.
Forbidden or risky:
- Invented ratings and review counts.
- Reviews that are not on the page.
- "Stars" markup for your own organization or
LocalBusinessbased on reviews you collected on your own site (self-serving reviews): they do not produce rich results, and mistakes hurt. - Copying reviews from third-party sites without permission.
- The same rating on every page when it does not match the content.
Risk. For structured data policy violations Google can apply manual actions (removing rich results site-wide or a significant drop in trust). The "stars in the snippet" bet is not worth that risk.
08 FAQ, HowTo, Video, and other types
FAQPage
- For most commercial sites there will be no rich results.
- Markup is allowed if questions and answers are actually on the page.
- It may help structure understanding, but do not expect click growth.
VideoObject
- For pages with video: helps appear in video results and key moments.
- Required:
name,thumbnailUrl,uploadDate,description; preferablycontentUrlorembedUrl,duration.
Event, JobPosting, Course, Recipe, Software
- Have special rich results and carousels.
- Use only if the content truly matches the type (e.g.
JobPostingonly for real open roles). - Follow required properties and freshness (remove or update ended events and jobs).
Person / ProfilePage
- Authors and experts: strengthen trust in content and links to profiles.
- Mark up only real, visible data.
What not to mark up
- Content that is not on the page.
- Types that do not match the content (e.g. an article as
Product). - Everything "for the checklist": more markup does not mean better.
09 Markup for AI search and entity understanding
In 2026 users increasingly get answers from AI overviews and assistants. What can be said honestly:
- There is no special markup "for AI overviews". The foundation is the same: accessible, quality, clearly structured content.
- Structured data helps unambiguously identify entities (company, service, author, product), which is useful to any system collecting facts about you.
- Data consistency (name, address, phone, profiles,
sameAs) reduces confusion across sources. - Do not promise clients "getting into AI answers thanks to markup": there are no guarantees.
- For quickly notifying about page updates, sitemap and, for Bing and some systems, IndexNow are useful.
10 How to implement: JSON-LD and @graph
Principles:
- JSON-LD in
<head>or<body>, a separate script block. - One connected graph instead of many scattered blocks: use
@idand referenceOrganization,WebSite,WebPage,Article. - Generate from CMS data, not by hand-copying: title, dates, author, price, availability fields are injected automatically.
- One markup source. If the theme, SEO plugin, and an extension all add it, you get duplicates and conflicts.
- Freshness: prices, availability, dates, contacts update together with the content.
- Match visible content: markup must not diverge from what the user sees.
Example: generating JSON-LD on the server (PHP)
<?php
$schema = [
'@context' => 'https://schema.org',
'@type' => 'Article',
'headline' => $page['title'],
'datePublished' => $page['published_at']->toAtomString(),
'dateModified' => $page['updated_at']->toAtomString(),
'author' => ['@type' => 'Person', 'name' => $page['author_name']],
'publisher'=> ['@id' => $baseUrl . '/#organization'],
'mainEntityOfPage' => $page['url'],
];
?>
<script type="application/ld+json">
<?= json_encode($schema, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT) ?>
</script>Use json_encode, not manual string concatenation, so quotes and special characters do not break the JSON.
11 Validation and monitoring
| Tool | What it is for |
|---|---|
| Rich Results Test (Google) | Whether the page qualifies for rich results; errors and warnings |
| Schema Markup Validator (schema.org) | General syntax and type validation, independent of Google |
| Search Console → Enhancements | Reports by markup type, site-level errors, what changed after release |
| Search Console → Performance → Search appearance | Clicks and impressions for pages with rich results |
| URL Inspection | How Google sees the page, rendered HTML |
| Crawler (Screaming Frog, etc.) | Mass check of markup presence and validity across the site |
| Merchant Center | For e-commerce: feed vs markup consistency |
Validation order:
- Test every template (home, service, article, product, contacts) in Rich Results Test.
- Fix errors; assess warnings: they are not always critical.
- Compare markup with visible content.
- After release, watch Search Console reports for several weeks.
- Recheck markup after every template, plugin, and CMS update.
Markup supports content; it does not replace it. If the page is weak, markup will not save it.
12 How to measure the effect
The markup effect is hard to separate from other changes, so evaluate carefully.
| Metric | How to look |
|---|---|
| Impressions and clicks for pages with rich results | Search Console → Search appearance |
| CTR before and after | Compare periods of equal length; exclude seasonality |
| Markup errors | Enhancements reports |
| Entity understanding | Brand knowledge panel; correct name, logo, contacts in search |
| For e-commerce | Price and availability display; number of products in shopping results |
| Organic conversions | GA4 |
Realistic expectations: markup usually improves understanding and display accuracy, not a sharp ranking jump. Where rich results exist (products, video, events, jobs), the CTR effect can be noticeable.
13 Platform specifics: WordPress, MODX, Laravel, OpenCart
WordPress
- One SEO plugin (Yoast SEO, Rank Math, SEOPress) generates base
Organization,WebSite,Article,BreadcrumbList. Disable duplicate markup from the theme and other plugins. - For WooCommerce,
Productis generated automatically, but verify prices, availability, and reviews. - For non-standard types (
Service,LocalBusiness) use plugin settings or custom templates.
MODX
- Generate JSON-LD in templates via chunks and snippets, injecting resource fields (
pagetitle,longtitle,description,introtext, dates, TVs). - For miniShop2/MiniShop3 build
Product+Offerfrom product prices and stock. - Align breadcrumbs (e.g. via pdoCrumbs) with
BreadcrumbListmarkup.
Laravel / custom projects
- Create a Blade component or service to generate JSON-LD from models.
- Use packages like
spatie/schema-orgfor type-safe markup construction. - For Vue/Nuxt: form metadata and JSON-LD at the page level (SSR/SSG) so they are in the initial HTML.
- Add automated tests that check JSON validity and required fields.
use Spatie\SchemaOrg\Schema;
$article = Schema::article()
->headline($post->title)
->datePublished($post->published_at)
->dateModified($post->updated_at)
->author(Schema::person()->name($post->author->name))
->publisher(Schema::organization()->name('CROPE'));
echo $article->toScript();OpenCart and online stores
Product+Offerfor every product: price, currency, availability, SKU, brand, images.- Data must match the visible price and the Merchant Center feed.
- Mark up only real, visible reviews.
- Control duplicate markup from the theme and modules.
14 Common mistakes and penalty risks
- Marking up what is not on the page (hidden text, prices, reviews).
- Invented ratings and reviews. The most common cause of manual actions.
- Self-serving reviews for your own organization for stars.
- Duplicates and conflicts: theme, plugin, and extension add different markup at once.
- Wrong types: article as
Product, service asEvent. - Missing required properties and invalid JSON (trailing commas, unescaped quotes).
- Stale data: price or availability in markup does not match the site;
priceValidUntilin the past; ended jobs and events. - The same markup on every page when it does not match the content.
- **Artificial
dateModifiedupdates** without real changes. - Betting on markup instead of content: it does not replace a quality page.
- No post-release validation: markup "breaks" quietly.
- Expecting markup to guarantee a rich result: Google decides whether to show it.
15 30-day implementation plan
| Period | Actions |
|---|---|
| Days 1–5: audit | Inventory existing markup (theme, plugins, manual inserts); check Rich Results Test and Search Console; find duplicates and errors |
| Days 6–12: starter set | Organization, WebSite, WebPage, BreadcrumbList site-wide; verify contacts, logo, sameAs |
| Days 13–20: content and commerce | Article + Person for the blog; Service for services; Product + Offer for products; LocalBusiness if needed |
| Days 21–25: extend as needed | VideoObject, Event, JobPosting only when relevant; be careful with ratings |
| Days 26–30: control | Template testing, automated checks, Search Console monitoring, documentation (what, where, and why is marked up) |
16 Structured data checklist
Foundation
- JSON-LD format, valid syntax
- One connected graph with
@id, no duplicates from theme and plugins - Markup matches visible content on the page
Starter set
Organizationwith name, logo, contacts,sameAsWebSite(withSearchActiononly if search exists)BreadcrumbListaligned with visible navigationArticle/BlogPostingwith author, dates, image for the blog
Commerce and services
Serviceon service pages (no invented prices)Product+Offerfor products; current price and availabilityLocalBusiness(exact subtype) with consistent NAP, for local companiesAggregateRating/Reviewonly with real visible reviews
Validation
- All templates tested in Rich Results Test and Schema Markup Validator
- Errors fixed, warnings assessed
- Search Console Enhancements reports configured and reviewed
- Recheck after every template and plugin update
Risks
- No hidden or invented content in markup
- No self-serving reviews for stars
dateModifiedchanges only on real edits- Documented what is marked up and where
17 FAQ
What is Schema.org in plain terms?
It is a vocabulary for adding hints in page code for search engines: who you are, what you offer, how much it costs, where you are. JSON-LD is the best format for this.
Does markup affect Google rankings?
Not directly: it is not a "ranking button". Markup helps understand the page better and can unlock rich results, which affects CTR. Ranking is still driven by content, links, speed, and user experience.
Which markup should a business implement first?
Organization (with logo and contacts), WebSite, BreadcrumbList, Article for the blog. Then by business type: Product + Offer for stores, Service for services, LocalBusiness for local companies.
Is FAQ markup needed?
For most commercial sites the Q&A rich result is not shown: Google left it only for a limited set of authoritative sites. You can add markup if FAQ is really on the page, but do not expect click growth.
Can you add AggregateRating to a service page?
Only with real reviews visible on the page. For your own organization and local business, reviews collected on your own site do not produce stars in search, and incorrect markup risks penalties. Services have no separate rich result, so the risk is not justified.
Does SearchAction markup still work?
Google removed the separate search field from the snippet, so there is no visual effect. The markup is harmless and may help with the site name, but it is not a priority.
How do you validate markup?
Rich Results Test (for rich results), Schema Markup Validator (general validation), Enhancements and Search appearance reports in Search Console, plus a crawler for mass site checks.
What if the theme and plugin add duplicate markup?
Keep one source: disable markup generation in the theme or extra plugin, or configure the SEO plugin to own everything. Verify the result in Rich Results Test.
Does markup help get into AI answers?
There is no special markup for that, and no one gives guarantees. Structured data helps unambiguously identify the company, services, and author, but the foundation is quality, crawlable content and consistent data.
How often should you update markup?
Automatically together with content: prices, availability, dates, contacts. Recheck markup after every template, plugin, and CMS update, and regularly review Search Console reports.
18 Summary
Schema.org in 2026 is not a "magic button" for stars in search — it is a precision tool: it helps search engines unambiguously understand who you are, what you offer, and what backs your claims. There are fewer rich results, so the right strategy is to close the starter set, add markup by business type, and avoid penalty risk.
Action order:
- Audit existing markup and remove duplicates.
- Close the starter set:
Organization,WebSite,BreadcrumbList,Article. - Add commercial types:
Product+Offer,Service,LocalBusiness. - Do not mark up invented or invisible content; ratings only with real reviews.
- Generate markup from the CMS as one connected graph.
- Validate in Rich Results Test, Schema Validator, and Search Console after every release.
- Remember: markup supports content; it does not replace it.
Need a structured data audit for your site?
We will review your existing markup, find errors and duplicates, implement the types your business needs, and set up monitoring so the markup works without penalty risk.