I am attempting to create structured data for a list of events. I currently have the following:
"@context": "http:\/\/schema.org",
"@type": "ItemList",
"name": "Forthcoming Shows",
"url": "http:\/\/example.com\/",
"itemListElement": [
{
"@type": "Event",
"name": "test event",
"startDate": "21\/07\/2020",
"endDate": "24\/07\/2020",
"description": "description here",
"position": 1,
"url": "http:\/\/example.com/",
"location": [
{
"@type": "Place",
"name": "Venue name",
"address": "Venue address"
}
]
},
etc
]
Google's Structured data testing tool objects to the position as The property position is not recognized by Google for an object of type Event, but if I leave it out the tool objects because A value for the position field is required. I could siply use a ListItem as the type, but then start date and end date are invalid and I rather hoped that a list of events would allow for these event details to be included. Unfortunately I can't find any examples of a list of events or and events calendar to reference. What would the correct/best structure be?
The position
is property of ListItem
(Not of the event).
To fix your issue you should use a nested object (itemListElement > item (type event)).
Basic outline (Missing some properties for shorter code):
<script type="application/ld+json">
{
"@context": "http://schema.org",
"@type": "ItemList",
"name": "Basic list",
"numberOfItems": 2,
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"item": {
"@type": "event",
"name": "hello"
}
},
{
"@type": "ListItem",
"position": 2,
"item": {
"@type": "event",
"name": "world"
}
}
]
}
</script>
"THE PROBLEM"
Add structured data to your event pages. Currently, the event experience on Google only supports pages that focus on a single event https://developers.google.com/search/docs/data-types/event
Anyway, your markup could look something like this (Again google not support this for rich results
true to June 2020):
<script type="application/ld+json">
{
"@context": "http://schema.org",
"@type": "ItemList",
"url": "http://hello.com",
"numberOfItems": "2",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Event One",
"item": {
"@type": "Event",
"name": "If Not For You",
"url": "http://hello.com#one",
"startDate": "2025-07-21T19:00-05:00",
"location": {
"name": "Snickerpark Stadium",
"address": "Paris"
}
}
},/*item two*/
{
"@type": "ListItem",
"position": 2,
"name": "Event Two",
"item": {
"@type": "Event",
"name": "Event Two",
"url": "http://hello.com#two",
"startDate": "2025-07-21T19:00-05:00",
"location": {
"name": "Empire Stadium",
"address": "London"
}
}
}
]
}
</script>
One more issue. Google uses a very close outline for summary-page
(Keep this in mind):
Defines an ItemList, where each ListItem has only three properties: @type (set to "ListItem"), position (the position in the list), and url (the URL of a page with full details about that item https://developers.google.com/search/docs/data-types/carousel