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 日停用。工程团队开始修改代码时,通常会遇到三项接口变更:
- 原有的
products.insert写入接口改为productInputs,且必须在请求中传入dataSource参数。 - 用于查询拒登原因的独立
productstatuses接口已移除,合并至只读的products资源内。 - 若传错
dataSource参数,会触发商品数据源抢占(Offer Stealing),导致 GMC 后台已配置的 Feed 属性转换规则失效。
本文整合 Google 官方《Start your migration》及 Products、Data sources 和 Reports 兼容性文档,整理出可按步骤执行的工程迁移清单。
系列文章导航
- 系列一:《Google Merchant API 架构指南:替代 Content API for Shopping、2026 年停用时间表与模块化升级方案》
- 系列二(本文):《Google Merchant API 迁移实战手册(Start Your Migration):子 API 排期顺序、ProductInput 读写分离与防“Offer Stealing”指南》
- 系列三:《Google Merchant API 认证与 GCP 项目架构指南:取消 GMC 后台直接发证、registerGcp 开发者注册与零停机切换》
- 系列四:《Google Merchant API 高并发代码重构实战:移除 custombatch、优化 gRPC 100 并发流上限与动态配额管理》
第一章:官方四步迁移路线与子 API 排期顺序
Merchant API 与 Content API v2.1 支持在同一个 GMC 生产账号下双轨并行(Hybrid Coexistence),因此无需停机一次性切换全部代码。团队可以保留存量旧接口运行,每次只上线验证一个子模块。
各子模块之间存在严格的上下游依赖关系,Google 官方推荐按以下顺序排期:
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 读写分离
products 资源同时承担原始数据写入与处理后结果查询两项职责。通过 products.insert 写入的数据若连续 30 天未刷新就会过期新版 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 步:只读盘点存量数据源
调用
GET https://merchantapi.googleapis.com/datasources/v1/accounts/{ACCOUNT_ID}/dataSources,列出账号下全部 Primary 与 Supplemental 数据源。旧版 Content API 创建的默认 API Feed,在新版dataSources.list中已自动转为标准 API Primary DataSource,无需重复新建。 - 第 2 步:在本地 ERP 或 PIM 数据库回填
dataSource字段 调用products.list遍历存量商品,读取每件商品返回的dataSource属性,将offerId与原属dataSource资源名的映射关系写入本地商品表。后续日常更新时,严格按原属dataSource执行productInputs:patch。 - 第 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.impressions | offer_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 查询代码对照
| 1 | -- ❌ 旧版 Content API v2.1 MCQL(已废弃) |
| 2 | SELECT |
| 3 | segments.date, |
| 4 | segments.offer_id, |
| 5 | segments.program, |
| 6 | metrics.impressions, |
| 7 | metrics.clicks |
| 8 | FROM MerchantPerformanceView |
| 9 | WHERE segments.date DURING LAST_30_DAYS |
| 10 | AND segments.program = 'SHOPPING_ADS' |
| 11 | |
| 12 | -- ✅ 新版 Merchant API reports/v1 MCQL(直接可用) |
| 13 | SELECT |
| 14 | date, |
| 15 | offer_id, |
| 16 | marketing_method, |
| 17 | impressions, |
| 18 | clicks, |
| 19 | click_potential, |
| 20 | click_potential_rank |
| 21 | FROM product_performance_view |
| 22 | WHERE date DURING LAST_30_DAYS |
| 23 | AND marketing_method = 'ADS' |
| 24 | ORDER BY clicks DESC |
| 25 | LIMIT 1000 |
下一步认证配置提示:GMC 已关闭后台直接生成 API 密钥的旧入口。若未提前注册 GCP 项目就发起调用,接口会直接返回 401 UNAUTHENTICATED: GCP project is not registered 或 409 DUPLICATE_PROJECT_REGISTRATION 报错。请继续阅读系列第三篇:《Google Merchant API 认证与 GCP 项目架构指南:取消 GMC 后台直接发证、registerGcp 开发者注册与零停机切换》。
觉得本文有启发?一键复制标准引用摘要
自带原文归因链接与核心摘要,可直接粘贴至团队飞书/Slack 知识库、技术周报或大模型上下文。