出海数字营销宝典 Logo
出海数字营销宝典evaoo.com
返回列表

Google Merchant API 迁移实战手册(Start Your Migration):子 API 排期顺序、ProductInput 读写分离与防“Offer Stealing”指南

2026-11-11Google Merchant Center 开发者文档组 · evaoo 跨境电商与商品流工程实验室编译

Google Merchant API 迁移实战手册(Start Your Migration):子 API 排期顺序、ProductInput 读写分离与防“Offer Stealing”指南Google Merchant API 迁移实战手册(Start Your Migration):子 API 排期顺序、ProductInput 读写分离与防“Offer Stealing”指南

导读

在系列第一篇架构指南中,我们说明了 Content API for Shopping 将于 2026 年 8 月 18 日停用。工程团队开始修改代码时,通常会遇到三项接口变更:

  1. 原有的 products.insert 写入接口改为 productInputs,且必须在请求中传入 dataSource 参数。
  2. 用于查询拒登原因的独立 productstatuses 接口已移除,合并至只读的 products 资源内。
  3. 若传错 dataSource 参数,会触发商品数据源抢占(Offer Stealing),导致 GMC 后台已配置的 Feed 属性转换规则失效。

本文整合 Google 官方《Start your migration》及 Products、Data sources 和 Reports 兼容性文档,整理出可按步骤执行的工程迁移清单。


系列文章导航

  1. 系列一:《Google Merchant API 架构指南:替代 Content API for Shopping、2026 年停用时间表与模块化升级方案》
  2. 系列二(本文):《Google Merchant API 迁移实战手册(Start Your Migration):子 API 排期顺序、ProductInput 读写分离与防“Offer Stealing”指南》
  3. 系列三:《Google Merchant API 认证与 GCP 项目架构指南:取消 GMC 后台直接发证、registerGcp 开发者注册与零停机切换》
  4. 系列四:《Google Merchant API 高并发代码重构实战:移除 custombatch、优化 gRPC 100 并发流上限与动态配额管理》

第一章:官方四步迁移路线与子 API 排期顺序

Merchant API 与 Content API v2.1 支持在同一个 GMC 生产账号下双轨并行(Hybrid Coexistence),因此无需停机一次性切换全部代码。团队可以保留存量旧接口运行,每次只上线验证一个子模块。

各子模块之间存在严格的上下游依赖关系,Google 官方推荐按以下顺序排期:

| 迁移阶段 | 目标子 API 模块 | 前置依赖说明 | 上线验收标准(Definition of Done) | | :--- | :--- | :--- | | 第 1 顺位(账号与认证) | Accounts(含 developerRegistration) | 未完成 GCP 项目的 registerGcp 开发者注册前,其余 Merchant API 子模块请求均会返回 401 UNAUTHENTICATED(详见系列三认证篇)。 | 成功调用 accounts.get 与 accounts.list,获取主账号及 MCA 子账号层级关系。 | | 第 2 顺位(数据源) | Data sources(原 datafeeds) | 新版商品写入接口 productInputs.insert 要求在 Query 参数中显式传入目标 dataSource 资源名,不再隐式自动创建默认 API Feed。 | 拉取全部存量数据源列表,将各站点的 accounts/{A}/dataSources/{D} 映射写入本地数据库。 | | 第 3 顺位(商品与库存) | Products + Inventories | 承接高频商品新增、局部调价(patch)、下架删除、区域库存同步及拒登巡检,须保持 offerId 与 Google Ads 历史竞价信号一致。 | 灰度 1% SKU 走 productInputs 写入,验证 3 分钟~5 分钟异步合并后 products.get 状态正常,且广告历史数据未丢失。 | | 第 4 顺位(报表与订阅) | Reports + Promotions + Notifications | 报表查询属于只读下游,迁移风险低
可同步接入 notifications Pub/Sub 订阅与 ucp_agentic_performance_view 代理商业报表。 | BI 每日定时任务跑通新版 snake_case MCQL 查询,停用旧版报表任务。 |

第二章:Products 模块重构:ProductInput 与 Product 读写分离

在旧版 Content API v2.1 中,products 资源同时承担原始数据写入与处理后结果查询两项职责。通过 products.insert 写入的数据若连续 30 天未刷新就会过期
叠加补充源(Supplemental Feed)后,研发团队也很难区分故障来自原始输入还是后台 Feed 规则。

