XooCode(){

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.

Highlight legend:Required by GoogleRecommendedOptional
schema.org/SaleEvent
<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.

schema.org/SaleEvent (minimal)
<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.

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.

  1. 01

    Using generic Event for a sale

    Wrong
    "@type": "Event" for a clearance sale or promotional event
    Right
    "@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.

  2. 02

    Changing the Product price instead of creating a SaleEvent

    Wrong
    Updating Product.offers.price from "495.00" to "346.50" during a sale
    Right
    Keep 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.

  3. 03

    Missing endDate on a time-limited sale

    Wrong
    SaleEvent with startDate but no endDate
    Right
    "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.

  4. 04

    isAccessibleForFree set to false for a sale event

    Wrong
    "isAccessibleForFree": false on a SaleEvent at a store
    Right
    "isAccessibleForFree": true

    isAccessibleForFree 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.

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...

Leave a comment