SaleEvent
SaleEvent is an Event subtype for sales, clearance events, flash sales, grand opening promotions, and any time-limited event where the primary purpose is selling products at special prices. It adds no properties of its own. The @type value is the entire point: it tells search engines and shopping aggregators that this is a promotional sales event, not a concert or conference.
The type hierarchy is Thing → Event → SaleEvent. The most useful inherited properties are offers (what is on sale and at what price), startDate/endDate (when the sale runs), location (where), and isAccessibleForFree (the event is free to attend, even though the products are not free). You still need eventAttendanceMode and eventStatus for Google's Event rich result.
Full example of schema.org/SaleEvent json-ld markup
The markup is verified as valid with Rich Results Test from Google.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@id": "https://xoocode.com/shop/summer-sale-2026#event",
"@type": "SaleEvent",
"name": "Xoo Code Summer Clearance 2026",
"url": "https://xoocode.com/shop/summer-sale-2026",
"description": "Annual summer clearance at Xoo Code Shop Dunmore. XooTee Classic t-shirts at 30% off, plus discounts across the full Xoo Code product line. In-store and online, one weekend only.",
"image": [
"https://xoocode.com/shop/summer-sale-2026/banner-1x1.jpg",
"https://xoocode.com/shop/summer-sale-2026/banner-4x3.jpg",
"https://xoocode.com/shop/summer-sale-2026/banner-16x9.jpg"
],
"startDate": "2026-07-18T09:00:00-04:00",
"endDate": "2026-07-19T18:00:00-04:00",
"eventStatus": "https://schema.org/EventScheduled",
"eventAttendanceMode": "https://schema.org/MixedEventAttendanceMode",
"location": {
"@id": "https://xoocode.com/shop/dunmore-1290",
"@type": "LocalBusiness",
"name": "Xoo Code Shop Dunmore",
"url": "https://xoocode.com/shop/dunmore-1290",
"address": {
"@type": "PostalAddress",
"streetAddress": "355 Eagle Butte Ave",
"addressLocality": "Dunmore",
"addressRegion": "AB",
"postalCode": "T1B 0K2",
"addressCountry": "CA"
}
},
"organizer": {
"@id": "https://xoocode.com/shop/dunmore-1290",
"@type": "LocalBusiness",
"name": "Xoo Code Shop Dunmore"
},
"offers": [
{
"@type": "Offer",
"name": "XooTee Classic - Summer Sale",
"itemOffered": {
"@id": "https://xoocode.com/shop/xootee-classic#product",
"@type": "Product",
"name": "XooTee Classic"
},
"price": "346.50",
"priceCurrency": "DKK",
"availability": "https://schema.org/InStock",
"url": "https://xoocode.com/shop/xootee-classic?promo=summer2026",
"validFrom": "2026-07-18",
"priceValidUntil": "2026-07-19"
},
{
"@type": "Offer",
"name": "XooPremium Bundle - Summer Sale",
"price": "799.00",
"priceCurrency": "DKK",
"availability": "https://schema.org/LimitedAvailability",
"url": "https://xoocode.com/shop/xoo-premium-bundle?promo=summer2026",
"validFrom": "2026-07-18",
"priceValidUntil": "2026-07-19"
}
],
"isAccessibleForFree": true,
"inLanguage": "en"
}
</script>offers on a SaleEvent
The offers array on a SaleEvent describes the deals available during the sale. Each Offer should include the sale price, the product via itemOffered, and availability. This is different from the Product offers: Product.offers is the everyday price, SaleEvent.offers is the temporary sale price. Use @id references to connect each Offer's itemOffered to existing Product entities so Google can match the sale to the product's knowledge graph entry.
SaleEvent vs Product offers
A Product's Offer is its standing price. A SaleEvent is a time-bounded event where products sell at different prices. If you run a weekend clearance, the SaleEvent's offers show the sale prices and the Product's offers keep the regular prices. Do not update the Product's price to the sale price and forget to revert it. Google renders both, and a Product with a price that changes every week looks unreliable. Use priceValidUntil on the SaleEvent's offers to signal when the sale pricing expires.
SaleEvent vs BusinessEvent
BusinessEvent covers networking events, trade shows, product launches, and business mixers. SaleEvent is for sales and promotions. A product launch with an introductory discount is arguably both, but pick the primary purpose. If the event exists to sell products at a discount, use SaleEvent. If the event is about presenting something new and happens to include a sale, use BusinessEvent.
In-store vs online sales
Set eventAttendanceMode to OfflineEventAttendanceMode for in-store sales, OnlineEventAttendanceMode for online flash sales, MixedEventAttendanceMode for sales running in both channels. For online-only sales, use a VirtualLocation as the location instead of a physical Place. Most ecommerce sales are mixed: the sale pricing applies both online and in-store.
Minimal valid version
The smallest markup that still produces a valid SaleEvent entity. Use it as the floor. Reach for the advanced example above when you want search engines and AI agents to understand more about your content.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "SaleEvent",
"name": "Xoo Code Summer Clearance 2026",
"startDate": "2026-07-18T09:00:00-04:00",
"endDate": "2026-07-19T18:00:00-04:00",
"eventStatus": "https://schema.org/EventScheduled",
"eventAttendanceMode": "https://schema.org/MixedEventAttendanceMode",
"location": {
"@type": "Place",
"name": "Xoo Code Shop Dunmore",
"address": {
"@type": "PostalAddress",
"streetAddress": "355 Eagle Butte Ave",
"addressLocality": "Dunmore",
"addressRegion": "AB",
"addressCountry": "CA"
}
},
"image": "https://xoocode.com/shop/summer-sale-2026/banner-16x9.jpg",
"description": "Annual summer clearance at Xoo Code Shop Dunmore. Discounts across the full product line."
}
</script>Google rich results this unlocks
Markup matching this example makes your page eligible for the following Google Search rich results. The primary target drives the required / recommended property classification in the advanced code block above.
- Google docsEvent rich resultprimary
Common SaleEvent mistakes
Mistakes that pass validation but silently fail to earn rich results or mislead consumers walking the graph. Avoid these and your markup will be ahead of most sites in the wild.
- 01
Using generic Event for a sale
Wrong"@type": "Event" for a clearance sale or promotional eventRight"@type": "SaleEvent"SaleEvent signals to Google and shopping aggregators that this is a promotional sales event. Generic Event works structurally, but you lose the classification that lets shopping-aware search features treat the event as a sale rather than a concert or meeting.
- 02
Changing the Product price instead of creating a SaleEvent
WrongUpdating Product.offers.price from "495.00" to "346.50" during a saleRightKeep the Product price at "495.00" and create a SaleEvent with its own offers at "346.50"A Product's Offer should reflect the standard price. Changing it for a weekend sale and forgetting to revert it leaves the wrong price in Google's index. A SaleEvent with its own offers, priceValidUntil, and explicit start/end dates keeps the sale pricing separate and self-expiring.
- 03
Missing endDate on a time-limited sale
WrongSaleEvent with startDate but no endDateRight"startDate": "2026-07-18T09:00:00-04:00", "endDate": "2026-07-19T18:00:00-04:00"Every sale ends. Without endDate, Google does not know when to stop showing the event. A SaleEvent with no endDate can appear in search results long after the sale is over, which is worse than not showing it at all.
- 04
isAccessibleForFree set to false for a sale event
Wrong"isAccessibleForFree": false on a SaleEvent at a storeRight"isAccessibleForFree": trueisAccessibleForFree describes whether the event itself is free to attend, not whether the products being sold are free. Walking into a store during a sale costs nothing. The products have prices, but the event is free. Setting it to false implies the sale requires paid admission.
Schema properties in this example
About the example data
The Xoo Code Shop Dunmore runs a summer clearance with discounted XooTee Classic t-shirts. The offers.itemOffered references the Product entity via @id, and the LocalBusiness is the organizer. This is a companion to the Product example, showing how the same product can have different pricing during a sale event.
Comments
Loading comments...