Skip to content
feedlab Request early access

Feed error

Item disapproved

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.

How this appears in your account

The exact wording the channel shows, so you can match what you are looking at.

What it affects

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

  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.

Related errors

Primary sources

Channel specifications change. These are the official documents this page is based on.

Last reviewed View as markdown