Pages

Friday, 10 July 2015

Event Markup: Primary Ticketers

If you are a primary ticketer who sells the official inventory of an event's tickets on behalf of the event's organizer, then Google can incorporate structured data markup from your website into the Knowledge Graph. This data may then be displayed across Google Search and other products, in two ways:
  • When performers or venues have events that link to your site for tickets, the markup on your site may be used to provide information such as pricing, on-sale dates, availability, and ticket links on Google.
  • When performers and venues have not themselves provided markup on their official websites, your markup may be used as a source of basic event data such as event name, date, location, and details link.
This document describes in detail how primary ticketer sites should mark up their events to maximize eligibility for Google's event features.
For a 10-minute video tutorial on how Google uses event markup, please see: https://www.youtube.com/watch?v=XXw8g-FbemI 

Markup specification

Each event should be specified with the most specific applicable subtype of schema.org/Event. Popular subtypes include ComedyEvent, Festival, FoodEvent, MusicEvent, TheaterEvent, and SportsEvent. This helps search engines categorize your event, and in some cases lets you specify extra fields relevant to that type of event, such as the "homeTeam" and "awayTeam" for a SportsEvent, or the "workPerformed" for a TheaterEvent.
The following table indicates the full set of event fields used by Google events projects.
PropertyTypeDescription
name (required)TextThe title of the event.
imageURLURL of an image or logo for the event or tour
urlURLURL of a page providing details about the event.
startDate (required)DateThe start date and time of the event, in ISO-8601 format.
doorTimeDateTimeThe time admission commences, in ISO-8601 format.
endDateDateThe end date and time of the event, in ISO-8601 format.
eventStatusEventStatusTypeThe event's cancellation status, if applicable. Must be one of the example values at right.
previousStartDateDateThe previously scheduled date (only if eventStatus is set).
typicalAgeRangeTextThe expected age range.
location (required)PlaceA nested schema.org/Place (or more specific subtype, such as schema.org/EventVenue or schema.org/PerformingArtsTheater).
location.name (required)TextThe venue name.
location.sameAsURLThe URL of the venue's official website.
location.address (required)PostalAddressThe venue's address. You may either provide the whole address as a single string, or provide the separate fields of the address in a nested schema.org/PostalAddress.
location.address.streetAddressThe street address.
location.address.addressLocalityThe locality or city.
location.address.addressRegionThe region or state.
location.address.postalCodeThe postal code.
location.address.addressCountryThe country code.
offersOfferA nested schema.org/Offer, one for each ticket type.
offers.url (recommended)The URL of a page providing the ability to buy tickets. This URL must:
  • direct to a landing page which clearly and predominantly provides, to any user from the general public, the opportunity to buy a ticket offering admittance to that specific event
  • be a link that is also present as a clickable link on the web page containing the data (i.e., not only in the markup)
  • be followable by the Googlebot, i.e., not blocked by robots.txt
offers.nameA user-visible name for the ticket type.
offers.category (required)Google recognizes the following values in this field:
  • primary: tickets available to the general public directly from the official representative of the event organizer or venue
  • secondary: tickets made available for resale after direct purchase
  • presale: tickets available early only to a subset of the public
  • premium: tickets with special benefits in addition to admission
Note: offers marked 'primary' will be given precedence in search contexts.
offers.price (required)The lowest available price, including service charges and fees, of this type of ticket.
offers.priceCurrency (required)The 3-letter currency code (unless included in price value).
offers.availability (required)The availability status of tickets.
offers.validFromThe ISO-8601 date and time when tickets go on sale (only required on date-restricted offers).
offers.validThroughThe ISO-8601 date and time when tickets go off sale (only required on date-restricted offers).
performerPersonA nested schema.org/PerformingGroup or schema.org/Person, one for each performer.
performer.nameThe performer's name.
performer.sameAsThe URL of the performer's official website or Wikipedia page.
workPerformedCreativeWorkA nested schema.org/CreativeWork, used to represent each play, dance, or classical music piece being performed at the event (if applicable).
workPerformed.nameThe name of the creative work being performed.
workPerformed.sameAsThe URL of the work's Wikipedia page or other reference page.
awayTeam
homeTeam
SportsTeam(Pending schema.org proposal for SportsEvent only, where applicable.)
homeTeam.name
awayTeam.name
The name of the team.
homeTeam.sameAs
awayTeam.sameAs
The URL of the team's official website or Wikipedia page.

Markup example: concert tickets

