Service
Service is the schema.org base type for any professional service offering. It covers consulting, repair, transportation, financial services, food delivery, broadcasting, government programs, and web APIs. Anything intangible that someone provides in exchange for something.
The example below is the Xoo Code Schema Markup Audit, a professional service Xoo Code Inc. offers on top of its XooStructured IDE product. Clients submit their site URL; the team audits all JSON-LD against Google's rich result requirements using XooStructured internally and delivers a graded report. It follows the schema.org/Service vocabulary, with provider referencing the Organization example and availableChannel referencing the LocalBusiness for in-person delivery.
A second angle on subtype selection
Back in the EducationalOrganization example, we taught the most important meta-lesson of schema.org: pick the most specific subtype available. Service is another place that lesson applies. Schema.org has TaxiService, FinancialService, BroadcastService, CableOrSatelliteService, FoodService, GovernmentService, and WebAPI. If your service fits any of these, use the subtype. Base Service is the right choice only when the service doesn't fit cleanly into any subtype, which is the case for XooStructured's Schema Markup Audit (no specific subtype matches "professional schema consulting").
A second angle on rich result eligibility
Service has no dedicated Google rich result. It surfaces through Knowledge Panel enrichment and Google Business Profile listings, but there's no SERP card with install buttons or star ratings or price filters the way Product or Recipe get. This matches the situation from the SoftwareApplication example, where desktop apps benefit via Knowledge Panel but don't get the mobile-app card. The honest takeaway is that rich result eligibility isn't universal across schema types. Some types exist for semantic clarity and knowledge-graph enrichment; some types earn SERP cards. Always check Google's current documentation for whichever rich result you're actually targeting.
The OfferCatalog composition pattern
A new composition this example introduces: hasOfferCatalog wraps an OfferCatalog object, which contains an itemListElement array of Offer entries. Each Offer describes a pricing tier or deliverable. The example has three tiers: a free initial audit (limited to 5 pages), a standard paid audit at a fixed price, and an enterprise audit quoted per-site. This is how services with multiple pricing levels get marked up in schema.org. The same pattern works for any type of tiered offering.
Full example of schema.org/Service json-ld markup
The markup is verified as valid with Rich Results Test from Google.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@id": "https://xoocode.com/services/schema-markup-audit#service",
"@type": "Service",
"name": "Xoo Code Schema Markup Audit",
"alternateName": "XooCode Audit",
"description": "A professional schema.org markup audit for content sites, ecommerce stores, news publishers, and SaaS landing pages. Submit your site URL and our team reviews every JSON-LD block against Google's rich result requirements using XooStructured internally, then delivers a graded report with prioritised recommendations. Typical turnaround: 3 business days for sites under 100 pages.",
"url": "https://xoocode.com/services/schema-markup-audit",
"image": [
"https://xoocode.com/services/audit/audit-cover-1x1.jpg",
"https://xoocode.com/services/audit/audit-cover-4x3.jpg",
"https://xoocode.com/services/audit/audit-cover-16x9.jpg"
],
"provider": {
"@id": "https://xoocode.com#organization"
},
"brand": {
"@type": "Brand",
"name": "XooCode"
},
"serviceType": "Technical SEO consulting",
"category": "https://www.naics.com/six-digit-naics/?code=541512",
"areaServed": [
{
"@type": "Country",
"name": "Canada"
},
{
"@type": "Country",
"name": "United States"
},
{
"@type": "Country",
"name": "Denmark"
},
{
"@type": "Country",
"name": "United Kingdom"
}
],
"audience": {
"@type": "BusinessAudience",
"audienceType": "Content site owners, e-commerce teams, news publishers, SaaS landing page owners"
},
"availableChannel": [
{
"@type": "ServiceChannel",
"name": "Remote audit",
"serviceUrl": "https://xoocode.com/services/schema-markup-audit/submit",
"serviceType": "Web-based submission",
"availableLanguage": [
"en",
"da"
]
},
{
"@type": "ServiceChannel",
"name": "On-site audit at Xoo Code Shop Dunmore",
"servicePhone": "+1-555-072-1210",
"serviceLocation": {
"@id": "https://xoocode.com/shop/dunmore-1290"
},
"availableLanguage": "en"
}
],
"serviceOutput": {
"@type": "CreativeWork",
"name": "Xoo Code Schema Markup Audit Report",
"description": "A graded report documenting every schema.org issue found across the submitted site, prioritised by Google rich result impact. Includes specific JSON-LD corrections, ready to paste.",
"fileFormat": "application/pdf"
},
"hasOfferCatalog": {
"@type": "OfferCatalog",
"name": "Audit tiers",
"itemListElement": [
{
"@type": "Offer",
"@id": "https://xoocode.com/services/schema-markup-audit#tier-free",
"name": "Initial Audit",
"description": "Free initial audit covering up to 5 pages. Surface-level review of the most-visited pages on your site.",
"price": "0.00",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"category": "free",
"eligibleDuration": {
"@type": "QuantitativeValue",
"value": "3",
"unitCode": "DAY"
}
},
{
"@type": "Offer",
"@id": "https://xoocode.com/services/schema-markup-audit#tier-standard",
"name": "Standard Audit",
"description": "Full audit of up to 100 pages. Includes common mistakes report, Google rich result eligibility checklist per page, and one follow-up review after you implement recommendations.",
"price": "1495.00",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"priceValidUntil": "2026-12-31",
"category": "subscription",
"eligibleDuration": {
"@type": "QuantitativeValue",
"value": "5",
"unitCode": "DAY"
}
},
{
"@type": "Offer",
"@id": "https://xoocode.com/services/schema-markup-audit#tier-enterprise",
"name": "Enterprise Audit",
"description": "Full site audit for sites over 100 pages. Quoted per-site based on page count, complexity, and custom schema coverage. Includes three follow-up reviews and a dedicated support channel for six months.",
"price": "0.00",
"priceCurrency": "USD",
"priceSpecification": {
"@type": "PriceSpecification",
"priceCurrency": "USD",
"valueAddedTaxIncluded": false,
"description": "Custom quote. Contact sales for pricing."
},
"availability": "https://schema.org/InStock",
"category": "subscription"
}
]
},
"aggregateRating": {
"@type": "AggregateRating",
"@id": "https://xoocode.com/services/schema-markup-audit#rating",
"ratingValue": "4.9",
"reviewCount": "2",
"bestRating": "5",
"worstRating": "1"
},
"review": [
{
"@type": "Review",
"author": {
"@type": "Organization",
"name": "Northern Light Publishing Co."
},
"datePublished": "2025-11-14",
"name": "Caught issues we'd missed for two years",
"reviewBody": "We'd been running the Google Rich Results Test ourselves and assuming we were fine. The audit caught missing priceValidUntil on 80 percent of our product pages and a malformed BreadcrumbList at the template level. Recommendations were specific enough that our devs implemented them in one afternoon.",
"reviewRating": {
"@type": "Rating",
"ratingValue": "5",
"bestRating": "5",
"worstRating": "1"
}
},
{
"@type": "Review",
"author": {
"@type": "Organization",
"name": "TÃ¥rnet Kokkeskole"
},
"datePublished": "2026-02-03",
"name": "Worth it for the Recipe pages alone",
"reviewBody": "Our cooking school runs 200 plus recipe pages and we'd never marked any of them up beyond headline and image. Standard Audit gave us HowToStep templates for every recipe category and the Recipe rich results started showing within a week of implementing.",
"reviewRating": {
"@type": "Rating",
"ratingValue": "5",
"bestRating": "5",
"worstRating": "1"
}
}
],
"termsOfService": "https://xoocode.com/services/schema-markup-audit/terms",
"slogan": "Your markup, graded honestly.",
"isFamilyFriendly": true
}
</script>Rich result preview
Approximate preview of what Google may render from this markup. Hover any element inside the card to see which JSON-LD path produced it. Google decides whether to show any rich result. Markup makes you eligible, not guaranteed.
Xoo Code Schema Markup Audit
A professional schema.org markup audit for content sites, ecommerce stores, news publishers, and SaaS landing pages. Submit your site URL and our team reviews every JSON-LD block against Google's rich...
Minimal valid version
The smallest markup that still produces a valid Service entity. Use it as the floor. Reach for the advanced example above when you want search engines and AI agents to understand more about your content.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Service",
"name": "Xoo Code Schema Markup Audit",
"description": "A professional schema.org markup audit for content sites, e-commerce stores, and news publishers.",
"provider": {
"@type": "Organization",
"name": "Xoo Code Inc.",
"url": "https://xoocode.com"
},
"areaServed": {
"@type": "Country",
"name": "Canada"
},
"hasOfferCatalog": {
"@type": "OfferCatalog",
"name": "Audit tiers",
"itemListElement": [
{
"@type": "Offer",
"name": "Standard Audit",
"price": "1495.00",
"priceCurrency": "USD"
}
]
}
}
</script>Google rich results this unlocks
Markup matching this example makes your page eligible for the following Google Search rich results. The primary target drives the required / recommended property classification in the advanced code block above.
- Google docsKnowledge Panel enrichment (no dedicated rich result)primary
- Google docsGoogle Business Profile services listing
Common Service mistakes
Mistakes that pass validation but silently fail to earn rich results or mislead consumers walking the graph. Avoid these and your markup will be ahead of most sites in the wild.
- 01
Using base Service when a subtype fits
Wrong"@type": "Service" "name": "Acme Taxi Booking"Right"@type": "TaxiService" "name": "Acme Taxi Booking"schema.org has purpose-built Service subtypes: TaxiService, FinancialService, BroadcastService, CableOrSatelliteService, FoodService, GovernmentService, WebAPI. If your service fits one of these, use it. Base Service validates but loses the subtype-specific surfacing some of these get in Google Business Profile and Knowledge Panel. The subtype selection lesson from the EducationalOrganization example applies here verbatim: reach for specificity when it's available.
- 02
hasOfferCatalog as a flat Offer array
Wrong"hasOfferCatalog": [ { "@type": "Offer", "name": "Free tier", "price": "0" }, { "@type": "Offer", "name": "Pro tier", "price": "99" } ]Right"hasOfferCatalog": { "@type": "OfferCatalog", "name": "Service tiers", "itemListElement": [ { "@type": "Offer", "name": "Free tier", "price": "0.00", "priceCurrency": "USD" }, { "@type": "Offer", "name": "Pro tier", "price": "99.00", "priceCurrency": "USD" } ] }hasOfferCatalog expects an OfferCatalog object, not a flat array of Offers. The OfferCatalog wraps the itemListElement array and carries a catalog name plus optional metadata. This is one of those schema.org patterns where the wrapper feels redundant but is actually required by the spec. Flat arrays validate as structurally-valid schema but lose the catalog grouping semantics.
- 03
areaServed as a plain country name string
Wrong"areaServed": "Canada"Right"areaServed": { "@type": "Country", "name": "Canada" }A plain string tolerates validation but Google Business Profile can't filter your service by region without structured country data. Use Country, State, City, AdministrativeArea, or GeoShape depending on the geographic scope. For multi-country services, areaServed accepts an array: [{ '@type': 'Country', 'name': 'Canada' }, { '@type': 'Country', 'name': 'United States' }]. The structured form enables the 'services in your area' filter in Google Business Profile.
- 04
Missing provider
WrongA Service with name, description, and hasOfferCatalog but no providerRight"provider": { "@type": "Organization", "name": "Xoo Code Inc.", "url": "https://xoocode.com" } // Or via @id if Organization is already marked up elsewhere: "provider": { "@id": "https://xoocode.com#organization" }provider is the property that connects a Service to the entity delivering it. Without it, the Service floats in the knowledge graph without a named provider, which breaks Google Business Profile association and Knowledge Panel linkage. Always include provider, either as a nested Organization or as an @id reference to an Organization marked up elsewhere on your site.
Compare your markup against this exampleruns in your browser
Schema properties in this example
Comments
Loading comments...