Schema Mark-Up via JSON-LD for Local Businesses

It’s no secret that Google has been using the vocabulary since 2011 to to provide richer search results through structured data.

Google currently support Microdata, RDFa, JSON-LD but have a clear bias towards the use of JSON-LD (JavaScript Object Notation for Linked Data).

However, in my opinion and experience, there remains a lot of ambiguity surrounding best practice use of mark-up via JSON-LD. It seems there are lots of different way in which structured data can be implemented via JSON-LD, but which method is correct?

I’m going to kick this off by stating for the record that the example use of JSON-LD highlighted in this post may not be the best method of implementation – but hopefully I’ll at least explain why.

JSON-LD for Local Businesses

For the purposes of this post I’m going to use the LocalBusiness vocabulary as this is one which I often receive a lot of questions about.

Below is an example of a common JSON-LD syntax which can be used to define a single local business.

This syntax utilises various properties of the LocalBusiness vocabulary to define the type of business, the business name, address, website URL and so forth. This works exactly as expected and validates through Google’s Structured Data Testing Tool.

JSON-LD Single LocalBusiness Mark-Up

There are many different properties of the LocalBusiness vocabulary that you could include should you wish to customise your structured data declaration even further – see for a full list.

JSON-LD Markup for Multiple Business Locations

This works great for a local business with a single location; but what about those businesses with multiple locations? Is a business still classed as a “local business” if the company has multiple offices across the UK, or does it become an “Organization” with multiple branches?

According to, the definition of a LocalBusiness is as follows:

A particular physical business or branch of an organization. Examples of LocalBusiness include a restaurant, a particular branch of a restaurant chain, a branch of a bank, a medical practice, a club, a bowling alley, etc.

Great, so we can define all local business locations via a single JSON-LD script, right? Erm… that remains debatable! I am yet to find a definitive answer from Google, or anywhere/one else which states the correct usage of JSON-LD for defining multiple local business locations.

Let’s say, for example, that your business as 10 offices throughout the UK. SEO experts, including myself, would likely recommend the creation of dedicated local landing pages within your website to house contact information for each office. You’ve likely seen similar approaches used in the past? A prime example is are car dealers which will often utilise unique landing pages for each of their local dealerships.

Through this approach, you could include a revised version of the aforementioned JSON-LD code on each landing page, obviously changing the properties and data of each to reflect each of your 10 offices.

But what happens if don’t want multiple location pages? What if you want to retain a single landing page which showcases each of your office locations? It may sound a little odd, but in reality its a problem which I’m often approached with. I consult with many SMEs which perhaps operate via 2 or 3 locations across the UK or a specific region of the UK. They will often list all contact details for each office on a single ‘Contact’ page, or quite often simply within the footer of their websites.

As a result, the question that they will often ask is…

Is it possible to create a single JSON-LD script to define multiple local business locations?

TL;DR: Yes it is.

When I was asked if it was feasible to define multiple business locations via a single JSON-LD script my face must have been a sorry sight as my brain tried to determine:

  1. Whether it’s possible?
  2. Whether you would ever want/need to?

Putting the latter question aside, I tried to answer the first question – is it even possible? After a little trial and error I determined that the short answer is yes, it is possible to define a single JSON-LD script with nested local business declarations.

In the following example I’ve provided a script which defines the parent organisation and the corresponding details for two local businesses.

Whether it’s the right thing to do, and how Google treat this type of declaration remains to be seen!

On that note, I’m not saying you should implement your mark-up in this way, I just wanted to show that it is technically feasible:

Again, this validation via Google’s Structured Data Testing Tool. Validation

Organization JSON-LD Validation

Multiple Localbusiness JSON-LD Validation

The Code Validates, So it Must be Right, Right?

You would think so wouldn’t you, but as I said in the introduction to this post, there are many ways in which structured data mark-up can be defined through JSON-LD and very little guidance to define the right and wrong ways of implementation.

In the syntax provided above I have utilised a combination of the ‘Organization’ and ‘LocalBusiness’ vocabularies to define the parent organisation and each local business. Being honest, I’m not 100% convinced this is the best or simplest method but I have little information from, Google or anyone else to tell me otherwise. The data is accurate and it validates so my assumption (right or wrong!) is that this method should suffice – but I guess only time will tell.

FYI here is Google’s developer documentation on structured data for local businesses –, and here’s Google’s introduction to structured data in case you have absolutely no idea where to start

Perhaps you know something I don’t? If so please share your thoughts! 🙂

