Skip to content
Free SEO Audit

Technical SEO

Product Schema for Services: Where People Get It Wrong

Why Google recommends against Product schema for service businesses, what to use instead, and how to structure Service schema correctly.

Technical blueprint concept for schema markup structure

Technical blueprint concept for schema markup structure

Don’t use Product schema for a service business, even though schema.org’s own definition technically allows it. Google’s structured data documentation for Product is written for retail goods, and its Search Advocate has said directly that a service business should use local business markup instead. Using Product schema on a service page usually earns a validation warning, not a rich result, because required fields like price and availability don’t map cleanly onto something that varies by scope of work.

This is one of the more common mistakes we find on schema audits, and it’s an understandable one. The schema.org Product definition literally names “a haircut” as a valid example. The confusion is reasonable. It’s also not what actually gets you rewarded in Google Search.

What’s the actual mistake people make here?

Someone builds a service page, installs a schema plugin or copies a JSON-LD snippet from a tutorial written for an ecommerce store, and marks the service up as a Product: a name, a price, an “InStock” availability, sometimes even a fabricated SKU. It validates against the raw schema.org vocabulary, because technically Product does cover services. It then either fails Google’s stricter Product rich result requirements or, worse, “succeeds” and displays pricing or availability information that doesn’t accurately describe a service whose actual cost depends on the job.

What does Google actually say about this?

In a Google SEO office-hours session, someone running a service business asked exactly this question: how do you fix invalid-item errors when using Product structured data for a service with variable, estimate-based pricing? Google’s Search Advocate answered directly, recommending local business structured data instead, noting that it lets you specify a price range for your services, and pointing to Google’s own developer documentation for that markup.

The broader point, confirmed by Google’s Search Central documentation, is that Schema.org is a shared vocabulary maintained by several companies including Google, not a set of rules Google is obligated to fully support. Search engines choose what they build rich results around. Google’s Product documentation is explicit about being for product content; it makes no provision for service businesses, regardless of what the base vocabulary technically allows.

What should you use instead?

Run your current markup against this before publishing anything new.

Checklist: choosing Service schema over Product schema for a service business

Product vs Service Schema: Quick Checklist

  • Is the price fixed or variable by scope?. Variable pricing points to Service/LocalBusiness with a price range, not Product.
  • Is there real, checkable availability?. “InStock” on a service you can’t literally stock is a red flag.
  • Does the offer target local search visibility?. LocalBusiness markup is what Google recommends for services.
  • Are reviews genuinely third-party, not self-published?. Self-serving testimonials don’t earn review rich snippets either way.
  • Is the provider linked via @id to your Organization schema?. This is what connects the service to your business entity.
  • Would LocalBusiness or Service fit better than Product?. For almost every service business, yes.

How do you structure Service schema correctly?

A working Service object typically includes: serviceType (a plain description like “Home Cleaning” or “SEO Audit”), provider (a reference to your Organization or LocalBusiness entity), areaServed (a region, city, or “Worldwide”), and hasOfferCatalog if you want to list specific offerings under that service. The provider reference is what actually connects the service to your business entity, using an @id that matches your Organization schema elsewhere on the site, which is the same nesting principle that holds an entire schema graph together.

Keep the offer details honest. If your pricing genuinely varies by job scope, a price range or a “starting at” figure paired with LocalBusiness markup is more accurate, and more defensible if anyone checks, than inventing a single fixed price to satisfy a schema field that expects one.

What does correct Service markup actually look like?

Here’s the structural shape, not a template to copy blindly since your real property values need to reflect your actual business:

{
  "@context": "https://schema.org",
  "@type": "Service",
  "serviceType": "Technical SEO Audit",
  "provider": { "@id": "https://example.com/#org" },
  "areaServed": { "@type": "City", "name": "Ahmedabad" },
  "hasOfferCatalog": {
    "@type": "OfferCatalog",
    "name": "SEO Services",
    "itemListElement": [
      { "@type": "Offer", "itemOffered": { "@type": "Service", "name": "One-time technical audit" } }
    ]
  }
}

Note what’s absent compared to a Product block: no invented SKU, no hard “InStock” claim, no single fixed price standing in for something that genuinely varies. The provider field’s @id is doing real work here, it’s the link back to your Organization or LocalBusiness entity elsewhere in the same JSON-LD graph, which is how Google (and any AI system parsing your entities) understands that this service belongs to this business, not a floating, disconnected offering.

How does this fit with your existing LocalBusiness schema?

