No Event schema on an event page
What Is This Issue
Event listing pages are missing Event schema, preventing the event from appearing in Google’s Events carousel, event rich results, and Google Maps event listings.
Without Event schema:
- Your events won’t appear in Google’s Events carousel
- Event details won’t show in rich results (date, time, location)
- Events won’t be listed in Google Maps event listings
- Users can’t easily add events to their calendars from search results
- Ticket links won’t appear in search results
A proper Event schema should include: @type (Event), name, startDate, location, and optionally endDate, eventStatus, eventAttendanceMode, offers, description, image.
Why Is This Important
Event schema is critical for event visibility and user engagement:
- Google Events carousel: Events with proper schema can appear in Google’s dedicated Events carousel
- Rich results: Enables event details (date, time, location, price) to appear in search results
- Google Maps: Events are listed in Google Maps event listings
- Calendar integration: Users can add events to their calendars directly from search results
- Ticket sales: Ticket links and pricing can appear in search results
- Voice search: Voice assistants can provide event details and ticket information
Resolving this issue improves your SEO health score by ensuring events are properly structured for maximum visibility and user engagement.
How XeoPix Detects This
XeoPix follows these logical steps to detect missing Event schema:
-
Detect event pages: The crawler identifies pages with:
- Event URL patterns (
/events/,/conference/,/webinar/,/workshop/) - Visible date/time/location information on the page
- Text indicating an event (e.g., “Register now”, “Join us”, “Tickets”)
- Event URL patterns (
-
Extract structured data: The crawler looks for JSON-LD, Microdata, or RDFa blocks on the page
-
Check for Event schema: The crawler verifies if any schema block has:
@typeset toEvent- Required properties:
name,startDate,location
-
Validate schema completeness: If Event schema is found, the crawler checks for:
startDatein ISO 8601 format with timezonelocationproperty (Place or VirtualLocation)endDateif the event has an end timeeventStatusdeclared (Scheduled/Cancelled/Postponed)eventAttendanceMode(in-person/online/mixed)
-
Trigger conditions: The issue is flagged when:
- Page has event content but no Event schema
- Event schema exists but
startDateis missing - Event schema exists but
locationis missing
How To Fix
-
Identify event pages: Look for pages with event URL patterns (
/events/,/conference/,/webinar/) or visible date/time/location information -
Add Event JSON-LD structured data to the page’s
<head>or before</body>:For in-person events:
{ "@context": "https://schema.org", "@type": "Event", "name": "Annual Tech Conference 2024", "startDate": "2024-09-15T09:00:00-05:00", "endDate": "2024-09-16T18:00:00-05:00", "eventStatus": "https://schema.org/EventScheduled", "eventAttendanceMode": "https://schema.org/OfflineEventAttendanceMode", "location": { "@type": "Place", "name": "Austin Convention Center", "address": { "@type": "PostalAddress", "addressLocality": "Austin", "addressRegion": "TX", "addressCountry": "US" } }, "offers": { "@type": "Offer", "price": "299", "priceCurrency": "USD", "availability": "https://schema.org/InStock" } }For online events: Use
"@type": "VirtualLocation"with aurlproperty -
Include required properties:
name: Event namestartDate: ISO 8601 format with timezonelocation: Place or VirtualLocation
-
Add recommended properties:
endDate: Event end date/timeeventStatus: Scheduled, Cancelled, or PostponedeventAttendanceMode: In-person, online, or mixedoffers: Ticket pricing and availabilitydescription: Event descriptionimage: Event image URL
-
Validate with Google’s Rich Results Test
What We Store
Storage Level
Page Level — This issue is evaluated for each individual URL that contains structured data.
Database Table / Prisma Model
PageStructuredData
Stored Fields
| Field | Type | Description |
|---|---|---|
| schemaType | SchemaType | The type of schema (e.g., Organization, Person) |
| schemaFormat | SchemaFormat | The format of the schema (JSON-LD, Microdata, RDFa) |
| schemaIdentifier | String? | Unique identifier for the schema |
| rawJson | Json? | The raw JSON-LD or structured data content |
| schemaErrors | Json? | Array of validation errors found in the schema |
| isValidSchema | Boolean? | Whether the schema is valid according to validation |
| missingFields | Json? | Array of required fields that are missing |
Detection Dependencies
- The following data sources are required to evaluate this issue:
- HTML Document — The crawler parses the HTML to find structured data (JSON-LD, Microdata, RDFa)
- Structured Data Validation — The extracted schema is validated against Schema.org definitions
- Schema Parser — JSON-LD scripts, Microdata attributes, and RDFa markup are parsed
Examples
Example 1: Missing Event Schema on Event Page
Problematic state:
<!-- Event page without Event schema -->
<html>
<head>
<title>Annual Tech Conference 2024</title>
</head>
<body>
<h1>Annual Tech Conference 2024</h1>
<p><strong>Date:</strong> September 15-16, 2024</p>
<p><strong>Location:</strong> Austin Convention Center</p>
<p><strong>Price:</strong> $299</p>
<button>Register Now</button>
</body>
</html>Corrected state:
<!-- Event page with Event schema -->
<html>
<head>
<title>Annual Tech Conference 2024</title>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Event",
"name": "Annual Tech Conference 2024",
"startDate": "2024-09-15T09:00:00-05:00",
"endDate": "2024-09-16T18:00:00-05:00",
"eventStatus": "https://schema.org/EventScheduled",
"eventAttendanceMode": "https://schema.org/OfflineEventAttendanceMode",
"location": {
"@type": "Place",
"name": "Austin Convention Center",
"address": {
"@type": "PostalAddress",
"addressLocality": "Austin",
"addressRegion": "TX",
"addressCountry": "US"
}
},
"offers": {
"@type": "Offer",
"price": "299",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock"
}
}
</script>
</head>
<body>
<h1>Annual Tech Conference 2024</h1>
<p><strong>Date:</strong> September 15-16, 2024</p>
<p><strong>Location:</strong> Austin Convention Center</p>
<p><strong>Price:</strong> $299</p>
<button>Register Now</button>
</body>
</html>Example 2: Online Event with VirtualLocation
Corrected state (webinar):
{
"@context": "https://schema.org",
"@type": "Event",
"name": "SEO Webinar: Advanced Techniques",
"startDate": "2024-04-10T14:00:00Z",
"eventAttendanceMode": "https://schema.org/OnlineEventAttendanceMode",
"location": {
"@type": "VirtualLocation",
"url": "https://zoom.us/j/123456789"
}
}Example 3: Incomplete Event Schema
Problematic state:
{
"@context": "https://schema.org",
"@type": "Event",
"name": "Workshop"
}Missing required properties: startDate, location
Corrected state:
{
"@context": "https://schema.org",
"@type": "Event",
"name": "SEO Workshop",
"startDate": "2024-05-20T10:00:00Z",
"location": {
"@type": "Place",
"name": "Conference Room A"
}
}Unit Test
Test File
xeopix-crawling-v2/__tests__/seo-audit-checks/structuredDataRichResults/issue-63-event-schema.test.js
Purpose
Validates that the crawler correctly detects when a page with event-related content (event classes, headings, or date patterns) is missing an Event schema.
Tested Function
runStructuredDataRichResults()
Issue Information
- Issue Number: 63
- Issue Code:
event_schema_event - Toggle Group:
structuredDataRichResults
Test Scenarios
Positive Test Cases
- Event schema present: Page has an
Eventschema withname,startDate, andlocation— no issue reported. - No event content: Page has no event-related content — no issue reported.
Negative Test Cases
- Event class detected: Page has elements with
eventorcalendarclass but no Event schema — issue is reported withdetectionHints.hasEventClassset totrue. - Event heading detected: Page has event-related headings like “Webinar:” or “Upcoming Events” but no schema — issue is reported with
detectionHints.hasEventHeadingset totrue. - Event date patterns detected: Page has text content with date patterns suggesting events (e.g., “June 15, 2024”) but no schema — issue is reported with
detectionHints.hasEventPatternsset totrue.
Boundary Cases
None.
Edge Cases
- Empty HTML:
<html></html>— no issue reported, no crash. - Malformed HTML: Unclosed tags — no crash.
Expected Outcome
Pass
Issue should not be reported when an Event schema is present or when the page has no event-related content.
Fail
Issue should be reported when the page contains event-related content (classes, headings, or date patterns) but lacks an Event schema. Detection hints indicate which pattern was matched.
Validation
- Correct issue detection when event content exists without schema
- No issue detection when Event schema is present
- No issue detection when no event content exists
- Detection hints (
hasEventClass,hasEventHeading,hasEventPatterns) populated correctly - Graceful handling of empty and malformed HTML
Related Production Files
xeopix-crawling-v2/toggleGroups/structuredDataRichResults.jsxeopix-crawling-v2/issueCodes.jsxeopix-crawling-v2/utils/context.jsxeopix-crawling-v2/utils/issues.jsxeopix-crawling-v2/utils/schema.js
Coverage Summary
- Covers presence of Event schema
- Covers detection of event class names, headings, and date patterns
- Covers absence of false positives when no event content exists
- Covers empty HTML resilience
- Covers malformed HTML resilience
References
- Schema.org — Event — Schema.org
- Google — Event Structured Data — Google Search Central