How are sale start and end dates declared in Product markup?

The Citead team, updated

In short. Use validFrom for the start, then choose the documented end field for the node carrying the sale price.

Definition: In Product structured data, validFrom declares when a sale price starts. The end is declared with either validThrough or priceValidUntil on an Offer; when the sale price is a PriceSpecification, use validFrom and validThrough on that price specification.

Key facts

  • Google describes sale periods with Schema.org date properties in ISO 8601 format, including the example 2025-12-31T23:59:59+01:00, in its merchant listing documentation.
  • validFrom is the start date and time for the price, while validThrough is the end date and time; Schema.org defines validFrom as the date when an item becomes valid and validThrough as the date after which it is not valid.
  • On an Offer, Google allows validFrom together with either validThrough or priceValidUntil when the Offer price is the active sale price.
  • On a sale PriceSpecification, Google places validFrom and validThrough on the specific price specification and says that priceValidUntil does not apply to that type.
  • Google recommends providing both endpoints, keeping the start earlier than or equal to the end, and including the time and timezone in ISO 8601 values.

Which node should contain the dates?

The node carrying the sale price determines where the dates go. When offers.price is the current sale price, put validFrom and one of the two supported end fields on the Offer. When the sale price is one member of offers.priceSpecification, put validFrom and validThrough on that specific UnitPriceSpecification. Google’s merchant listing documentation gives this Offer pattern:

{
  "@type": "Offer",
  "price": 10.00,
  "priceCurrency": "GBP",
  "validFrom": "2025-11-20T08:00:00+00:00",
  "priceValidUntil": "2025-11-30T23:59:59+00:00",
  "priceSpecification": {
    "@type": "UnitPriceSpecification",
    "priceType": "https://schema.org/StrikethroughPrice",
    "price": 15.00,
    "priceCurrency": "GBP"
  }
}

The same documentation says that these Offer dates apply when the Offer price represents the current active sale price. For a sale price held in a PriceSpecification, it specifies validFrom and validThrough on that object and excludes priceValidUntil.

How do the end fields differ?

Google documents validThrough and priceValidUntil as alternatives for the sale end on an Offer. The priceValidUntil property is an Offer field described as the date and time after which the price is unavailable. Google’s product snippet documentation adds that a product snippet may not display when priceValidUntil indicates a past date.

Schema.org gives the broader meaning of validThrough: it is the date after which an item is not valid, including the end of an offer. That definition supports using validThrough on the particular UnitPriceSpecification whose price has a limited period.

How should the sale price sit beside the original price?

Dates describe the active period, while priceType identifies a separate price as a list or strikethrough price. Google’s sale pricing example marks the original price with https://schema.org/StrikethroughPrice and leaves the active price without a priceType property. Schema.org describes priceType as a way to identify the type of each price when an offer has multiple prices.

If both offers.price and offers.priceSpecification encode an active price, Google uses offers.price and ignores offers.priceSpecification. The active price and its date fields therefore need to be placed consistently on the node that represents that price.

FAQ

Can you use both validThrough and priceValidUntil?

Google presents them as alternative end fields for an Offer. Use validFrom with one of them, and use validThrough with validFrom when the sale price is on a PriceSpecification.

Where do you put validFrom for two price specifications?

Put it on the UnitPriceSpecification that contains the active sale price. The original price can be a second specification marked with priceType set to https://schema.org/StrikethroughPrice.

What does a past priceValidUntil value affect?

Google states that a product snippet may not display if priceValidUntil indicates a past date. The property is an end date for the price on an Offer, rather than a field for a PriceSpecification.

Sources

  1. Google Search Central, "Merchant listing structured data", 8 September 2026
  2. Google Search Central, "Product snippet structured data", 8 September 2026
  3. Schema.org, "Offer", 2026-09-16
  4. Schema.org, "UnitPriceSpecification", 2026-09-16

Check how a page reads to answer engines. Open the GEO score analyzer

Test a page and see what to fix first

The analysis usually takes less than 10 seconds and needs no account.

400,000+ pages scored in the public benchmark