Google 拒的不是 Feed,是落地页:Merchant Center 的多格式变体陷阱
一个卖书的 Shopify 商家,每本书都有纸质、电子、有声三种格式。他用 feed 管理应用把所有数字版从 Google Merchant Center 数据源里排除干净——然后自动审核继续拒登他的纸质书条目。feed 从来不是问题的全部:Google 审的是被提交 URL 的落地页,而那个页面上,电子书仍然在同一个购买表单里一键可买。这篇讲清分界线,和三条有官方文档依据的出路。
TL;DR: Google 的「Unsupported Shopping content」政策明文列出电子书和数字图书属于不可推广的购物内容——数字格式必须留在 Google 展示面之外。但从 feed 里排除只完成了一半:Merchant Center 的自动审核评估的是被提交 URL 的落地页,不只是你提交的数据。当电子书/有声书以可选择、可购买的变体形式存在于同一个产品 URL 上,爬虫看到的就是「一个被提交的 offer,落地页上挂着不受支持的数字商品在售」——feed 再干净也照拒。分界线是:文案里提及「同时提供电子版」允许;把电子版做成被提交 URL 上可购买的变体不允许。三条出路:把格式拆成独立产品(A);做一个只渲染实体变体的代理页面模板,用 requires_shipping 过滤(B);在 GMC 里加属性规则、用 excluded_destination 做 feed 卫生(C)——必要,但单靠它治不了本。
这是我们的 Shopify Google 渠道实战系列第 1 篇。选题证据是一个真实的 Shopify 社区帖子(主题 658986,全文按田野报告标注):一个多格式图书出版商做了最直觉的 feed 层修复,拒登继续;13 个回答之后,仍没有采纳答案。
问题
发帖人 casacarlini 每本书都卖纸质 + 电子 + 有声三个版本,数字版「是业务的重要部分」,从店铺下架不现实。他用 feed 管理应用把所有数字版从数据源里排除——每个 feed 工具都宣传这个修复——然后 Google 的自动审核继续标记他的纸质书条目。
诊断的突破来自一位真的去审计了他目录的回答者(dropfeed):**480 个产品里有 423 个,把 Audiobook / Ebook / Paperback / Hardcover 做成了同一个产品的 Format 选项变体。**四种格式共享一个 URL、一个 item group。这一个结构性事实,解释了为什么所有 feed 层的修复全部无效。
根因:三条有文档的事实,撞在一起
-
Google 购物政策不支持电子书。「Unsupported Shopping content」政策页明确列出「eBooks and digital books(不含有声书)」——PDF、ePub、MOBI——属于不可推广的内容。所以数字格式必须留在 Google 的展示面之外。这没问题。
-
Google 审的是落地页,不只是 feed。落地页要求文档写明:当落地页包含多个产品「例如变体」时,你产品数据里的那个产品必须是页面的主要焦点,页面显示的价格必须与产品数据一致。
link属性文档补充:每个产品或产品变体只提交一个链接——而 Google 自己的结构化数据文档演示了变体如何通过 URL 参数预选(如?size=small&color=green)。 -
**在被提交的 URL 上,电子书依然可以购买。**因为电子书和有声书是同一个 Shopify 产品的变体,纸质书 URL 渲染出的同一个加入购物车表单里,格式选择器仍然允许顾客选中——并购买——数字版。自动审核抓取那个 URL,看到的是:一个被提交的 offer,其落地页上挂着一个不受支持的数字商品在售。
社区帖子最终收敛出一个精确的分界线(田野报告,与上述政策页一致):
- 允许:在文案里写「本书同时提供电子版和有声版」。文字不是 offer。
- 拒登:电子书/有声书以可选择、可购买的变体形式,出现在被提交 URL 的同一个购买表单里。
这就是为什么过滤 feed 毫无效果:商家清理干净的是 Google 读取的数据,而不是 Google 访问的页面。把平装版设为默认选中(让纸质价格先加载)也救不了——数字选项仍然在同一个表单里,一键可达,仍然可买,同一个 URL。
还有一个更安静的放大器:结构化数据。如果产品页的 JSON-LD 为数字变体输出了 offers(很多主题和应用都会),那么即使人类看到的只是一个下拉框,Google 的爬虫也能把电子书读成一个 offer。Google Search Central 的文档描述了 ProductGroup 模式——hasVariant、variesBy、productGroupID——用于变体同属一个父产品的页面。对真正的多格式页面,这是正确标记;但当其中一些变体属于不受支持的内容时,它就是负债。
最小复现
不需要碰 Google,在开发店上就能复现这套机制——失败是结构性的,Liquid 层可见:
- 建一个产品
dune,选项 Format:Paperback($18,需要物流)、Ebook($9,数字)、Audiobook($15,数字)。 - 用你喜欢的任何方式,把数字版从 Google feed 里排除。
- 打开预选了平装的 URL:
/products/dune?variant=<平装变体ID>。 - 查看源代码。加入购物车表单提交的是变体
id,而 Format 选择器里三个选项齐全。任何渲染或解析这个页面的爬虫,都会在被提交的 URL 上看到三个可购买的 offer——其中两个是数字商品。
Feed 层排除已验证;页面层暴露原样。拒登以商家报告的精确形状复现。
路线 A —— 把格式拆成独立产品(结构性修复)
纸质、电子、有声各做一个独立 Shopify 产品。只把纸质产品发布到 Google 展示面;数字产品留在店铺里,从纸质页用文字链接过去(「同时提供电子版 / 有声版」)。被提交的纸质 URL 只提供实体格式——这正是能通过审核的形态。
商家的反对是真实的:这会让目录膨胀 3-4 倍(他的原话)。缓解手段存在但不消除成本——批量编辑器、metafield 驱动的交叉链接;要程序化控制可用 Admin GraphQL API(publicationCreate 把产品发布到渠道;渠道可见性是产品级的,标签/metafield 本身不控制同步)。
路线 B —— 代理页面:每个标题一个「仅实体」报价页(主题修复)
保留变体结构。创建一个替代页面模板,只渲染指定产品的实体变体,把这些代理 URL 提交给 Google。
Shopify 主题架构支持替代模板:模板指派给页面,Liquid 模板让你完全控制标记。在模板里用 all_products['your-handle'] 取产品,用 requires_shipping 过滤变体——实体商品为 true,数字商品为 false:
{%- comment -%} templates/page.print-proxy.liquid {%- endcomment -%}
{%- assign book = all_products['dune'] -%}
<h1>{{ book.title }} — 纸质版</h1>
<form method="post" action="/cart/add">
<label for="fmt">格式</label>
<select id="fmt" name="id">
{%- for variant in book.variants -%}
{%- if variant.requires_shipping -%}
<option value="{{ variant.id }}">
{{ variant.title }} — {{ variant.price | money }}
</option>
{%- endif -%}
{%- endfor -%}
</select>
<button type="submit">加入购物车</button>
</form>这套做法买到的,逐条对应官方要求:
- 代理 URL 上唯一可购买的选项是实体(
requires_shipping滤掉了电子/有声)。页面上的 offer 与被提交的 offer 一致。 - 一个产品、一个干净 URL 作为
link提交——Google 要求每个产品或变体恰好一个链接。 - 数字版继续在 canonical 产品 URL 上正常销售,以文字链接(「同时提供电子版」)呈现——文字是文案,不是 offer。
两个有文档的约束必须尊重:
all_products每页最多解析 20 个唯一 handle。每个标题一个代理页没问题;想用一个页面代理整个目录不行——改用 collection 方案或按 handle 分页。- 代理页的 JSON-LD 必须诚实:只为页面上真实渲染的实体 offer 输出结构化数据。如果用
ProductGroup/hasVariant模式,不要把数字变体列为代理 URL 上的 offer。另外记住 Google 的变体 URL 约定:当你在别处提交变体 URL 时,用 URL 参数预选被提交的变体,让价格与库存状态和落地页一致。
代理路线在社区帖中被提出(Maxime_StoreCanary,建立在另一位贡献者的提醒之上);上面的机制是让它能跑起来的、有文档的 Liquid 部件。比路线 A 多写模板,但保住了目录。
路线 C —— GMC 属性规则 + excluded_destination(feed 卫生修复)
帖子里 feed 侧的答案(EmmanuelFlossie)无论选哪条结构路线都值得做。在 Merchant Center 里,「feed rules」已改名为属性规则(attribute rules)(Google 改的,属性规则文档页上写明了)。在你的数据源上加一条规则:当标题匹配数字标记时(如「title contains ebook」),设置 excluded_destination,从 Shopping ads、free listings、display 等全部排除。excluded_destination 属性的文档用途正是这个:阻止产品出现在指定展示面。
要理解路线 C 做什么、不做什么:
- 做:保证任何数字 SKU 永远不会被提交到 Google 展示面,即使同步应用出错、或新增数字产品忘了打标签。
- 不做:改变爬虫在混合格式产品 URL 上的所见。如果数字格式仍是被提交纸质 URL 上的可购买变体,落地页问题依旧。路线 C 是必要的卫生措施,不是解药。
同步侧:Google & YouTube 应用把 Shopify 的产品数据同步到 Merchant Center,可自动可手动——无论哪种同步,属性规则都作用于数据到达之后,这正是它能兜住渠道侧可见性设置漏网之鱼的原因。
检查清单
- 盘点损失面:哪些产品把实体+数字格式做成了同一产品的变体?(帖中的田野方法:审计选项值;该商家的审计结果是 480 个产品中 423 个。)
- 把每种数字格式对照 Google 不支持购物内容清单分类——电子书明文列出;有声书明文不在该条目里,但任何即时下载商品在核验前都按可疑对待。
- 修之前先确认失败模式:被提交的 URL 是否提供数字格式购买?是的话,仅过滤 feed 不可能清除拒登。
- 选结构路线:拆产品(A)或
requires_shipping过滤表单的代理页(B)。数字版的文字提及可以留;被提交 URL 上的可购买选择器不能留。 - 无论哪条路线,都加 GMC 属性规则,对数字标记设置
excluded_destination兜底。 - 审计被提交 URL 的 JSON-LD:只输出真实可购买且受支持的 offer;canonical 多格式页正确使用
ProductGroup/hasVariant,数字变体不进代理页标记。 - 每个产品/变体只提交一个
link;用变体 URL 时用 URL 参数预选被提交变体,让价格与库存和落地页一致。 - 修完后对受影响条目请求复审(帖子的收尾建议),并盯防二次拒登。
Agent 能接的那段活
选哪条路线是一次性的架构决策。持续的活在它周围:新书上架时重新审计目录(423/480 这个比例就是一个产品一个产品积出来的),盯 Merchant Center 的新拒登,核验每个被提交 URL 是否仍然只渲染受支持的 offer,带上证据去提复审。这是一个定期的监控循环——正是店铺运营 Agent 能接管的活:检查、对照政策、把异常连同证据一起交给人。我们做开箱即用的 Agent 来接这类循环,如果你的周末也耗在这种事上,可以看看。
上文已对照 Google 官方文档(Unsupported Shopping content 政策、落地页要求、link 与 excluded_destination 属性文档、属性规则、产品变体结构化数据)与 Shopify 官方文档(Liquid all_products 与 variant 对象、主题模板架构、Admin GraphQL publicationCreate,latest stable 2026-07)核验,核验时间 2026 年 8 月。社区帖内容(商家目录审计、「可购买变体」诊断、代理页建议、属性规则配方)为 Shopify 社区主题 658986 的田野报告,出现处均已标注。