WooCommerce Google Shopping Sale Price: Map It Correctly

The image shows the essential attributes for managing sale prices in product feeds: regular price, sale price, and the sale effective date.

Your sale starts Monday. You set the sale price in WooCommerce, the product page shows the discount, and your Shopping ad still shows the full price. Or the reverse: the sale ends, your site goes back to the regular price, and Merchant Center flags a price mismatch because the feed still carries the discount.

Both problems come from the same place. Google does not read a sale the way your product page shows it. It reads your regular price and your sale price as two separate feed attributes, plus a date window that says when the sale applies.

This guide covers the attributes Google expects, where WooCommerce keeps your prices and sale dates, the mapping mistakes behind most sale price problems, and how to check the sale before it goes live.

What Google expects: price, sale_price and sale_price_effective_date

Merchant Center uses three attributes to describe a sale on a single product:

  • price: your regular, non-discounted price. Keep sending it during the sale.
  • sale_price: the discounted price. It must be lower than price.
  • sale_price_effective_date: when the sale starts and ends, in ISO 8601 format with a time and a time zone. For example: 2026-11-27T00:00+0100/2026-11-30T23:59+0100.

Without sale_price_effective_date, Google applies the sale price as soon as it processes your feed, and keeps applying it for as long as the attribute is in the feed. With the date window, Google switches to the sale price at the start time and back to price at the end time, on its own.

When both prices are present, Shopping can show your regular price next to the sale price, or a sale annotation. Google does not guarantee this. Among other requirements, the discount must be more than 5% and less than 90%, and in most countries your regular price must have been valid for 30 days within the past 200 days (Shopping ads in the US use shorter periods). So a new product with a launch discount may show the sale price without the old price crossed out.

Google also requires the landing page to show both the regular and the sale price, and the sale price must stay the same through checkout. A standard WooCommerce product page already does this: it shows the regular price crossed out next to the sale price.

Where WooCommerce keeps your prices and sale dates

On the product edit screen, in the General tab, WooCommerce has three fields that matter here:

  • Regular price
  • Sale price
  • Schedule: the optional start and end date of the sale

For variable products, every variation has its own regular price, sale price and schedule.

The trap is the price your shop shows. During a sale, the price on the product page and at checkout is the sale price. Outside a sale it is the regular price. That is right for shoppers and wrong for a feed. If your feed takes its price from that active price, the price attribute drops to the discount the moment the sale starts, and Google no longer sees a sale at all. It just sees a cheaper product.

The rule is simple: map price to the Regular price field, sale_price to the Sale price field, and sale_price_effective_date to the schedule dates. Never map price to the active price.

The mapping mistakes behind most sale price problems

1. The active price in price. During a promotion, the feed sends the discounted amount as your regular price. Google treats it as a normal price change: no crossed-out price, no sale annotation, and Google simply records a lower regular price.

2. A sale price without a date window. If you set a sale price without schedule dates, the feed carries sale_price with no end. When you remove the sale in WooCommerce, the product page goes back to the regular price straight away. Google keeps showing the discount until your feed updates and Google has processed it. In that gap the feed and the page disagree, and the product may be disapproved for a price mismatch. For a full walkthrough of that error, see How to Fix Merchant Center Price Mismatch for WooCommerce Stores.

3. Changing prices on the day itself. If you edit prices on the morning the sale starts, your product page changes instantly. Your feed waits for its next update, and Google needs time to process it. Google also checks the price on your product page, so for a while the two do not match. A sale that is scheduled in advance avoids this: the feed already carries the sale price and the dates, and Google switches at the start time.

4. One price for all variations. A sale on one size or color is a change on that variation. Every variation needs its own price, sale_price and dates in the feed, under the same item_group_id. A feed that only sends the parent product sends one price for the whole group, and that is often the wrong one.

Setting it up, step by step

  1. In WooCommerce, enter the sale price and click Schedule to add the start and end date. For variable products, do this on each variation that is on sale.
  2. In your feed, map price to the Regular price field and sale_price to the Sale price field.
  3. Map sale_price_effective_date to the schedule dates, with a time zone.
  4. For variable products, check that every variation is in the feed with its own prices and the shared item_group_id.
  5. Schedule the sale a few days ahead and let the feed update, so Merchant Center has the sale price and the dates before the sale starts.
  6. Let the dates end the sale. Don’t edit products back by hand on the last day.

In Product Feed Manager for WooCommerce, the Google feed handles steps 2 and 3 by default: price comes from the regular price, sale_price from the sale price, and sale_price_effective_date from the WooCommerce schedule dates. If you changed the price mapping in the past, check that it still points to these fields.

Check the sale before it starts

  • Open one sale product in Merchant Center and check what Google received: the price, the sale price and the sale date range.
  • Check the time zone. When no time zone is given, Google uses UTC, so a sale meant to start at midnight in your country can start a few hours early or late.
  • In the days before launch, watch the products that need attention for price mismatch issues.
  • If Merchant Center fetches your feed on a schedule, you can fetch it manually after an update instead of waiting for the next run.
  • On the first day of the sale, search for one of the products on Google and check which price is shown.
  • Start with a few products, then apply the same setup to the whole promotion.

What happens when the sale ends

With schedule dates in WooCommerce and sale_price_effective_date in the feed, both sides switch back on their own. WooCommerce ends the sale on the end date, and Google drops sale_price at the end time. Nothing to do.

Without dates, someone has to end the sale in WooCommerce and make sure the feed updates soon after. Miss it by a day and every discounted product may be flagged for a price mismatch.

When the feed is not the problem

Not every discount belongs in sale_price.

  • Coupon codes. A discount that needs a code at checkout is not a sale price. Google has a separate Promotions feature for that.
  • Discounts calculated on the fly. Role-based or dynamic pricing can apply a discount without ever filling the WooCommerce Sale price field. Then there is nothing in that field to map. Find out where the discount is stored before you change your feed.

FAQ

Do I need sale_price_effective_date? It is optional. Without it, Google applies the sale price for as long as it is in your feed. With it, the sale starts and ends on time, even when your feed updates later.

Why does Google show my sale price without the old price crossed out? Sale price annotations are never guaranteed. The most common reasons are a discount under 5%, or a regular price that has not been valid long enough. In most countries that means 30 days within the past 200 days.

Can I just lower the regular price for a short promotion? You can, as long as your page and feed show the same price. But Google then sees a normal price change instead of a sale, so you lose the crossed-out price, and you have to raise the price again by hand when the promotion ends.

Want your WooCommerce sale prices and dates in your Google feed without manual edits? Try Product Feed Manager for WooCommerce.

On this page