2 Awesome JSON-LD Schema Hacks for Multiple Locations
**Update March 2018: We’ve updated our second example! We’ve shifted to using location and parentOrganization properties to differentiate from businesses that have departments within their single building location.
JSON-LD is pretty sweet. It makes encoding schema onto websites super simple. As opposed to squeezing microdata manually into a website’s code, JSON-LD can be placed pretty much anywhere on a page and be totally invisible. And the cherry on top: it can be implemented straight from Google Tag Manager.
Writing proper schema in JSON-LD, however, is another story.
Creating schema for a business with one address is pretty straightforward (and this generator will even create the JSON-LD for you). But what if a business has multiple locations? Things can get even trickier when those locations have separate telephone numbers or names.
Depending on what information needs to be differentiated, you can build JSON-LD schema for businesses with multiple locations in 2 ways.
1. Same Contact Information with Different Locations
Universities and campgrounds, for example, often have multiple locations controlled by one main hub. To provide addresses for those extra locations while keeping only one set of contact details, use the Organization framework and build an array for the “address” property.
Here’s an example for the new school I just founded, The School for Gluten-Free Baking:
[js]
“@context”: “http://schema.org”,
“@type”: “CollegeOrUniversity”,
“name”: “The School for Gluten-Free Baking”,
“telephone”: “(503) 123-4567”,
“alumni”: {
“@type”: “OrganizationRole”,
“alumni”: {
“@type”: “Person”,
“name”: “Founder”,
“sameAs”: “www.url.com”
},
“startDate”: “2016”
},
“sameAs”: “URL for The School for Gluten-Free Baking”,
“email”: “[email protected]”,
“foundingDate”: “2002”,
“address”:
[
{
“@type”: “PostalAddress”,
“addressLocality”: “Portland”,
“addressRegion”: “OR”,
“postalCode”: “97214”,
“streetAddress”: “Address 1 for The School for Gluten-Free Baking”
},
{
“@type”: “PostalAddress”,
“addressLocality”: “Vancouver”,
“addressRegion”: “WA”,
“postalCode”: “98662”,
“streetAddress”: “Address 2 for The School for Gluten-Free Baking”
}
]
[/js]
2. Entirely Separate Contact Information for Each Location
This solution works best for businesses with separate locations that work independently of each other, such as chain restaurants or branches of a large organization. Again, use schema’s Organization framework, but this time create an array for the “location” property and reference the “parentOrganization”:
In this example, I’ll use my favorite fake business, The Gluten-Free Donut Place (who I made a Yelp business account for in a previous post).
[js]
“@context”: “http://schema.org”,
“@type”: “Organization”,
“name”: “The Gluten-Free Donut Place”,
“url”: “https://yoururl.com/”,
“logo”: “https://yoururl.com/yourlogo.png”,
“location”:
[
{
“@type”: “Bakery”,
“parentOrganization”: {
“name”: “The Gluten-Free Donut Place”
},
“name” : “The Gluten-Free Donut Place – SE Portland”,
“image”: “https://yoururl.com/se-portland-location.jpg”,
“address”: {
“@type”: “PostalAddress”,
“addressLocality”: “Portland”,
“addressRegion”: “Oregon”,
“postalCode”: “97202”,
“streetAddress”: “Address 1 for The Gluten-Free Donut Place”
},
“openingHours”: [
“Mo-Su 08:00-22:00”
],
“telephone” : “+1(503) 123-4567”
},
{
“@type”: “Bakery”,
“parentOrganization”: {
“name”: “The Gluten-Free Donut Place”
},
“name” : “The Gluten-Free Donut Place – North Portland”,
“image”: “https://yoururl.com/north-portland-location.jpg”,
“address”: {
“@type”: “PostalAddress”,
“addressLocality”: “Portland”,
“addressRegion”: “Oregon”,
“postalCode”: “97203”,
“streetAddress”: “Address 2 The Gluten-Free Donut Place”
},
“openingHours”: [
“Mo-Su 08:00-22:00”
],
“telephone” : “+1(503) 654-4321”
}
],
“image”: “https://yoururl.com/gluten-free-donut-place.jpg”,
“email”: “[email protected]”,
“description”: “We make gluten-free donuts so tasty, you’ll question
everything you thought you knew. Check out our flavor of the day as
well as our award-winning menu of triple chocolate goodies.”
[/js]
These tend to be the two most frequent cases I run into. Are there any other common variations I’m missing? Or do you know of any other hacks to make JSON-LD schema for businesses with multiple locations? Leave a comment below!
Have you had any success with the services offered schema? The first time around on this I went ahead and tried to fill as many data points as possible. It seemed to work well, but it\’s always hard to tell the results with such constant ranking fluctuation.
Hey Eli! The most common way I see people list services is by using the \”Service\” property within the \”Offer\” property. It\’s a great way to help search engines understand what specific things a company offers. In addition to services you can also list products, creative work, or events. The schema site has some good examples. I don\’t believe schema actually boosts rankings, but it does have the ability to make businesses look much more attractive in search results (which in turn will help rankings).
I am using schema on my site SEOexpertIndore.in for local business does not find any results on Google SERP.
Hi, Praveen. I\’ll say that schema really shines in more interesting uses such as displaying movie times for a theatre or a star rating for a testimonials page. However, location schema is still best practice, and Google likes to reward best practice. Reviewing your site on Google\’s Structured Data testing tool, you\’re looking pretty good. You can read more about Google\’s take on structured data here.
We have a local tire shop with two locations. We\’d be interested in seeing an example from you of what the schema should look like for this business, since what we\’ve been able to find online so far is somewhat ambiguous at best.
To date, we basically did two independent json scripts in the header, one for each business, which seems to pass muster in the SDTT. However, since both locations are represented on the same website, we think the best way to go is to find a way to represent the separate locations under one business.
Since your example in #2 above shows what to do with the same business with different departments (which doesn\’t apply to our setup), could you give us an idea of what this should look like?
– The business has two locations roughly five miles apart from one another, so even though they technically service similar areas, there are some differences that need to be shown in the service areas.
– The locations have slightly different business hours.
– The locations provide the same products (new & used tires) and tire-related services.
We asked this question in a comment like this because we thought the answer might benefit everyone viewing this content. However, if you don\’t agree, we\’d appreciate an email from you with this information.
Thanks!
Hi! We\’re more than happy to help here. So noting that your business has two pretty distinct locations, using the \”department\” hack is your best bet. This is the best way (we\’re aware of) to include multiple locations with unique properties such as hours or services in one JSON-LD chunk.
But if you\’d prefer not to use the \”department\” trick, another effective option would be to create a separate page for each location and give each its own JSON-LD.
And finally, we\’d recommend adding a product, offer, or service property to talk about your tires, along with choosing an appropriate automotive business type (https://schema.org/AutomotiveBusiness).
Hope this helps!
Hey Matt, I appreciate you sharing this post. I stumbled upon this after searching for \”structured data markup for businesses with multiple locations\” and what you shared answered my questions! However, I\’d like to know if you can provide any input on another schema-related question.
My business provides a few different services that fall under the \”HomeAndConstructionBusiness\” schema. If I were adding this type of schema to each of my service pages, would the \”name\” field be my business\’s name on every page or the name of the service?
Hopefully this question makes sense, thanks again!
– Jason
Hey Jason! Good question. If you\’re using the \”name\” property underneath the \”service\” property, the value will actually be what you want to call your service. For example, the \”name\” for your service might be \”Carpet Cleaning\”.
However, you might also be interested in using the \”OfferCatlog\” property along with \”Service\”. This will let you get even more specific with your services, such as \”Residential Carpet Cleaning\” or \”Commercial Carpet Cleaning\”. Check out example #2 at http://schema.org/Service for a great example.
Hi Matt,
Thanks for adding to this. There\’s still precious little clear info with regards to multiple locations available.
For example, I\’m working on a site which offers motorcycle rental in 2 areas on a large European island.
With local SEO best practice in mind, we\’ve created 2 contact pages for each location and will be linking 2 separate GMB accounts to each separate location.
However, with regards to the schema, would we include an organisation – department snippet containing both locations in the homepage footer, or every footer, or just the appropriate department snippet on the particular contact page for that location?
Or maybe, both departments mentioned in the homepage, and the individual departments only marked up on the separate contact pages…
Would love to hear your thoughts.
Hi Matt, I was wondering, is it possible to do a PostalAddress without addressLocality?
I work for a Trucking company and were are doing this for a JobPosting, but we are hiring in many areas (you solved my issue with this above, as I will do the same contact info with different locations). But for example we hire in all of Missouri, all of Illinois, etc. Google\’s Structured Data Testing Tool gives me an error when I try to take out the city (\”addressLocality\”). Any ideas how to get around this? Thanks in advance!
Matt, this article is straightforward and super clear. Well done sir!
We are opening several locations and will be going for the second example you outlined above. We also have 2 more international locations coming soon. When adding the international locations to the organization framework, is there anything specific I should watch out for? These will all be separate working hours and timezones. Or just add them in just like normal US locations?
Hi Tyler! We\’re so glad that you found the article helpful. Great question about international locations.
The second option will definitely be your best bet so that you can specify separate working hours and unique information for each location. With international addresses specifically, you\’ll want to be sure you add a line for \”addressCountry\” to the PostalAddress section that indicates the country of that location. (http://schema.org/PostalAddress)
For example, we can adjust the JSON-LD we used above to clarify the United States location:
\”address\”: {
\”@type\”: \”PostalAddress\”,
\”addressCountry\”: \”USA\”,
\”addressLocality\”: \”Portland\”,
\”addressRegion\”: \”Oregon\”,
\”postalCode\”: \”97219\”,
\”streetAddress\”: \”Address 1 for The Gluten-Free Donut Place\”
Hope this helps!
Hi, Matt
I am a little bit confused.
The google guidelines https://developers.google.com/search/docs/data-types/local-businesses
say that the department property is to be used for the departments of the same business and I believe that that means: department of marketing, department of sales, department of service etc.
The concept of ONE main store and its multiple departments, all forming the ONE main store.
Quote from google guidelines: \”Multiple departments
For a business with sub-departments, each with its own distinct properties such as opening hours or telephone numbers, you can mark up the department property with an element for each sub-department. Define properties that differ from the main store individually in each respective department element.\”
On the same page google says \”Define each local business location as a LocalBusiness type.\”
So… clearly google is telling us that a department is different from a local business location.
What do you think?
First and foremost, thank you for the article! I have a similar (or follow up) question to Cruz Tire Shops question above. I am working with an Auto Repair Shop that has 4 auto shops, 8 gas stations, and 1 towing service all in the same city. I\’ve started to add schema specific to each station via JSON on each stations/services individual page on the website. My question is, what should should I put on the other pages of the website, such as general services information or the homepage? Would I list out every station in a massive JSON (using the Department array like you described), a general Organization schema, or no schema at all on the pages that are not describing a specific station?
Thank you very much for any help you can offer! I really appreciate it.
Hey Jacob! I\’m glad to hear you have individual location pages set up for each station and unique JSON-LD firing on each of those— that\’s a great setup.
I\’d recommend creating general Organization schema for the rest of your site pages, especially if specific each address isn\’t listed on your other site pages (since Google likes schema to match the page content). You could also add the parentOrganization property to your individual station schema referring back to the main Organization. Hope this helps!
This is the first time I\’ve tried to understand schema, but after finding and reading your article, I feel strangely excited! I think I just found my inner Geek! lol 🙂 And my question…
I have a client with a local business who provides a service to others, and due to Google My Businesses structure, I have the option of defining a service area that the business will service clients within. This is \”within 60 Km\’s of their address, which is expressed in the schema as a latitude and longitude.
So could I augment the JSON-LD Schema \”:\”LocalBusiness\” with \”additionalType\”:[\”service\”], and the \”geo\”:{\”@type\”:\”GeoCoordinates\”,\”latitude\”:\”\”,\”longitude\”:\”\”} with a \”GeoShape\”:\”60,000\”:\”60,000” to indicate we service people within 60 Km\’s of our geoco-ordinates, or is that not allowed? If not, how would I express this?
Hi David! I’m so happy to hear our article inspired you! We love to geek out on Schema too.
It sounds like you\’re on the right track for outlining a service area by using GeoShape! I\’d recommend trying out the areaServed property along with GeoCircle, geoMidpoint, and geoRadius. The geoMidpoint would be set as the business address, and the radius would be the traveling distance in meters. That part might look something like this for you:
\”areaServed\”: [{
\”@type\”: \”Place\”,
\”geo\”: {
\”@type\”: \”GeoCircle\”,
\”geoMidpoint\”: {
\”@type\”: \”GeoCoordinates\”,
\”latitude\”: \”42.362757\”,
\”longitude\”: \”-71.087109\”
},
\”geoRadius\”: \”60000\”
}
}],
Hope this helps point you in the right direction!
Great article / tips.
Is it possible to include areaServed and GEO information under each location?
For example, if a location is in X and it serves a certain mile radius, a location in Y, serving a different mile radius?
Can I use the first option to offer the address USPS uses and that all the data aggregators use even though it is not what Google or anyone else uses.
We use, the city of \”Hamilton Township\” NJ and USPS changes it to \”Trenton\”. It also for some reason adds the county into the street address, \”Mercerville Quakerbridge Rd\”.
The data aggregators don\’t appear willing to fix these inconsistencies and I doubt USPS will even listen to such a request.
I tried using the DeliveryAddress item but it isn\’t supported for a MedicalClinic.
Thoughts?
Oof that sounds like a general NAP mess! That may be kind of a bad bandaid fix with a secondary schema address. We\’d recommend you go with the accurate version for on-site, schema, GMB, and other top directories you have control of and then put some work into citation management.