Template
LocalBusiness and Service schema template
Use this template with one LocalBusiness node for the physical business location and one Service node for each service the page visibly describes. Schema.org defines a LocalBusiness as a physical business or branch and a Service as a service provided by an organization. Google requires name and address for LocalBusiness rich-result eligibility. The other fields below are conditional Google properties or Schema.org relationships, not extra Google requirements.1,2,3
This is the copyable implementation companion to Does LocalBusiness schema help local ranking?. That page explains what the markup is for. This page gives you a business-plus-service starter and the checks that keep it accurate.
| Situation | Copy |
|---|---|
| One physical location and one service | Basic business plus service starter |
| One physical location and several separate services | Separate Service nodes |
| A page visibly presents a named service catalog | Service catalog shape |
When one business page describes one service
Copy this starter, then replace or remove every bracketed value.
{ "@context": "https://schema.org", "@graph": [ { "@type": "[most specific LocalBusiness subtype]", "name": "[exact business name as shown on the page]", "address": { "@type": "PostalAddress", "streetAddress": "[street address]", "addressLocality": "[city]", "addressRegion": "[state or region]", "postalCode": "[postal code]", "addressCountry": "[country]" }, "url": "[fully qualified URL for this location]", "telephone": "[primary public telephone number]", "geo": { "@type": "GeoCoordinates", "latitude": "[latitude]", "longitude": "[longitude]" }, "openingHoursSpecification": [ { "@type": "OpeningHoursSpecification", "dayOfWeek": ["[day]"], "opens": "[hh:mm:ss]", "closes": "[hh:mm:ss]" } ] }, { "@type": "Service", "name": "[service name as shown on the page]", "serviceType": "[type of service]", "provider": { "@type": "LocalBusiness", "name": "[exact business name as shown on the page]" }, "areaServed": { "@type": "AdministrativeArea", "name": "[service area, if the page states one]" }, "description": "[visible service description]" } ] }
This shape keeps the business identity separate from the service it provides. Keep name and address for the Google LocalBusiness boundary, and use the Service fields only when the page supports them.1,3
Omit an optional property instead of publishing a bracketed value. For example, remove areaServed when the page does not state a service area, and remove telephone when the page does not show a public phone number.3,4
When one page describes several services
Use one Service object per separately named offering.
{ "@context": "https://schema.org", "@graph": [ { "@type": "[most specific LocalBusiness subtype]", "name": "[exact business name as shown on the page]", "address": { "@type": "PostalAddress", "streetAddress": "[street address]", "addressLocality": "[city]", "addressRegion": "[state or region]", "postalCode": "[postal code]", "addressCountry": "[country]" } }, { "@type": "Service", "name": "[first service name as shown on the page]", "serviceType": "[first service type]", "provider": { "@type": "LocalBusiness", "name": "[exact business name as shown on the page]" }, "description": "[visible description of the first service]" }, { "@type": "Service", "name": "[second service name as shown on the page]", "serviceType": "[second service type]", "provider": { "@type": "LocalBusiness", "name": "[exact business name as shown on the page]" }, "description": "[visible description of the second service]" } ] }
The separate nodes make each offering explicit without turning the business node into a list of invented services. Add another complete Service object only when the page names and describes that service. Schema.org defines provider, serviceType, description, and areaServed as relationships or properties for a service, but these are not additional Google LocalBusiness rich-result requirements.1,3
When the page shows a service catalog
Use this shape when the page visibly presents a named catalog or grouped list of services.
{ "@context": "https://schema.org", "@graph": [ { "@type": "[most specific LocalBusiness subtype]", "name": "[exact business name as shown on the page]", "address": { "@type": "PostalAddress", "streetAddress": "[street address]", "addressLocality": "[city]", "addressRegion": "[state or region]", "postalCode": "[postal code]", "addressCountry": "[country]" } }, { "@type": "Service", "name": "[service group or catalog name shown on the page]", "provider": { "@type": "LocalBusiness", "name": "[exact business name as shown on the page]" }, "hasOfferCatalog": { "@type": "OfferCatalog", "name": "[visible catalog name]", "itemListElement": [ { "@type": "Offer", "itemOffered": { "@type": "Service", "name": "[first service name]", "serviceType": "[first service type]", "description": "[visible first-service description]" } }, { "@type": "Offer", "itemOffered": { "@type": "Service", "name": "[second service name]", "serviceType": "[second service type]", "description": "[visible second-service description]" } } ] } } ] }
Use hasOfferCatalog only when the page actually presents a catalog or grouped list. Schema.org's example uses an OfferCatalog with offered Service items, but its example names and location are illustrative. Replace every entity and description with facts the page shows.3
Which fields are required for Google, and which are conditional?
Google's LocalBusiness rich-result table has a narrow required boundary. Recommended properties can add information, but they do not become required just because they appear in a starter.
LocalBusiness identity fields
| Field | Boundary | Use it when |
|---|---|---|
@type |
Applicable type selection | Use the most specific LocalBusiness subtype. If multiple types apply, use an array. Google says additionalType is not supported in this guidance. |
name |
Required by Google's LocalBusiness rich-result guidance | The page visibly presents the business name. |
address |
Required by Google's LocalBusiness rich-result guidance | The page represents the physical business location with a truthful PostalAddress. |
url |
Applicable Google property | The page has a fully qualified working URL for this location. |
telephone |
Applicable Google property | The page shows the primary public contact number, including country and area code. |
geo |
Applicable Google property | Coordinates for the location are available. Use at least five decimal places for latitude and longitude. |
openingHoursSpecification |
Applicable Google property | The page states actual hours. Use opens and closes in hh:mm:ss form and add seasonal dates only when the page states them. |
priceRange |
Applicable Google property | The page gives a truthful price range or descriptor. Keep it under 100 characters for Google's price-range display. |
department |
Applicable nested business property | A distinct department has its own visible details, such as a name, URL, logo, or hours. |
menu |
Food-establishment property | A food establishment has a visible menu URL. |
servesCuisine |
Restaurant property | A restaurant visibly states its cuisine. |
review or aggregateRating |
Conditional review properties | The site captures reviews about other local businesses and follows Google's review snippet guidance. |
Service offering fields
| Field | Boundary | Use it when |
|---|---|---|
name |
Service label | The service name appears on the page. |
serviceType |
Schema.org service classification | The page states the type of service being offered. |
provider |
Schema.org provider relationship | The page identifies the business that provides the service. |
areaServed |
Schema.org service-area relationship | The page states the geographic area where the service is provided. |
description |
Visible-content field | The same service description is visible to readers. |
hoursAvailable |
Schema.org availability relationship | The page states service or contact hours. |
hasOfferCatalog |
Schema.org grouped-offerings relationship | The page visibly presents an offer catalog or grouped service list. |
offers |
Schema.org offer relationship | The page represents an actual offer to provide the service. |
The LocalBusiness rows come from Google's feature guidance. The Service rows come from Schema.org's public vocabulary. Keep those authorities separate when you explain the markup to a client or teammate.1,3
How do I replace the placeholders without inventing facts?
Replace every bracketed value with a fact that is visible and true on the page, or remove the optional property. Do not leave a placeholder in production markup.
- Choose the most specific applicable LocalBusiness subtype. Use an array only when multiple types genuinely apply.1
- Copy the business name exactly as the page presents it.1,4
- Use the physical location represented by the page in
address. Complete thePostalAddressfields the page supports truthfully.1,4 - Add
url,telephone,geo, hours, price range, department, menu, cuisine, or review properties only when each one applies to the page.1,4 - Add one
Servicenode for each service the page names. KeepdescriptionandareaServedaligned with visible text.3,4 - Remove
reviewandaggregateRatingunless the page captures reviews about other local businesses and meets Google's review-snippet rules.1
For a broader explanation of the LocalBusiness boundary, see Does LocalBusiness schema help local ranking?. Keep the business facts on the same page as the markup, and keep the Google Business Profile aligned with the facts the business publishes elsewhere.
How do I make sure the markup matches the visible page?
Structured data must describe the page readers can see. Google says not to mark up content that is hidden from readers, misleading, fake, or unrelated to the page focus.4
- Put the markup on the page that describes the business location and its services.
- Use the same business name, service names, descriptions, hours, address, and service area in the visible copy and the JSON-LD.
- Do not add a service only because it exists in an internal list or in a template example.
- Do not add fake reviews, ratings, or a service area that the page does not state.
- Make the page and its resources accessible to anonymous users. Check
robots.txt,noindex, login requirements, and other access controls before requesting a crawl.1,4
What should I validate before publishing?
- Confirm that the JSON-LD uses the most specific applicable types and properties and describes visible page content.1,4
- Run the public page URL through Google's Rich Results Test. For an unpublished snippet, choose Code and paste the JSON-LD. The tool also accepts a public URL when the page resources are anonymously accessible.5
- Fix critical errors. Review warnings and suggestions, but do not call a suggestion a Google eligibility requirement unless Google's source does.1,5
- Deploy a small number of representative pages. Use Search Console's URL Inspection to confirm how Google sees each page.1
- Confirm the inspected page is not blocked by
robots.txt,noindex, login requirements, or another access-control method. Request recrawling when the page is ready.1,4 - Submit or maintain a sitemap so Google can learn about future changes.1
- Recheck the rendered page and structured data after material edits. A passing test does not guarantee that a rich result will appear.1,4
What should I not do with this template?
| Do not | Do instead |
|---|---|
Leave [bracketed placeholders] in the published JSON-LD. |
Replace each value with a verified, visible fact or remove the optional field. |
Treat serviceType, areaServed, or description as extra Google LocalBusiness required properties. |
Label them as Schema.org Service relationships and use them only when the page supports them.1,3 |
| Copy the example's business name, location, service area, or descriptions. | Adapt every entity to the page the markup describes.3 |
| Mark up hidden content, fake reviews, irrelevant services, or a page the public cannot access. | Keep the markup representative and make the page crawlable.4 |
| Treat a passing Rich Results Test as a promise of a rich result or a ranking change. | Use the test to catch implementation errors, then allow for Google's own eligibility and crawling decisions.1,4 |
FAQ
This starter separates the Google LocalBusiness identity boundary from Schema.org's service relationships. Use the smallest truthful set of properties, then validate the public page and the code together.
Is Service required for Google's LocalBusiness rich result?
No. Google's LocalBusiness guidance lists name and address as the required properties for that rich-result feature. Service is a separate Schema.org type for describing a service provided by an organization. Add it when the page visibly describes the offering, not to satisfy a LocalBusiness requirement.1,3
Do I need every recommended LocalBusiness property?
No. Add a recommended property only when it applies and the page supports it. A restaurant may have menu and servesCuisine; another business may need only the required identity fields plus applicable contact, URL, hours, or location details.1
Can I use additionalType for several business types?
Google's LocalBusiness guidance says to use an array when multiple types apply and says additionalType is not supported in that guidance. Choose the most specific applicable subtype, then use an array only when the business genuinely has multiple applicable types.1
Does a passing Rich Results Test guarantee a rich result?
No. Google says structured data can make a feature eligible, but it does not guarantee that the feature will appear. A passing test is an implementation check, not a promise of a display outcome.4
Sources
-
Google Search Central, “Local business (LocalBusiness) structured data,” updated 2026-09-08, read 2026-10-10. Read Google's LocalBusiness guidance
-
Schema.org, “LocalBusiness - Schema.org Type,” development vocabulary page, read 2026-10-10. Read the LocalBusiness type
-
Schema.org, “Service - Schema.org Type,” development vocabulary page, read 2026-10-10. Read the Service type and example
-
Google Search Central, “General structured data guidelines,” updated 2026-07-10, read 2026-10-10. Read Google's structured-data policies
-
Google Search Console Help, “Rich Results Test,” read 2026-10-10. Read the Rich Results Test guidance
See where your profile stands
The audit shows how this applies to your own profile: it reads a verified Google Business Profile and scores it the same way every month.
Visibility Score
0 to 100
20 scored factors across profile completeness, performance, competitive position. Free, no signup, on any verified Google Business Profile.
No signup, no card. You get the score and the factors behind it.