Event Schema for AI Search
schema.org/Event is the canonical JSON-LD type for time-bound gatherings (conferences, webinars, classes, festivals, sports games). Unlike Service, Event has a Google rich result, so required properties matter: name, startDate, location. For virtual events, use VirtualLocation; for hybrid, set eventAttendanceMode: MixedEventAttendanceMode and provide both Place and VirtualLocation. Add offers for tickets, performer for speakers, and organizer to anchor the event to your Organization entity.
TL;DR
Mark up event pages with JSON-LD @type: Event. Required: name, startDate (ISO-8601 with timezone), location. Strongly recommended: endDate, eventStatus, eventAttendanceMode, description, image, offers, organizer. For virtual-only events, use "@type": "VirtualLocation" with a url. Validate with the Schema.org Validator and Google Rich Results Test. AI search engines reuse Google's required-property bar, so getting the basics right pays double dividends.
Definition
Event is a Schema.org type for "an event happening at a certain time and location, such as a concert, lecture, or festival. Ticketing information may be added via the offers property. Repeated events may be structured as separate Event objects." Subtypes include BusinessEvent, ChildrensEvent, ComedyEvent, CourseInstance, DanceEvent, EducationEvent, ExhibitionEvent, Festival, FoodEvent, Hackathon, LiteraryEvent, MusicEvent, PublicationEvent, SaleEvent, ScreeningEvent, SocialEvent, SportsEvent, TheaterEvent, and VisualArtsEvent.
Unlike Service, Event has a dedicated Google rich result with documented required properties. AI search engines such as ChatGPT, Claude, and Perplexity reuse the same vocabulary, so a single correct implementation feeds both Google's event experience and AI citation pipelines.
Why Event schema matters for AI search
Three reasons Event schema lifts AI citation potential:
- Time and place grounding. AI engines need an unambiguous answer to "when?" and "where?" before recommending an event. startDate and location make both explicit.
- Virtual and hybrid clarity. The web is full of ambiguous "online or in-person?" event pages. eventAttendanceMode resolves the ambiguity in machine-readable form.
- Ticket-link grounding. offers.url gives AI engines a canonical purchase link to surface in their answers, increasing the chance the cited link is the correct one.
A recent Yext analysis of 6.8M AI citations found that 86% of generative AI answers draw from brand-managed sources (websites, listings, reviews); structured-data-rich pages accounted for the largest share. An independent 200-query tracking study reported sites with Schema.org markup were cited roughly 2x more than comparable unmarked sites.
Required and recommended properties
Google defines the following requirements for the event rich result. Properties marked Required are mandatory; Recommended are strongly suggested.
| Property | Type | Status | Description |
|---|---|---|---|
| name | Text | Required | Event name. Use the same wording as on the page. |
| startDate | DateTime | Required | ISO-8601 with timezone offset, e.g., 2026-09-15T09:00:00-04:00. |
| location | Place or VirtualLocation | Required | Physical place, virtual URL, or array of both for hybrid. |
| endDate | DateTime | Recommended | ISO-8601 with timezone offset. |
| description | Text | Recommended | 1-2 sentence summary. |
| image | URL or ImageObject | Recommended | Multiple aspect ratios preferred (1:1, 4:3, 16:9). |
| eventAttendanceMode | EventAttendanceModeEnumeration | Recommended | OnlineEventAttendanceMode, OfflineEventAttendanceMode, or MixedEventAttendanceMode. |
| eventStatus | EventStatusType | Recommended | EventScheduled, EventCancelled, EventMovedOnline, EventPostponed, EventRescheduled. |
| organizer | Organization or Person | Recommended | Linked to your Organization entity by @id. |
| performer | Person or PerformingGroup | Recommended | Speaker, band, team. Multiple allowed. |
| offers | Offer or AggregateOffer | Recommended | Ticket pricing, currency, validity, URL. |
| previousStartDate | DateTime | Conditionally Required | Required if eventStatus is EventRescheduled or EventPostponed. |
| inLanguage | Language or Text | Optional | BCP-47 language tag. |
| keywords | Text | Optional | Comma-separated keywords or array. |
| audience | Audience | Optional | Target audience description. |
| maximumAttendeeCapacity | Integer | Optional | Total seats. |
| remainingAttendeeCapacity | Integer | Optional | Seats still available. |
Canonical example: physical conference
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BusinessEvent",
"@id": "https://example.com/events/geo-summit-2026#event",
"name": "GEO Summit 2026",
"description": "Two-day conference on Generative Engine Optimization for technical SEO leaders. 30 talks, 8 workshops, 600 attendees.",
"startDate": "2026-09-15T09:00:00-04:00",
"endDate": "2026-09-16T17:00:00-04:00",
"eventAttendanceMode": "https://schema.org/OfflineEventAttendanceMode",
"eventStatus": "https://schema.org/EventScheduled",
"location": {
"@type": "Place",
"name": "Boston Convention Center",
"address": {
"@type": "PostalAddress",
"streetAddress": "415 Summer St",
"addressLocality": "Boston",
"addressRegion": "MA",
"postalCode": "02210",
"addressCountry": "US"
}
},
"image": [
"https://example.com/events/geo-summit-1x1.jpg",
"https://example.com/events/geo-summit-4x3.jpg",
"https://example.com/events/geo-summit-16x9.jpg"
],
"organizer": {
"@type": "Organization",
"@id": "https://example.com/#organization",
"name": "Example GEO Agency",
"url": "https://example.com"
},
"performer": [
{
"@type": "Person",
"name": "Jane Researcher",
"sameAs": "https://www.linkedin.com/in/jane-researcher"
}
],
"offers": {
"@type": "Offer",
"url": "https://example.com/events/geo-summit-2026/register",
"price": "795",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"validFrom": "2026-04-01T00:00:00-04:00"
}
}
</script>Canonical example: online-only webinar
Use VirtualLocation for purely online events. Note: Google's Rich Results Test has historically had detection bugs when OnlineEventAttendanceMode is used alone with VirtualLocation; the schema is still valid and AI engines parse it correctly.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "EducationEvent",
"@id": "https://example.com/events/llms-txt-webinar#event",
"name": "llms.txt for Engineers: A Live Workshop",
"description": "60-minute live workshop on authoring, deploying, and validating llms.txt files for AI crawlers.",
"startDate": "2026-06-12T14:00:00-04:00",
"endDate": "2026-06-12T15:00:00-04:00",
"eventAttendanceMode": "https://schema.org/OnlineEventAttendanceMode",
"eventStatus": "https://schema.org/EventScheduled",
"location": {
"@type": "VirtualLocation",
"url": "https://example.com/events/llms-txt-webinar/join"
},
"image": "https://example.com/events/llms-txt-webinar.jpg",
"organizer": {
"@type": "Organization",
"@id": "https://example.com/#organization"
},
"offers": {
"@type": "Offer",
"url": "https://example.com/events/llms-txt-webinar/register",
"price": "0",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock"
}
}
</script>Canonical example: hybrid event
For hybrid events, set eventAttendanceMode to MixedEventAttendanceMode and provide both a physical Place and a VirtualLocation in the location array:
{
"@type": "Event",
"name": "Hybrid GEO Workshop",
"startDate": "2026-07-10T10:00:00-04:00",
"endDate": "2026-07-10T16:00:00-04:00",
"eventAttendanceMode": "https://schema.org/MixedEventAttendanceMode",
"eventStatus": "https://schema.org/EventScheduled",
"location": [
{
"@type": "Place",
"name": "Example HQ",
"address": {
"@type": "PostalAddress",
"streetAddress": "100 Innovation Way",
"addressLocality": "Boston",
"addressRegion": "MA",
"postalCode": "02110",
"addressCountry": "US"
}
},
{
"@type": "VirtualLocation",
"url": "https://example.com/events/hybrid-workshop/livestream"
}
]
}startDate format rules
- Always include timezone offset. 2026-09-15T09:00:00-04:00 is correct. 2026-09-15T09:00:00 (no timezone) is rejected by Google.
- Use ISO-8601, not RFC 822. Mon, 15 Sep 2026 09:00:00 -0400 is invalid.
- Date-only is allowed for all-day events. "startDate": "2026-09-15" is valid for an all-day event with no specific time.
- endDate must be later than startDate. Identical or reversed values are flagged.
Recurring events
Schema.org supports recurring events two ways:
- Separate Event objects per occurrence (preferred). Each instance has its own @id, dates, and ticket link. This works best for AI engines because each occurrence is independently citable.
- eventSchedule property with a Schedule object. More compact but less well-supported by AI engines and Google rich results. Use only when occurrences are truly identical and per-instance pages do not exist.
For a weekly class, create one Event page per occurrence (or one canonical Event page with eventSchedule). Avoid openingHours — it is not part of the Event schema and Google rejects it.
eventStatus and rescheduling
When an event changes, update eventStatus and (if applicable) previousStartDate:
- EventScheduled (default): Event is on as planned.
- EventRescheduled: New startDate/endDate; original date in previousStartDate.
- EventPostponed: Indefinitely postponed; keep original dates and add previousStartDate.
- EventCancelled: Cancelled; do not delete the schema, mark cancelled.
- EventMovedOnline: Originally physical, now virtual. Update location to VirtualLocation and eventAttendanceMode to OnlineEventAttendanceMode.
Keep the schema live for at least 30 days after the event ends so AI engines can correctly identify past references.
Validation pipeline
- Schema.org Validator (https://validator.schema.org/): Confirms syntax.
- Google Rich Results Test (https://search.google.com/test/rich-results): Confirms eligibility for the Event rich result. Note known detection bug for online-only events.
- Search Console Events report: Surfaces required-property errors and warnings post-deployment.
- AI smoke test: Query each major AI engine for your event by name + city + month. Track citation frequency over the event's pre-launch window.
Common mistakes
- Missing timezone in startDate. Most common error. Always include the offset.
- Using Place for online events. Use VirtualLocation instead.
- No endDate. Allowed but reduces rich-result quality. Add it.
- Inline Organization in every event. Use @id reference to the canonical Organization entity.
- offers.url pointing to the event description page instead of the ticketing page. AI engines may surface the description page when users want to buy.
- Leaving stale eventStatus: EventScheduled on cancelled events. Update promptly.
- Repeating an event by reusing the same Event @id. Each occurrence needs a unique @id.
- Using openingHours for recurring events. Not a valid Event property. Use eventSchedule or separate Event objects.
How to apply
- List every event-page URL.
- For each, draft JSON-LD with name, startDate (with timezone), endDate, location, eventAttendanceMode, eventStatus, description, image, organizer, offers.
- Choose the most specific subtype (BusinessEvent, MusicEvent, EducationEvent).
- Validate with Schema.org Validator + Google Rich Results Test.
- Deploy in (preferred).
- Monitor Search Console Events report and AI citation behavior in the 30-day pre-event window.
- Update eventStatus immediately on any change.
FAQ
Q: What are the required properties for Event schema?
name, startDate, and location. endDate, eventStatus, and eventAttendanceMode are strongly recommended but not strictly required.
Q: How do I mark up an online-only event?
Use "@type": "VirtualLocation" for location with a url that links to the joining page. Set eventAttendanceMode to https://schema.org/OnlineEventAttendanceMode.
Q: How do I mark up a hybrid event?
Set eventAttendanceMode to MixedEventAttendanceMode. Provide both a Place and a VirtualLocation inside an array under location.
Q: Why does Google's Rich Results Test fail my online-only Event?
This is a known bug reported by multiple developers. The schema is still valid; AI engines and Search Console will recognize it. As a workaround, some publishers add a placeholder physical location in the office address as MixedEventAttendanceMode, which restores rich-result detection.
Q: How should I mark up recurring events?
Prefer one Event object per occurrence with unique @id URLs. For high-volume recurrences, use eventSchedule with a Schedule object. Do not use openingHours — it is not part of Event schema.
Q: Should I delete schema for past events?
No. Keep it live for at least 30 days after endDate to support AI engines parsing past-tense references. After that, you may archive or remove.
Q: Can I add multiple offers (tickets at different price points)?
Yes. Use either an array of Offer objects or a single AggregateOffer with lowPrice and highPrice.
: Schema.org, "Event" type — verified 2026-05-03 — supports canonical type definition. https://schema.org/Event
: Google Search Central, "Event (Event) structured data" — verified 2026-05-03 — supports required-property list and Google rich result. https://developers.google.com/search/docs/appearance/structured-data/event
: Schema.org, "eventAttendanceMode" property — verified 2026-05-03 — supports OnlineEventAttendanceMode / OfflineEventAttendanceMode / MixedEventAttendanceMode values. https://schema.org/eventAttendanceMode
: Google Search Central Community, "Rich Results Test does not recognize Event schema with VirtualLocation" — verified 2026-05-03 — supports detection-bug workaround note. https://support.google.com/webmasters/thread/375879542
: Stack Overflow, "How to mark up recurring events with Schema.org for Google?" — verified 2026-05-03 — supports openingHours rejection note. https://stackoverflow.com/questions/24685541/how-to-mark-up-recurring-events-with-schema-org-for-google
: BrightEdge, "Structured Data in the AI Search Era" — verified 2026-05-03 — supports same-vocabulary reuse across Google and AI engines. https://www.brightedge.com/blog/structured-data-ai-search-era
: eMarketer, "AI search shifts power to brands with structured data" (Yext analysis of 6.8M citations) — verified 2026-05-03 — supports brand-managed-source statistic. https://www.emarketer.com/content/ai-search-shifts-power-brands-with-structured-data
: r/LLMTraffic, 200-query AI citation tracking study — verified 2026-05-03 — supports 2x citation lift for schema-marked sites (small sample). https://www.reddit.com/r/LLMTraffic/comments/1riwsqt/
Related Articles
AggregateRating Schema for AI Citations
AggregateRating schema specification for AI citations: required fields, decimal handling, parent-type pairings (Product, Course, SoftwareApplication, LocalBusiness), Google policy violations.
Canonicalization for AI Answers: Avoiding Duplicate and Conflicting Sources
Canonicalize duplicate and conflicting sources so AI answers cite the right URL. Practical playbook with rel=canonical, redirects, sitemap, and update policies.
schema.org Claim Type for AI Fact-Checking
schema.org Claim type spec for AI fact-checking and grounding—appearance, firstAppearance properties and ClaimReview pairing patterns.