TechnicalEntity SEOPlaybook

Service Schema: How to Mark Up Your Services (With Template)

Service schema is structured data that describes a service your business offers, using the schema.org Service type, and connects it to the organization that provides it. It does not produce a rich result in Google. What it does is remove guesswork: it tells search engines and AI systems exactly what you sell, where, to whom, and who stands behind it. For a service business, that is the most commercially important fact about your brand, and most sites never state it in machine-readable form.

What Service schema does and does not do

It doesIt does not
State what each service is, in structured formProduce a rich result or visual SERP feature
Connect each service to your Organization entityGuarantee rankings or AI citations
Declare where the service is availableReplace clear on-page copy
Describe audience and pricing modelEarn review stars

Its value is compounding rather than visible. Each Service node that references your Organization @id adds one more precise statement to the entity picture engines hold about you, which is the connected-graph approach described in Organization schema for AI search.

Service vs ProfessionalService vs Offer

These three get confused constantly, and the confusion produces broken graphs.

  • Service is the thing you sell: “Technical SEO audit”, “Kitchen remodeling”, “Tax preparation”.
  • ProfessionalService is a subtype of LocalBusiness. It describes a business, not an offering. Schema.org’s own definition now says the type was deprecated because of exactly this confusion with Service. Existing markup still parses, so there is no emergency, but for new work describe the company as Organization or the most specific LocalBusiness subtype that fits, such as LegalService, AccountingService or Plumber.
  • Offer describes the commercial terms of selling something: price, currency, availability. A Service can carry an Offer.

The usual correct pattern is an organization node, a Service node per offering whose provider points at the organization, and an optional Offer inside each Service for pricing.

The properties that matter

PropertyWhat it holdsPriority
@idA stable identifier, such as the page URL plus #serviceEssential
nameThe service’s name as customers say itEssential
serviceTypeThe category, in conventional industry termsEssential
descriptionOne or two plain sentences, matching the pageEssential
providerA reference to your Organization @idEssential
urlThe service page URLEssential
areaServedCountries, regions, or cities, as Place typesHigh
audienceWho it is for, e.g. BusinessAudienceMedium
offersPricing model via Offer and PriceSpecificationMedium
hasOfferCatalogSub-services or packagesOptional
termsOfServiceA link to service termsOptional

Two properties do most of the work. provider connects the service to your entity; without it, the service floats unattributed. serviceType tells engines which category you belong to, which is how you become a candidate when someone asks an assistant for a provider of that thing.

A copy-ready template

Replace the example values and keep the @id pattern consistent with the rest of your site. This assumes your WebSite and Organization nodes already exist sitewide; they are repeated here so the example validates on its own.

{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "Organization",
      "@id": "https://example.com/#organization",
      "name": "Example Studio",
      "url": "https://example.com/"
    },
    {
      "@type": "WebSite",
      "@id": "https://example.com/#website",
      "url": "https://example.com/",
      "publisher": { "@id": "https://example.com/#organization" }
    },
    {
      "@type": "WebPage",
      "@id": "https://example.com/services/technical-seo/#webpage",
      "url": "https://example.com/services/technical-seo/",
      "name": "Technical SEO Audit",
      "isPartOf": { "@id": "https://example.com/#website" },
      "about": { "@id": "https://example.com/services/technical-seo/#service" }
    },
    {
      "@type": "Service",
      "@id": "https://example.com/services/technical-seo/#service",
      "name": "Technical SEO Audit",
      "serviceType": "Technical SEO",
      "description": "A crawl, indexation, rendering and structured data audit with a prioritized fix list.",
      "url": "https://example.com/services/technical-seo/",
      "provider": { "@id": "https://example.com/#organization" },
      "areaServed": [
        { "@type": "Country", "name": "United States" },
        { "@type": "Country", "name": "United Kingdom" }
      ],
      "audience": {
        "@type": "BusinessAudience",
        "audienceType": "B2B software companies"
      },
      "offers": {
        "@type": "Offer",
        "url": "https://example.com/services/technical-seo/",
        "priceCurrency": "USD",
        "priceSpecification": {
          "@type": "PriceSpecification",
          "minPrice": 5000,
          "priceCurrency": "USD"
        }
      }
    }
  ]
}

The minPrice pattern suits services priced from a starting point. If you do not publish prices, leave offers out rather than inventing a number; markup must match what the page says.

Listing many services from the organization

If you offer several services and want one machine-readable list of them, add an OfferCatalog to your Organization node and reference each Service by its @id:

