JAVASCRIPTseobeginner

Event Schema Markup for Google Rich Results

Add Event structured data for concerts, webinars, workshops, and conferences to appear in Google event listings

Faisal Yaqoob
#event#schema#seo#structured-data#json-ld#google#rich-snippets#webinar#conference
Share this snippet:

Code

javascript
1// In-person event schema
2const physicalEvent = {
3 "@context": "https://schema.org",
4 "@type": "Event",
5 "name": "WordPress Developer Conference 2026",
6 "description": "Join 500+ WordPress developers for three days of talks, workshops, and networking. Learn about headless WordPress, block editor development, and performance optimization.",
7 "startDate": "2026-03-15T09:00:00-05:00",
8 "endDate": "2026-03-17T17:00:00-05:00",
9 "eventStatus": "https://schema.org/EventScheduled",
10 "eventAttendanceMode": "https://schema.org/OfflineEventAttendanceMode",
11 "location": {
12 "@type": "Place",
13 "name": "Convention Center",
14 "address": {
15 "@type": "PostalAddress",
16 "streetAddress": "500 Convention Way",
17 "addressLocality": "Austin",
18 "addressRegion": "TX",
19 "postalCode": "78701",
20 "addressCountry": "US"
21 },
22 "geo": {
23 "@type": "GeoCoordinates",
24 "latitude": "30.2672",
25 "longitude": "-97.7431"
26 }
27 },
28 "image": "https://yoursite.com/images/wp-conf-2026.jpg",
29 "offers": [
30 {
31 "@type": "Offer",
32 "name": "Early Bird Ticket",
33 "url": "https://yoursite.com/events/wp-conf-2026/tickets",
34 "price": "199.00",
35 "priceCurrency": "USD",
36 "availability": "https://schema.org/InStock",
37 "validFrom": "2025-12-01T00:00:00-05:00"
38 },
39 {
40 "@type": "Offer",
41 "name": "Regular Ticket",
42 "url": "https://yoursite.com/events/wp-conf-2026/tickets",
43 "price": "349.00",
44 "priceCurrency": "USD",
45 "availability": "https://schema.org/InStock",
46 "validFrom": "2026-01-15T00:00:00-05:00"
47 }
48 ],
49 "performer": {
50 "@type": "Person",
51 "name": "Matt Mullenweg"
52 },
53 "organizer": {
54 "@type": "Organization",
55 "name": "Your Company Name",
56 "url": "https://yoursite.com"
57 }
58};

Event Schema Markup for Google Rich Results

Add Event structured data so your events appear in Google's event experience — including event packs, rich results, and Google Search event listings. This works for conferences, webinars, workshops, concerts, and any scheduled happening.

Physical Event Schema

// In-person event schema
const physicalEvent = {
  "@context": "https://schema.org",
  "@type": "Event",
  "name": "WordPress Developer Conference 2026",
  "description": "Join 500+ WordPress developers for three days of talks, workshops, and networking. Learn about headless WordPress, block editor development, and performance optimization.",
  "startDate": "2026-03-15T09:00:00-05:00",
  "endDate": "2026-03-17T17:00:00-05:00",
  "eventStatus": "https://schema.org/EventScheduled",
  "eventAttendanceMode": "https://schema.org/OfflineEventAttendanceMode",
  "location": {
    "@type": "Place",
    "name": "Convention Center",
    "address": {
      "@type": "PostalAddress",
      "streetAddress": "500 Convention Way",
      "addressLocality": "Austin",
      "addressRegion": "TX",
      "postalCode": "78701",
      "addressCountry": "US"
    },
    "geo": {
      "@type": "GeoCoordinates",
      "latitude": "30.2672",
      "longitude": "-97.7431"
    }
  },
  "image": "https://yoursite.com/images/wp-conf-2026.jpg",
  "offers": [
    {
      "@type": "Offer",
      "name": "Early Bird Ticket",
      "url": "https://yoursite.com/events/wp-conf-2026/tickets",
      "price": "199.00",
      "priceCurrency": "USD",
      "availability": "https://schema.org/InStock",
      "validFrom": "2025-12-01T00:00:00-05:00"
    },
    {
      "@type": "Offer",
      "name": "Regular Ticket",
      "url": "https://yoursite.com/events/wp-conf-2026/tickets",
      "price": "349.00",
      "priceCurrency": "USD",
      "availability": "https://schema.org/InStock",
      "validFrom": "2026-01-15T00:00:00-05:00"
    }
  ],
  "performer": {
    "@type": "Person",
    "name": "Matt Mullenweg"
  },
  "organizer": {
    "@type": "Organization",
    "name": "Your Company Name",
    "url": "https://yoursite.com"
  }
};

Online Event / Webinar Schema

// Virtual event / webinar schema
const onlineEvent = {
  "@context": "https://schema.org",
  "@type": "Event",
  "name": "Free Webinar: Schema Markup for SEO in 2026",
  "description": "Learn how to implement Schema.org structured data to improve your search rankings. Covers JSON-LD, rich results, and Google Search Console validation.",
  "startDate": "2026-02-20T14:00:00-05:00",
  "endDate": "2026-02-20T15:30:00-05:00",
  "eventStatus": "https://schema.org/EventScheduled",
  "eventAttendanceMode": "https://schema.org/OnlineEventAttendanceMode",
  "location": {
    "@type": "VirtualLocation",
    "url": "https://zoom.us/j/123456789"
  },
  "image": "https://yoursite.com/images/schema-webinar.jpg",
  "offers": {
    "@type": "Offer",
    "url": "https://yoursite.com/webinars/schema-seo",
    "price": "0",
    "priceCurrency": "USD",
    "availability": "https://schema.org/InStock"
  },
  "organizer": {
    "@type": "Organization",
    "name": "Your Company",
    "url": "https://yoursite.com"
  }
};

