What Is Event Schema? The Complete Guide (2026)
What Is Event Schema?
Event schema is a type of structured data — based on the Schema.org Event vocabulary — that tells Google a page describes a specific event: a concert, a conference, a sports match, a theater show, or any other time-bound gathering. When correctly implemented, Google can display your event in a dedicated rich results carousel showing the event name, date, location, and a direct link to buy tickets — all without the user having to click into your page.
Event rich results appear prominently above organic search listings and in Google Maps, putting your event in front of people actively looking for things to do. According to Google, event rich results drive significantly higher click-through rates than standard blue-link results.
- Event schemais JSON-LD markup that enables Google's event rich results carousel — showing date, location, and ticket info in search.
- Three required fields:
name,startDate(ISO 8601 with timezone), andlocation(a physical address — online-only events do not qualify for rich results). - For cancelled or rescheduled events, use
eventStatus. Always keepstartDatein the markup even if the event is cancelled. AddpreviousStartDatewhen rescheduled. - Offer price must be a plain number — no currency symbols, no commas. Use
priceCurrencyfor the 3-letter ISO 4217 code.
How Event Schema Appears in Google Search
Google displays qualifying events in a scrollable carousel at the top of search results. Each card in the carousel shows:
- The event name and thumbnail image
- The date and time
- The venue name and city
- A ticket link (if
offers.urlis present)
These carousels appear for queries like "concerts near me," "Taylor Swift tour dates," or "tech conferences 2026" — making Event schema particularly valuable for venues, promoters, conference organizers, and ticketing platforms. Each event in the carousel links directly to its own URL, so structured data must be present on the individual event page — not a listing page.
Events That Do NOT Qualify for Google Rich Results
Google disqualifies several categories of events from appearing as rich results, regardless of how correctly the schema is implemented:
| Disqualifier | Why It's Excluded |
|---|---|
| Online-only events (no physical location) | Google requires a physical venue for Event rich results. A VirtualLocation-only event will not appear in the carousel. |
| Membership or invitation-only events | The event must be bookable by the general public. Ticket purchase URLs must be openly crawlable by Googlebot without login walls. |
| School events where participants and audience are minors | Spectator events held on school premises where the primary participants are minors are not eligible. |
| Non-events (coupons, discounts, business hours) | Marking promotions or operational information as events is a policy violation and will result in manual actions. |
| Multiple simultaneous events at one URL | Each event must have its own dedicated URL with schema on that specific page. Listing pages aggregating many events are not eligible. |
Note: online-only events can and should still use Event schema for AI search visibility, voice assistants, and knowledge graph enrichment — they just won't appear in Google's visual event carousel.
Required Properties
Google requires three properties for an event to be eligible for rich results. Missing any one of them will prevent the event from appearing in the carousel.
| Property | Type | Description |
|---|---|---|
name | Text | The full title of the event. Use a specific, descriptive name — avoid generic terms like "Concert" or "Show" alone. Do not include promotional language such as "Buy tickets now" or discount offers. The venue name belongs in location.name, not here. |
startDate | DateTime | The event start date and time in ISO 8601 format. Always include a timezone offset (e.g., 2026-09-15T19:30:00-05:00). If the start time is genuinely unknown, use date-only format (2026-09-15). Avoid using T00:00:00 as a placeholder — Greadme flags this as a warning because midnight start times are typically an error, not an actual event time. |
location | Place or VirtualLocation | For physical events: a Place object containing a nested PostalAddress. Include streetAddress, addressLocality, postalCode, addressRegion, and addressCountry. For online events: a VirtualLocation object with a url — but note that online-only events do not qualify for Google Event rich results. |
Recommended Properties
These properties are not required for rich result eligibility, but each one improves how your event appears in Google Search and how accurately AI assistants can describe it. Greadme deducts score for missing recommended fields.
| Property | Type | Notes |
|---|---|---|
description | Text | A clear description of what makes this specific event unique. Minimum 50 characters — Greadme flags shorter descriptions as warnings. |
endDate | DateTime | Event end date and time in ISO 8601 format. Required for multi-day events. Use the same timezone format as startDate. |
image | ImageObject or URL | Event imagery. Google recommends providing three aspect ratios: 16:9, 4:3, and 1:1. Minimum width: 720px; recommended: 1920px. Minimum total pixels: 50,000. Images must be crawlable and indexable by Googlebot. |
eventStatus | EventStatusType | The current status of the event. See the Event Status section below for all valid values. Defaults to EventScheduled if omitted. |
offers | Offer | Ticket pricing, availability, and purchase URL. See the Offers section below for full details. |
organizer | Organization or Person | The host of the event. Include both name and url. Greadme warns separately for missing name and missing URL. |
performer | Person or PerformingGroup | Artists, speakers, comedians, or other participants. Include name on each performer object. Use an array for multiple performers. |
location.name | Text | The venue or place name (e.g., "Madison Square Garden"). Greadme warns if this is missing and also warns if it duplicates the event name — the two should always be different values. |
eventAttendanceMode | EventAttendanceModeEnumeration | Whether the event is in-person, online, or hybrid. See the Attendance Mode section below. |
isAccessibleForFree | Boolean | Set to true for free events. When used, also set offers.price to 0 for completeness. |
eventStatus: Cancelled, Postponed, and Rescheduled Events
When an event's status changes, update the eventStatusproperty immediately rather than removing the schema. Google uses the status to update how your event appears in search results — a cancelled event can still surface with a "Cancelled" badge, which is more helpful to users than a dead page.
| Value | Meaning | Additional requirement |
|---|---|---|
EventScheduled | Event proceeds as planned. This is the default. | None |
EventCancelled | Event has been cancelled. | Keep startDate in the markup. Do not remove it even though the event is no longer happening. |
EventPostponed | Event is delayed; no new date has been set yet. | None |
EventRescheduled | Event has been moved to a new date. | Must include previousStartDate with the original start date. Greadme flags this as a warning if omitted. Update startDate to the new date. |
EventMovedOnline | Event has moved to an online format. (Schema.org only) | Not explicitly listed in Google's rich results documentation. Use with caution; pair with eventAttendanceMode: OnlineEventAttendanceMode. |
Values can be written in short form ("EventCancelled") or full URL form ("https://schema.org/EventCancelled"). Greadme accepts both.
Offers: Ticket Pricing and Availability
The offers property tells Google and search users the ticket price, where to buy, and whether tickets are still available. This is one of the most impactful properties for driving clicks from the event carousel — users see the price range before clicking.
| Property | Type | Notes |
|---|---|---|
price | Number | The ticket price as a plain number — no currency symbol, no comma separators. Example: 49 or 49.99. Greadme throws an error if the value contains "$", "€", or commas. For free events, use 0. |
priceCurrency | Text | The 3-letter ISO 4217 currency code. Examples: "USD", "EUR", "GBP". |
availability | ItemAvailability | Only three values are valid for events: InStock (tickets available), SoldOut, or PreOrder (on sale soon). Greadme rejects any other value. |
url | URL | Direct link to the ticket purchase page. Must be publicly accessible without login — Googlebot must be able to crawl it. |
validFrom | DateTime | The date and time when tickets go on sale. Must be in ISO 8601 format. Useful for pre-sale announcements. |
For events with multiple ticket tiers, use an array of Offer objects. For events with a price range (e.g., floor and VIP tickets), use an AggregateOffer with lowPrice and highPrice.
eventAttendanceMode: In-Person, Online, or Hybrid
The eventAttendanceMode property explicitly signals how attendees participate. While optional, it is strongly recommended — especially for hybrid events where both physical and online attendance is possible.
| Value | Use case | location type |
|---|---|---|
OfflineEventAttendanceMode | In-person only event | Place with PostalAddress |
OnlineEventAttendanceMode | Online-only event (no physical venue) | VirtualLocation with url — note: not eligible for Google Event rich results |
MixedEventAttendanceMode | Both in-person and online attendance available | Array: one Place and one VirtualLocation |
Use the full Schema.org URL form for these values: "https://schema.org/OfflineEventAttendanceMode".
Complete Implementation Examples
1. Standard Physical Event with Tickets
{
"@context": "https://schema.org",
"@type": "Event",
"name": "Jazz & Blues Festival 2026",
"startDate": "2026-09-12T18:00:00-05:00",
"endDate": "2026-09-12T23:00:00-05:00",
"eventStatus": "https://schema.org/EventScheduled",
"eventAttendanceMode": "https://schema.org/OfflineEventAttendanceMode",
"description": "Live jazz and blues, 12 artists, 3 stages.",
"image": [
"https://example.com/img/festival-16x9.jpg",
"https://example.com/img/festival-4x3.jpg",
"https://example.com/img/festival-1x1.jpg"
],
"location": {
"@type": "Place",
"name": "Millennium Park",
"address": {
"@type": "PostalAddress",
"streetAddress": "201 E Randolph St",
"addressLocality": "Chicago",
"addressRegion": "IL",
"postalCode": "60601",
"addressCountry": "US"
}
},
"organizer": {
"@type": "Organization",
"name": "Chicago Music Foundation",
"url": "https://example.com"
},
"performer": [
{ "@type": "MusicGroup", "name": "The Blue Notes" },
{ "@type": "Person", "name": "Maria Estrada" }
],
"offers": {
"@type": "Offer",
"url": "https://example.com/tickets",
"price": 35,
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"validFrom": "2026-06-01T09:00:00-05:00"
}
}2. Rescheduled Event
{
"@context": "https://schema.org",
"@type": "Event",
"name": "Annual Developer Conference 2026",
"startDate": "2026-10-20T09:00:00-07:00",
"endDate": "2026-10-22T18:00:00-07:00",
"eventStatus": "https://schema.org/EventRescheduled",
"previousStartDate": "2026-09-15T09:00:00-07:00",
"description": "3-day conference for software developers. Moved to October.",
"location": {
"@type": "Place",
"name": "Moscone Center",
"address": {
"@type": "PostalAddress",
"streetAddress": "747 Howard St",
"addressLocality": "San Francisco",
"addressRegion": "CA",
"postalCode": "94103",
"addressCountry": "US"
}
},
"organizer": {
"@type": "Organization",
"name": "DevConf Foundation",
"url": "https://example.com"
},
"offers": {
"@type": "Offer",
"url": "https://example.com/tickets",
"price": 499,
"priceCurrency": "USD",
"availability": "https://schema.org/PreOrder"
}
}3. Free Hybrid Event (In-Person + Online)
{
"@context": "https://schema.org",
"@type": "Event",
"name": "Product Design Summit: The Future of UX",
"startDate": "2026-11-05T10:00:00-08:00",
"endDate": "2026-11-05T17:00:00-08:00",
"eventStatus": "https://schema.org/EventScheduled",
"eventAttendanceMode": "https://schema.org/MixedEventAttendanceMode",
"isAccessibleForFree": true,
"description": "Full-day UX summit. Attend in Seattle or stream online free.",
"image": "https://example.com/img/ux-summit-2026.jpg",
"location": [
{
"@type": "Place",
"name": "Seattle Convention Center",
"address": {
"@type": "PostalAddress",
"streetAddress": "705 Pike St",
"addressLocality": "Seattle",
"addressRegion": "WA",
"postalCode": "98101",
"addressCountry": "US"
}
},
{
"@type": "VirtualLocation",
"url": "https://example.com/live"
}
],
"organizer": {
"@type": "Organization",
"name": "UX Collective",
"url": "https://example.com"
},
"offers": {
"@type": "Offer",
"url": "https://example.com/register",
"price": 0,
"priceCurrency": "USD",
"availability": "https://schema.org/InStock"
}
}7 Common Event Schema Mistakes
1. Using Midnight as a Default Start Time
Setting "startDate": "2026-09-15T00:00:00" when the actual start time is unknown is a common mistake. Google interprets this literally as a midnight event. If the time is unknown, use date-only format: "2026-09-15". Greadme flags the midnight pattern as a warning.
2. Putting the Venue Name in the Event Name
"name": "Jazz Festival at Millennium Park"is not wrong per se, but it violates Google's guidance to keep the venue in location.name. Use "name": "Jazz Festival 2026" and put "Millennium Park" in location.name.
3. Promotional Language in the Event Name
"name": "Jazz Festival — Buy Tickets Now! 30% Off" is a policy violation. The namefield must contain the event title only. Greadme detects and warns for keywords like "buy", "sale", "discount", "%", or "$" in the event name.
4. Using a Currency Symbol in the Price
"price": "$49" or "price": "49,00" will cause a Greadme error. Price must be a plain number: 49 or 49.99. The currency goes in the separate priceCurrency field.
5. Missing previousStartDate When EventRescheduled
When you set "eventStatus": "EventRescheduled", you must also include previousStartDate with the original start date. Greadme warns if previousStartDate is absent. Conversely, if you include previousStartDate but forget to set the status to EventRescheduled, Greadme also warns.
6. Using VirtualLocation and Expecting Rich Results
A common misconception: online-only events are automatically excluded from Google's Event rich results carousel. If location is VirtualLocation only (with no physical Place component), Greadme deducts 15 points and shows a warning. Add Event schema anyway for AI assistant visibility — but do not expect the Google carousel.
7. Removing startDate When Cancelling
When an event is cancelled, a natural instinct is to remove or blank out startDate. Don't — Google requires startDate to remain in the markup even for cancelled events. Simply update eventStatus to EventCancelled and leave the rest intact.
Event Schema and AI Search Visibility
AI search platforms — including Google AI Overviews, ChatGPT Search, and Perplexity — increasingly source event information from structured data. When a user asks "What concerts are happening in Chicago in September?" these systems extract event details from JSON-LD markup on event pages.
Even for online-only events that don't qualify for Google's visual carousel, complete Event schema significantly improves how accurately AI assistants describe your event: the title, date, location, performer names, and ticket link all become structured, machine-readable facts that AI systems can extract and cite rather than infer from unstructured body text.
For recurring events such as weekly workshops or monthly meetups, use the eventSchedule property with a Schedule object (from Schema.org) to describe the recurrence pattern — this gives AI systems a richer signal than duplicating the same event markup across dozens of individual pages.
How to Validate Your Event Schema
Paste your event page URL into Greadme to validate your Event schema. Greadme checks every required and recommended field, detects promotional language in the event name, flags midnight start time placeholders, warns about VirtualLocation-only events, and verifies that previousStartDate and eventStatus are consistent with each other. The score report shows exactly which fields are missing or misconfigured so you can fix them before submitting to Google.
