A complete LocalBusiness block in one form
The JSON-LD LocalBusiness Schema Builder assembles the structured data search engines need to understand a physical business. Filling in your address, hours and contact details produces a valid schema.org/LocalBusiness block that can enrich your Google Maps and local-pack listings.
How it works
The tool creates a root object with a configurable @type (LocalBusiness or a specific subtype). The address is nested as a PostalAddress object with streetAddress, addressLocality, addressRegion, postalCode and addressCountry. Latitude and longitude, when supplied, form a GeoCoordinates object. Opening hours are emitted as an array of OpeningHoursSpecification entries, each carrying a dayOfWeek URL value plus opens and closes times; any day left closed is omitted. Phone, URL, image, price range and accepted currencies are added as plain properties when filled.
Choosing the right business type
Schema.org has many subtypes that inherit from LocalBusiness and provide more specific signals to search engines. Specifying the narrowest type that fits your business gives the richest potential results:
| Business type | Use @type |
|---|---|
| General local business | LocalBusiness |
| Restaurant, cafe, bar | Restaurant, CafeOrCoffeeShop, BarOrPub |
| Medical clinic | MedicalClinic, Dentist, Physician |
| Trade & home services | Plumber, Electrician, HVACBusiness |
| Fitness & wellness | HealthClub, BeautySalon, SpaResort |
| Retail shop | ClothingStore, BookStore, GroceryStore |
Subtypes are nested in the schema.org hierarchy, so a Restaurant is automatically also a FoodEstablishment and a LocalBusiness — using the specific type gets you all the parent signals.
NAP consistency matters
NAP stands for Name, Address, Phone. These three fields should be exactly identical across your Google Business Profile, Yelp listing, and your website’s LocalBusiness markup. Even small variations — “St.” vs “Street”, “(020)” vs “020” — can reduce confidence in which business these sources describe. Use the same formatting throughout.
A complete worked example
A plumber with Monday-to-Friday hours might produce output like this:
{
"@context": "https://schema.org",
"@type": "Plumber",
"name": "City Plumbing Services",
"telephone": "+44-20-7946-0000",
"url": "https://cityplumbing.example.com",
"address": {
"@type": "PostalAddress",
"streetAddress": "12 Trade Street",
"addressLocality": "London",
"postalCode": "EC1A 1BB",
"addressCountry": "GB"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 51.5174,
"longitude": -0.1032
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["https://schema.org/Monday", "https://schema.org/Tuesday",
"https://schema.org/Wednesday", "https://schema.org/Thursday",
"https://schema.org/Friday"],
"opens": "08:00",
"closes": "18:00"
}
],
"priceRange": "££"
}
Tips and example
Use the same name, address and phone (NAP) here as everywhere else online — inconsistency hurts local ranking. Times use 24-hour HH:MM. Use a two-letter ISO country code such as US or GB. One opening-hours entry looks like this:
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "https://schema.org/Monday",
"opens": "09:00",
"closes": "17:30"
}