Ticket offers schema is an important check in the Events SEO category, and a high-priority one. If you sell tickets and the offers markup is missing or malformed, you are leaving the most valuable part of an event result — the price and the “buy” affordance — off the table in search. That is worth fixing soon.
What This Check Is Really About
An event page can carry Event structured data, but Google will not show ticket-buying details unless that Event object contains a valid offers property. This check verifies that your event markup includes a complete Offer: the price, the currency, the availability, and the URL where a visitor actually buys. Miss any of those and you fall back to a plain blue link — no price, no “Tickets from $25”, no availability badge.
The minimum Google looks for inside offers is price, priceCurrency (an ISO 4217 code like USD), availability (an ItemAvailability value such as https://schema.org/InStock), url (the ticketing page), and validFrom (when tickets go on sale). For free events, use price of 0 — do not omit the offer entirely.
Why It Matters for SEO
Here is the blunt version: event rich results are one of the few SERP features where the markup directly changes purchase intent. A result that shows a date, a price, and an availability state does the qualifying for you before the click. The visitor who taps through already knows they can afford it and that seats exist. That is a higher-intent click than a bare title, and it is the difference between traffic and revenue.
- Eligible for the event experience in Google Search and Google Maps, including the date and price row
- Correct availability signalling — a sold-out event marked
SoldOutstops wasting clicks - Cleaner deduplication when the same event is listed on several aggregators
- A concrete “from” price that pre-qualifies the click and lifts click quality
I Have Shipped Events Before the Web Made Them Easy
Long before “event schema” was a phrase, I was building what we then called virtual shows — CD-ROM and early online trade-fair experiences where every booth, session, and ticket tier had to be described in a structured catalogue so the runtime could render it and price it. If a session record was missing its price field or its “seats remaining” flag, the whole booth rendered broken, and you found out in front of the client. That taught me a habit I still keep: the machine only shows what you describe to it, completely and in the right shape. offers is the same contract in modern clothes. Describe the ticket fully — price, currency, availability, URL — or accept that the search engine will render the event as if it were not for sale at all.
How to Check It
- Run the affected event URL through Google’s Rich Results Test and look specifically for warnings under the
Eventitem — missingoffersshows as a non-critical warning, which is easy to overlook. - View the page source and search for
"@type": "Event", then confirm anoffersblock sits inside it with all five fields. - Check Google Search Console under Enhancements → Events for “Missing field offers” or “Missing field price” reports across the site.
- Re-run the SEO Roadmap audit to see the full list of event URLs flagged, not just the one you happened to open.
How to Fix This in WordPress
Difficulty Level: EASY – This fix is straightforward and can typically be completed by anyone with basic WordPress knowledge.
Estimated Time: 15 min
The fix depends on where your events come from, so find that first.
If you use an events plugin
The Events Calendar, Event Espresso, and most ticketing plugins emit Event schema for you, but the offers block only populates when the ticket or cost fields are actually filled in on the event. The usual cause of this failure is an event with the price left blank or the ticket attached in a way the plugin does not map to offers. Open the flagged event, set an explicit cost or ticket price, set the currency in the plugin’s settings, and confirm availability is tracked. Re-test — nine times out of ten the offer appears.
If you hand-roll or use an SEO plugin
Yoast SEO and Rank Math can output or supplement Event schema, but neither invents a price you did not give them. If you build the JSON-LD yourself, make sure every event template renders a complete offers node, and use 0 for free events rather than dropping the property. Keep the url pointing at the real ticketing page, not the event page, when they differ.
Verify the fix
- Clear your caching and any schema/SEO plugin cache — stale markup is the most common reason a “fixed” page still fails.
- Re-run the Rich Results Test and confirm the
Eventitem is valid with the offer present. - Re-run the SEO Roadmap audit, then check Search Console after a few days to confirm Google has re-crawled.
Recommended Tools & Plugins
These tools can help you fix and prevent this issue:
- Yoast SEO – Comprehensive SEO plugin with built-in checks
- Rank Math – Feature-rich SEO plugin with detailed analysis
- Google Search Console – Free tool to monitor your site’s search presence
- SEO Roadmap – Complete SEO audit and action plan tool
Common Mistakes to Avoid
- Dropping the
offersblock entirely for free events instead of settingpriceto0 - Leaving
availabilityatInStockafter an event sells out, so clicks keep flowing to a dead page - Pointing the offer
urlat the event page rather than the actual checkout or ticketing URL - Using a currency symbol instead of the ISO 4217 code in
priceCurrency - Assuming the plugin “handles schema” without ever running a single event through the Rich Results Test
Need More Help?
If the offer still will not validate, the problem is almost always upstream of the markup — a missing price, a currency set in the wrong place, or two plugins both emitting Event schema and confusing Google. Trace it to the source rather than patching the JSON-LD, and run a full SEO Roadmap audit to see whether the issue repeats across every event on the site.
This guide is part of the SEO Roadmap knowledge base – your complete resource for WordPress SEO optimization.
Last modified: August 2, 2026
United States / English
Slovensko / Slovenčina
Canada / Français
Türkiye / Türkçe