这类问题先别从广告系列里找答案。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 USD,sale_price=39.99 USD。如果 Shopify、WooCommerce 或自研 feed 把 Compare at price 丢掉,只传 39.99 USD 到 price,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.price 或 priceSpecification |
| 按 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、页面和历史价格清理到不会拖累资格判断。