新版 Merchant API 采用命令查询职责分离(CQRS)设计,将商品拆分为两个独立资源。

2.1 写入端:accounts.productInputs(持久化原始输入)

  • 接口职责:代表商家提交给指定数据源(Data Source)的原始商品数据。所有写入操作(insert、patch 和 delete)均针对 productInputs 执行。
  • 持久化与版本控制:通过 productInputs 提交的商品数据采用持久化存储(Persistent),同时支持传入单调递增的 versionNumber 防止分布式乱序覆盖。若传入版本号低于服务端已存版本号,服务端会拒绝旧消息。
  • 必填参数 ?dataSource=...:执行 insert、patch 或 delete 时,URL 查询字符串必须携带目标数据源完整路径,例如: POST https://merchantapi.googleapis.com/products/v1/accounts/123456/productInputs:insert?dataSource=accounts/123456/dataSources/987654
  • 字段结构变化:标题、描述、链接、价格(amountMicros)、GTIN 和库存状态等标准商品字段,统一放入 productAttributes: { ... } 对象内
    自定义属性则放在顶层 customAttributes 数组中。
  • 继承广告历史数据的条件:迁移时必须保持 offerId、contentLanguage 与 feedLabel 与旧版完全一致(区分大小写)。只要这组三元键不变,Shopping 与 PMax 系列积累的历史点击率和转化率即可延续,购物车毛利归因(CwCD)数据也不会中断。同时请用 Shopify GTM 与 Web Pixel 转化代码生成器核验前端像素,确保上报的商品 ID 与 Feed 一致。

2.2 读取端:accounts.products(只读合成视图与内嵌状态)

  • 接口职责:纯只读接口(Read-Only,仅提供 get 与 list)。productInputs 写入后,Google 后台会异步合并主数据源、补充数据源(Supplemental Data Sources)与后台属性转换规则,耗时数秒至数分钟,最终生成供消费者和广告系统调用的 Product 实体。
  • 原 productstatuses 接口的去向:旧版独立的 productstatuses 服务已移除,审批状态直接内嵌至 Product.productStatus 字段。现在调用一次 products.get 或 products.list(单页上限 pageSize=1000),即可同时读取合成后的商品属性与各渠道过审状态,并获取 itemLevelIssues 逐条拒登错误码(排查方法详见《Google Ads 产品状态诊断与跨系列重叠排查指南》)。
  • 历史纯线下 Feed 标记 legacyLocal:若旧版账号中仍有遗留的 local:en:US:SKU1 纯线下数据源商品,合成后的 Product 资源会带有 legacyLocal: true 标记,资源名中也会包含 legacy_local 前缀。官方建议将其逐步迁移至统一的线上商品加 LocalInventory 架构。

第三章:DataSources 迁移重点:防范“Offer Stealing(商品抢占)”

3.1 “Offer Stealing(商品数据源抢占)”的触发机制

在旧版 Content API 中,调用 products.insert 无需指定 Feed ID,Google 会自动将商品写入默认的 Content API 主数据源。许多卖家账号中会同时存在两个数据源:

  • 数据源 A:存量旧版默认 API 主数据源,运营已在后台为其配置了 20 条标题拼接与 Custom Label 分层规则。
  • 数据源 B:开发测试 Merchant API 时新建的另一个 Primary API Data Source。

切换到新版 productInputs.insert?dataSource=数据源 B 时,如果未核实该 SKU 原先归属数据源 A,直接往数据源 B 写入相同的 en~US~offerId,数据源 B 就会将该商品的归属权从数据源 A 抢走(Steal)。一旦发生抢占,数据源 A 上配置的自定义标签、促销映射与属性加工规则都会对该 SKU 失效,直接打乱广告系列分流。

