Module 5 · 5.2
LocalBusiness: your business details in JSON-LD
Module 5: Structured data · Reading time: 13 minutes
Learning objective: After this lesson you can write and assess a LocalBusiness block in JSON-LD, with the required and recommended properties according to Google and the right subtype from schema.org.
Key concepts: LocalBusiness, subtype (Florist, Bakery, Dentist, ...), required: name and address, PostalAddress (streetAddress, postalCode, addressLocality, addressCountry), recommended: telephone, url, openingHoursSpecification, geo, image, priceRange, sameAs, openingHours as text, a single source of truth
Why this block matters
In lesson 5.1 you saw that Google uses structured data to understand your page. For a business with a shop, practice or workshop, the most important block is LocalBusiness: who you are, where you are, how to call you and when you are open. Google mentions the knowledge panel in Search and Maps as a possible use when someone searches for your business.
The block does not replace your Google Business Profile (module 6). It is one of the sources search engines take your details from. That is why it must say exactly the same as your profile, your contact page and your directory listings. Lesson 6.4 comes back to this.
Choosing the right type
Start with the question: what kind of business am I? In schema.org, LocalBusiness has thirty direct subtypes, and many more below those. A few examples:
| Business | Type | Path in schema.org |
|---|---|---|
| Flower shop | Florist | LocalBusiness > Store > Florist |
| Baker | Bakery | LocalBusiness > FoodEstablishment > Bakery |
| Dentist | Dentist | LocalBusiness > Dentist |
| Hairdresser | HairSalon | LocalBusiness > HealthAndBeautyBusiness > HairSalon |
| Plumber | Plumber | LocalBusiness > HomeAndConstructionBusiness > Plumber |
| Accountant | AccountingService | LocalBusiness > FinancialService > AccountingService |
Google asks for the most specific type that fits. If you cannot find one, use LocalBusiness itself. If your business does two things (a bakery with a café), @type may be a list: ["Bakery", "CafeOrCoffeeShop"]. Watch the spelling: types start with a capital letter and are written exactly as in schema.org. Bloemist, florist or Flower shop do not exist; a reader will not recognise that type.
Look up a type via https://schema.org/<Type> or in the full list. If the page exists, the type exists.
Required and recommended according to Google
For a local business, Google lists only two required properties:
name: the name of the business, as it appears on your shopfront and in your profile;address: the physical location, as aPostalAddress. Google asks you to fill in as many parts as possible.
And a series of recommended properties. The most important ones for a small business:
| Property | What goes in it | Note |
|---|---|---|
telephone | The main number | With country code and area code, for example +31 33 000 0000 |
url | The address of the page for this location | Full address with https://, and it must work |
openingHoursSpecification | Opening hours per day | See below |
geo | GeoCoordinates with latitude and longitude | Numbers, at least 5 decimal places |
image | Photo(s) of the business | Addresses Google is allowed to fetch and index |
priceRange | Price range, such as €€ or €10-25 | Shorter than 100 characters |
menu, servesCuisine | Only for restaurants and cafés |
Because a LocalBusiness is also an Organization, Google recommends following the Organization fields as well, such as logo and sameAs (the addresses of your profiles on other sites, for example Instagram or Facebook).
What Google does not want in this block: review and aggregateRating about your own business. These are only meant for sites that collect reviews about other businesses. Lesson 5.3 explains why.
The address as a PostalAddress
The address is an object with its own type. Not a single line of text, but separate fields:
"address": {
"@type": "PostalAddress",
"streetAddress": "Voorbeeldstraat 12",
"postalCode": "3811 AA",
"addressLocality": "Amersfoort",
"addressCountry": "NL"
}streetAddress: street and house number, with any addition if there is one.postalCode: the postcode.addressLocality: the town or city.addressCountry: the country, preferably as a two-letter country code (NL,BE,DE).addressRegion(province or state) is allowed, but is not needed in the Netherlands.
A common mistake is "address": "Voorbeeldstraat 12, 3811 AA Amersfoort". That is text; a reader then has to guess which part is the postcode. Use the separate fields.
Opening hours
Google lists openingHoursSpecification: a list of blocks with days, opening time and closing time.
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "09:00",
"closes": "18:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Saturday",
"opens": "09:00",
"closes": "17:00"
}
]The rules:
- Days in English, as in schema.org:
MondaytoSunday(or as a full address,https://schema.org/Monday). Noma, nomaandag. - Times in 24-hour notation:
09:00, not9 uurand not9:00 AM. - A day that is not in the list counts as not described. If you want to state explicitly that you are closed all day, set
opensandclosesboth to00:00. - Open day and night:
opens00:00andcloses23:59. - Open until after midnight (for example 18:00 to 02:00): one block with
opens18:00andcloses02:00. - Temporarily different hours, such as a winter closure: the same block with
validFromandvalidThrough(dates such as2026-12-24).
There is also a shorter notation from schema.org: "openingHours": ["Tu-Fr 09:00-18:00", "Sa 09:00-17:00"], with two-letter English day names. It is valid in schema.org, but it is not in Google's list. If you have the choice, use openingHoursSpecification.
The complete block for Bloemenatelier Lotte
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Florist",
"name": "Bloemenatelier Lotte",
"url": "https://www.example.com/",
"telephone": "+31 33 000 0000",
"image": "https://www.example.com/beelden/winkel.jpg",
"priceRange": "€€",
"address": {
"@type": "PostalAddress",
"streetAddress": "Voorbeeldstraat 12",
"postalCode": "3811 AA",
"addressLocality": "Amersfoort",
"addressCountry": "NL"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 52.15617,
"longitude": 5.38763
},
"openingHoursSpecification": [
{ "@type": "OpeningHoursSpecification", "dayOfWeek": ["Tuesday", "Wednesday", "Thursday", "Friday"], "opens": "09:00", "closes": "18:00" },
{ "@type": "OpeningHoursSpecification", "dayOfWeek": "Saturday", "opens": "09:00", "closes": "17:00" }
],
"sameAs": ["https://www.instagram.com/example"]
}
</script>Note two things. latitude and longitude are numbers, without quotation marks; latitude lies between -90 and 90, longitude between -180 and 180. And the url points to your own site, not to your Instagram (that belongs in sameAs).
Where do you put the block? Google says any page is fine, but it makes most sense on a page with information about your business, such as the homepage or the contact page. If you have several locations, each location gets its own page with its own block and its own url.
In practice: AI Builder and WordPress
The WebOké AI Builder creates this block for you, from the business details you enter for the site: the business type (a drop-down list including Florist, Bakery and HairSalon, or the general LocalBusiness), name, address, postcode, town, phone, email, opening hours and your social profiles. The block appears on the homepage and on pages with a contact block. The AI Builder currently writes the opening hours in the short openingHours notation (for example Tu-Fr 09:00-18:00). In WordPress, SEO plugins do something similar, often in a separate section for local details; other website builders work the same way.
For every builder: the block is only as good as what you enter. If you enter an old phone number in the builder, that old number also ends up in your JSON-LD. Keep your business details in one place and copy them from there to your site, your profile and your listings.
Summary
- Choose the most specific schema.org type that fits, written exactly as on schema.org.
- Required according to Google:
nameandaddress(as aPostalAddresswith separate fields). - Recommended:
telephonewith country code,urlof the location,openingHoursSpecification,geoas numbers,image,priceRange. - Opening hours: English day names, 24-hour times; closed is
00:00to00:00, open day and night is00:00to23:59. - No reviews about your own business in this block; make sure everything matches your profile and your contact page.
Quiz
Exercise
Exercise A5.2: Is your LocalBusiness block correct? Enter the address of your homepage or contact page, along with your business name, postcode and phone number as they appear in your Business Profile. The program looks for the business block in the page's JSON-LD and checks the type, required fields, address, phone, opening hours, coordinates and url, and compares the name, postcode and phone with what you entered. No business site of your own? Then use the site of a shop or practice near you and leave the three comparison fields empty.
Further reading
The steps in these articles apply to the WebOké control panels; other providers work in a similar way.
- WebOké manual 8.1: AI Builder: having your website built for you
- WebOké manual 8.2: AI Builder: editing, versions and publishing
- Google Search Central, Structured data for local businesses (LocalBusiness): https://developers.google.com/search/docs/appearance/structured-data/local-business
- Google Search Central, Structured data for organisations (Organization): https://developers.google.com/search/docs/appearance/structured-data/organization
- schema.org, LocalBusiness and all subtypes: https://schema.org/LocalBusiness
- schema.org, OpeningHoursSpecification: https://schema.org/OpeningHoursSpecification
