Structured data tells search engines explicitly what a page is about: which organisation publishes it, who wrote an article, where a page sits in the site hierarchy. It does not guarantee a rich result, and Google has narrowed several rich result types over time, so treat markup as a way to describe your content accurately rather than as a ranking trick.
Google recommends JSON-LD, placed in a <script type="application/ld+json"> block. The templates below use only properties documented by Google or schema.org. Replace every value in angle brackets, and delete any property you cannot fill truthfully.
Organization (site-wide, usually on the homepage)
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "<Legal or trading name>",
"url": "https://<your-domain>/",
"logo": "https://<your-domain>/<path-to-logo>.png",
"sameAs": [
"https://www.linkedin.com/company/<handle>",
"https://www.instagram.com/<handle>/"
]
}
Notes:
-
logoshould be a crawlable image URL. Google documents its logo requirements in the Organization structured data guidelines. - Only list profiles in
sameAsthat you actually control. - Only add
addressortelephoneif they are real and match what is shown on the page. Placeholder contact details in markup are worse than none.
Article (blog posts and guides)
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "<Title as shown on the page>",
"datePublished": "<YYYY-MM-DD>",
"dateModified": "<YYYY-MM-DD>",
"author": [{
"@type": "Person",
"name": "<Author name>",
"url": "https://<your-domain>/<author-page>"
}],
"image": ["https://<your-domain>/<hero-image>.jpg"]
}
Notes:
-
dateModifiedshould change only when the content meaningfully changes. - If the author is the organisation rather than a person, use
"@type": "Organization"for the author.
BreadcrumbList
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://<your-domain>/" },
{ "@type": "ListItem", "position": 2, "name": "Services", "item": "https://<your-domain>/services" },
{ "@type": "ListItem", "position": 3, "name": "<Current page>" }
]
}
The last item may omit item. The trail should match the breadcrumb that users see.
Service (describing what you offer on a service page)
Google does not currently show a dedicated rich result for Service, but the type is valid schema.org vocabulary and helps describe a page unambiguously.
{
"@context": "https://schema.org",
"@type": "Service",
"name": "<Service name>",
"serviceType": "<e.g. Search engine optimisation>",
"provider": { "@type": "Organization", "name": "<Your organisation>", "url": "https://<your-domain>/" },
"areaServed": ["<Country or region>"],
"url": "https://<your-domain>/<service-page>"
}
Types to handle with care
- FAQPage: since 2023 Google shows FAQ rich results only for a limited set of well-known, authoritative government and health sites. Marking up a genuine FAQ is still valid, but do not expect a visual result.
- HowTo: HowTo rich results have been deprecated in Google Search.
- Review / AggregateRating: self-serving reviews of your own business are not eligible for review snippets. Never mark up testimonials you cannot substantiate.
Validation workflow
- Validate syntax with the Schema Markup Validator.
- Check eligibility with Google's Rich Results Test.
- After deployment, watch the enhancement reports in Search Console for errors that appear at scale.
- Keep markup in the template, generated from the same data as the visible page, so the two cannot drift apart.
Further reading
- Google Search Central: Introduction to structured data
- Google Search Central: Structured data general guidelines
- Structured data is one small part of search visibility. For how it fits alongside content, authority and AI-search optimisation, see Gorilla Vibe's SEO and authority growth overview.
Top comments (0)