Hybrid Event Schema

// Event with both in-person and online attendance
const hybridEvent = {
  "@context": "https://schema.org",
  "@type": "Event",
  "name": "E-Commerce Growth Summit 2026",
  "description": "Join us in-person or online for a full day of e-commerce strategy, Shopify optimization, and conversion rate talks.",
  "startDate": "2026-04-10T09:00:00-04:00",
  "endDate": "2026-04-10T17:00:00-04:00",
  "eventStatus": "https://schema.org/EventScheduled",
  "eventAttendanceMode": "https://schema.org/MixedEventAttendanceMode",
  "location": [
    {
      "@type": "Place",
      "name": "Tech Hub NYC",
      "address": {
        "@type": "PostalAddress",
        "streetAddress": "200 Park Avenue",
        "addressLocality": "New York",
        "addressRegion": "NY",
        "postalCode": "10166",
        "addressCountry": "US"
      }
    },
    {
      "@type": "VirtualLocation",
      "url": "https://yoursite.com/live-stream"
    }
  ],
  "image": "https://yoursite.com/images/ecom-summit.jpg",
  "offers": [
    {
      "@type": "Offer",
      "name": "In-Person Pass",
      "price": "299.00",
      "priceCurrency": "USD",
      "availability": "https://schema.org/LimitedAvailability",
      "url": "https://yoursite.com/summit/tickets"
    },
    {
      "@type": "Offer",
      "name": "Virtual Pass",
      "price": "49.00",
      "priceCurrency": "USD",
      "availability": "https://schema.org/InStock",
      "url": "https://yoursite.com/summit/virtual"
    }
  ],
  "organizer": {
    "@type": "Organization",
    "name": "Your Company",
    "url": "https://yoursite.com"
  }
};

Event Status Updates

// Use these eventStatus values for schedule changes:

// Normal scheduled event
"eventStatus": "https://schema.org/EventScheduled"

// Event has been cancelled
"eventStatus": "https://schema.org/EventCancelled"

// Event moved to online only
"eventStatus": "https://schema.org/EventMovedOnline"

// Event postponed (update startDate when new date is known)
"eventStatus": "https://schema.org/EventPostponed"

// Event rescheduled (include both previousStartDate and new startDate)
const rescheduledEvent = {
  "@context": "https://schema.org",
  "@type": "Event",
  "name": "Tech Workshop",
  "eventStatus": "https://schema.org/EventRescheduled",
  "previousStartDate": "2026-03-01T10:00:00",
  "startDate": "2026-04-15T10:00:00",
  "endDate": "2026-04-15T16:00:00"
};

WordPress Implementation

/**
 * Output Event schema for WordPress event posts
 * Works with a custom post type 'event' with custom fields
 */
function wp_event_schema_jsonld() {
    if ( ! is_singular( 'event' ) ) {
        return;
    }

    global $post;

    $start_date = get_post_meta( $post->ID, 'event_start_date', true );
    $end_date   = get_post_meta( $post->ID, 'event_end_date', true );
    $venue      = get_post_meta( $post->ID, 'event_venue', true );
    $price      = get_post_meta( $post->ID, 'event_price', true );
    $ticket_url = get_post_meta( $post->ID, 'event_ticket_url', true );
    $is_online  = get_post_meta( $post->ID, 'event_is_online', true );

    $schema = [
        '@context'            => 'https://schema.org',
        '@type'               => 'Event',
        'name'                => get_the_title(),
        'description'         => wp_trim_words( get_the_excerpt(), 50 ),
        'startDate'           => $start_date,
        'endDate'             => $end_date,
        'eventStatus'         => 'https://schema.org/EventScheduled',
        'eventAttendanceMode' => $is_online
            ? 'https://schema.org/OnlineEventAttendanceMode'
            : 'https://schema.org/OfflineEventAttendanceMode',
        'image'               => get_the_post_thumbnail_url( $post->ID, 'full' ),
        'organizer'           => [
            '@type' => 'Organization',
            'name'  => get_bloginfo( 'name' ),
            'url'   => home_url( '/' ),
        ],
    ];

    if ( $venue ) {
        $schema['location'] = $is_online
            ? [ '@type' => 'VirtualLocation', 'url' => $venue ]
            : [ '@type' => 'Place', 'name' => $venue ];
    }

    if ( $price && $ticket_url ) {
        $schema['offers'] = [
            '@type'         => 'Offer',
            'url'           => $ticket_url,
            'price'         => $price,
            'priceCurrency' => 'USD',
            'availability'  => 'https://schema.org/InStock',
        ];
    }

    echo '<script type="application/ld+json">'
        . wp_json_encode( $schema, JSON_UNESCAPED_SLASHES )
        . '</script>' . "\n";
}
add_action( 'wp_head', 'wp_event_schema_jsonld' );

Best Practices

  • Include offers with price — required for event rich result eligibility
  • Use specific date-time with timezone offset (ISO 8601 format)
  • Update eventStatus promptly for cancellations or schedule changes
  • Add image — events with images are more likely to get rich results
  • Include location with full address for in-person events
  • Set eventAttendanceMode correctly for online, offline, or hybrid

Features

  • Google Event Pack: Appear in Google's event experience search results
  • Event Status: Handle cancellations, postponements, and reschedules
  • Multiple Formats: Physical, virtual, and hybrid event support
  • Ticket Integration: Display pricing and availability in search
  • WordPress Ready: PHP implementation for WordPress event sites
  • Multi-Offer: Support early bird, regular, VIP pricing tiers

Related Snippets