
Element Code: RI-013
I audit a lot of venue, university, and conference sites, and event pages are where structured data earns its keep most visibly. Most schema types give you an abstract, hard-to-measure benefit. Event schema gives you a listing with a date, a place, and often a ticket link, right in the search results. When a client's own event page loses that placement to an Eventbrite or Ticketmaster copy of the same event, it is almost always because the aggregator shipped clean markup and the client shipped nothing.
What Event schema actually is
Event schema is the schema.org Event vocabulary applied to a page that describes a single real-world or online happening: a concert, a webinar, a conference, a workshop, a match. You express it as a JSON-LD block in the page source, and Google reads it to understand the who, when, and where of the event without having to guess from your prose.
The vocabulary includes useful subtypes, and you should use the most specific one that fits: MusicEvent, SportsEvent, BusinessEvent, EducationEvent, TheaterEvent, Festival, and more. Google treats them all as events for rich result purposes, but specificity costs you nothing and helps other consumers of the data.
Three properties are required by Google before an event is even considered for rich results: name, startDate, and location. Everything else is recommended, and the recommended fields are where the listing actually gets attractive.
How Google decides whether you get the rich result
One honest caveat before you get excited: valid markup makes you eligible, it does not guarantee anything. Google decides case by case, and the dedicated event search experience is not available in every country. But ineligible is a guaranteed no, so the markup is still the price of entry.
Why this matters for SEO
Event queries carry strong, time-boxed intent. Someone searching "jazz concerts near me this weekend" is going to click something within minutes, and Google's event surfaces are built to capture exactly that. If your page is in that surface, you get the click and the ticket revenue. If not, an aggregator gets it, resells your own event back to your audience, and takes a cut.
There is also a plain CTR effect in regular results. An event snippet showing the date and venue directly answers the searcher's first two questions before they click, and listings that answer questions get chosen. This is one of the few schema types where I have watched clicks move within weeks of deployment, simply because the result type changed.
Property reference
| Property | Status | What to provide |
|---|---|---|
name | Required | The event title only. No city, no dates, no promo copy stuffed in. |
startDate | Required | ISO 8601 with timezone offset, e.g. 2026-09-12T19:30:00-05:00. |
location | Required | A Place with a full PostalAddress, or VirtualLocation with a URL for online events. |
endDate | Recommended | Same format as startDate. Matters for multi-day events. |
eventStatus | Recommended | EventScheduled, EventPostponed, EventCancelled, or EventMovedOnline. Keep it current. |
eventAttendanceMode | Recommended | Offline, online, or mixed. Pair mixed mode with both a Place and a VirtualLocation. |
offers | Recommended | Real price, currency, availability, and a URL that lands directly on the purchase step. |
performer / organizer | Recommended | Person or Organization objects. Helps disambiguation for touring acts. |
image, description | Recommended | A real event image and a short factual summary matching the visible page. |
How to detect the problem
Start with one representative event URL in Google's Rich Results Test. It tells you immediately whether an Event object was found, and which required or recommended fields are missing or malformed.
For site-wide coverage, crawl with Screaming Frog: enable JSON-LD extraction and Google rich result feature validation under Config, then Spider, then Extraction, and work through the Structured Data tab filters for missing and invalid items. This is how you find the template-level failure, which is what it usually is: one broken date format repeated across four hundred event pages.
Then check Search Console. If Google has already found event markup on your site, the Events report under Enhancements lists every item with errors like a missing startDate or an unrecognized date format. If the report does not exist at all, Google has found no event markup anywhere, which for a site full of events is your answer.
How to fix it, step by step
- One Event object per real event, on that event's own URL. Do not mark up a category or listing page as a single event, and do not mark up things that are not events. Google's guidelines explicitly call out promotions like a weekend sale as abuse of event markup.
- Fill the three required fields with real values. Dates in ISO 8601 with an explicit timezone offset. A surprising number of "invalid startDate" errors are just
12/09/2026written the human way. - Model the location correctly. Physical: a
Placewith name and full street address. Online:VirtualLocationwith the join or registration URL, plusOnlineEventAttendanceMode. Hybrid: both locations in an array withMixedEventAttendanceMode. - Add offers, performer, organizer, image. These are what turn the listing from adequate into clickable.
- Keep status honest over the event lifecycle. A cancelled event should stay published with
eventStatus: EventCancelled, not 404. A postponed one getsEventPostponedwith the old date left in place until a new one is confirmed, which is exactly what Google's documentation asks for. - Validate, deploy, request indexing on a few templates, and watch the GSC Events report over the following weeks.
If you are on WordPress, plugins like The Events Calendar, Rank Math, or Yoast can emit Event schema for you. Verify what they actually output with the Rich Results Test rather than trusting the settings screen. I have seen plugin-generated markup with an empty location on every single event because a venue field was never mapped.
- Use one Event object per actual event, on its own URL
- Write dates in ISO 8601 with timezone offsets
- Update eventStatus when things change instead of deleting pages
- Make the markup match the visible page content exactly
- Use the most specific Event subtype that fits
- Mark up sales, promos, or coupons as events
- Stuff cities or keywords into the name field
- Leave long-past events marked as EventScheduled
- Mark up a listing page as one giant event
- Ship the JSON-LD inside a script bundle that only renders after user interaction
What good looks like
Every event has a dedicated URL carrying one valid Event object whose values match the visible content. The GSC Events report shows items with zero errors. Statuses track reality: scheduled, postponed, cancelled. And in the Performance report, filtering by search appearance shows event results actually accruing impressions and clicks. When a venue owns its own event listings in search instead of renting them back from an aggregator, this check is done.
FAQ
We sell through Eventbrite. Doesn't their markup cover us?
JSON-LD or microdata?
How do I handle a recurring event, like a weekly class?
Will Event schema improve my rankings?
I check schema coverage, eligibility errors, and rich result performance as part of every Advanced SEO Audit. You get a prioritized fix list, not a PDF of screenshots.
Claude Vincent is a technical SEO consultant focused on crawlability, rendering, and AI-search visibility. He writes the field guides and case studies at SEO ProCheck, with a bias toward the durable, unglamorous work that decides whether search engines and AI answer engines can actually read and cite a site.
About SEO ProCheck
Technical SEO consulting and GEO strategy with 20 years of enterprise experience. Case studies, resources, and tools for search and AI visibility.
Work With Me
Technical SEO audits, GEO strategy, site migrations, and international SEO. Hourly consulting for teams who need hands-on support, not just reports.







