Schema Forge

Schema guide

Event schema markup (Event JSON-LD)

How to write Event JSON-LD: name, dates with time zones, location, status and tickets, with a working example and the mistakes that stop events showing.

Overview

Short answer

Event markup describes something that happens at a set time and place, such as a workshop, concert or webinar. Google needs a name, a startDate and a location. Give times with a time zone offset, and say whether it is in person, online or both.

What it can do for you

Google Rich results: yes
Yes. Events with a name, date and place can appear in event listings in Search and Maps.
AI and answer engines
Dates, times and venue are stated exactly, so assistants can answer "when" and "where" without guessing.

Use it when

  • A page about one event with a date, a place and a way to attend

Skip it when

  • A list of many events (mark up each event on its own page)
  • An event with no date, or one that already took place and has no value to visitors
  • A sale or a promotion that is not an event

Properties

PropertyStatusNotes
nameRequiredThe event name as shown on the page.
startDateRequiredISO 8601 with a time zone, such as 2026-04-18T10:00:00-05:00.
locationRequiredA Place with a name and an address. For an online event use a VirtualLocation with a URL.
endDate, image, descriptionRecommendedAdd the end time and a clear image.
eventStatus, eventAttendanceModeRecommendedSay if it is scheduled, cancelled or postponed, and whether it is in person, online or mixed.
offers, organizer, performerOptionalA ticket Offer with price, currency and a link, and who is running it.

Example

event.jsonld (example)
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Event",
  "name": "Spring Glazing Workshop",
  "startDate": "2026-04-18T10:00:00-05:00",
  "endDate": "2026-04-18T13:00:00-05:00",
  "eventStatus": "https://schema.org/EventScheduled",
  "eventAttendanceMode": "https://schema.org/OfflineEventAttendanceMode",
  "location": {
    "@type": "Place",
    "name": "Hearthstead Studio",
    "address": {
      "@type": "PostalAddress",
      "streetAddress": "12 Main St",
      "addressLocality": "Springfield",
      "addressRegion": "IL",
      "postalCode": "62704",
      "addressCountry": "US"
    }
  },
  "image": [
    "https://example.com/img/workshop.jpg"
  ],
  "description": "A hands-on morning of glazing your own mug, with all materials included.",
  "offers": {
    "@type": "Offer",
    "url": "https://example.com/workshop/tickets",
    "price": "45.00",
    "priceCurrency": "USD",
    "availability": "https://schema.org/InStock"
  },
  "organizer": {
    "@type": "Organization",
    "name": "Hearthstead",
    "url": "https://example.com/"
  }
}
</script>

It reads the event name from the main heading, the start date from event meta tags, microdata or a time element on a page that talks about an event (workshop, webinar, conference and similar words), and the venue from event meta tags or the address on the page.

A time without a time zone is flagged. Status, attendance mode and ticket offers are never guessed, so they show up in the checklist for you to add.

Common mistakes

  • A start time with no time zone offset.
  • No location, or a vague one such as the city name alone.
  • Leaving a cancelled event as EventScheduled instead of EventCancelled.
  • Marking up a recurring series as one event with one date.

Questions

What does Google require for an event?

A name, a startDate and a location. Other properties are recommended, such as endDate, image, description and ticket offers.

How do I mark up an online event?

Set eventAttendanceMode to OnlineEventAttendanceMode and give a VirtualLocation with the web address where people join.

What if the event is cancelled or moved?

Change eventStatus to EventCancelled, EventPostponed or EventRescheduled, and update the dates. Do not remove the markup for a cancelled event.

Why does Schema Forge not add ticket prices?

A price is only used when the page states it explicitly. Ticket details are easy to get wrong, so they are listed as something for you to add.

Generate this markup for your page

Paste the address of a public page and get a ready-to-paste block, with every gap listed.

Open the generator

Keep going