# Invalid 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.

- **Canonical URL:** https://www.feedlab.io/knowledge/errors/invalid-value-sale-price
- **Last reviewed:** 3 November 2026
- **Source:** feedlab knowledge base
- **Licence:** free to quote and cite with attribution to feedlab


## How this appears in your account

- `Invalid value [sale_price]`
- `Invalid sale price`


## 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

1. **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.
2. **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.
3. **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.
4. **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.
5. **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.




## Primary sources

- [Google: sale_price attribute specification](https://support.google.com/merchants/answer/6324471)
- [Google: sale_price_effective_date attribute specification](https://support.google.com/merchants/answer/6324460)
- [Google: Merchant Center product data specification update 2025](https://support.google.com/merchants/answer/16098264)



