Event schema marks up anything happening at a specific date and time: a class, a sale, a webinar, a race. It is what allows an event to show up as its own rich result, complete with dates and ticket availability, rather than as a plain link.
Event schema states the start date, location, and organizer explicitly, making an event eligible to appear directly in search results with its date and location visible before anyone clicks. The startDate needs a full timestamp including a timezone offset, and any offers block should include a price of zero for free events rather than being omitted entirely.
- A missing timezone offset in startDate is one of the most common reasons Event schema gets rejected during validation.
- Update eventStatus (EventCancelled, EventPostponed, EventRescheduled) immediately if plans change, rather than leaving stale schema live that confidently states outdated details.
- For genuinely recurring events, use eventSchedule or publish individual pages per occurrence rather than a single static date describing an ongoing event.
What Event Schema Actually Does
Without it, a model reading an event page has to guess at the actual date, time, and location from surrounding text, which is one of the least reliable things to infer since dates get written in a dozen different formats. Event schema states the start date, the location, and the organizer explicitly, and per Google’s Event documentation it is what makes an event eligible for the event experience in Google Search and Maps, with its date and location already visible before anyone clicks.
The Code: A Working Example
{
"@context": "https://schema.org",
"@type": "Event",
"name": "Saturday Sourdough Workshop",
"startDate": "2026-09-12T10:00:00-07:00",
"location": {
"@type": "Place",
"name": "Riverside Bakery",
"address": "128 River Street, Portland, OR 97201"
},
"organizer": {
"@type": "Organization",
"name": "Riverside Bakery"
},
"offers": {
"@type": "Offer",
"priceCurrency": "USD",
"price": "45.00",
"availability": "https://schema.org/InStock",
"url": "https://riversidebakery.example/events/sourdough-workshop"
}
}
Adding Ticket and Availability Data
The offers block works the same way it does in Product schema: a price, a currency, and an availability value pulled from schema.org’s own list. For a free event, set price to zero rather than omitting the offers block entirely, since some rich results expect it to be present even when nothing is being charged.
Where to Add It on Your Site
Add one Event block per event, on that event’s own page. If the event repeats on a schedule, either publish a page per occurrence or use eventSchedule to describe the recurrence, but avoid a single static date on a page describing an ongoing, repeating event.
How to Validate It
Run the event page through Google’s Rich Results Test to confirm eligibility, then check the raw JSON-LD in Schema.org’s Validator. Pay close attention to the startDate format: it needs a full timestamp including a timezone offset, not just a plain date, since a missing timezone is one of the most common reasons Event schema gets rejected.
FAQ
Do I need Event schema for a recurring weekly event?
Yes, though how you structure it matters. Use eventSchedule for a genuinely recurring event, or publish individual event pages for each date if the details vary occurrence to occurrence.
What happens if an event gets canceled or postponed?
Update eventStatus to reflect the change (EventCancelled, EventPostponed, or EventRescheduled) rather than leaving stale schema live, since an AI system citing outdated event details with full confidence is worse than citing nothing.
Is the offers block required for free events?
It is not strictly required, but including it with a price of zero is safer, since some rich results expect an offers block to be present to determine ticket status.
Related Reading
Go deeper on offering and location schema:
Want to Be the Brand AI Recommends?
Book a call and we’ll map what it takes to get there for your business.
