You have probably seen search results that look richer than the others. One shows star ratings. One shows a price and whether the item is in stock. One shows a small trail of links instead of a long web address. Those are called rich results, and they are not something Google decides to grant you out of goodwill.
They appear because the page told Google, in code, what its content actually was. That code is schema markup. Without it, a search engine reads your page the way you would read a page in a language you do not speak. It can see the shapes. It cannot be sure what any of it means.
This guide explains what schema markup is, what each rich result actually looks like, which types your business genuinely needs, how to check yours is working, and the handful of mistakes that quietly break it.
What Schema Markup Actually Is
Schema markup is a block of code that labels the things on your page. Not the layout, not the styling, the meaning.
Take a page for a hardware shop in Nairobi. A human reads it and understands instantly that "Kimathi Hardware" is the business name, that "KSh 4,500" is a price, that "Mon to Sat, 8am to 6pm" is opening hours, and that "Ngara" is a location. None of that is obvious to a machine. The word Ngara is just a word. The number 4,500 is just a number.
Schema is how you say it out loud in a format built for machines. It comes from schema.org, a shared vocabulary that Google, Bing, Microsoft and Yahoo all agreed on, which is why one block of markup works everywhere rather than needing a version per search engine.
What a Rich Result Looks Like
This is the part most explanations skip, and it is the part that makes the effort feel worth it. Here is what you actually get.
| Rich result | What appears | Markup that earns it |
|---|---|---|
| Breadcrumb trail | wpfoss.ke › Services › Web Design, instead of a long URL | BreadcrumbList |
| Star ratings | Gold stars and a review count under the title | Review, AggregateRating |
| Price and stock | KSh 4,500, In stock | Product with Offer |
| Article card | Larger image, headline and publish date | Article, BlogPosting |
| Business panel | Address, hours, phone in a side panel | LocalBusiness |
| Event listing | Date, time and venue in the result | Event |
| Sitelinks search box | A search field inside your result | Retired by Google in 2023 |
Two of those need an honest footnote, because outdated advice about both is still everywhere.
FAQ dropdowns are effectively gone. In 2023 Google restricted FAQ rich results to government and health sites. If you run an ordinary business, FAQ markup will no longer give you the expanding question list in search results. It is still worth adding, because AI answer engines read it happily, but do not add it expecting a visible change in Google.
The sitelinks search box is retired. Plenty of sites still carry markup declaring a search endpoint that Google stopped using. If your site does not even have a search function, that markup is describing a feature you do not have, which is worse than having none.
Which Types Your Site Actually Needs
There are hundreds of schema types. You need a handful. Adding more is not better, and every type you add is another thing that can drift out of step with your page.
Every site
The non-negotiable three.
- Organization or LocalBusiness
- BreadcrumbList
- Article or BlogPosting on posts
If it applies
Add only when the page genuinely is this.
- Product, for a shop
- Service, for a service page
- Event, for real events
Probably skip
Retired, restricted or rarely earned.
- HowTo, retired in 2023
- Speakable, news publishers only
- SearchAction, retired
One Business, One Entity
This is the mistake we see most, and it is invisible until someone looks for it.
A business describes itself on its home page as an Organization. Then the about page describes it again, slightly differently. Then each service page describes it again inside the provider field, with fewer details. Nothing links these descriptions together, so a search engine has no way of knowing whether it is looking at one business or four similar ones.
The fix is a single identifier. You define the business properly once, give it an @id, and everywhere else on the site you reference that id instead of repeating the details.
{
"@type": "LocalBusiness",
"@id": "https://example.co.ke/#organization",
"name": "Kimathi Hardware",
"telephone": "+254700000000",
"address": { "@type": "PostalAddress", "addressLocality": "Nairobi" }
}
{
"@type": "Service",
"name": "Plumbing supplies",
"provider": { "@id": "https://example.co.ke/#organization" }
}
That second block inherits every property of the first. Change the phone number in one place and the whole site is correct. Repeat the details instead and you have a maintenance problem that grows with every page you add.
One more rule for this block. Your social profile links, the sameAs list, must be identical everywhere they appear. A home page listing five profiles and an about page listing four is exactly how one business becomes two in a machine's eyes.
Breadcrumbs, Products, Reviews and Events
BreadcrumbList
The cheapest win on this list. It lets Google show a readable trail instead of your URL, and it takes a few lines per page. Positions must be numbered in order, and each item needs a full address rather than a relative path.
{
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Home",
"item": "https://example.co.ke/" },
{ "@type": "ListItem", "position": 2, "name": "Services",
"item": "https://example.co.ke/services/" }
]
}
Product
For a shop, this is what puts a price and stock status into your result. It needs a name, an image and an offer with a price and currency. Use KES for Kenyan pricing, and make sure the price in the markup is the price on the page, including after a sale ends.
Review and AggregateRating
Here is the trap. You cannot add review markup for reviews of your own business, written by you. Google calls that self-serving review markup and disallows it on Organization and LocalBusiness. It can earn a manual penalty rather than stars.
What is allowed is review markup on products or services you list, using genuine customer reviews you actually collected. If your reviews live on your Google Business Profile, they already show in Maps and the business panel, and you do not need markup to earn that.
Event
Only if you run real events with a date, a time and a place. A training session, a launch, a service day. Every Event needs a start date and a location, and Google is strict about both.
Blog Posts, and the Date Trap
Every blog post should carry Article or BlogPosting markup with a headline, an image, a publish date and an author. The image matters more than people expect. Google asks for at least 1200 pixels wide, and a squeezed logo does not qualify.
Now the trap, and it is one that gets sites into genuine trouble.
Article markup has two date fields, datePublished and dateModified. It is tempting to set dateModified to today on every page automatically, so everything looks fresh. Do not. If a page has not changed, saying it was modified today is a false freshness signal, and a whole site claiming every page was revised on the same day is a pattern search engines actively look for.
2026-09-05T09:00:00+03:00 instead of 2026-09-05. The offset removes any ambiguity about which day you meant.
Where the Code Goes
Schema goes inside a script tag with the type application/ld+json, in the head of the page or at the end of the body. Both work.
There are two ways to write structured data. The older approach, microdata, scatters attributes through your existing HTML. The newer one, JSON-LD, keeps everything in one self-contained block. Use JSON-LD. Google recommends it, and the practical reason is maintenance: one block you can read and check, rather than labels buried across a page that break the moment someone edits the layout.
If you are on WordPress, a plugin will produce most of this for you. Rank Math and Yoast both output Organization, BreadcrumbList and Article markup without you writing a line. Check what they emit rather than assuming, because defaults are generic and often describe a business slightly differently from how you would.
How to Check Yours Is Working
Three tools, and they answer three different questions. People often use one and assume it covers the others.
| Tool | Answers | Use it when |
|---|---|---|
| Google Rich Results Test | Which rich results can this page earn? | Checking one page after a change |
| Schema.org Validator | Is this markup valid at all? | Debugging markup Google ignores |
| Search Console, Enhancements | What is broken across my whole site? | Ongoing monitoring |
The Rich Results Test only reports on types Google actually uses for rich results, so valid markup for a type Google does not support will appear to be missing. That is when the Schema.org Validator earns its place: it checks the markup on its own terms rather than Google's.
Search Console is the one people neglect and the one that matters over time. It reports errors across every page it has crawled, which is how you find the one product page with a broken price rather than the ninety-nine that are fine. Our guide to Google Search Console covers where that report sits.
The Mistakes That Break It
- Markup that does not match the page. This is the big one. If your schema says a product costs KSh 3,000 and the page says KSh 4,500, or your FAQ markup contains questions a visitor cannot see anywhere, you are describing a page that does not exist. Google treats that as spam, not as an error.
- Missing required properties. Each type has fields Google needs. Product without an offer, Event without a start date, Article without an image. The Rich Results Test names the missing field.
- Bare dates instead of timestamps. Valid, but ambiguous. Add the time and the offset.
- Relative URLs. Every URL inside schema must be complete, starting with https, not
/services/. - The same business described four different ways. Covered above. Use one
@id. - Markup for features you do not have. A search endpoint on a site with no search, opening hours on a business with no premises.
- Broken JSON. A single trailing comma stops the entire block being read, silently. This is why the validator is worth a minute after every edit.
If you fix only one thing from this list, make it the first. Everything else is a technical error that costs you a rich result. Markup that contradicts the visible page is the one that can cost you more than that.
Frequently Asked Questions
What is schema markup in simple terms?
Schema markup is a small block of code that labels what is on your page. A human reads a page and understands that 4,500 is a price and Tuesday is an opening day. A machine has to be told. Schema is how you tell it.
Does schema markup improve my Google rankings?
Not directly. Schema is not a ranking factor. What it does is change how your existing result looks, and a result with star ratings, prices or a breadcrumb trail gets clicked more often than a plain one. The gain is in clicks, not position.
Which schema types does a small business website need?
Most business sites need three. Organization or LocalBusiness for the business itself, BreadcrumbList on every page below the home page, and Article or BlogPosting on each blog post. Shops add Product. Everything else is optional.
Do FAQ rich results still work?
Mostly not. Google restricted FAQ rich results in 2023 to government and health sites, so an ordinary business no longer gets the dropdown in search results. FAQ markup is still worth adding because AI answer engines read it, but do not expect a visible change in Google.
Can I add review stars to my own website?
Not for reviews of your own business written by you. Google disallows self-serving review markup on an Organization or LocalBusiness, and it can trigger a manual penalty. Review markup is for reviews of products or services you list, collected from real customers.
Where should the schema code go on my page?
In a script tag of type application/ld+json, in the head or at the end of the body. Google recommends JSON-LD over the older microdata approach because it sits in one block instead of being scattered through your HTML, which makes it far easier to maintain.
How do I check whether my schema is working?
Use Google's Rich Results Test for a single page to see which rich results it qualifies for, the Schema.org Validator to check the markup itself, and the Enhancements section of Google Search Console to see errors across your whole site over time.
Want this set up properly on your site?
Every site we build ships with structured data configured, validated and pointing at a single business entity. Websites start from KES 20,000, and SEO with schema included is KES 10,000 a month. Talk to us on WhatsApp at +254 722 334 188 or email hello@wpfoss.ke.
Book a Free ConsultationRelated: SEO Services Kenya · Web Design Kenya · Optimising for AI Search · Free Meta Tag Checker