36 thoughts on “Schema Mark-Up via JSON-LD for Local Businesses

  • Hi Chris,

    I wondered if you had made any further progress on this. I’m searching the web endlessly but can’t seem to get a complete answer. We do have separate location pages, but we also display our 3 locations in the footer. I’m not trying to seo optimise the location pages. Currently we feature in local listings and this goes to our home page which I prefer. So ideally I want to add the JSON to the homepage for the locations to assist with local SEO.

    • Hi David,

      Thanks for reaching out, and apologies for the delay in responding!

      The short answer is no, I haven’t made any further progress on this. I’ve deployed this implementation on a couple of websites and certainly haven’t observed any negative impact; but I also can’t say there are any notable positive trends either.

      It’s also questionable how much Google rely on or utilise structured data markup for local businesses. It’s fair to say it’s likely utilised as to signal local intent, but other initiatives such as claiming and optimising Google My Business listings are far superior.

      Let me know how you get on 🙂


    • Hi Zgred,

      I tend to deploy the code in the header across the entire site (but that’s largely because I’m working with WordPress and it’s a pain to deploy on individual pages!).

      I don’t think there is a definitive answer, but deploying the code sitewide theoretically means Google can better understand the local intent of each page individually, assuming that’s applicable in your scenario.


      • Chris,

        I understand your comment to Zgred, and like you, I work heavily with WordPress sites, where deploying Schema on a per-page basis is extremely difficult. However, what if you have a page for each location on a site?

        I have a client that has a used tire business with two locations. No one location is really a “main” location. They have overlapping service areas, but still with some differences (the locations are five miles apart; go figure).

        I’m just wondering if it doesn’t muck things up somewhat if you have schema for both locations on a page that is all about a single location.

        Finally, I was wondering if you might expand your example above to include additional code for service areas as well as services offered – for the benefit of the group as much as for my own benefit.


  • Thanks for this Chris – currently managing a site with 19 branches and it is something I’ve been trying to figure out for a while now. Atm we have individual pages with the mark up tweaked on each page for each branch but I think it makes sense to be able to tell Google that there is a parent organisation for that branch in the individual mark up, so will be using your example. Many thanks again.

  • I think it is better if you use the subOrganization, branchOf and/or department markups (if you have any). Declare the main branch as the parent organisation and make the other locations as subOrganization.

  • You’ll be interested to know that this code still passes the structed data testing tool except that it now insists on an image being added to each LocalBusiness section.

    • Hi Valerie,

      You could simply add another “Geo” property of the type “GeoCoordinates”.

      For example, append the following after the “hasmap” property but before the “},” that follows it:

      "Geo": {
      "@type" : "GeoCoordinates",
      "latitude" : "51.895906",
      "longitude" : "0.896336"

      This should work for a single location, so if you add this to all locations with the correct lat/long defined this should work.

      Give me a shout if you have any issues.


  • Great example Chris, it’s pointed me in the right direction, just a couple of errors in the multiple location example above now there’s been a few updates in the schema testing tool but it’s an easy fix.

  • We are fortunate to have marketing professionals, such as you, that fill in the gaps were better documentation is still missing. Perhaps because this area of Search Engine Optimization is so quickly evolving, Thank you for the article.

  • Hi Chris

    Thanks, for this wonderful article it’s concise and easy to understand. Actually, I was struggling to get my head around to find a snippet for an organisation with multiple locations. I have implemented your code and it worked like a charm. It’s threw me 2 errors related to “Image” and “pricerange” I have managed to bypass them by adding below code in the snippet

    “image” : “Url of the image you want to display ( I have used website logo)”,
    “pricerange” : “££”,

    Thanks you so much!

  • Great article!

    I am building a store listing for a shopping center. I’m wondering if you have any idea if setting the “parentOrganization” to the shopping center (even though some of the stores are franchises with locations all over and the shopping center is not TECHNICALLY the parent/owner) is a good idea?

    Also, each store will have its own listing/detail page so, I’ll do all of the hours and contact information on those pages. Does it make sense to include that information, or even mark up the store listing page since each store will have its own detail page???

    Thanks for any and all help!

    • Hi, Jon.

      Have you figured out the best approach to the question you made? I’m facing a similar issue and I’d like to know how you solved it. Thanks!

    • Hi Bikash,

      It depends. The results tend to vary depending on what information Google already displays in Knowledge Graph and the type of business in question.

      Sorry for the vague answer, but it really does vary!



  • So your schema code doesn’t validate, just FYI. Google testing tool wants and image and also doesn’t like the } after the hasMap entry. Also, instead of LocalBusiness, you can use Restaurant. See for AMP validated markup for two restaurant locations.

    • Hi Kevin,

      I can’t see any issues with the } after hasMap? Validates fine for me?

      The ‘image’ requirement was introduced in November 2016, after I published this post, and I’m yet to update code – easily added though.


  • Nice article, can you suggest whats better using @graph or “location” tag instead. I’ve tried both approaches but not sure which one to use. Here’s my example below

    This one is with location:
    “@context”: “”,
    “@id”: “”,
    “@type”: “Organization”,
    “name”: “Zeebrow | Mobile Beauty Services”,
    “url” : “”,
    “logo” : “”,
    “sameAs” : [ “”,
    “” ]
    “location”: [ {
    “@type”: “LocalBusiness”,
    “parentOrganization”: {
    “name” : “Your Business Name”
    “name” : “Your Business Name”,
    “image” : “”,
    “address”: {
    “@type” : “PostalAddress”,
    “streetAddress”: “1 The High Street”,
    “addressLocality”: “Colchester”,
    “addressRegion”: “Essex”,
    “postalCode”: “CO1 1AB”,
    “telephone” : “01234 567 891”
    “openingHours”: [ “Mo-Fr 09:00-18:00”, “Sa 10:00-16:00” ],
    “hasmap” : “,-0.1440787,17z/data=!3m1!4b1!4m5!3m4!1s0x48760520cd5b5eb5:0xa26abf514d902a7!8m2!3d51.501364!4d-0.14189”
    “@type”: “LocalBusiness”,
    “parentOrganization”: {
    “name” : “Your Business Name”
    “name” : “Your Business Name”,
    “image” : “”,
    “address”: {
    “@type” : “PostalAddress”,
    “streetAddress”: “Buckingham Palace”,
    “addressRegion”: “London”,
    “postalCode”: “SW1A 1AA”,
    “telephone” : “01234 567 891”
    “openingHours”: [ “Mo-Fr 09:00-18:00”, “Sa 10:00-16:00” ],
    “hasmap” : “,-0.1440787,17z/data=!3m1!4b1!4m5!3m4!1s0x48760520cd5b5eb5:0xa26abf514d902a7!8m2!3d51.501364!4d-0.14189”

    And also I tried @graph approach as well they both show up in google structure data tool. I’m not sure how it will effect the SEO and what should be better approach. I haven’t changed the bottom bit yet so just ignore that.

  • This is still working. I implemented 2 location schema for a client and it worked great. I also had to modify it slightly to include pricerange. It’s kind of weird that Schema throws a warning when price range is not included, yet we’re talking about a basic local business listing. Why would you need to specify a pricerange? I mean, i guess you could, but it’s so vague.

    Thanks again.

  • Our company offers a nationwide service but I can’t find any information about using a locale or region rather than a specific address.

    Is it as simple as only defining “addressCountry”? How would this affect SEO?

  • I just used the Google Structured Data Testing tool, and it shows 2 Food Establishment items, but it doesn’t show Organization.

    Does it still show those 3 items for you in the tool? Or has the tool been updated that it no longer shows Organization?

  • Regarding Google My Business listings, I am wondering if the advice is to link each location to a dedicated page on your is the correct way. Therefore, a location page for each should be created and marked up as a local business with these location details.

    I use Joomla so it’s easy to assign this to menu items without any trouble.

    Do you think this is a good strategy?

    • Hi Dave,

      Generally speaking, if your business has a physical presence in multiple geographic locations, then creating dedicated landing pages for each location is the correct approach. There are multiple benefits to that approach, foremost, driving your customers to a dedicated landing page for their intended geo-location. I have mentioned in this post that that’s the better solution.

      The purpose of this post is to see if it could be done, not necessarily that it should be done in this way.



      • Would doing both be a terrible idea? For example I follow this example for non-location specific pages, and for the location pages use a single LocalBusiness definition?

        • Probably not the best idea! Again I’d reiterate that I was just experimenting to see if this could be done, it’s not necessarily the right way of doing it! I’d definitely advise using single LocalBusiness definitions on local pages, but I’d probably avoid using my example site-wide on non local pages.

  • Chris,
    Thank you so much for taking the time to write this, AND reply to so many questions!
    Now 3.5 years late, still a very needed article to fill in the huge knowledge base gap on schema for local businesses with multiple locations.

Leave a Reply

Your email address will not be published. Required fields are marked *