If you run time-limited promotions, the sale_price_effective_date attribute is the mechanism that tells Google exactly when your sale price should be shown to shoppers. Get the format wrong and the value is silently ignored—or your products accumulate feed errors in Merchant Center. This article covers the exact formatting requirements, time zone behaviour, and the most common mistakes catalog operators make.

What the Attribute Does and When to Use It

The sale_price_effective_date attribute is optional for each product, but it is highly recommended whenever you submit a sale_price. Without it, Google applies your sale price immediately and indefinitely. Google documentation describes the attribute as a way to "tell us how long you want a specific sale price to be shown to users."

The attribute works alongside sale_price, not instead of it. You must submit both attributes together: sale_price carries the discounted price value, and sale_price_effective_date carries the date range during which that price is valid. The Google documentation on sale_price makes this relationship explicit: "To submit the dates of your sale, use the sale price effective date [sale_price_effective_date] attribute."

If you omit sale_price_effective_date entirely, the sale price becomes active as soon as the feed is processed and stays active until you either remove the sale_price value or update the feed. For short, time-sensitive promotions this creates a risk: if your feed update is delayed, shoppers may see a sale price that is no longer valid on your landing page, which can trigger a price mismatch disapproval.

ISO 8601 Format, Character Limits, and Time Zone Rules

This is where most feed errors originate. The attribute has a precise required format and a strict character limit.

Required format

According to Google documentation, the type is a "Date range (use ISO 8601 standard). Submit a start date and an end date with time and timezone of format YYYY-MM-DDThh:mm[±hhmm] or YYYY-MM-DDThh:mmZ , separated by slash ( / )." You must submit a start date and an end date separated by a forward slash (/). Each date must include time and time zone using one of two patterns:

  • YYYY-MM-DDThh:mm[±hhmm] — explicit UTC offset
  • YYYY-MM-DDThh:mmZ — UTC

A valid value therefore looks like this:

2024-11-29T09:00-0500/2024-11-29T23:59-0500

For XML feeds the same value is wrapped in a tag:

<g:sale_price_effective_date>2024-11-29T09:00-0500/2024-11-29T23:59-0500</g:sale_price_effective_date>

Character limit

The field accepts 0–51 characters, as stated in the Google documentation: "Limits 0-51 characters". The full pattern YYYY-MM-DDThh:mm±hhmm/YYYY-MM-DDThh:mm±hhmm uses exactly 51 characters including the slash. Any additional whitespace, a trailing zero, or an extra character will push the value over the limit and make it unusable.

Time zone defaults

If you omit the time component, Google defaults the start to 12:00 AM midnight on the start date and the end to 11:59 PM on the end date. If you omit the time zone offset entirely, Google defaults to UTC—as stated in the Google documentation: "If you don't include a timezone, we default to the UTC timezone." For merchants whose store operates in a specific local time zone—US Eastern, Central European, or Australian Eastern, for example—relying on the UTC default means your sale may go live or expire several hours earlier or later than intended. Always include the offset.

Common Feed Errors and How to Fix Them

The Google documentation notes: "Follow the formatting guidelines or the information you submit can't be used." Unlike many other attributes, sale_price_effective_date has no minimum requirements that would cause a product disapproval on its own—but a malformed value means the date range is simply discarded, leaving the sale price active indefinitely or not at all.

Here are the errors catalog operators encounter most often:

1. Missing the time and time zone

Submitting 2024-11-29/2024-11-30 without time or offset is incomplete. The format specification requires hh:mm and a time zone designator. Strip the time out and the value cannot be used.

2. Using a space instead of T as the date-time separator

ISO 8601 requires the letter T between date and time. 2024-11-29 09:00-0500 is invalid. Use 2024-11-29T09:00-0500.

3. Using a colon inside the time zone offset

Some export tools write -05:00 with a colon inside the offset. The format shown in the Google documentation examples uses -0800 without a colon. Colon-separated offsets are not shown in the specification examples and may not be parsed correctly.

4. End date before start date

If your export logic generates the dates incorrectly—for example, by reversing start and end—the date range will be unusable. Always verify that the end timestamp is later than the start timestamp.

5. Exceeding 51 characters

Adding spaces around the slash (2024-11-29T09:00-0500 / 2024-11-29T23:59-0500) adds 2 characters and can push the value past the 51-character limit stated in the Google documentation: "Limits 0-51 characters". Use the slash with no surrounding spaces.

Hypothetical Example: A Black Friday Flash Sale

The following is a hypothetical example for illustration purposes only.

Imagine a store selling apparel in the US Eastern time zone (UTC−5). They want to run a flash sale on a jacket from 6:00 AM to 11:59 PM on 29 November 2024.

Incorrect submission (common mistakes combined):

2024-11-29 06:00 EST / 2024-11-29 23:59 EST

Problems: space instead of T, EST is not a valid ISO 8601 offset designator, and spaces around the slash add characters.

Correct submission for a TSV/CSV feed:

2024-11-29T06:00-0500/2024-11-29T23:59-0500

This value is 45 characters, within the 51-character limit stated by Google documentation, uses the correct T separator, and expresses the time zone as a numeric offset. The full product row would look like:

AttributeValue
idJACKET-BLK-M
price129.99 USD
sale_price89.99 USD
sale_price_effective_date2024-11-29T06:00-0500/2024-11-29T23:59-0500

After the end time passes, the sale_price value in the feed is ignored and the regular price is shown again—provided the feed date range has simply expired.

Variants and Per-SKU Sale Windows

The sale_price_effective_date attribute is not repeated, meaning each product row carries its own single date range value. For item groups with multiple variants—say, a T-shirt in green, blue, and yellow—you can assign a different sale window to each color SKU independently. This is useful when you are running a clearance on slow-moving colorways while keeping other variants at full price.

Each variant row requires its own sale_price, sale_price_effective_date, and item_group_id. Make sure the date ranges you assign to individual variants are accurate; a mismatch between the feed date range and the actual price shown on the landing page can lead to a price mismatch disapproval.

Keeping Your Feed Accurate During Sales

Because sale_price_effective_date is date-driven, Google will stop showing the sale price once the end date passes, even without a feed update. However, if your landing page price changes before the end date—for example, because a promotion was cancelled early—you should update the feed promptly to reflect the current price. A discrepancy between the feed price and the landing page price can trigger a disapproval regardless of what the date range says.

For ongoing catalog management and feed validation across multiple promotions, Magicfeedpro provides tools to manage product data and prepare accurate destination feeds. Keeping date-range attributes correctly formatted at scale—especially across large apparel or electronics catalogs with frequent promotions—is where automated feed management reduces manual error.


MagicFeedPro Team

Feed Optimization Practitioners

We're a team of e-commerce and paid-search practitioners who have spent the last decade running Google Shopping campaigns at scale. We write about what actually moves the needle on product feed quality, CTR, and conversion.

Related articles