Article contents
In short: structured data is a machine-readable description of your page: who you are, what you offer, how much it costs, who wrote the article. The most convenient format is JSON-LD in the <head>. Markup doesn't lift rankings on its own, but it helps search engines and AI systems understand a page unambiguously, and for stores it unlocks rich results with price and availability.
What is structured data and why does it matter?
A person reads plain text easily, while an algorithm has to guess: is "$49" the product price or the shipping fee? Is "Alex" the author or a character in a case study? Structured data removes the guessing. You state the entity type (organisation, article, product, service) and its properties using the Schema.org vocabulary.
In practice it gives you:
- Rich results. Price, availability and rating for products; a clear path for pages with breadcrumbs.
- A clearer brand identity. Search engines connect your site, company name, logo and profiles more reliably.
- Better readiness for AI answers. Systems that assemble answers extract facts from structured pages more easily. This doesn't guarantee citations, but it removes ambiguity.
- A foundation for Merchant Center. Product data on the page and in the feed must match, and Product markup helps confirm it.
JSON-LD, Microdata or RDFa: which to choose?
Google recommends JSON-LD. It lives in a separate block and doesn't mix with HTML layout, so it is easier to add, change and test.
| Format | Where it goes | Maintenance |
|---|---|---|
| JSON-LD | A separate <script> in <head> or <body> |
Easy, independent of layout |
| Microdata | Attributes inside HTML tags | Medium, templates must be edited |
| RDFa | Attributes inside HTML tags | Medium, used less often |
For new projects choose JSON-LD and don't mix formats on one page.
Which markup types does a business site need?
| Type | Where to use it | Purpose |
|---|---|---|
Organization |
Homepage, About | Name, logo, contacts, social profiles |
WebSite |
Homepage | Site name, language |
BreadcrumbList |
All inner pages | Breadcrumbs in results |
Article / BlogPosting |
Blog posts | Author, dates, image |
Service |
Service pages | Service description, provider, area |
LocalBusiness |
Contacts, local pages | Address, hours, phone |
Product + Offer |
Product page | Price, currency, availability, brand |
FAQPage |
Pages with an FAQ section | Structures questions and answers |
Don't mark up everything. Use the types that match the real content of the page.
Example: Organization for the homepage
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "Kyivan",
"url": "https://kyivan.com/",
"logo": "https://kyivan.com/assets/logo.png",
"email": "hello@kyivan.com",
"sameAs": [
"https://t.me/example",
"https://www.linkedin.com/company/example"
]
}Insert the real data from your site. Contacts and profiles in the markup must match what visitors see.
Example: Article for a blog post
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "Article title",
"datePublished": "2026-09-19T10:00:00+03:00",
"dateModified": "2026-09-19T10:00:00+03:00",
"inLanguage": "en",
"image": "https://kyivan.com/assets/blog/cover.webp",
"author": { "@type": "Organization", "name": "Kyivan" },
"publisher": { "@type": "Organization", "name": "Kyivan" }
}datePublished and dateModified must match the dates visible on the page. Don't update dateModified without real changes to the text.
Example: Product and Offer for a product page
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Product name",
"image": ["https://example.com/img/product.webp"],
"brand": { "@type": "Brand", "name": "Brand" },
"sku": "ABC-123",
"offers": {
"@type": "Offer",
"url": "https://example.com/product/abc-123",
"priceCurrency": "UAH",
"price": "1490",
"availability": "https://schema.org/InStock",
"itemCondition": "https://schema.org/NewCondition"
}
}Price and availability in the markup must match the page and your Merchant Center feed. Mismatches are a typical reason for product disapprovals.
What changed with rich results?
Since 2023 Google has sharply limited rich results for FAQPage (mostly to well-known government and health sites) and removed HowTo rich results. That doesn't mean you should delete the markup: it remains a valid machine-readable description of the page. Just don't plan click growth around it. Check the current requirements in Google Search Central, because the list of supported types changes.
How do you add markup on MODX, WordPress and Laravel?
- MODX. Create a chunk with JSON-LD and placeholders (
Schema.org and Structured Data: A Complete JSON-LD Guide for Service Sites and Online Stores,2026-09-19 09:00:00) and include it in the template. For dynamic arrays (products, FAQ) a snippet that builds JSON withjson_encodeworks well. - WordPress. Use an SEO plugin that generates base markup, or print your own block in
wp_head. Make sure plugins don't duplicate each other's markup. - Laravel. Build an array in the controller or a view composer and print it with
@jsonin the Blade template. That way markup always reads from the same models as the page.
The key rule: markup data comes from the same source as the visible text. Then the two never drift apart.
How do you validate markup?
- Rich Results Test from Google shows which rich results are available for a page.
- Schema Markup Validator checks general correctness against Schema.org, even for types that give no rich result.
- Search Console enhancement reports show errors across the whole site, not one page.
- After deployment, check the code in the page's source HTML, not just in the inspector: markup must be in the server response or in the DOM after rendering.
Common markup mistakes
- Marking up things that aren't on the page (reviews, ratings, prices).
- Duplicates: an SEO plugin and the theme output different
Organizationblocks. - Invalid JSON: a trailing comma, unescaped quotes.
- Price without currency, or availability in free text instead of Schema.org values.
- Hidden text the visitor can't see.
- Stale data after prices or contacts change.
A 5-step rollout plan
- List your page templates: homepage, services, article, product, contacts.
- For each template pick the markup types from the table above.
- Pull data from a single source (CMS fields, models) instead of typing it by hand.
- Test one page per template in the Rich Results Test and the validator.
- Set up monitoring in Search Console and re-check after every template release.
FAQ
Does Schema.org affect rankings?
Google doesn't call markup a direct ranking factor. It helps understand the page and can produce rich results that influence click-through.
Does markup guarantee a rich snippet?
No. Google decides whether to show a rich result even when markup is valid.
Is markup needed for AI search?
There are no separate requirements, but structured data reduces ambiguity. It's a useful, though not mandatory, part of GEO.
Can you mark up reviews?
Only genuine reviews that visitors can see on the page. Self-published reviews of your own business in markup can be treated as a guideline violation.
How many markup types should a page have?
As many as match its content. For an article that is usually Article, BreadcrumbList and, if there is an FAQ section, FAQPage.
Does markup need updating?
Yes: when prices, contacts, company name or site structure change. Best of all is markup generated automatically from CMS data.
Want to know what's wrong with your site's markup? Request a free Kyivan audit — a developer will check Schema.org, validation errors and consistency between pages and your feed.
Web developer and SEO specialists. We write about technical SEO, Google Shopping and ads.