# Price and Availability: The Signals That Must Match

> What price and availability signals are, where each copy lives (product page, markup and feeds), how Google compares them and what happens when they differ.

URL: https://clione.ai/glossary/price-and-availability/
Lang: en

This is not about how to set prices or how much stock to hold, but about how they get stated. A single product has one price and one stock status, but **your store publishes them in several places at once**: on the [product page](/glossary/product-page/) the customer sees, in that page's [structured data](/glossary/structured-data/) and in every [product feed](/glossary/product-feed/) you send out. Each copy is a signal, and whoever reads it does not always read the same one. It matters because these are the data that change most (every markdown, every sale, every restock) and the ones checked most: Google and the assistants compare the copies against each other, and a difference can be enough for a product to stop showing.

## How it works

The four usual copies say the same thing in different formats:

| Copy                                                                   | Price                                                                                                                   | Availability                                                      |
| ---------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------- |
| The page                                                               | As a person reads it: "$29.90" | As a person reads it: "In stock", "Last few left"                 |
| The markup, in the offer                                               | `price` and `priceCurrency`                                                                                             | A single vocabulary value, such as `https://schema.org/InStock`   |
| The [Google Merchant Center](/glossary/google-merchant-center/) _feed_ | `price`, with the currency                                                                                              | `in_stock`, `out_of_stock`, `preorder` or `backorder`             |
| The ChatGPT _feed_                                                     | `price`, the regular price, and `sale_price`                                                                            | `in_stock`, `out_of_stock`, `pre_order`, `backorder` or `unknown` |

In the markup, the offer is the [Offer](/glossary/offer-schema/) type. For [merchant listings](/glossary/merchant-listings/), Google requires a price greater than zero and the currency as an ISO 4217 code, and asks for a single availability value.[^google-merchant-listing] The Merchant Center specification asks that the price match the one on the page, in the structured data and in checkout, and that availability match the page, checkout and the markup; and it adds that **an out-of-stock product has to keep showing its price visibly on the page**.[^mc-spec] OpenAI's _feed_ makes availability mandatory on every row: if it is missing or is not one of its values, the row is rejected. The sale price has to be greater than zero, lower than the regular price and in the same currency, and OpenAI asks you to update the _feed_ when a sale starts or ends and when a product sells out or comes back in stock.[^openai-feed-spec]

**Google compares the copies.** Its [crawler](/glossary/web-crawler/), [Googlebot](/glossary/googlebot/), visits your product pages and **compares your _feed_'s price with the one on the page or in the markup**. If it finds a difference, the product can be rejected, and Google warns it can lead to the account being suspended. It reads the HTML your server returns: if the price is added with JavaScript after the page loads, that throws an error. When you fix it, it recrawls the rejected products within hours or days.[^mc-price-mismatch] Availability works the same way: the _feed_ value and the page value have to match, and too many products with the wrong availability can also lead to suspension.[^mc-availability-mismatch]

**The most common cause is the clock.** Google lists as frequent causes the time gap between what you change on the site and what reaches Merchant Center, incorrect markup, a different price for bots than for people and, during sales, start and end dates or a time zone set wrong on the sale price.[^mc-price-mismatch] That is why it recommends syncing _feed_ uploads with store changes or, if you change prices and stock often, turning on automatic updates.[^mc-availability-mismatch] Those updates use your page's structured data to correct the price, sale price, availability and condition of the product in Merchant Center, but they do not replace an up-to-date _feed_, they may not work with products whose price or availability changes more than once a day and, if they detect a difference, they may reject the product instead of updating it.[^mc-auto-updates]

**The markup has to arrive on time too.** Google warns that product markup generated with JavaScript can make Shopping crawls **less frequent and less reliable**, a problem for anything that changes fast, like price and availability.[^google-js-sd]

**Assistants use it too.** When several merchants sell the same product, ChatGPT ranks them taking into account availability, price, quality and whether they are the manufacturer or the primary seller. OpenAI acknowledges that when a merchant changes its price or shipping terms, it can take a while to show up in what the user sees.[^openai-shopping]

## In a store

A shirt goes on sale on Monday at 9:00. At 11:00, the store checks its four copies. This is a **fictitious example**: the store, the product, the prices and the times are invented to show where the difference appears.

| Copy, at 11:00 (fictitious example) | Price                   | Availability | Does it match the page?                                                  |
| ----------------------------------- | ----------------------- | ------------ | ------------------------------------------------------------------------ |
| The page                            | $29.90                  | In stock     | It is the reference                                                      |
| The page's markup                   | `29.90` USD             | `InStock`    | Yes                                                                      |
| The Merchant Center _feed_          | $39.90, no `sale_price` | `in_stock`   | No: the price is the pre-sale one                                        |
| The ChatGPT _feed_                  | $39.90                  | Empty        | No: the price is the old one, and a row with no availability is rejected |


Two takeaways. **The page and the markup are fine, and there is still a problem**: the Merchant Center _feed_ goes out once a day and does not yet know about the sale, so if Google crawls the page that morning it will find two different prices.[^mc-price-mismatch] The fix is not to touch the page but the _feed_: send the sale price with its start and end dates, or let automatic updates correct it if the price does not change more than once a day.[^mc-auto-updates] The second: in the ChatGPT _feed_, empty availability is not a warning, it is a rejected row.[^openai-feed-spec]


**Marking a product as out of stock to stop advertising it.** If the page says there is stock, that creates exactly the mismatch Google punishes. Merchant Center asks you not to use `out_of_stock` to pause a product: that is what the pause attribute is for, for a maximum of 14 days, and the excluded destination attribute if it is for longer.[^mc-availability-mismatch]


## How to check it

1. **Pick a product that is on sale or low on stock** and write down what a customer sees on the page.
2. **Open the page's source code**, not the browser inspector, and look for the markup's price and availability. If they only show up in the inspector, JavaScript is adding them after load.[^mc-price-mismatch][^google-js-sd]
3. **Go to Merchant Center, to Products, to the Needs attention tab**, and filter by the mismatched price and availability issues.[^mc-availability-mismatch]
4. **If you use a sale price, check its start and end dates and the time zone**: an error there shows a wrong price even if everything else is right.[^mc-price-mismatch]
5. **Check every row of your ChatGPT _feed_**: availability has to be one of the accepted values, and `unknown` only when you really do not know.[^openai-feed-spec]

## Related concept: Offer

Offer is just one of the copies: the one in the page's markup, with its price, its currency and its availability. Price and availability signals are the whole set, and the problem is usually not inside any one copy but **between them**: a perfect offer in the markup is no use if the _feed_ says a different price. When a copy that was right stops matching over time, the name for it is [data drift](/glossary/data-drift/).

To go further, the [catalog and entities reading path](/learn/catalog-and-entities/) orders the rest of the terms, and the entry on [return policy](/glossary/return-policy/) covers the other sales conditions that search engines and assistants read.
