Google builds price drop badges from its own 60-day crawl average
Summary
Two of the stranger product-result bugs, a sale badge on something that is not discounted and a retired image still showing in Shopping, come from records Google keeps independently of the feed.
Neither is fixable in the feed alone. Merchant Center's crawl panel shows the price Google holds, and a retired image stops appearing once its URL returns a 404.
Google’s “Price drop” badges are not assembled from anything a retailer submits. Google compares the price currently submitted for a product against the average price it recorded for that product over the previous 60 days, and when the drop is big enough against a stable baseline it generates both the badge and the “Was” reference price on its own, according to Search Engine Journal’s piece on Google’s hidden data layer by Emina Demiri-Watson, head of digital marketing at the agency Vixen Digital. No feed attribute suppresses it.
The badge retailers do control looks almost identical, which is where the confusion starts. A sale price annotation comes from submitting sale_price and sale_price_effective_date, after which Google checks that the discount sits between 5% and 90% and that the base price has been on record for a qualifying period. In the UK that period is at least 30 days within the past 200. Even for the badge you ask for, Google validates against its own history of your submissions rather than the current feed alone.
Those two records, the crawl history and the submission history, are what make the resulting bug look unreproducible from the merchant’s side. Demiri-Watson describes a client whose Shopping result read “Was £474, now £355” next to a percentage-off badge while no promotion was running. The feed carried no sale price at all. Each place Google had looked said something different:
| Where Google looked | What it found |
|---|---|
| Current primary feed | £355, submitted excluding VAT, no sale price |
| Last page crawl, in Merchant Center | £426, which is £355 including VAT |
| AggregateOffer schema | price tiers labeled “List price” and “Sale price” |
| Page HTML | the word “Now” beside the price |
The product had been repriced months earlier without a sale price ever being submitted. Google read the schema labels and the page wording as a promotion and had a higher historical price on file to corroborate it. No feed edit could remove the badge, because the feed had never claimed a sale in the first place.
Organic results work the same way. Price drop rich snippets need a specific price in Offer markup rather than an AggregateOffer carrying lowPrice and highPrice, but the reference price that appears is Google’s. SEO consultant Brodie Clark, who first documented the feature in depth, is quoted in Demiri-Watson’s piece saying the site owner never specifies that figure in the structured data: Google steps in and adds its own historical record of the page’s price.
Images are held the same way and are harder to correct. Google keeps its own index of product images, runs classifiers over them and applies flags or restrictions based on what it finds, so swapping image_link in the feed does not retract the file Google already holds. Demiri-Watson notes that Shopify’s CDN URLs are permanent by design and that deleting a product does not remove its images, so the old URL keeps answering with a 200 and Google keeps serving that image in ads and free listings. Removal has to be an HTTP status change, not a delete in the admin.
Third-party copies are the version of this that no feed audit will surface. In another case from the piece, a client’s forgotten Amazon listing from two years earlier carried the wrong image, and Google preferred it to the correct one because of Amazon’s authority.
What to do
- Open “Information found on your site” in Merchant Center and compare the crawled price against what the feed submits. In the case above the crawl returned the VAT-inclusive equivalent of the feed price, which exposed the feed’s VAT handling as a second problem.
- Filter by badge type in the Products panel to see every product Google is annotating, rather than only the one someone emailed about.
- Strip “Sale” and “List price” labels out of Offer markup, and words implying a promotion out of page copy, when nothing is discounted.
- Check the HTTP status of retired image URLs and make them return 404. Then search the old filenames in Google Images to find marketplace and affiliate pages still hosting them.
- Keep date-stamped feed exports so the price history Google compared against can be reconstructed later, rather than guessed at from the 60-day baseline Google compares against.