AI builder5 min read·828 words

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 — a PostalAddress with streetAddress,

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.

  • logo and image — 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

  1. 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.

  1. 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.

  1. 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.

  1. Check the address is complete. A postal address with a locality and a

region but no street address will not place a pin.

  1. Check the hours match the site. Hours that contradict the page are

worse than no hours.

  1. 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.

  1. 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.

Deploy in 60 seconds

Related guides & connected surfaces