Advertisement
Content Moved? Use Search to Locate
High-tech server rack in a secure data center with network cables and hardware components.

How to Mark Up Sale Prices for Google Merchant Listings

For Google Merchant listings, the active price should be the price a shopper can buy the product for now; identify the former, higher price separately as the strikethrough price. Leave the active Offer price without priceType. For the original price, use Google’s documented StrikethroughPrice value. This guide is for ecommerce operators and developers checking a product page’s visible price against its structured data.

Check what Google is being told

Start with one representative product page. Record the price and currency a customer sees, the former price if one is displayed, and any stated sale start or end date. Then inspect the page’s rendered Product and Offer markup. Compare the rendered page content with the parsed markup rather than assuming a plugin or theme has generated the intended output.

  1. Compare the active price. The Offer’s active price should match the current price a shopper can buy at, including its currency. If the page shows a sale price but the Offer gives the former higher price, the roles do not match.
  2. Inspect the original price. Look for a separate priceSpecification identifying the former price. Google specifies the priceType value StrikethroughPrice. Its full Schema.org identifier is available in Google’s linked implementation guidance.
  3. Check member-tier properties. Confirm that member pricing, if present, is represented separately from ordinary strikethrough pricing.
  4. Check sale dates and their placement. Make sure the values reflect the offer shown on the page and are attached to the appropriate node for the way the active sale price is encoded.

Schema.org’s priceType definition is broad: it identifies the type of a specified price. For Google Merchant listings, follow the narrower value and usage rules in Google Search Central’s merchant listing guidance. The active price is not marked with priceType.

Keep the active and original prices separate

Hypothetical example: A product page displays a sale price of $10 and a former price of $15. The Offer’s active price should be 10.00 with currency USD, without priceType. A separate price specification should identify 15.00 USD as the strikethrough price, using Google’s documented StrikethroughPrice value. Compare those fields with what the page communicates to customers.

Google says ListPrice is allowed during a transition period, but its reviewed documentation does not give an end date for that period. Use the documented StrikethroughPrice value rather than assuming a deadline. The Google implementation examples show the exact value to use.

Verify sale dates and where they belong

Google documents validFrom for a sale start and either validThrough or priceValidUntil for an end date. It recommends providing both dates with an ISO 8601 date and time, including a timezone. Check the placement instructions in Google’s merchant listing documentation for the way your active sale price is encoded; do not assume dates belong on the same node in every implementation.

Compare the dates in the markup with the offer presented on the page. A missing or expired date, an incorrect timezone, or a date attached to the wrong node can make the structured data inconsistent with the sale customers see. Correct the specific mismatch, then test the updated page.

Do not treat member pricing as a regular sale

Google uses validForMemberTier to identify prices available to members, not priceType. The Offer must still include a current regular price, and member-program and tier markup have separate setup guidance. Google also says a price specification that combines priceType and validForMemberTier is ignored. Keep member pricing separate from strikethrough pricing and follow the distinct markup rules for each in Google’s documentation.

Test the page and interpret the result

  1. Run the live product URL through Google’s Rich Results Test. Check that Google detects the relevant structured data and address any critical errors. Compare parsed prices and dates with the rendered page, not just the error summary.
  2. Review Search Console’s Merchant Listings report. Find it under Shopping. Review whether the sampled item is valid or has an issue, then investigate the affected field on the page.
  3. Use URL Inspection if the URL is missing from the report. Search Console rich result reports show a sample, not every detected item. An omitted product URL is not, by itself, evidence that Google failed to detect its markup or that the markup is invalid.

A clean test means the tool detected the markup without critical errors; it does not promise a sale annotation or Merchant listing display for a particular query or date, nor does it establish a ranking or commercial outcome. Google’s documentation updates record additions about priceType and sale-pricing examples on September 23, 2024, and expanded examples and instructions on February 13, 2025. Those entries document changes to the documentation, not a confirmed 2026 Search display change.

If your store uses WooCommerce, inspect the specific page’s rendered output. A theme or plugin may contribute markup alongside other components, but the configuration alone does not establish what Google can parse. If you find a mismatch, correct the output at its source, then rerun the test and recheck the live page.

When you inspect a sale page, which mismatch is most common in your setup: the active price, the original price, or the sale dates?

Sources

Editorial note: AI assists with research, drafting and automated checks. Sources are linked so you can verify the guidance. Platform requirements can change; confirm the details that apply to your setup.