{
  "@type": "Organization",
  "@id": "https://example.com/#organization",
  "hasOfferCatalog": {
    "@type": "OfferCatalog",
    "name": "Services",
    "itemListElement": [
      { "@type": "Offer", "itemOffered": { "@id": "https://example.com/services/technical-seo/#service" } },
      { "@type": "Offer", "itemOffered": { "@id": "https://example.com/services/local-seo/#service" } }
    ]
  }
}

Does Service schema still work in 2026?

One of the top results for this topic is a Google Help thread asking exactly this, because the question comes up whenever someone notices that Service markup produces nothing visible. The short answer is yes, as long as you know what “working” means for this type.

QuestionAnswer
Is Service still a valid schema.org type?Yes. Schema.org reports it in use on between one and ten million domains.
Does Google show a rich result for it?No, and it never has. Its absence from rich results is not a sign that it broke.
Does Google still read it?Google parses all valid JSON-LD on a page. It only documents the types that change how a result looks.
Is ProfessionalService deprecated?Schema.org’s definition says so. It still validates, but it is a type for the business, not the service, and should not be used for new work.
Is it worth adding?Yes, if your services are the thing buyers ask AI assistants about. It states your offering, area and provider as facts rather than prose to be interpreted.

So judge Service schema the way you would judge a clear About page: not by a visible feature it unlocks, but by whether the facts machines hold about you are more precise because it exists.

Common mistakes

  1. Marking the business itself as a Service. The company is an Organization or LocalBusiness; the Service is what it sells.
  2. No provider. A Service with no provider is a service offered by nobody in particular.
  3. One generic Service node on every page. Each service gets its own node on its own page, with its own @id.
  4. Free-text areaServed everywhere. A plain string works, but typed Place values such as Country or City are unambiguous.
  5. Prices that do not match the page. Google requires markup to reflect visible content, and a mismatch undermines trust in everything else you mark up.
  6. Adding aggregateRating for stars. Service is not a supported type for review snippets, and self-serving reviews of your own business are not shown as stars. It adds risk and no reward.
  7. Changing @id values between deploys. Identifiers are how engines join facts across pages. Treat them as permanent.

How to validate it

Use the Schema Markup Validator at validator.schema.org, which checks any schema.org type. Google’s Rich Results Test only reports on types that produce rich results, so it will say nothing useful about Service markup; an empty result there is not an error. Then check the rendered HTML, not just your template, to confirm the JSON-LD is present without JavaScript. The rest of the technical checks are in the technical SEO checklist for AI search.

Where Service schema fits in your graph

Service schema is one layer of a connected graph: Organization at the center, Person nodes for your people, WebPage nodes for your pages, and a Service node for each thing you sell. On its own it is a helpful statement. Connected, it is how engines learn precisely what your brand does. For the full set of types and how they fit together, see structured data for AI search. If you would rather have the whole graph designed, implemented, and validated, that is our schema markup service.

Frequently asked questions

What is Service schema?

Service schema is structured data using the schema.org Service type to describe a service a business offers: what it is, who provides it, where it is available, who it is for, and how it is priced. It is usually written in JSON-LD and connected to the provider's Organization node.

Does Service schema create a rich result in Google?

No. Service is not one of the types Google turns into a rich result. Its value is understanding: it tells search engines and AI systems exactly what you offer and connects each service to your brand entity.

Should I use Service or ProfessionalService?

They describe different things, and only one of them is the current recommendation. Service describes what a business sells. ProfessionalService describes a business, and schema.org now notes that it was deprecated because it was so often confused with Service. Mark up the company as Organization or the most specific LocalBusiness subtype that fits, and each offering as a Service whose provider is that organization.

Can I add review stars to Service schema?

You should not expect stars from it. Service is not among the types Google supports for review snippets, and Google does not show self-serving reviews, meaning reviews of your own business published on your own site, as stars for LocalBusiness or Organization either.

Do I need one Service node per page or one for the whole site?

One per service, placed on that service's own page with a stable @id. If you want a single list of everything you offer, add an OfferCatalog to your Organization node that references those Service nodes.

OK

Olga Kunger

Founder & Lead Strategist, Ambeltek

Olga leads Ambeltek's web development, AI SEO, and GEO work — helping brands rank on Google and get cited by AI engines. More about Olga →

Want structured data that engines trust?

We audit, design and ship connected JSON-LD for your whole site, validated and monitored.