The following example shows how to mark up concert event information. The example is shown in JSON-LD syntax. Alternatively, you can mark up your content in Microdata or RDFa syntax if you prefer.
<script type="application/ld+json">
[{
    "@context" : "http://schema.org",
    "@type" : "MusicEvent",
    "name" : "B.B. King with Jonathon \"Boogie\" Long",
    "image" : "http://www.bbking.com/gallery/b-b-king-live.jpg",
    "url" : "http://www.bbking.com/events/apr12-providence.html",
    "startDate" : "2014-04-12T19:30",
    "doorTime" : "18:30",
    "endDate" : "2014-04-12T22:00",
    "eventStatus" : "EventRescheduled",
    "previousStartDate" : "2013-09-30T19:30",
    "typicalAgeRange" : "18+",
    "location" :
    {
        "@type" : "Place",
        "name" : "Lupo's Heartbreak Hotel",
        "sameAs" : "http://lupos.com/",
        "address" :
        {
            "@type" : "PostalAddress",
            "streetAddress" : "79 Washington St.",
            "addressLocality" : "Providence",
            "addressRegion" : "RI",
            "postalCode" : "02903",
            "addressCountry" : "US"
        }
    },
    "offers" :
    [{
        "@type" : "Offer",
        "name" : "General Admission",
        "category" : "primary",
        "price" : "$63.25",
        "availability" : "SoldOut",
        "url" : "http://www.bbking.com/ticket/17004C29"
    },{
        "@type" : "Offer",
        "name" : "VIP Experience",
        "category" : "premium",
        "url" : "http://www.bbking.com/ticket/vip/Abcde12345",
        "price" : "$299.00",
        "validFrom" : "2014-02-05T10:00",
        "validThrough" : "2014-03-19T23:59"
    }],
    "performer" :
    [{
        "@type" : "MusicGroup",
        "name" : "B.B. King",
        "sameAs" : "http://en.wikipedia.org/wiki/B.B._King"
    },{
        "@type" : "MusicGroup",
        "name" : "Jonathon \"Boogie\" Long",
        "sameAs" : "http://jonathonboogielong.com/"
    }]
}]
</script>

Markup example: theater tickets

The following example shows how to mark up event information for theater performances. The markup represents a single performance; for multiple performances, simply repeat the markup for each performance. All examples are shown in JSON-LD syntax. Alternatively, you can mark up your content in Microdata or RDFa syntax if you prefer.
<script type="application/ld+json">
{
  "@context": "http://schema.org",
  "@type": "TheaterEvent",
  "name": "Julius Caesar at Shakespeare's Globe",
  "location":
  {
    "@type": "PerformingArtsTheater",
    "name": "Shakespeare's Globe",
    "sameAs": "http://www.shakespearesglobe.com/",
    "address": "London, UK"
  },
  "offers":
  [{
    "@type": "Offer",
    "name": "Standing (Yard)",
    "url": "https://tickets.shakespearesglobe.com/performances.asp?PerIndex=287339",
    "category": "primary",
    "price": "£7.50",
    "availability": "http://schema.org/InStock"
  },{
    "@type": "AggregateOffer",
    "name": "Lower Gallery",
    "url": "https://tickets.shakespearesglobe.com/performances.asp?PerIndex=287339",
    "category": "primary",
    "lowPrice": "£17.50",
    "highPrice": "£44.50",
    "availability": "http://schema.org/LimitedAvailability"
  }],
  "startDate": "2014-10-01T19:30",
  "workPerformed":
  {
    "@type": "CreativeWork",
    "name": "Julius Caesar",
    "sameAs": "http://en.wikipedia.org/wiki/Julius_Caesar_(play)",
    "creator":
    {
      "@type": "Person",
      "name": "William Shakespeare",
      "sameAs": "http://en.wikipedia.org/wiki/William_Shakespeare"
    }
  }
}
</script>

Markup example: music festival tickets

This examples shows typical markup for a music festival, with ticketing details and performer information.
<script type="application/ld+json">
{
  "@context" : "http://schema.org",
  "@type" : "Festival",
  "name" : "Thank You Festival",
  "image" : "http://cdn.ticketfly.com/i/00/01/10/12/37-atxl1.jpg",
  "startDate" : "2014-06-26T16:00",
  "typicalAgeRange" : "All Ages",
  "location" : {
     "@type" : "EventVenue",
     "name" : "Merriweather Post Pavilion",
     "address" : "10475 Little Patuxent Parkway, Columbia, MD"
  },
  "offers" : {
     "@type" : "AggregateOffer",
     "category" : "primary",
     "lowPrice" : "$45.00",
     "highPrice" : "$549.50",
     "url" : "http://www.ticketfly.com/purchase/event/545417/tfly"
  },
  "performer" : [
    { "@type" : "MusicGroup", "name" : "Tiesto", "sameAs" : "http://www.tiesto.com" },
    { "@type" : "MusicGroup", "name" : "Above and Beyond", "sameAs" : "http://www.aboveandbeyond.nu" },
    { "@type" : "MusicGroup", "name" : "Krewella", "sameAs" : "http://www.krewella.net" },
    { "@type" : "MusicGroup", "name" : "Cedric Gervais", "sameAs" : "http://www.cedricgervais.com" },
    { "@type" : "MusicGroup", "name" : "Alvin Risk", "sameAs" : "http://en.wikipedia.org/wiki/Alvin_Risk" }
  ]
}
</script>

FAQ for Ticketer Events Markup

My site's event listings are spread over multiple web pages. How should I mark them up?

It is fine to include markup on multiple pages of events; Google will collect event details from all the pages it indexes on your site.

Will Google recognize event markup in dynamically generated (e.g. AJAX) web pages?

JSON-LD markup inserted by Javascript that runs upon initial page load can be recognized. Other forms of markup in dynamic content are not supported.