Type in your event's name, start time, venue address and tickets, and this generator writes schema.org Event JSON-LD you can paste into the page. It follows Google's Event rules: name, startDate, a Place location with an address are required, and it warns about missing time zones or online-only events.
| Property | What goes in it |
|---|---|
| name | The full title of the event |
| startDate | Start date and time in ISO-8601, ideally with a UTC offset |
| location | A Place for the venue |
| location.address | The venue's full street address |
Updated
Running a workshop, a gig, a tasting night or a class? Event markup is a short block of code that tells search engines the date, place and ticket details in a form they can read reliably. You do not need to write it by hand: fill in the form and copy the result into your page or your builder's custom code box.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Event",
"name": "Sourdough Basics Workshop",
"startDate": "2026-11-14T10:00:00-05:00",
"endDate": "2026-11-14T13:00:00-05:00",
"eventAttendanceMode": "https://schema.org/OfflineEventAttendanceMode",
"eventStatus": "https://schema.org/EventScheduled",
"location": {
"@type": "Place",
"name": "Corner Bakery Studio",
"address": {
"@type": "PostalAddress",
"streetAddress": "12 Mill Street",
"addressLocality": "Springfield",
"addressRegion": "IL",
"postalCode": "62701",
"addressCountry": "US"
}
},
"image": [
"https://example.com/img/sourdough-16x9.jpg"
],
"description": "A three-hour hands-on class: starter care, shaping and baking your first loaf.",
"offers": {
"@type": "Offer",
"price": 45,
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"url": "https://example.com/events/sourdough-basics"
},
"organizer": {
"@type": "Organization",
"name": "Corner Bakery",
"url": "https://example.com"
}
}
</script>No problems found against Google's Event rules.
This is what the generator writes for an in-person workshop with paid tickets. Swap in your own details.
Required fields come first; image, offers and organizer are recommended extras.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Event",
"name": "Sourdough Basics Workshop",
"startDate": "2026-11-14T10:00:00-05:00",
"endDate": "2026-11-14T13:00:00-05:00",
"eventAttendanceMode": "https://schema.org/OfflineEventAttendanceMode",
"eventStatus": "https://schema.org/EventScheduled",
"location": {
"@type": "Place",
"name": "Corner Bakery Studio",
"address": {
"@type": "PostalAddress",
"streetAddress": "12 Mill Street",
"addressLocality": "Springfield",
"addressRegion": "IL",
"postalCode": "62701",
"addressCountry": "US"
}
},
"image": ["https://example.com/img/sourdough-16x9.jpg"],
"description": "A three-hour hands-on class: starter care, shaping and baking your first loaf.",
"offers": {
"@type": "Offer",
"price": 45,
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"url": "https://example.com/events/sourdough-basics"
},
"organizer": { "@type": "Organization", "name": "Corner Bakery", "url": "https://example.com" }
}
</script>Google documents four values. Leave the field out and Google assumes the first one.
| Value | Use it when |
|---|---|
| EventScheduled | The event is going ahead as planned (the default) |
| EventCancelled | The event has been called off |
| EventPostponed | It will happen later but the new date is not known |
| EventRescheduled | It moved to a new date; add previousStartDate |
Google needs only four things: name, startDate, location and location.address. Everything else, such as description, endDate, image, offers, organizer and performer, is recommended and makes the listing more useful.
If you leave eventStatus out, Google treats the event as EventScheduled, so you only need it when plans change.
Google asks for the UTC or GMT offset on start and end times, like 2026-11-14T19:00:00-05:00 for 7pm in New York in winter. Without one, it uses the time zone of the event location.
Remember that offsets change with daylight saving time, so check the offset for the event date, not for today.
Google's Event documentation currently says virtual experiences with no real-world component are not supported, and events must take place in a physical location. You can still describe an online event with schema.org, but do not expect Google event features for it.
For an all-day event, or when the start hour is unknown, Google says to give only the date, such as 2026-11-14. Avoid putting a fake midnight time in.
Set eventStatus to EventRescheduled, put the new date in startDate, and add the old date in previousStartDate. For a postponed event with no new date yet, use EventPostponed and keep the original startDate.
priceCurrency takes a three-letter ISO 4217 code such as USD, GBP, EUR or CAD.
Inside the HTML of the event page, in the head or the body. Most site builders have a custom code or header code setting per page.
Related: Schema markup generator, Schema markup validator, On-page SEO checklist, How to get your business on Google.
Start for free or see all free tools. We.Inc is free to start, with no card needed. AI building is on paid plans from $20 a month.
We.Inc is an AI-powered website builder you can resell under your own brand. Launch a branded client dashboard, bill on Stripe Connect, and deliver AI-generated websites in minutes. White-label plans start at $99 a month for 25 client sites, with a 7-day free trial and no per-site fees.