How to verify your LocalBusiness structured data
Overview & Key Takeaways
What the renderer emits, which fields turn an Organization into a LocalBusiness, and how to check the result without guessing.
Structured data is the one part of a site you can check completely, because it is a document you can read. This is the procedure: what to look for, where to look, and what each result means.
What the renderer emits, and when it is a LocalBusiness
Every site carries an organization entity in its JSON-LD. Its type is not always the same, and the rule is the first thing to understand:
- If you set a business type yourself, the entity is emitted as *that
type* — Dentist, PlumbingContractor, LegalService. A specific type says more than the generic one, and it is the more useful claim.
- If the site's organization details carry **a postal address, a telephone
number, or opening hours** — and no explicit type — the entity is emitted as LocalBusiness.
- Otherwise it is emitted as
Organization.
That is deliberate. A schema that says "LocalBusiness" on a site with no address and no hours is a claim the page cannot support, and an unsupported claim is worse than a missing one.
The fields that matter
name— the business name, taken from the brand, overridable.legalName— the registered name, when it differs from the brand.address— aPostalAddresswithstreetAddress,
addressLocality, addressRegion, postalCode and addressCountry. Each is emitted only when it is set, so a partial address is a partial address — and the missing parts are the ones a local pack needs.
telephone— the number a customer would actually call.openingHoursSpecification— the hours, and what makes the type
switch to LocalBusiness.
priceRange— the price band, when you want to declare one.sameAs— the social profiles, collected from the footer and from
the organization's own configuration.
logoandimage— the brand mark, when one is set.url— the canonical origin, not a page URL.areaServed— the places the business covers, named as place
entities. It is emitted only when the site declares one: a business that covers a city says so, and a business that covers nothing declares nothing.
hasOfferCatalog— the services the business sells, as a
catalogue of Service entities. This is the one part of the entity a platform cannot infer: a plumber's catalogue is not a salon's.
hasCredential— the licence, the certification or the insurance
the business holds, with a credentialCategory. A licence number belongs in the credential's name, because that is where a reader looks for it.
amenityFeature— the physical features a customer filters on:
parking, showers, a waiting area. They are properties of the place rather than of the business, which is why they are not a line of copy.
servesCuisine— the cuisine, for a business that serves one.
What the block looks like
The organization entity the renderer emits, with every field filled:
json{ "@type": "LocalBusiness", "@id": "https://yourbrand.com/#organization", "name": "Your Brand", "url": "https://yourbrand.com/", "telephone": "+1-555-0100", "address": { "@type": "PostalAddress", "streetAddress": "18 Example Street", "addressLocality": "Portland", "addressRegion": "OR", "postalCode": "97204", "addressCountry": "US" }, "openingHoursSpecification": [ { "@type": "OpeningHoursSpecification", "dayOfWeek": "Monday", "opens": "09:00", "closes": "17:00" } ], "areaServed": [ { "@type": "City", "name": "Portland" } ], "hasOfferCatalog": { "@type": "OfferCatalog", "name": "Services", "itemListElement": [ { "@type": "Offer", "itemOffered": { "@type": "Service", "name": "Emergency appointments" } } ] }, "hasCredential": [ { "@type": "EducationalOccupationalCredential", "credentialCategory": "license", "name": "Your licence number" } ] }
Read it as a document. Every field in it is one the renderer emits, and every field you can see in it is one you set.
The procedure
- Fetch the published page, not the preview. The preview and the live
site can differ, and a schema that is only right in one of them is not right.
- Find the JSON-LD. It is a
<script type="application/ld+json">block
in the page source. Read it as a document, not as a string.
- Check the entity type. LocalBusiness, Organization, or the specific
type you set? If you expected LocalBusiness and got Organization, the cause is almost always one of three fields: no address, no phone, no hours. If you set a business type and still got Organization, the type never reached the renderer.
- Check the address is complete. A postal address with a locality and a
region but no street address will not place a pin.
- Check the hours match the site. Hours that contradict the page are
worse than no hours.
- Then run Google's Rich Results Test against the live URL. It tells
you whether the block parses and what it complains about; it does not tell you whether the business is real, which is the part that actually decides a local result.
- Check the same page is what the crawler gets. A schema that only
appears for logged-in visitors, or only in a preview, is not a schema the crawler has.
Experience edge-native speed on your domain
Sub-50ms TTFB, Anycast BGP routing, and automatic Let's Encrypt certificates across 330+ locations.
Related guides & connected surfaces
- Lexicon & Q&A
What is a local business schema? LocalBusiness Schema markup, and what it has to contain
Why the entity type changes what a machine can read.
- Documentation
Site structure — pages, sections and where your copy lives
Which part of the site the schema is written from.
- Data Pod
Pods
The surfaces the schema is attached to.
- Solution Architecture
Local SEO
The outcome the markup exists to support.
- Solution Architecture
Local services
Trades, clinics, studios, and independent practitioners
- Solution Architecture
Dental Practices & Clinics
General dentists, cosmetic practices, orthodontists, and pediatric dental clinics