Most service businesses already have, or should have, a LocalBusiness or Organization block covering the company itself: name, address, phone, hours, areas served. Service schema doesn’t replace that, it sits alongside it. LocalBusiness describes the business as an entity; Service describes a specific thing that business offers, referenced back to the business through the provider property. Trying to cram service-specific details, individual offerings, per-service descriptions, into a single sprawling LocalBusiness block instead of breaking them into separate Service entities makes the markup harder to maintain and harder for search engines to parse as distinct offerings, especially if you run more than one type of service.

What about reviews and ratings on a service page?

Add them only if they’re genuinely visible on the page and genuinely yours to show. Google restricts self-serving review markup, testimonials you’ve written or collected about your own business, from generating star-rating rich snippets in search results, and this applies regardless of whether you’ve wrapped it in Product or Service schema. Third-party aggregated reviews through a supported platform are handled differently. Marking up five-star testimonials pulled from your own website is a common way schema gets flagged, not because the schema type is wrong, but because the practice itself falls outside what Google will reward with a visual result.

When, if ever, does Product schema fit a service business?

  • You sell a genuinely fixed-price, packaged offering that behaves like a retail product: a fixed-scope audit at one set price, a downloadable template, a subscription tier with a published price. Even then, LocalBusiness with an Offer often serves you better for local search visibility.
  • You’re feeding a Google Merchant Center style product feed for something explicitly product-like. This is a narrow, specific use case, not the default for a general service page.
  • You genuinely want to multi-type a data item as both Product and Service to make use of properties from each, provider, areaServed, image, price, together, and you understand you’re not automatically unlocking a Product rich result by doing so.

For the overwhelming majority of consultancies, agencies, and local service businesses, none of these apply, and Service or LocalBusiness markup is the more accurate, better-supported choice.

The pattern I see most often on audits isn’t a business deliberately choosing Product schema. It’s a schema plugin’s default template, or a copy-pasted example from a general “how to add schema” tutorial that was written with an online store in mind, getting applied to a service page without anyone checking whether the fields actually fit. Nobody sits down and decides “we’re a services company, let’s use Product markup anyway.” It happens by default, quietly, and usually nobody notices until a Search Console validation report flags it or a rich-result test comes back with warnings nobody can explain.

Frequently asked questions

Is a haircut a Product or a Service in schema.org terms?

Schema.org’s own definition of Product technically includes services, and lists a haircut as an example. Google’s guidance diverges: its Product documentation is written for retail goods and doesn’t support service businesses for rich results, so Google recommends LocalBusiness or Service markup instead.

Can I use both Product and Service schema on the same page?

You can multi-type an item as both if it genuinely has properties from each. For most service businesses this adds complexity without adding eligibility for a rich result Google doesn’t support for services, so a single, correct Service or LocalBusiness type is usually simpler and safer.

Why did my service page’s Product markup show as invalid in Search Console?

Most often because required fields for a valid Product rich result, price, availability, a specific offer, don’t map cleanly onto a service whose price varies by scope. Google’s own recommendation is to use local business markup with a price range instead.

Does Service schema give me a rich result in search?

Not directly on its own. Service schema mainly helps Google and AI systems understand what you offer and to whom, rather than triggering a specific visual rich result. Its value is entity clarity and local search eligibility when paired with LocalBusiness markup, not a guaranteed SERP visual.

Should I add reviews to my Service schema?

Only real reviews genuinely visible on the page. Google restricts self-serving reviews, your own testimonials about your own service, from generating review rich snippets, regardless of schema type. Third-party aggregated ratings are treated differently.

Sources

Want this done on your site?

Every PalV’s DM engagement starts with a free audit of your actual website — a 12-point
crawl covering what is blocking indexation, on-page gaps against your primary keywords, speed
findings, and the three to five fixes worth making first. Delivered in two working days. No
payment details, and the findings are yours whether you hire us or not.

Get your free SEO audit
See SEO plans and prices

Written by Palash — founder of PalV’s DM,
an SEO and AI-visibility consultancy in Ahmedabad. Five-plus years in SEO, 1,000+ articles
published, 250+ certifications. Every engagement runs on the same crawl-data-in,
prioritised-actions-out workbook. Full profile and credentials →

Get the audit.
Keep the findings.

Free, no payment details, yours to act on either way.

Get Your Free SEO Audit WhatsApp Us

What you get back

A 12-point audit of your actual site: technical issues blocking indexation, on-page gaps, speed findings, and the three to five fixes we’d make first.

  • 2 daysDelivery
  • 225Checks run
  • ₹0Cost, always