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

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

先确认是不是这个问题?

如果 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 Ads、Merchant Center、Shopify 和结账配置,可以给关键后台操作固定工作环境,用 跨境电商团队稳定线路 承载价格、feed 和账单相关操作。它不影响 Google 是否展示 sale badge,只是减少多人同时排查时的登录环境变量。

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

相关阅读

FAQ

sale price annotations 不展示是不是 feed 写错了?

不一定。feed 里 pricesale_price 写对,只是第一关;落地页可见价格、结构化数据、折扣比例、历史原价窗口和 Google 的展示筛选都会影响结果。

折扣 5% 刚好可以显示促销价标注吗?

不建议卡边界。Google 文档写的是折扣必须大于 5% 且小于 90%。如果刚好 5%、90% 或因为四舍五入落到边界外,sale badge 可能不会出现。

美国 Shopping ads 的历史原价窗口怎么看?

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

sale_price_effective_date 不填会怎样?

Google 会把已提交的 sale_price 立即用于商品。大促、闪促和定时折扣最好补 sale_price_effective_date,否则促销结束后 feed 延迟会继续传促销价。

落地页只显示折后价可以吗?

想拿 sale price annotations,不够。Google 要求原价和当前促销价都在落地页清楚展示,当前促销价更突出,原价可以弱化、灰显或划线。

为什么 Merchant Center 没报错,前台还是没有 sale badge?

sale price annotations 不是强制展示组件。Google 明确说明,即使满足要求也不保证展示;先确认商品在 All products 里是否被标记为 Sale badge eligible。

来源与时间戳