Service Schema Markup — Describe What You Offer
Service JSON-LD describes one thing a business offers: what it is, who provides it, where it's available, and what it costs. Pair it with LocalBusiness or Organization markup for the business itself.
Generate Service JSON-LDWhy service markup often goes wrong
- The business and its services are mixed into one entity, so it is unclear what is offered.
- Old tutorials recommend ProfessionalService, which schema.org has deprecated.
- A service radius is written without a unit, so it means meters.
- Prices appear in the markup that visitors cannot see on the page.
How SwiftSchema helps
The generator below builds one Service with its name, type, provider, area served, and an optional price, using only real schema.org properties.
The examples on this page show the three common setups: a local service page, a B2B service with a retainer, and a business page that lists its services with hasOfferCatalog.
What is Service schema?
Schema.org defines Service as "a service provided by an organization, e.g. delivery service, print services, etc." It sits under Intangible: Thing → Intangible → Service. Use it for anything you do for customers rather than sell as a physical item, such as repairs, cleaning, consulting, legal work, lessons, or installation.
Service has a few more specific subtypes. Use one when it fits: FinancialProduct for banking and lending, GovernmentService, FoodService, TaxiService, BroadcastService, and WebAPI.
Service, LocalBusiness, or Product?
These three types answer different questions, and most service businesses need two of them:
| Question | Type |
|---|---|
| Who is the business, where is it, when is it open? | LocalBusiness, or a subtype such as Plumber, Dentist, Attorney (or Organization for non-local companies) |
| What does the business do for customers? | Service, one per service |
| What physical item does it sell? | Product |
Link the two with provider: the Service's provider is the business. Giving the business an @id lets every service page point to the same entity.
Don't use ProfessionalService
Many older tutorials recommend ProfessionalService. Schema.org deprecated it: "The general ProfessionalService type for local businesses was deprecated due to confusion with Service." It covered businesses such as dentists, accountants, attorneys, notaries, electricians, plumbers, and roofers. Use the specific LocalBusiness subtype for those businesses, such as Dentist, AccountingService, Attorney, Electrician, Plumber, or RoofingContractor.
Properties that matter
name: the service name as the page shows it, such as "Drain cleaning".serviceType: the kind of service, such as "HVAC maintenance". This is free text.description: a short summary of what's included.provider: the business or person who delivers it, as an Organization (or LocalBusiness subtype) or a Person.areaServed: where you offer it. Use aCity,State,Country, orAdministrativeAreawith a name, or aGeoCirclefor a radius.serviceAreais an older property that schema.org has replaced withareaServed.offers: an Offer withpriceandpriceCurrencywhen the page shows a price. Use apriceSpecificationfor rates such as a monthly retainer.url: the page about this service.hasOfferCatalog: a list of services, used on the business, or on a Service that has sub-services.
Service also supports audience, hoursAvailable, availableChannel, termsOfService, brand, and category when the page covers them.
Service pages vs. the home page
- A page about one service (for example
/drain-cleaning): one Service, withproviderpointing to the business. - The home page or a services overview: describe the business with LocalBusiness or Organization markup, and list the services with
hasOfferCatalog. Each catalog entry is an Offer whoseitemOfferedis a Service. The third example above shows this.
Don't put every service's full markup on every page. Each service page should describe its own service.
Google Search status
Google's Search Gallery has no feature for the Service type, so Service markup won't produce a rich result, and the Rich Results Test won't report it. That doesn't make it pointless. It gives search engines and AI assistants an unambiguous statement of what you offer, who provides it, and where. For the business itself, use LocalBusiness markup, which Google does document and support.
To check Service markup, use the Schema Markup Validator, which validates any schema.org type.
How to build one here
- 01
Enter the service name exactly as the page shows it.
- 02
Add serviceType and a one-sentence description of what is included.
- 03
Add the provider name, and choose Organization or Person.
- 04
Add the area you serve as a place name, such as a city or region. For a radius or a LocalBusiness provider, edit the JSON to match the first example.
- 05
Add a price and currency only if the page shows one.
- 06
Copy the JSON-LD into the service page and check it in the Schema Markup Validator.
Common mistakes
- A unitless radius.
"geoRadius": 40means 40 meters. Write"40 mi"or"64 km", or give the number in meters. - Prices the page doesn't show. Only mark up prices visitors can see, with the same currency and unit.
- One page, many unrelated Services. Give each service its own page and markup, and use
hasOfferCatalogfor overview pages. - ProfessionalService or serviceArea. Both are outdated. Use a specific LocalBusiness subtype and
areaServed. - A provider that doesn't match the business. The provider's name, phone, and URL should match your LocalBusiness or Organization markup and your footer.
- Service for physical goods. Use Product for items you sell.
Required properties
name
Recommended properties
serviceTypedescriptionproviderareaServedoffersurlhasOfferCatalog
{
"@context": "https://schema.org",
"@type": "Service",
"name": "HVAC Tune-Up",
"serviceType": "HVAC maintenance",
"description": "A 21-point heating and cooling system inspection and cleaning.",
"url": "https://www.breezeright.example/services/hvac-tune-up",
"provider": {
"@type": "HVACBusiness",
"@id": "https://www.breezeright.example/#business",
"name": "BreezeRight HVAC",
"telephone": "+1-512-555-0142"
},
"areaServed": {
"@type": "GeoCircle",
"geoMidpoint": {
"@type": "GeoCoordinates",
"latitude": 30.2672,
"longitude": -97.7431
},
"geoRadius": "40 mi"
},
"offers": {
"@type": "Offer",
"price": 189,
"priceCurrency": "USD",
"url": "https://www.breezeright.example/services/hvac-tune-up"
}
}{
"@context": "https://schema.org",
"@type": "Service",
"name": "Analytics Implementation",
"serviceType": "Web analytics setup and training",
"description": "GA4 and tag manager setup, dashboards, and team training.",
"url": "https://www.datanorth.example/services/analytics-implementation",
"provider": {
"@type": "Organization",
"name": "DataNorth",
"url": "https://www.datanorth.example"
},
"areaServed": {
"@type": "Country",
"name": "United States"
},
"offers": {
"@type": "Offer",
"priceSpecification": {
"@type": "UnitPriceSpecification",
"minPrice": 3000,
"priceCurrency": "USD",
"unitCode": "MON",
"name": "Monthly retainer (starting)"
}
}
}{
"@context": "https://schema.org",
"@type": "Plumber",
"@id": "https://www.clearflow.example/#business",
"name": "ClearFlow Plumbing",
"url": "https://www.clearflow.example",
"telephone": "+1-303-555-0187",
"address": {
"@type": "PostalAddress",
"streetAddress": "410 Market St",
"addressLocality": "Denver",
"addressRegion": "CO",
"postalCode": "80202",
"addressCountry": "US"
},
"areaServed": {
"@type": "City",
"name": "Denver"
},
"hasOfferCatalog": {
"@type": "OfferCatalog",
"name": "Plumbing services",
"itemListElement": [
{
"@type": "Offer",
"itemOffered": {
"@type": "Service",
"name": "Drain cleaning",
"url": "https://www.clearflow.example/drain-cleaning"
}
},
{
"@type": "Offer",
"itemOffered": {
"@type": "Service",
"name": "Water heater installation",
"url": "https://www.clearflow.example/water-heaters"
}
},
{
"@type": "Offer",
"itemOffered": {
"@type": "Service",
"name": "Leak detection",
"url": "https://www.clearflow.example/leak-detection"
}
}
]
}
}FAQs
Does Service schema give me a rich result?ShowHide
No. Google's Search Gallery has no feature for the Service type, so the Rich Results Test won't show one. The markup still tells search engines and AI assistants what you offer, who provides it, and where.
Service or LocalBusiness?ShowHide
Use both, for different things. LocalBusiness (or a subtype like Plumber or Dentist) describes the business: name, address, hours. Service describes one thing the business offers. Link them with provider.
Should I use ProfessionalService?ShowHide
No. Schema.org deprecated the general ProfessionalService type because people confused it with Service. Use a specific LocalBusiness subtype for the business, such as Attorney, AccountingService, or Plumber, and Service for what it offers.
How do I list several services on one page?ShowHide
On a page about the business, add hasOfferCatalog to the business: an OfferCatalog whose items are Offers, each with a Service as itemOffered. On a page about one service, use a single Service.
Do I need a price?ShowHide
No. Add offers with price and priceCurrency only when the page shows a price. For quotes or retainers, describe the service without a price, or use a priceSpecification for a starting rate the page states.
How do I set a service radius?ShowHide
Use areaServed with a GeoCircle. Write geoRadius with a unit, such as "40 mi". A bare number means meters, so 40 would mean a 40-meter radius.