Course and event pages can use structured data so Google understands them precisely and can show them in dedicated search features. Event markup describes the name, dates, location or online attendance, status, organiser and tickets; course markup describes the course, provider, and details such as format, schedule and price. In both cases the markup must match the visible page, and it must be updated when things change, such as a postponed event or a new course batch. This guide gives working JSON-LD for each.
Event structured data
{
"@context": "https://schema.org",
"@type": "Event",
"name": "AEO and GEO Workshop for Marketing Teams",
"startDate": "2026-11-18T10:00:00+05:30",
"endDate": "2026-11-18T16:00:00+05:30",
"eventStatus": "https://schema.org/EventScheduled",
"eventAttendanceMode": "https://schema.org/OfflineEventAttendanceMode",
"location": {
"@type": "Place",
"name": "Venue name",
"address": {
"@type": "PostalAddress",
"streetAddress": "Street address",
"addressLocality": "Pune",
"postalCode": "411027",
"addressCountry": "IN"
}
},
"organizer": { "@type": "Organization", "name": "Example Company", "url": "https://www.example.com" },
"offers": {
"@type": "Offer",
"price": "5000",
"priceCurrency": "INR",
"availability": "https://schema.org/InStock",
"url": "https://www.example.com/events/aeo-geo-workshop/",
"validFrom": "2026-10-01T09:00:00+05:30"
},
"description": "A one-day workshop on AI search, crawler setup and writing for citation."
}
Online and hybrid events
For online events, set eventAttendanceMode to OnlineEventAttendanceMode and use a VirtualLocation with the event URL. For hybrid events, use MixedEventAttendanceMode and include both a Place and a VirtualLocation.
When plans change
| Change | What to do |
|---|---|
| Cancelled | Set eventStatus to EventCancelled and keep the page with a notice |
| Postponed, new date unknown | EventPostponed, keep the original dates |
| Rescheduled | EventRescheduled, new dates in startDate and endDate, and previousStartDate |
| Moved online | Update eventAttendanceMode and location |
Course structured data
{
"@context": "https://schema.org",
"@type": "Course",
"name": "Technical SEO for Developers",
"description": "Six live sessions on rendering, structured data, sitemaps and crawl management.",
"provider": { "@type": "Organization", "name": "Example Company", "sameAs": "https://www.example.com" },
"offers": [{ "@type": "Offer", "category": "Paid", "price": "15000", "priceCurrency": "INR" }],
"hasCourseInstance": [{
"@type": "CourseInstance",
"courseMode": "Online",
"courseSchedule": {
"@type": "Schedule",
"repeatFrequency": "P1W",
"repeatCount": 6,
"startDate": "2026-11-05",
"duration": "PT2H"
}
}]
}
Google’s course features have changed over time. Check Google’s current documentation for which course properties and rich results are supported before relying on them; accurate course markup still helps search engines understand the page.
Implementation tips
- Generate markup from the same data that renders the page; see automating structured data.
- Use the Indian time zone offset, +05:30, in dates and times.
- Give each event or course its own page; do not mark up listings as if they were single events.
- Validate with Google’s Rich Results Test and watch Search Console’s enhancement reports.
Frequently asked questions
Should past events keep their markup?
Keep past event pages if they have value, such as recordings or write-ups. The event markup can remain with its original dates; Google stops showing past events.
Can a webinar use Event markup?
Yes, with online attendance mode and a VirtualLocation. See turning webinars into cited content.
Do AI assistants use this markup?
AI companies have not documented this in detail. The visible page text matters most, and structured data helps search engines, whose results many assistants draw on.
Sources
- Google Search Central, “Event (Event, Place, Offer) structured data”
- Google Search Central, course structured data documentation
- schema.org, Event, Course and CourseInstance