3.2 防抢占三步排查流程与三种数据源选型

  1. 第 1 步:只读盘点存量数据源 调用 GET https://merchantapi.googleapis.com/datasources/v1/accounts/{ACCOUNT_ID}/dataSources,列出账号下全部 Primary 与 Supplemental 数据源。旧版 Content API 创建的默认 API Feed,在新版 dataSources.list 中已自动转为标准 API Primary DataSource,无需重复新建。
  2. 第 2 步:在本地 ERP 或 PIM 数据库回填 dataSource 字段 调用 products.list 遍历存量商品,读取每件商品返回的 dataSource 属性,将 offerId 与原属 dataSource 资源名的映射关系写入本地商品表。后续日常更新时,严格按原属 dataSource 执行 productInputs:patch。
  3. 第 3 步:新业务按规模选择 DataSource 结构
    • 单主数据源(Single Primary Data Source):适合单站点、全量商品共用同一语言和国家标签的独立站,维护成本低。
    • 多主数据源(Multiple Primary Data Sources):适合美、欧、英、日多站点独立运营的品牌,每个市场单独配置对应的 contentLanguage 与 feedLabel 主数据源。
    • 主数据源加 API 补充数据源(Primary + Supplemental API Data Source):适合使用 Shopify 官方应用同步商品的卖家。保持主数据源由 Shopify 应用托管不动,另建一个补充数据源(Supplemental Data Source),用自研 Merchant API 脚本按 offerId 挂载实时毛利标签(customLabel0~customLabel4)或促销标签,避免干扰 Shopify 原生同步。
    • 人工规则迁移提示:若确定废弃旧数据源并迁往新数据源,需注意 GMC 后台界面配置的 Attribute Rules(属性转换规则)不支持通过 API 自动复制。切流前请由运营在 GMC 后台手动为新数据源补齐规则。

第四章:Reports 报表与 MCQL 语法变更:去掉前缀并统一 snake_case

如果 BI 团队通过旧版 reports.search 抽取商品曝光、点击与价格基准数据,迁移到 POST https://merchantapi.googleapis.com/reports/v1/accounts/{ACCOUNT_ID}/reports:search 时,需修改以下三处 MCQL 语法:

语法变更项旧版 Content API v2.1 MCQL 写法新版 Merchant API v1 MCQL 写法差异说明
视图表名格式MerchantPerformanceView / PriceCompetitivenessProductView(大驼峰 PascalCase)product_performance_view / price_competitiveness_product_view(小写下划线 snake_case)
统一改为 SQL 下划线命名风格
原 MerchantPerformanceView 更名为 product_performance_view。
字段名前缀segments.offer_id、segments.date、metrics.clicks、metrics.impressionsoffer_id、date、clicks、impressions(直接写字段名,去掉 segments. 与 metrics. 前缀)
简化查询语句
返回的 JSON 行对象仍按视图结构体分组嵌套。
流量类型筛选字段WHERE segments.program = 'SHOPPING_ADS'WHERE marketing_method = 'ADS'(或 'ORGANIC')segments.program 替换为 marketing_method,便于区分付费广告与免费自然购物(Free Listings,可配合 Shopify 独立站 SEO 指南优化)。

新旧 MCQL 查询代码对照

PROMPT25 行
1-- ❌ 旧版 Content API v2.1 MCQL(已废弃)
2SELECT
3 segments.date,
4 segments.offer_id,
5 segments.program,
6 metrics.impressions,
7 metrics.clicks
8FROM MerchantPerformanceView
9WHERE segments.date DURING LAST_30_DAYS
10 AND segments.program = 'SHOPPING_ADS'
11
12-- ✅ 新版 Merchant API reports/v1 MCQL(直接可用)
13SELECT
14 date,
15 offer_id,
16 marketing_method,
17 impressions,
18 clicks,
19 click_potential,
20 click_potential_rank
21FROM product_performance_view
22WHERE date DURING LAST_30_DAYS
23 AND marketing_method = 'ADS'
24ORDER BY clicks DESC
25LIMIT 1000

下一步认证配置提示:GMC 已关闭后台直接生成 API 密钥的旧入口。若未提前注册 GCP 项目就发起调用,接口会直接返回 401 UNAUTHENTICATED: GCP project is not registered 或 409 DUPLICATE_PROJECT_REGISTRATION 报错。请继续阅读系列第三篇:《Google Merchant API 认证与 GCP 项目架构指南:取消 GMC 后台直接发证、registerGcp 开发者注册与零停机切换》。

Merchant APIGoogle Merchant Center商品FeedDataSourcesMCQLGoogle Shopping跨境电商技术架构

觉得本文有启发?一键复制标准引用摘要

自带原文归因链接与核心摘要,可直接粘贴至团队飞书/Slack 知识库、技术周报或大模型上下文。