Schema.org is cryptic. Or at least that’s what I had always thought. To me, it was a confusing source of information: missing the examples I needed, not explaining which item properties search engines require, and overall making the process of implementing structured data a daunting task. However, once I got past Schema.org’s intimidating shell, I found an incredibly useful and empowering tool. Once you know how to leverage it, Schema.org is an indispensable tool within your SEO toolbox.
A structured data toolbox
The first part of any journey is finding the map. In terms of structured data, there are a few different guiding resources:
- The most prominent and useful are Google’s Structured Data Features Guides. These guides are organized by the different structured data markups Google is explicitly using. Useful examples are provided with required item properties.
Tip: If any of the item types listed in the feature guides are relevant to your site, ensure that you're annotating these elements.
- I also want to share Merkle’s new, free, supercalifragilisticexpialidocious Structured Data Markup Generator. It contains Google’s top markups with an incredibly user-friendly experience and all of the top item properties. This tool is a great support for starting your markups, and it’s great for individuals looking to reverse-engineer markups. It offers JSON-LD and some illustrative microdata markups. You can also send the generated markups directly to Google’s structured data testing tool.
- If you’re looking to go beyond Google’s recommendations and structure more data, check out Schema.org’s Full Hierarchy. This is a full list of all Schema.org’s core and extended vocabulary (i.e., a list of all item types). This page is very useful to determine additional opportunities for markup that may align with your structured data strategy.
Tip: Click “Core plus all extensions” to see extended Schema.org’s libraries and what's in the pipeline.
- Last but not least is Google’s Structured Data Testing Tool. It is vital to check every markup with GSDTT for two reasons:
- To avoid silly syntactic mistakes (don’t let commas be your worst enemy — there are way better enemies out there ☺).
- Ensure all required item properties are included
As an example, I’m going to walk through the Aquarium item type Schema.org markup. For illustrative purposes, I’m going to stick with JSON-LD moving forward; however, if there are any microdata questions, please reach out in the comments.
The basic structure of all Schema.org pages
When you first enter a Schema.org item type’s page, notice that every page has the same layout, starting with the item type name, the canonical reference URL (currently the HTTP version*), where the markup lives within the Schema.org hierarchy, and that item type’s usage on the web.
*Leveraging the HTTPS version of a Schema.org markup is acceptable
What is an item type?
An item type is a piece of Schema.org’s vocabulary of data used to annotate and structure elements on a web page. You can think about it as what you’re marking up.
At the highest level of most Schema.org item types is Thing (alternatively, we’d be looking at DataType). This intuitively makes sense because almost everything is, at its highest level of abstraction, a Thing. The item type Thing has multiple children, all of which assume Thing’s properties in a cascading in a hierarchical fashion (i.e., a Product is a Thing, both can have names, descriptions, and images).
Explore Schema.org’s item types here with the various visualizations:
Item types are going to be the first attribute in your markup and will look a little like this (remember this for a little later):
Tip: Every Schema.org item type can be found by typing its name after Schema.org, i.e. https://schema.org/Aquarium (note that case is important).
Below, this is where things start to get fun — the properties, expected type, and description of each property.
What are item properties?
Item properties are attributes, which describe item types (i.e., it’s a property of the item). All item properties are inherited from the parent item type. The value of the property can be a word, URL, or number.
What is the "Expected Type"?
For every item type, there is a column the defines the expected item type of each item property. This is a signal which tells us whether or not nesting will be involved. If the expected property is a data type (i.e., text, number, etc.) you will not have to do anything; otherwise get ready for some good, old-fashioned nesting.
One of the things you may have noticed: under “Property” it says “Properties from CivicStructure.” We know that an Aquarium is a child of CivicStructure, as it is listed above. If we scan the page, we see the following “Properties from…”:
This looks strikingly like the hierarchy listed above and it is (just vertical… and backward). Only one thing is missing – where are the “Properties from Aquarium”?
The answer is actually quite simple — Aquarium has no item properties of its own. Therefore, CivicStructures (being the next most specific item type with properties) is listed first.
Structuring this information with more specific properties at the top makes a ton of sense intuitively. When marking up information, we are typically interested in the most specific item properties, ones that are closest conceptually to the thing we’re marking up. These properties are generally the most relevant.
Creating a markup
- Open the Schema.org item type page.
- In this case, we’ll go to https://schema.org/Aquarium.
- Review all item properties and select all relevant attributes.
- After looking at the documentation, openingHours, address, aggregateRating, telephone, alternateName, description, image, name, and sameAs (social media linking item property) stood out as the most cogent and useful for aquarium goers. In an effort to map out all of the information, I added the “Expected Type” (which will be important in the next step) and the value of the information we’re going to markup.
- Add the starting elements of all markup.
- All markup, whether JSON-LD or microdata, starts with the same set of code/markup. One can memorize this code or leverage examples and copy/paste.
- JSON-LD: Add the script tag with the JSON-LD type, along with the @context, and @type with the item type included:
- Start light. Add the easier item properties (i.e., the ones that don’t require nesting).
- First off, how do you tell whether or not the property nests?
- This is where the “Expected Type” column comes into play.
- If the “Expected Type” is “Text”, “URL”, or “Number” — you don’t need to nest.
- I’ve highlighted the item properties that do not require nesting above in green. We’ll start by adding these to our markup.
- First off, how do you tell whether or not the property nests?
- JSON-LD: Contains the item property in quotation marks, along with the value (text and URLs are always in quotation marks). If there are multiple values, they’re listed as arrays within square [brackets].
- Finish strong. Add the nested item properties.
- Nested item properties are item types within item types. Through nesting, we can access the properties of the nested item type.
- JSON-LD: Nested item properties start off like normal item properties; however, things get weird after the colon. A curly brace opens up a new world. We start by declaring a new item type and thus, inside these curly braces all item properties now belong to the new item type. Note how commas are not included after the last property.
- Test in Google’s Structured Data Testing Tool.
- Looks like we’re all good to go, with no errors and no warnings.
Side notes:
- *address: Google’s documentation list address, nested within PostAddress as a requirement. This is a good indicator of why it’s important to review Google’s documentation.
- openingHours: Multiple times are listed out in an array (as indicated by the square brackets). As the documentation’s “Description section” mentions – using a hyphen for ranges and military time.
- Note: Google’s documentation uses the openingHoursSpecification item property, which nests OpeningHoursSpecification. This is a good example where Google documentation shows a more specific experience to consider.
- telephone: Sometimes you need to add a country code (+1) for phone numbers.
- image: URLs must be absolute (i.e., protocol and domain name included).
TL;DR:
- Schema.org’s documentation can be leveraged to supplement Google’s structured data documentation
- The “Expected Type” on Schema.org tells you when you need to nest an item type
- Check out Merkle’s Structured Data Markup Generator if you want to try simply inserting values and getting a preliminary markup
Thanks!
A huge thanks to Max Prin (@maxxeight), Adam Audette (@audette), and the @MerkleCRM team for reviewing this article. Plus, shout outs to Max (again), Steve Valenza (#TwitterlessSteve), and Eric Hammond (@elhammond) for their work, ideas, and thought leadership that went into the Schema Generator Tool!
I've explored schema quite a bit but beyond two specific use cases - product markup to avoid the duplicate content filter and reviews markup to get rich snippets in search - I haven't seen any real results from implementing schema. Unfortunately I've wasted many hours on troubleshooting and implementing, but have never been able to verify any sort of positive lift from schema. With John Mueller specifically saying that schema is not a ranking signal, and studies showing no correlation (or so weak it's insignificant) between schema implementation and page position, I'm finding it very difficult to justify using schema. This guide is excellent for explaining schema and how to implement, and I love the way it flows (good job!), but does anyone have any case studies that show why we should even bother with it? Theoretically you're able to give Google context about the information on your website and that should help you rank over people who don't, but in practice this is not the case (likely because hummingbird and rankbrain are able to figure that out without schema). I suspect that there may be very specific use cases in certain industries that may benefit, but I haven't seen any studies yet and I'd really love to hear from someone who has.
Hi Brett!
Great point and this could definitely be an entire post within itself.
Most of the case studies I've seen relate to:
Considerations:
Personal Thoughts:
-Lex
Thank you! This is exactly the kind of information I was looking for. To give some additional clarity, I've done a ton of work with local businesses in the home services category, so there was a lot of schema that I believe is not actively used by Google that we are maintaining. I've been trying to figure out whether or not it's worth continuing to maintain some of the schema that we can't validate as being helpful and your response solidifies my belief that it should only be used for specific cases as it ties to business goals (eg. if CTR to high conversion pages drops after adding schema then remove schema). We're building a massive local SEO A/B testing platform for a client; once it's complete I'll have the test group add or remove schema and measure the impact on organic traffic and on page position to see if I can influence that. I suspect there could be some surprises in the results.
Edit: Also, please write a full blog post on this. It's badly needed - no one is coming forward as an expert within the industry and providing thoughtful and thorough information on when to use schema and why. I hate the shotgun approach.
Hi Brett, great comments. I am working on putting together some case studies for a few clients of mine specifically regarding star ratings appearing in search and it's impact on CTR, traffic, conversions, etc. The short answer is that I have been seeing some great results for clients who already rank well for a lot of terms especially for local SEO clients but mixed results for clients who don't already have enough high rankings. For time management efficiency I am starting to implement this type of structured data later on in my campaigns when the impact will be greater rather than earlier on where the time spent won't justify the return. I am not seeing direct ranking increases but with improved CTR typically comes improved rankings over time.
I will keep you in the loop when I finish it.
Awesome! Thanks John!
Hi Johin, waiting for the results. I also have some unsurety and doubts and for that I have asked to Britney and she responded well.
John-Interested myself in the star ratings, since it seems to make a positive difference in traffic/CTR.
This is great! I've been trying to transition from Microdata to JSON-LD because I'm not very good with HTML, and it was always frustrating to me that microdata had to be wrapped up in the formatting of what's being marked up.
Once you've created JSON-LD markup and it's tested and ready to be put on a Wordpress site, where does the script actually need to be placed? I've noticed it can't just be placed in the HTML of a page or widget.
Thanks for reading Josh!
Either <head> or <body> works: https://developers.google.com/search/docs/guides/i...
However, make sure the markup is high enough in the HTML that Google will see it every time it crawls (loads within the ~5 second window). This could only be an issue for a larger site, but some food for thought to throw out there.
Hi Alexis
You know? I also hear the word Schema and I begin to tremble. The truth is I limp here a lot.
Anyway, we will thoroughly review this post and try to make things clear.
Many thanks for the information
Thanks Luis!
Lol - We could have definitely titled this - Overcoming Schema.org Phobias... :-)
This echos my early experiences with Schema.org! I must have tested the same page a dozen times and kept getting the same errors. The actual documentation is pretty lacking if you're a beginner. Then, suddenly it clicks and your just get it. I really wish I had this guide back then. It would have saved me a lot of time and frustration.
Definitely! Thanks Brett! Your feedback is exactly what I was hoping for! #TheSchemaStruggleIsReal
Great article Alexis. The schema tool you linked out to is a great resource thanks for sharing as well. What are your thoughts on the data highlighter in Google Search Console? I have been having some success lately getting star ratings to show on SERP just through using data highlighter. Do you think it would be worth it for me to implement structured data directly in the code or is the highlter sufficient? Is their a way to implmeent this structured data in Google Tag Manager rather than directly coding it? That would speed up implementation time for me and help make this process more effieicent.
Thanks!
Hi John!
Thanks for reading!
From what I've heard from other SEOs is that the highlighter has mixed success (mostly skewing towards less successful). However, if it works, I wouldn't change it. It's good to hear that the tool is functioning for you!
You can add JSON-LD within Google's Tag manager. Here's a post on Moz about it: https://moz.com/blog/using-google-tag-manager-to-d...
In-depth post Alexis. Earlier I have also faced problem working on schema, but with few experiments I got to know its not that much difficult. Thanks for sharing the tool.
Waiting for the another post including the importance and ranking impacts (if any) of Schema.
Thanks for reading Shalu!
Hi Alexis,
Very useful post. One question - LocalBusiness JSON/LD Schema should be implemented site wide or just on certain pages which we are targeting?
Thanks
Karun
Hi Alexis!
+1 to that question. I guess it depends on the markups you apply, right?
Plus, other questions:
Thank you for that detailed tutorial!
Hi Angel!
Thanks for reading. Great questions!
'https://schema.org'
and'https://schema.org'
are fine."Great, thank you Alexis!
Hi Karun!
Definitely to any local pages.
It could be applied to any pages that have the address/local business information; however, I would prioritize on what's really important to that page. For example, if you have Product pages with addresses on them, starting with the Product markup.
Hi Karun,
We have been useing schema.org from last couple of year, and yes when you start it for the first time it is little tricky to understand but later you will find it really easy. There are example are given on schema.org which I feel straight forward, some of them don't have but one can reference the example of given one and create the one.
If you want to be ready for the mobile-first in terms of having your content utilized and ready to present on any future device the JSON structure is most reliable way.
If your mobile website is setup Dynamic Responsive then you have to be very careful with wrapping the schema the reason is Google is expecting same data on your desktop and mobile version.
You desktop content can have different HTML tags wrapped around than your mobile content, but they still need to have same JSON/Schema on each of them.
Do not wrap such information on JSON which is not participating as content. People might think that wrapping A,B and C product information in JSON and have page with content A will boost their page for B and C product as well; then don't do this...because Google may sooner or later will find people using it incorrectly and like people were doing on meta-keyword, then be ready for panatly.
Thoughts?
Thanks Alexis for this very usefull guide on Schema.org. Funny how you describe most people´s journey into schema markup from confusion to enlightment (that is if you dont give up in the middle). Merkle´s Schema Markup Generator is really handy to get a bettter grip on the schema markup scturcture.
Besides helping Google understand the content of your pages i also feel you need any edge you can get on the SERP´s with rich snippets from these markups.
Thanks for reading Ramon and checking out Merkle's tool!
Hi Alexis!
Does it make sense to manually put a generated script for BlogPosting just at the beginning of content in the source code of WordPress post? According to Google structured data tool my theme already has built-in "Article". It works and I have 0 errors but...does it make sense if some or even many informations are duplicated?
Hi Radek!
Thanks for reading!
I would leave the Article schema. Article is a bit less specific than BlogPosting (Thing > CreativeWork > Article > SocialMediaPosting > BlogPosting), but Google explicitly supports Article schema.
Really useful Schema guide, I've heard a lot of positive reviews about schema from some of prominent webmasters in my circle, but have not yet tried it myself.
I think after this guide, it would be easier for me to work on it. Will definitely leave some experience here once I get my hands dirty.
Thanks so much Ahtsham! Definitely feel free to comment with any questions or Twitter! :-)
This is extremely helpful! Great article Alexis.
Thanks Stephanie!
Thanks for this awesome post. I usually stick to the google examples of implementation, but the tools you outline are going straight in my war chest for when I get into more advanced implementations.
Thanks Vince! Nothing better than building up an arsenal! :-)
Great post Alexis! Love your work!
Only thing I'd suggest is mentioning implementing schema using Google Tag Manager. Always such a time saver :)
Thanks Sally! Totally! Means a lot coming from you! :-)
My only hesitation with Tag Manager would be Bing not reading the DOM and missing the markup. I haven't seen Bing pick up JS well, but it's got to happen soon!! Definitely has mad time saver potential though!
Hey Alexis Sanders, thank you for such a great article, this is my first comment. ^^
I have a question about 6. Test in Google’s Structured Data Testing Tool, I've made an events structured content in my website, does it matter if one or some has errors or warnings? and does it shows upcoming events and past events? or just upcoming?
Thanks!
Hi Yousef!
Thanks for reading!
Errors matter*. Warnings are less critical. Try and compare your markup with elements from the Markup Generator Tool. This way you can be sure it wasn't a syntax or nesting error.
Google only shows upcoming events.
*There is an error that appears for URLs that is questionable.
The errors were stuff like missing images, missing location, fixed them all but the problem was because "Google only shows upcoming events." I was testing it on previous events. I will try it on future events and I'll inform you with the results.
Thanks
Great, Thanks Alexis, before this article i never know about Schema!
Thanks for reading!
The article is a hidden gem itself.
Thanks so much Mr.Olisantos! I appreciate that!
Great article ! I am currently at "Intense Concentration Batman" . I hope next step is coming soon. Thanks for sharing Merkle Tool! It is awesome.
Thanks Jean-Christophe! I've been there! Keep it up!
I will! Thanks!
Great article Alexis. The schema tool you linked out to is a great resource thanks for sharing as well. What are your thoughts on the data highlighter in Google Search Console? I have been having some success lately getting star ratings to show on SERP just through using data highlighter. Do you think it would be worth it for me to implement structured data directly in the code or is the highlter sufficient? Thanks!
Hi Alexis
i have been using microdata schema for a number of years now, what is surprising to me are the number of new sites being built without its inclusion, especially in light of how easy it is to implement in its basic format. There are a number ofbplugins available for many of the popular cms that are so popular.
Thanks!
Definitely! Thanks so much for reading!
This comes to me deluxe for technical SEO.
Thank you very much!
Thanks Richard!
It's the first time that I am learning about Schema and really love your article! thank you very much.
Awesome tips. Structured data is by far the most underused thing on the internet right now, perhaps because it's a little more technical and harder to digest by the regular user. However, many people try to implement structured data but are unaware of the fact that they can get penalized. By displaying things like the star reviews on irrelevant pages or all the pages, you can risk seeing a drop in rankings, so make sure you don't abuse this stuff!
Yep. Important to follow policy. A structured data penalty results in the removal of the rich results.
John M talked about this week on Twitter too --> https://twitter.com/JohnMu/status/9225794060020490...
Very helpful schema info and tools.
Thanks for reading Evan!
We recently switched from html schema markup to using JSON, mostly because you can send a lot more info that front end users might not necessarily care about. We did a project with multiple events at the same location. The redundancy of having the same address repeatedly was a bad front end user experience, so we opted for JSON. Otherwise we'd have done display:none, which isn't ideal.
Definitely make sure that information is present on the page. It would be against Google's policy to not have content.
Alexis, you did a wonderful job putting this together about Schema. I know it really trips a lot of new people up in SEO. The essence of a great writer is someone who can take a complicated situation and put it into understandable terms.
Just awesome!
THANK YOU
Hi Alexis,
Schema.org it's been driving me crazy, so your post is so useful for me. I'm starting to put into practice all the tips and tools you provide right now.
Thank you :)
Awesome! Thanks for reading!
Thanks. I think your guide is going to help people to get easier into the topic. Schema and Rich Snippets are going to become even more important in the future for sure. By the way I like the Schema Markup Generator (JSON-LD) link from Merkle a lot.
Thanks so much Cesare!
Thanks Alexis. This was super helpful. Have been trying unsuccesfully to markup by site for a while now! The tool you linked to will definitely be helpful.
Thanks so much Josh!
I think for proper result of schema will work with verified google business account. Which fetch by that excat address and you get. If we not needed to verified google then can do business listing on big sites.
Excellent article with lots of information I wasn't aware of, thanks for sharing this, Schema can often get overlooked
Thanks for reading!
Thanks for sharing Alexis, very valuable, I'm going to step my Schema game up.