Search code examples
schema.orgjson-ldgoogle-rich-snippetsstructured-data

Correct structured data formatting for list of events with JSON-LD


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?


Solution

  • The position is property of ListItem (Not of the event). enter image description here

    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>
    

    enter image description here

    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