SEO 15 Oct 2026 18 min read

Schema.org for Business in 2026: Which Markup Actually Works (and Which Does Not)

Which Schema.org structured data actually works in 2026: Organization, Article, BreadcrumbList, Product, LocalBusiness. What changed in Google, JSON-LD examples, validation, penalty risks, and a checklist.

Schema.org for Business in 2026: Which Markup Actually Works (and Which Does Not)

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: Organization with a logo and contacts, WebSite (with SearchAction if you have search), Article for the blog, BreadcrumbList for navigation.
  • Commerce and services: Service or Product depending on the business model; AggregateRating only 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:

BenefitHow it works
Entity understandingThe search engine more accurately determines who you are, what you offer, where you operate, and how to contact you
Rich resultsFor some types, the page can get extra elements in search (price, availability, rating, breadcrumbs, etc.)
Data consistencyA 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 typeStatus in Google search (as of 2026)What to do
FAQPageRich 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
HowToRich results discontinuedDo not invest resources for SERP appearance
WebSite + SearchAction (sitelinks searchbox)Separate search field in the snippet removedMarkup is harmless and helps with the site name, but there is no search-box effect
Review snippet for your own organizationSelf-serving reviews for LocalBusiness and Organization do not produce starsDo not mark up your own reviews for stars
BreadcrumbListBreadcrumb display in the snippet has changed over timeKeep it for understanding site structure
Several niche types (e.g. certain ad or info-block formats)Support reduced or discontinuedCheck 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 typeRich result in GoogleReal valueComplexityRiskPriority
OrganizationLogo, brand info, help in knowledge panelsHigh: identity foundationLowLowRequired
WebSiteSite name in search; search box no longer shownMediumLowLowRecommended
BreadcrumbListMay varyMedium: site structureLowLowRecommended
Article / BlogPostingFor news and Discover; generally helps understandingMediumLowLowFor the blog
Product + OfferPrice, availability, rating in snippets and shopping resultsHigh for e-commerceMediumMedium (data must match)Required for stores
LocalBusinessHelps local search together with the business profileHigh for local businessMediumLowFor local companies
ServiceNo separate rich resultMedium: understanding servicesMediumLowDesirable for service pages
Person (author)Strengthens E-E-A-T, link to profilesMediumLowLowDesirable for the blog
VideoObjectVideo in resultsHigh if you have videoMediumLowWhen video is present
Event / JobPosting / Course / RecipeSpecial results and carouselsHigh for matching sitesMediumMediumOnly when relevant
AggregateRating / ReviewStars only for supported types and independent reviewsHigh but riskyMediumHighOnly with real reviews
FAQPageMostly absent on commercial sitesLowLowLowOptional
HowToDiscontinuedLowLowLowNot 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, Article or BlogPosting are 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.
  • availability changes 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 (offers with priceSpecification) that match the content.
  • **Do not add AggregateRating to Service without 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 generic LocalBusiness, 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 LocalBusiness based 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; preferably contentUrl or embedUrl, duration.

Event, JobPosting, Course, Recipe, Software

  • Have special rich results and carousels.
  • Use only if the content truly matches the type (e.g. JobPosting only 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:

  1. JSON-LD in <head> or <body>, a separate script block.
  2. One connected graph instead of many scattered blocks: use @id and reference Organization, WebSite, WebPage, Article.
  3. Generate from CMS data, not by hand-copying: title, dates, author, price, availability fields are injected automatically.
  4. One markup source. If the theme, SEO plugin, and an extension all add it, you get duplicates and conflicts.
  5. Freshness: prices, availability, dates, contacts update together with the content.
  6. 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

ToolWhat 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 → EnhancementsReports by markup type, site-level errors, what changed after release
Search Console → Performance → Search appearanceClicks and impressions for pages with rich results
URL InspectionHow Google sees the page, rendered HTML
Crawler (Screaming Frog, etc.)Mass check of markup presence and validity across the site
Merchant CenterFor e-commerce: feed vs markup consistency

Validation order:

  1. Test every template (home, service, article, product, contacts) in Rich Results Test.
  2. Fix errors; assess warnings: they are not always critical.
  3. Compare markup with visible content.
  4. After release, watch Search Console reports for several weeks.
  5. 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.

MetricHow to look
Impressions and clicks for pages with rich resultsSearch Console → Search appearance
CTR before and afterCompare periods of equal length; exclude seasonality
Markup errorsEnhancements reports
Entity understandingBrand knowledge panel; correct name, logo, contacts in search
For e-commercePrice and availability display; number of products in shopping results
Organic conversionsGA4

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, Product is 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 + Offer from product prices and stock.
  • Align breadcrumbs (e.g. via pdoCrumbs) with BreadcrumbList markup.

Laravel / custom projects

  • Create a Blade component or service to generate JSON-LD from models.
  • Use packages like spatie/schema-org for 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 + Offer for 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 as Event.
  • Missing required properties and invalid JSON (trailing commas, unescaped quotes).
  • Stale data: price or availability in markup does not match the site; priceValidUntil in the past; ended jobs and events.
  • The same markup on every page when it does not match the content.
  • **Artificial dateModified updates** 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

PeriodActions
Days 1–5: auditInventory existing markup (theme, plugins, manual inserts); check Rich Results Test and Search Console; find duplicates and errors
Days 6–12: starter setOrganization, WebSite, WebPage, BreadcrumbList site-wide; verify contacts, logo, sameAs
Days 13–20: content and commerceArticle + Person for the blog; Service for services; Product + Offer for products; LocalBusiness if needed
Days 21–25: extend as neededVideoObject, Event, JobPosting only when relevant; be careful with ratings
Days 26–30: controlTemplate 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

  • Organization with name, logo, contacts, sameAs
  • WebSite (with SearchAction only if search exists)
  • BreadcrumbList aligned with visible navigation
  • Article/BlogPosting with author, dates, image for the blog

Commerce and services

  • Service on service pages (no invented prices)
  • Product + Offer for products; current price and availability
  • LocalBusiness (exact subtype) with consistent NAP, for local companies
  • AggregateRating/Review only 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
  • dateModified changes 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:

  1. Audit existing markup and remove duplicates.
  2. Close the starter set: Organization, WebSite, BreadcrumbList, Article.
  3. Add commercial types: Product + Offer, Service, LocalBusiness.
  4. Do not mark up invented or invisible content; ratings only with real reviews.
  5. Generate markup from the CMS as one connected graph.
  6. Validate in Rich Results Test, Schema Validator, and Search Console after every release.
  7. 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.

Request an audit at crope.pro

Oleksii Kovalenko
Oleksii Kovalenko
Lead Backend Developer