Why Online Events Are Invisible to AI Search Without Structured Data
AI search engines like ChatGPT, Perplexity, and Gemini do not browse your website in real time and piece things together the way a human would. They rely heavily on structured data, training data, and indexable signals to understand what your page is about and whether it deserves a mention when someone asks "are there any online events about X this month?"
Most online event pages are a disaster for this. A Zoom link buried in paragraph three, a date written in plain text, and a vague description that could apply to any webinar ever produced. AI systems cannot reliably extract that information, so they do not recommend those events. Simple as that.
VirtualLocation schema is the specific markup that tells structured data parsers, search engines, and AI systems: this event happens online, here is where to access it, and here is how it works. Without it, even a brilliantly run webinar series can be completely absent from AI-generated recommendations.
What VirtualLocation Schema Actually Is
VirtualLocation is a type defined in the Schema.org vocabulary. It sits within the broader Event schema type and is used as the value for the location property when your event has no physical address.
Before VirtualLocation was formalised, developers would either skip the location property entirely (making the event structurally ambiguous) or hack in a physical address that did not really exist. VirtualLocation solves this cleanly. It signals that the event is intentionally online, not just missing a venue.
Here is the basic structure:
{
"@context": "https://schema.org",
"@type": "Event",
"name": "Advanced Shopify SEO Masterclass",
"startDate": "2025-09-15T14:00:00+01:00",
"endDate": "2025-09-15T16:00:00+01:00",
"eventStatus": "https://schema.org/EventScheduled",
"eventAttendanceMode": "https://schema.org/OnlineEventAttendanceMode",
"location": {
"@type": "VirtualLocation",
"url": "https://example.com/join/shopify-seo-masterclass"
},
"organizer": {
"@type": "Organization",
"name": "FlinnSchema",
"url": "https://flinnschema.com"
},
"description": "A two-hour deep dive into structured data and AI visibility strategies for Shopify store owners.",
"offers": {
"@type": "Offer",
"url": "https://example.com/tickets/shopify-seo-masterclass",
"price": "97",
"priceCurrency": "GBP",
"availability": "https://schema.org/InStock",
"validFrom": "2025-07-01T00:00:00+01:00"
}
}
Notice the pairing of VirtualLocation with OnlineEventAttendanceMode. These two work together. If you include one without the other, you leave gaps that AI systems may fill with incorrect assumptions.
The Key Properties That Actually Matter
eventAttendanceMode
This property has three accepted values from Schema.org:
OnlineEventAttendanceMode- fully virtualOfflineEventAttendanceMode- fully in-personMixedEventAttendanceMode- hybrid (more on this below)
For a fully online event, always use OnlineEventAttendanceMode. Do not leave this property out. It is one of the clearest signals you can send to a structured data parser.
location with VirtualLocation
The url inside VirtualLocation should point to the actual join link or access page for the event. If you are using a platform like Zoom, Crowdcast, Hopin, or StreamYard, the URL should be the event-specific link, not just your homepage. A generic URL here is a missed opportunity and slightly misleading.
If your event requires registration before the join link is revealed, point the URL to the registration page. That is still useful structured data because it gives AI systems a direct route to send people who want to attend.
eventStatus
Use EventScheduled for upcoming events, EventPostponed if rescheduled, EventCancelled if cancelled, and EventMovedOnline if it was originally in-person but has moved online. The EventMovedOnline status is worth knowing about because some AI systems specifically respond to it when users ask "has X event moved online?"
startDate and endDate
Always use ISO 8601 format with a timezone offset. Writing "September 15, 2025 at 2pm" in plain text and leaving startDate out of your schema is a common failure. AI systems prefer the machine-readable version. Include the offset, for example +01:00 for BST or +00:00 for GMT, so that users in different time zones can get accurate information.
Offers
If your event has a ticket price, add the Offer block. This is important for AI shopping and event recommendation queries. When someone asks Perplexity "are there any paid webinars about email marketing under £50?" your structured offer data is what enables your event to surface in that kind of answer. We cover this in more detail in our post on how to use Offer schema to win AI shopping recommendations.
Hybrid Events: Using MixedEventAttendanceMode
If your event runs both in-person and online simultaneously, you need to handle both location types. This means supplying an array for the location property: one Place object and one VirtualLocation object.
"eventAttendanceMode": "https://schema.org/MixedEventAttendanceMode",
"location": [
{
"@type": "Place",
"name": "Manchester Conference Centre",
"address": {
"@type": "PostalAddress",
"streetAddress": "1 Bridgewater Street",
"addressLocality": "Manchester",
"postalCode": "M1 5JW",
"addressCountry": "GB"
}
},
{
"@type": "VirtualLocation",
"url": "https://example.com/join/hybrid-event"
}
]
This matters more than most people realise. AI systems that get asked "can I attend X event remotely?" need to be able to read both location types to give an accurate answer. Leaving out the VirtualLocation in a hybrid event means the AI may answer "no" when the correct answer is "yes".
Where to Add VirtualLocation Schema
Shopify Stores
Shopify does not have a native event page type, so you will typically be adding this markup to a page template or blog post. The cleanest approach is to add the JSON-LD block inside a custom HTML section on the event page, or via your theme's head injection point scoped to that specific page template.
Do not use Shopify's product schema for events. The types are wrong, and it signals to search engines that you do not understand what you are marking up. Use the proper Event type with VirtualLocation every time.
WordPress Sites
If you are running events through a plugin like The Events Calendar, check whether it outputs VirtualLocation schema for online events. Many do not, or they output a stripped-down version that omits eventAttendanceMode. You can override or supplement this with a custom JSON-LD block added via a plugin like WPCode, scoped to the event post type.
If you are using Yoast or Rank Math, both have Event schema support, but test the output carefully with Google's Rich Results Test or Schema.org's validator. Plugin-generated event schema often has gaps in the VirtualLocation implementation specifically.
Standalone Landing Pages
For standalone event landing pages built in page builders or custom HTML, add the JSON-LD block inside a <script type="application/ld+json"> tag in the <head> section. Keep it clean, validate it, and make sure the data on the page matches the data in the schema. Inconsistencies between visible page content and structured data are a common reason for schema to be ignored by parsers.
Common Mistakes That Kill Your AI Visibility
Using a Place schema with a fake address
Older event schema guides sometimes suggest creating a fake physical address for online events. Do not do this. It confuses structured data parsers, misrepresents your event, and can cause AI systems to direct people to a location that does not exist. VirtualLocation exists precisely to avoid this workaround.
Omitting the url inside VirtualLocation
The url property inside VirtualLocation is not technically required by Schema.org's spec, but practically speaking it is essential. Without it, the schema tells AI systems "this is online" but gives them nowhere to send people. That is a half-finished signal. Always include the URL.
Not updating eventStatus after changes
If an event gets rescheduled or moved online from in-person, update the schema immediately. AI systems that have cached your page may surface outdated information. Using EventPostponed or EventMovedOnline with an updated startDate is the correct approach. Leaving stale schema in place actively damages trust with users who click through based on AI-generated answers.
Neglecting the description field
The description property inside your Event schema is read by AI systems when constructing answers to queries like "what is this event about?" A thin or vague description means AI systems have nothing interesting to quote. Write 2 to 4 sentences that genuinely describe the value of attending, the audience it is for, and what participants will leave with. Think of it as your pitch to an AI that is deciding whether to recommend you.
Testing and Validating Your VirtualLocation Schema
Once you have added your markup, validate it using Google's Rich Results Test at search.google.com/test/rich-results. Paste in your page URL or the raw JSON-LD code directly. Look specifically for any warnings around the location property and confirm that VirtualLocation is being parsed correctly.
Also run it through the Schema.org validator at validator.schema.org. This is less strict than Google's tool but catches structural errors that might not show up as errors in Rich Results Test but still prevent proper parsing by AI systems.
Finally, test the user-facing experience. Search for your event by name in Perplexity or ask ChatGPT (with Browse enabled) about online events in your niche. If your event does not surface within a week or two of implementation, check whether your page is indexed, whether your schema is valid, and whether the event details on-page match what is in the markup.
If you want a professional eye on this, our free AI visibility audit covers structured data implementation across your site, including event schema.
Connecting VirtualLocation to Your Broader AI Visibility Strategy
VirtualLocation schema does not operate in isolation. It works best when it sits inside a well-structured page that also signals authority through other schema types. Adding AggregateRating schema to your event page, if you have reviews or ratings from previous attendees, significantly increases the likelihood of an AI recommending your event over a competitor's.
Similarly, if your organisation runs a series of events, using a Series relationship or linking events to your Organisation schema builds a coherent picture of your brand's expertise that AI systems use when deciding who to recommend.
At FlinnSchema, we implement structured data strategies for e-commerce brands and service businesses who want to be visible in AI search, not just traditional Google results. Events are one of the fastest-moving areas for AI-generated recommendations right now, and most brands are leaving that visibility on the table. You can book a walkthrough call to see exactly what a full implementation looks like for your site.
Frequently Asked Questions
Does VirtualLocation schema help with Google's event rich results?
Yes, partially. Google does support Event schema and uses eventAttendanceMode to filter results (users can filter for online events specifically in Google Search). However, Google has specific requirements for event rich results that go beyond basic VirtualLocation markup. Make sure you also include name, startDate, and organizer as a minimum. Check Google's Event schema documentation for the full required and recommended properties.
What URL should I use inside VirtualLocation if my event is on Zoom?
If you have a registration page on your own site, use that URL. It keeps traffic on your domain and gives AI systems a page they can crawl. If you are linking directly to Zoom, use the specific meeting or webinar URL rather than a generic zoom.us link. The more specific the URL, the more useful the structured data signal.
Can I use VirtualLocation schema for pre-recorded events or on-demand content?
Technically, Event schema is intended for scheduled occurrences. For on-demand content, you would be better served by VideoObject or Course schema depending on the content type. If you run a live event and then make the recording available, you can update the schema post-event to reflect the new state, or add a separate VideoObject markup to the recording page. Using Event schema for purely on-demand content that has no scheduled date is likely to be ignored or flagged as inaccurate by parsers.
How quickly will AI search engines pick up my VirtualLocation schema after I add it?
This depends on how recently your page was crawled and indexed. For pages that are already indexed, changes in structured data can be picked up within a few days to a couple of weeks. For brand new pages, make sure you submit them to Google Search Console and ensure they are linked from elsewhere on your site so crawlers find them. AI systems like Perplexity and ChatGPT with Browse typically rely on recently indexed content, so getting your page indexed quickly is the priority.

