If you run events, whether that is a monthly workshop, an annual conference, a product launch webinar, or a local pop-up, you are probably used to relying on Google, Eventbrite, and social media to get the word out. That mix still works. But there is a growing channel that most event organisers are completely ignoring: AI search engines.
ChatGPT, Perplexity, and Gemini are increasingly being used to answer questions like "what marketing conferences are happening in London this autumn?" or "find me a ceramics workshop near me this weekend." These tools pull structured information from across the web. If your event page is not marked up with proper Event schema, the AI has almost no reliable way to surface it. It might not even know the event exists.
This guide walks through exactly how to implement Event schema in JSON-LD, what properties actually matter for AI visibility, and the mistakes that trip up most people doing this for the first time.
Why AI Search Treats Events Differently
AI search engines are not just reading your page copy and guessing what it means. They are trying to extract facts: who, what, when, where, how much. For events, those facts are time-sensitive and highly specific. A language model that gets the date wrong is not useful, so these systems have a strong preference for pages that make those facts machine-readable and unambiguous.
This is where schema markup earns its place. JSON-LD Event schema tells AI systems exactly what kind of thing your page describes, and then fills in the details in a structured, predictable format. There is no interpretation required. The date is the date. The venue is the venue. The ticket price is the ticket price.
Traditional SEO optimisation helps search engines rank your page. Event schema helps AI engines understand and cite your page. Those are different goals, and the second one is becoming increasingly important as more people start their information searches in an AI interface rather than a search box.
The Core Properties You Must Include
Not all Event schema properties carry equal weight. Some are required to be considered valid structured data. Others are optional but significantly improve how AI systems interpret and present your event. Here is a breakdown of what to prioritise.
The non-negotiables
At minimum, your Event schema needs these properties:
- @type: Always
Event(or a more specific subtype, covered below) - name: The full name of your event, exactly as it appears on the page
- startDate: In ISO 8601 format, e.g.
2025-09-15T09:00:00+01:00 - location: Either a
Placeobject with a physical address, or aVirtualLocationwith a URL, or both for hybrid events
Without these four, Google's Rich Results Test will flag your markup as invalid, and AI systems will have less confidence in the data. Both outcomes reduce the chance of your event being surfaced.
The properties that drive AI recommendations
Beyond the basics, these properties make a meaningful difference to how AI engines handle your event:
- endDate: Critical for multi-day events and for AI systems calculating whether an event is upcoming or past
- description: Write this for a human reading a summary, not just for search bots. AI engines often quote this directly
- image: At least one image URL; some AI interfaces display images alongside event results
- organizer: A
PersonorOrganizationobject. This links the event to your brand identity - offers: Ticket price, availability status, and a URL to purchase. This alone can be the difference between a user clicking through or not
- eventStatus: Use
EventScheduled,EventCancelled,EventPostponed, orEventRescheduledas appropriate - eventAttendanceMode: Use
OfflineEventAttendanceMode,OnlineEventAttendanceMode, orMixedEventAttendanceMode
The organizer property is one people frequently skip, but it matters for AI systems trying to assess credibility. Linking back to your organisation's schema gives the AI a trail to follow.
A Working JSON-LD Example
Here is a realistic example for a half-day marketing workshop held in person:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "EducationEvent",
"name": "AI Search Marketing Workshop: Get Found by ChatGPT and Perplexity",
"startDate": "2025-10-14T09:30:00+01:00",
"endDate": "2025-10-14T13:00:00+01:00",
"eventStatus": "https://schema.org/EventScheduled",
"eventAttendanceMode": "https://schema.org/OfflineEventAttendanceMode",
"location": {
"@type": "Place",
"name": "The Clerkenwell Hub",
"address": {
"@type": "PostalAddress",
"streetAddress": "12 Clerkenwell Road",
"addressLocality": "London",
"postalCode": "EC1M 5PA",
"addressCountry": "GB"
}
},
"image": "https://example.com/images/ai-workshop-oct2025.jpg",
"description": "A practical half-day workshop for marketing teams who want to understand how AI search engines discover and cite businesses. Covers schema markup, content structuring, and AI readiness audits.",
"offers": {
"@type": "Offer",
"url": "https://example.com/events/ai-search-workshop",
"price": "149",
"priceCurrency": "GBP",
"availability": "https://schema.org/InStock",
"validFrom": "2025-07-01T00:00:00+01:00"
},
"organizer": {
"@type": "Organization",
"name": "FlinnSchema",
"url": "https://flinnschema.com"
},
"performer": {
"@type": "Person",
"name": "James Flinn"
}
}
</script>
A few things to note here. The @type is EducationEvent, not just Event. Using a more specific subtype gives AI systems better context. The validFrom field in the offer tells systems when the ticket became available, which helps with freshness signals. And the description reads like a useful summary, not a keyword list.
Choosing the Right Event Subtype
Schema.org defines several subtypes of Event, and using the right one matters. AI engines use the type to categorise and filter results. If someone asks Perplexity for "upcoming business conferences in Manchester," it is going to weight pages marked as BusinessEvent more heavily than a generic Event.
Here are the most useful subtypes:
- BusinessEvent: Conferences, trade shows, networking events, expos
- EducationEvent: Workshops, training sessions, webinars with a learning focus
- SocialEvent: Parties, community gatherings, informal meetups
- SaleEvent: Flash sales, sample sales, pop-up retail events
- FoodEvent: Tastings, supper clubs, food markets
- MusicEvent: Concerts, gigs, open mic nights
- ScreeningEvent: Film screenings, watch parties, premiere events
- ExhibitionEvent: Art shows, gallery openings, trade exhibitions
If none of these fits neatly, use the base Event type rather than forcing the wrong subtype. An inaccurate type is worse than a generic one.
Handling Online and Hybrid Events
Since 2020, schema.org has included specific support for virtual and hybrid events. A lot of site owners are still not using it properly.
For a fully online event, swap the Place object for a VirtualLocation:
"location": {
"@type": "VirtualLocation",
"url": "https://us06web.zoom.us/j/yourwebinarlink"
},
"eventAttendanceMode": "https://schema.org/OnlineEventAttendanceMode"
For a hybrid event where people can attend in person or online, include both location objects and set the attendance mode to MixedEventAttendanceMode:
"location": [
{
"@type": "Place",
"name": "The Clerkenwell Hub",
"address": { ... }
},
{
"@type": "VirtualLocation",
"url": "https://example.com/live-stream"
}
],
"eventAttendanceMode": "https://schema.org/MixedEventAttendanceMode"
This is important because AI engines are increasingly filtering event results by format. Someone working from home asking for online events should not be shown your in-person only conference, and vice versa.
Common Mistakes That Kill Your Event Visibility
Most Event schema implementations have at least one of these problems. Each one reduces the chance of an AI engine citing your event.
Using plain text dates instead of ISO 8601
Putting "14th October 2025" in the startDate field is not valid. AI systems and validation tools expect ISO 8601 format: 2025-10-14T09:30:00+01:00. Include the time and timezone offset wherever possible. An event with no time information is less useful in a response to "what's on this Saturday morning."
Forgetting to update or remove past events
Leaving live schema markup for events that have already happened confuses AI systems and can hurt your credibility as a source. Either remove the JSON-LD after the event ends, update the eventStatus to reflect the past status, or redirect the page to a recap or recording.
Putting schema only in a plugin and not on the actual event page
Some WordPress and Shopify setups generate event schema site-wide from a plugin, but it does not actually appear on the individual event pages. Always validate that the markup is present on the specific URL you want to be cited. Use schema validation tools to confirm this before the event goes live.
Writing a description that is just a keyword dump
The description field is often what an AI engine quotes when it mentions your event. If it reads like "SEO workshop London best marketing event 2025 learn schema," it will not be quoted. Write a sentence or two that a real person would find genuinely informative.
Missing the offers block entirely
Even if your event is free, include an offers block with a price of 0 and availability set to InStock. AI engines answering "free events near me" queries need this signal to include your listing.
Validating and Monitoring Your Event Schema
Once your JSON-LD is in place, validation is not optional. Run the page through Google's Rich Results Test and Schema.org's own validator. Both will flag missing required fields and formatting errors.
Beyond validation, keep an eye on whether AI search engines are actually citing your events. Search for your event name in Perplexity or ChatGPT and see what comes back. If your structured data is solid and the page has reasonable authority, you should start appearing in AI-generated responses to relevant queries within a few weeks of publication.
At FlinnSchema, we regularly audit event pages as part of broader AI visibility reviews. The most common finding is technically valid schema that is still missing the properties AI engines actually use to make recommendations. Valid and optimised are not the same thing.
If you want to understand how AI engines decide what to surface and cite, it is worth reading about how Perplexity decides which sources to cite, because the signals go beyond schema alone.
And if you are running multiple event types across a site with other schema already in place, have a look at guidance on how many schema types you can use on a single page without causing conflicts or confusion.
Frequently Asked Questions
Does Event schema work for recurring events, like a weekly class?
Yes, but you have two main options. You can create separate event pages for each occurrence, each with their own JSON-LD and specific dates. Or you can use a single page and implement the eventSchedule property, which accepts a Schedule type describing the recurrence pattern. For most small businesses, individual pages per event date tend to perform better because each one can be indexed and cited independently.
Will Event schema guarantee my event appears in AI search results?
No, schema markup is not a guarantee. It is a signal. AI systems use structured data alongside other signals like page authority, content quality, and recency. That said, without Event schema, your chances of being cited drop significantly, especially for time-sensitive queries where AI engines need reliable date and location data quickly.
Can I use Event schema on a third-party ticketing page like Eventbrite?
Eventbrite generates its own structured data for your event listing, so that side is handled. But you should still implement Event schema on your own website's event page if you have one, because your own domain authority and brand identity matter for AI visibility. Having both is better than relying solely on the ticketing platform.
How do I handle an event that gets cancelled or postponed after the schema is published?
Update the eventStatus property as soon as possible. For a cancellation, use https://schema.org/EventCancelled. For a postponement with a new date not yet confirmed, use https://schema.org/EventPostponed. For a rescheduled event with a new confirmed date, use https://schema.org/EventRescheduled and update the startDate and endDate accordingly. Leaving cancelled event schema live without updating it is one of the fastest ways to damage your credibility as a data source.
