Feed error
Item disapprovedInvalid value: sale price
The "Invalid value [sale_price]" issue means the sale price cannot be used: it is not lower than price, lacks a valid currency, or its effective date range is malformed. On Shopify it usually comes from a compare-at price that is equal to or below the selling price, mapped straight into the feed.
How this appears in your account
The exact wording the channel shows, so you can match what you are looking at.
- Invalid value [sale_price]
- Invalid sale price
What it affects
- Channels
- Google Shopping Microsoft Advertising
- Attributes
- sale_price price
- Scope
- A subset of items
Why it happens on Shopify
The sale price is equal to or higher than price
Google requires sale_price to be less than price. A feed that sets price from the Shopify compare-at price and sale_price from the selling price breaks this wherever a compare-at value was left at or below the current price after a sale ended.
price and sale_price were mapped the wrong way round
In Shopify the compare-at price is the higher, original figure and the variant price is what the shopper pays. Swapping the two produces a sale price above the regular price on every discounted item.
The effective date range is malformed
sale_price_effective_date takes an ISO 8601 start and end separated by a slash, for example 2026-11-27T00:00+0000/2026-12-01T23:59+0000. A missing slash, a date-only value in the wrong format or an end date before the start cannot be read.
The currency is missing or does not match price
sale_price is a number plus an ISO 4217 currency code. A bare number, or a currency different from the one used in price, makes the value invalid.
How to fix it
-
Find which rule the affected items break
Compare price, sale_price and sale_price_effective_date on a few flagged items. A sale price at or above price, a broken date and a missing currency need different fixes, and the pattern is usually obvious within a handful of rows.
-
Only submit sale_price when compare-at is higher than price
Make the mapping conditional: when the Shopify compare-at price is greater than the variant price, send compare-at as price and the variant price as sale_price. Otherwise send the variant price as price and leave sale_price empty.
-
Clean up stale compare-at prices in Shopify
Compare-at values left behind after a promotion keep producing invalid or misleading sale prices. Clearing them in bulk once a sale ends fixes the source rather than the symptom.
-
Write dates in full ISO 8601 with a timezone
Use YYYY-MM-DDThh:mm with an offset, or Z for UTC, for both start and end. Without a timezone Google assumes UTC, which can start or end a sale hours away from your storefront.
-
Keep the storefront and the feed in step
The sale price has to match the landing page and checkout. If the sale ends on the storefront before the effective date does, the issue turns into a price mismatch instead.
How feedlab handles this
feedlab maps price and sale_price with a conditional rule, so a sale price is only sent when the compare-at price is genuinely higher. The rule preview against the real catalogue shows which variants carry a sale price before publishing, and validation before publish catches a sale price that is not lower than price.
Frequently asked questions
How does the Shopify compare-at price map to Google sale prices?
When compare-at is higher than the variant price, compare-at becomes price and the variant price becomes sale_price. When there is no compare-at price, or it is not higher, the variant price is price and sale_price is left out.
Do I need sale_price_effective_date?
It is optional. Without it the sale price applies immediately and stays in effect until you remove it, so the feed has to be updated when the sale ends on the storefront.
Can I put member or loyalty prices in sale_price?
No. Since July 2025 Google does not allow member prices in price or sale_price, for paid or free member programmes. They belong in the loyalty_program attribute instead.
Related errors
- Mismatched value: price The price mismatch error means the price in the feed does not agree with the price the channel found when it crawled the landing page. On Shopify the three usual culprits are a feed that has not regenerated since a price change, a link pointing at the wrong market's storefront, and a tax convention difference between the feed and the displayed price.
- Automatic item updates Automatic item updates let Merchant Center overwrite price, availability or condition with what it finds on the landing page. The warnings appear when Google stops doing so, usually because structured data is broken or conflicts too often with the feed. On Shopify the cause is usually theme markup or a stale feed.
- Mismatched currency A mismatched currency issue means the currency in the feed does not agree with the landing page, the shipping settings or the market being targeted. On a Shopify Markets store it usually means one feed in the store currency is sent to several countries while the storefront shows each visitor local prices.
Primary sources
Channel specifications change. These are the official documents this page is based on.