The 5 Schema Types Every Service Business Should Have
AI search engines now decide whether to cite your business when a buyer asks ChatGPT, Perplexity, Claude, or Google’s AI Overviews a service-intent question — “best HVAC contractor near me,” “who does asphalt roof replacement,” “I need a personal injury attorney in this area.” The mechanism that decides whether you get named in the answer is schema markup: structured JSON-LD embedded in your HTML that tells AI crawlers what your business is, where it operates, what it costs, and how to evaluate it.
Schema sits in a corner of the technical stack most agencies and freelancers don’t touch, which is why most service-business websites — even ones built recently and at significant expense — have very little of it. This is the labeling layer the AI search transition has made consequential, and the cost to implement it is low.
This post is the technical follow-up to Why ChatGPT Can’t See Your Website — server-side rendering was the foundational fix there (making sure your content shows up in the initial HTML response at all). Schema is the layer on top: once AI crawlers can read your page, schema tells them what every part of it means. Without it, you’re unlabeled text that the engine has to guess at. With it, you’re a labeled dataset the engine can confidently reason about.
Five schemas, each with a paste-ready JSON-LD block. Implementation time for all five: about an afternoon for a developer who’s done it before, a day if it’s their first time. If you’d rather generate the markup interactively, our free Schema Generator produces the LocalBusiness and FAQ blocks directly — fill in the form, copy the output, paste into your <head>.
1. LocalBusiness — but with areaServed geometry, not just an address
Most sites that have any schema have a basic LocalBusiness block with name, address, and phone. That’s the floor. What separates a serviceable LocalBusiness schema from a strong one is areaServed with actual geometry — a GeoCircle or GeoShape — instead of just a postal address.
Here’s why this matters for service businesses: your physical office is in one location, but you serve customers across a wider radius. A PostalAddress tells AI engines where your office is. areaServed with a GeoCircle tells them where you’ll actually show up to do work. When an AI engine answers “best HVAC contractor near [a specific suburb],” it filters on service area, not office address.
{
"@context": "https://schema.org",
"@type": "HomeAndConstructionBusiness",
"name": "Acme Roofing of Phoenix",
"url": "https://www.acmeroofingphx.com/",
"telephone": "+1-602-555-0100",
"image": "https://www.acmeroofingphx.com/og.jpg",
"address": {
"@type": "PostalAddress",
"streetAddress": "1234 E Camelback Rd",
"addressLocality": "Phoenix",
"addressRegion": "AZ",
"postalCode": "85016",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 33.5093,
"longitude": -112.0364
},
"areaServed": {
"@type": "GeoCircle",
"geoMidpoint": {
"@type": "GeoCoordinates",
"latitude": 33.4484,
"longitude": -112.0740
},
"geoRadius": "64000"
},
"priceRange": "$$",
"openingHoursSpecification": [{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "07:00",
"closes": "18:00"
}]
}
Replace HomeAndConstructionBusiness with the most specific subtype that fits — Plumber, Electrician, RoofingContractor, DentistOffice, MedicalClinic, etc. Schema.org’s LocalBusiness page has the full subtype tree. The more specific the type, the better AI engines can match it to intent queries. (Our Schema Generator handles this whole block interactively if you want to skip the hand-edit.)
2. Service — one block per offering, with priceRange and areaServed
LocalBusiness tells engines what your company is. Service tells them what you actually do. Most service-business sites have a “Services” page listing six to ten offerings — and none of them are individually marked up.
Each service should be its own Service schema, ideally embedded on its dedicated page:
{
"@context": "https://schema.org",
"@type": "Service",
"serviceType": "Residential roof replacement",
"name": "Asphalt Shingle Roof Replacement — Phoenix Metro",
"description": "Full tear-off and replacement of residential asphalt shingle roofing, including underlayment, flashing, and disposal. Typical project completed in 1–3 days.",
"provider": {
"@type": "HomeAndConstructionBusiness",
"name": "Acme Roofing of Phoenix",
"url": "https://www.acmeroofingphx.com/"
},
"areaServed": {
"@type": "AdministrativeArea",
"name": "Maricopa County, Arizona"
},
"offers": {
"@type": "Offer",
"priceCurrency": "USD",
"priceSpecification": {
"@type": "PriceSpecification",
"priceCurrency": "USD",
"minPrice": 8500,
"maxPrice": 22000
}
}
}
The price range matters more than people expect. AI engines weight businesses that publish price ranges as more transparent than those that don’t, and “best [service] under $X” is a common query pattern. (Schema.org’s Service spec lists the full optional field set if you want to go deeper than the essentials above.)
3. FAQPage — the underrated one AI cites heavily
FAQPage schema is the highest-leverage schema on this list. ChatGPT, Perplexity, and Google’s AI Overviews cite FAQ answers more frequently than any other content type because the question/answer format mirrors how users phrase prompts. If your site doesn’t have an FAQ section, build one. If it does, mark it up.
Pick the eight to twelve questions your sales team actually answers on every call. Don’t make them up.
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "How much does a residential roof replacement cost in Phoenix?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Most residential asphalt shingle replacements in Phoenix metro fall between $8,500 and $22,000, depending on roof square footage, pitch, and decking condition. Tile roof replacements typically range from $18,000 to $40,000."
}
},
{
"@type": "Question",
"name": "How long does a roof replacement take?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Most single-family residential replacements are completed in 1–3 working days. Larger or steeper roofs may take up to a week."
}
}
]
}
Keep answers to two to four sentences. Long answers don’t help; concise answers get quoted verbatim. The Schema Generator produces FAQ blocks directly — paste your Q&A pairs in, copy the JSON-LD out.
4. Review / AggregateRating — but only if the reviews are real
This is the schema most sites get wrong, and Google has been actively penalizing the mistakes. The rule (laid out in Google’s review snippet guidelines) is straightforward: you can only mark up reviews that are independently verifiable and currently displayed on the page. Five fake testimonials with star ratings on your homepage will get flagged as deceptive markup, and you’ll lose the rich result eligibility.
If you have a real review section pulling from Google Business Profile, Yelp, or a verified collection tool, mark up the AggregateRating that matches it:
{
"@context": "https://schema.org",
"@type": "HomeAndConstructionBusiness",
"name": "Acme Roofing of Phoenix",
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.8",
"reviewCount": "147",
"bestRating": "5"
}
}
reviewCount must match the count you actually display. ratingValue must match the average of those displayed reviews, not your Google Business Profile total unless those reviews are also embedded on the page. When in doubt, omit this one until your review collection is in order.
5. BreadcrumbList — low effort, high indexing benefit
This is the easiest schema on the list, and most sites still don’t have it. BreadcrumbList tells search and AI engines the hierarchical structure of your site, which dramatically improves how deep pages get indexed and how they appear in search results.
Place this on every page below the homepage. Most CMSes and modern frameworks can generate it dynamically from URL structure.
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://www.acmeroofingphx.com/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Services",
"item": "https://www.acmeroofingphx.com/services/"
},
{
"@type": "ListItem",
"position": 3,
"name": "Roof Replacement",
"item": "https://www.acmeroofingphx.com/services/roof-replacement/"
}
]
}
The order I’d implement these in
If you only have an afternoon:
- BreadcrumbList first — fastest win, deploys site-wide once.
- LocalBusiness with
areaServed— the foundational identity block. - FAQPage on your top-trafficked page — the highest AI citation lift per hour spent.
- Service on each service page — closes the offering loop.
- AggregateRating only if your reviews are clean — skip this until they are.
The whole stack runs about $0 in tools and four to six hours of developer time. Validate each block in Google’s Rich Results Test before deploying to production — it catches the silent typos schema.org’s validator misses. Once these are live, AI engines have enough labeled data to confidently identify your business, what you offer, where you operate, and how to evaluate you against the alternatives in their response — which is the precondition for being cited at all.
If you’d rather not hand-code the JSON-LD, our free AI tools suite includes a Schema Generator (LocalBusiness + FAQ), an llms.txt generator, a robots.txt analyzer for auditing your AI-crawler access, and a PageSpeed + Revenue Impact Calculator. All free, no email required.
And if you want a personalized walkthrough of which schemas your site is currently missing, what AI crawlers actually read on it, and which fixes would move the needle first — we offer free AI Search Readiness Audits. About 30 minutes turnaround, with paste-ready JSON-LD for every gap we identify.