Which price wins when Offer.price and priceSpecification.price differ?

The Citead team, updated

In short. Google uses Offer.price when both Offer.price and priceSpecification.price encode an active product price.

Definition: Google uses the offers.price value when both offers.price and offers.priceSpecification encode an active product price. The nested priceSpecification value is ignored for that active price.

Key facts

  • Google's product snippet documentation, updated 8 September 2026, lists price or priceSpecification.price as the required price location for an Offer.
  • When both properties encode an active price, Google uses the value in offers.price and ignores the value in offers.priceSpecification.
  • Google's merchant listing documentation defines an active price as the price at which the product is currently offered.
  • priceCurrency uses a three-letter ISO 4217 code. Google recommends it for product snippets and requires it for merchant listing experiences.
  • Schema.org's Offer guidance keeps the currency in priceCurrency and uses a full stop for the decimal point.

Which property takes precedence?

Google's product snippet documentation gives the direct precedence rule. An Offer may carry its price directly in price, or nest the price in priceSpecification.price. When both locations describe the active price, the direct offers.price value wins, regardless of the numeric difference.

The following compact example combines the two property shapes shown in Google's examples. It illustrates the case in which the values differ:

{
  "offers": {
    "@type": "Offer",
    "price": 39.99,
    "priceCurrency": "USD",
    "priceSpecification": {
      "@type": "PriceSpecification",
      "price": 9.99,
      "priceCurrency": "USD"
    }
  }
}

For this structure, Google's documented selection is offers.price. The nested value remains markup in the page, but it does not supply the active price when the direct property is also present.

What counts as the active price?

Google's merchant listing documentation describes three price types: active, strikethrough and member. The active price is the price at which the product is currently offered. A strikethrough price is the higher regular price shown during a sale, while a member price is offered to a member of a particular loyalty program.

The documentation says that these prices use price specifications under Offer, with the active price also allowed at the offer level. Active prices have neither priceType nor validForMemberTier. A strikethrough price uses priceType with StrikethroughPrice, and a member price uses validForMemberTier. A price specification containing both of those properties is ignored.

This distinction matters when several PriceSpecification objects describe one offer. A price marked as a member or strikethrough price is classified by its properties, while the active price follows the precedence rule above.

Which currency and date fields accompany it?

The product snippet documentation requires an offer price in either price or priceSpecification.price. It describes priceCurrency as the currency for the product price, in three-letter ISO 4217 format. The same field is recommended for product snippets and required for merchant listing experiences.

Schema.org's Offer page says to keep standard currency formats in priceCurrency rather than putting ambiguous symbols such as $ in the price value. It also specifies a full stop, U+002E, rather than a comma for a decimal point. These rules apply to the value selected as the active price and to its corresponding currency field.

Google also documents priceValidUntil as the ISO 8601 date after which a price is unavailable. A product snippet may not display when that property contains a past date.

How can you check the markup?

Google's product snippet documentation directs you to validate the code with the Rich Results Test and then use the URL Inspection tool to test how Google sees a page. It also separates the Merchant listings report for pages where shoppers can buy products from the Product snippets report for other product-related pages, such as reviews and aggregator sites.

When reviewing a mismatch, inspect the rendered Offer object and identify whether each PriceSpecification has priceType or validForMemberTier. Then compare the active price and its priceCurrency with the value visible on the page.

FAQ

Does Google choose the lower price?

Google's documented rule is based on property location. When both fields encode the active price, the value in offers.price takes precedence, whether it is higher or lower.

Can priceSpecification.price be used alone?

Yes. Google documents priceSpecification.price as an alternative location for an offer price. The precedence question arises when the direct offers.price property is also present.

Is a member price the active price?

Google identifies a member price with validForMemberTier. The active price has neither priceType nor validForMemberTier, so the two price types use different markup signals.

Sources

  1. Google Search Central, "Product snippet (Product, Review, Offer) structured data", 8 September 2026
  2. Google Search Central, "Merchant listing (Product, Offer) structured data", 8 September 2026
  3. Schema.org, "Offer", accessed 17 October 2026

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