这类问题先别从广告系列里找答案。sale price annotations 是 Merchant Center 商品数据和落地页价格共同触发的展示样式,不是 Google Ads 里手动打开的扩展。

我在排查 DTC 站点促销价时,会先拿 3 个 SKU 做样本:一个确定在打折、一个刚结束促销、一个从未促销。这样能分清是整条 feed 映射错了,还是某个 SKU 的历史价格不够。

Google Merchant Center 促销价标注 是否对得上

如果 Shopping ads 或 free listings 只显示现价,没有划线原价、sale badge 或保存金额提示,就属于本文范围。Merchant Center 后台不一定会给红色错误,因为「不展示促销价标注」和「商品被拒登」不是同一件事。

在 Merchant Center 的 Products > All products 找到商品,筛选 Sale badge 是否为 Yes。Google 文档说明,这里可以查看哪些商品有资格展示促销价标注;如果 SKU 没进候选池,广告前台通常也不会凭空出现标注。

检查点正常状态常见问题
price继续提交原始基准价把折后价写进了 price
sale_price提交当前促销价字段为空或币种不一致
sale_price_effective_date用 ISO 8601 日期段限制促销期促销结束后仍持续生效
落地页可见价格原价和现价同时显示页面只露出现价
结构化数据当前价格与页面一致JSON-LD 仍输出旧价

feed 里 price 和 sale_price 怎么填?

Google 的逻辑很直:price 是你之前收取过的原价,sale_price 是促销期间实际向用户收取的价格。促销期间也要继续提交原价到 price,不要把两个字段都改成折后价。

举个 SKU:原价 49.99 USD,促销价 39.99 USD。feed 里应该是 price=49.99 USDsale_price=39.99 USD。如果 Shopify、WooCommerce 或自研 feed 把 Compare at price 丢掉,只传 39.99 USDprice,Google 只能把它当当前普通价格处理。

sale_price_effective_date 不是展示 badge 的唯一条件,但它能减少促销期错位。Google 要求日期范围使用 ISO 8601,例如 2026-06-01T00:00-0700/2026-06-07T23:59-0700。不传这个字段时,sale_price 会在提交后立即生效。

落地页为什么比 feed 更容易出错?

Google 会抓取商品落地页,并把 feed 里的价格和页面价格或结构化数据做比对。官方的 price mismatch 文档特别提到,如果价格通过 JavaScript 在页面加载后才动态写入,可能触发价格不一致问题。

促销页最常见的坑是视觉层和机器层不一致:用户看到 39.99 USD,JSON-LD 还输出 49.99 USD;或者用户看到会员价,feed 却传普通访客价。Google Search Central 的 Merchant listing 文档也强调,页面上的 Product structured data 要和用户看到的价格一致。

场景对 sale annotations 的影响处理动作
页面只显示折后价缺少原价证据显示原价并弱化处理
划线价比当前价更醒目Google 可能难以判断 active price让促销价成为主价格
JSON-LD 输出旧价格结构化数据和页面冲突同步 offers.pricepriceSpecification
按 IP 改价格Googlebot 看到的价可能不同用区域定价能力或独立 URL
结账页价格变化用户点击后价格不一致比对购物车、税费和折扣规则

5%-90% 折扣区间怎么卡?

Google 明确要求促销价低于原价,并且折扣必须大于 5% 且小于 90%。这两个限制都不是「大于等于」或「小于等于」。

所以 100 -> 95 不稳,因为它刚好是 5%;100 -> 10 也不稳,因为它刚好是 90%。跨币种、四舍五入和含税价会让限制 SKU 更难判断,建议活动价至少留出一点余量。

SKU 级别也要分开算。一个父商品有 6 个颜色,只有 2 个颜色打折,feed 需要在变体 ID 上传对应的 sale_price。把父商品页统一写「up to 30% off」,但变体 feed 没有逐个对齐,前台通常不会稳定展示。

历史原价窗口要看哪个国家?

历史价格窗口是很多团队漏掉的一关。你今天才把原价改高,明天马上打折,Google 未必认可这个原价是有效基准价。

美国 Shopping ads 的规则更短:基准价在过去 30 天内收取过 5 天,或在过去 200 天内收取过 15 天,满足较早达到的一条即可,天数不要求连续。

澳大利亚、巴西、加拿大、法国、德国、印度、意大利、日本、韩国、荷兰、西班牙、英国的 Shopping ads 则看过去 200 天内基准价有效 30 天,天数也不要求连续。部分国家的 free listings 同样使用 30/200 天规则;美国、加拿大、澳大利亚、日本的 free listings 文档里没有额外写历史原价天数。

展示类型 / 国家历史原价要求备注
美国 Shopping ads过去 30 天 5 天,或过去 200 天 15 天不要求连续
AU、BR、CA、FR、DE、IN、IT、JP、KR、NL、ES、UK Shopping ads过去 200 天 30 天不要求连续
BR、FR、DE、IN、IT、KR、NL、ES、UK free listings过去 200 天 30 天不要求连续
US、AU、CA、JP free listings文档只列折扣和页面展示要求仍要接受 Google 展示筛选
店铺特定本地库存页过去 200 天 60 天,或新品 60 连续天只适合 local inventory 场景

仍未展示时的处理

先别在同一天反复改价格。每改一次 feed、页面、结构化数据,都要等 Merchant Center 重新抓取和处理。更合理的节奏是,修 feed 映射,再修页面价格,再请求重新抓取或等待下一轮抓取。

团队协作时,把 Merchant Center、Google Ads、Shopify 后台和 feed 生成任务分权。促销前 24 小时只允许一个 owner 改价格字段,其他人只看报表,不改模板和税费规则。

还要接受一个限制:Google 文档明确说,即使满足要求,sale price annotations 也不总是展示。排查目标不是承诺前台必出标注,而是把 feed、页面和历史价格清理到不会拖累资格判断。

相关阅读