跨境 ERP:多店铺订单与库存如何同步不打架
Webhook 推送、拉取补偿与库存扣减,三件事必须共享同一套真相。
跨境 ERP 最容易翻车的点,不是商品编辑页做得漂不漂亮,而是多店铺、多平台同时卖同一 SKU 时库存数字是否一致。商家在 Shopify 改了一处库存,Amazon 侧仍显示可售,仓管按 ERP 拣货却超卖——这类事故往往来自「每个渠道各写各的库」,缺少统一的同步入口与扣减规则。
同步入口要收敛
所有渠道 Webhook(订单创建、取消、退款、库存变更)进入统一同步队列,按 店铺 ID + 资源类型 分区消费。Worker 只认内部领域事件,不认平台原始 JSON scattered 在业务代码里。禁止为某个平台单独开「直接 UPDATE inventory 表」的旁路。
消息幂等
Webhook 会重复投递。用 平台 + 事件 ID 或 订单号 + 事件类型 做去重表,已处理过的直接 ACK。去重记录保留足够长窗口,覆盖平台重试周期。
顺序与延迟
同一订单的多条事件(创建 → 支付 → 取消)可能乱序到达。消费时带版本号或时间戳,旧事件不能覆盖新状态。无法判断时进入「待对齐」队列,由对账任务或人工确认。
库存扣减规则
以本地「可售库存」为权威,渠道库存为投影。下单占用、发货扣减、取消释放,都在本地事务或带版本号的乐观锁里完成;渠道侧只做数量推送与差异告警,不回写覆盖本地权威值。
扣减顺序
同一 SKU 多仓时,扣减策略(就近仓、优先级仓)在 ERP 内可配置且可审计。调拨在途、冻结库存要在商家界面可见,避免运营误以为「还有货」。
对账补洞
推送会丢、会延迟。定时任务拉取各平台最近变更的订单与库存快照,与本地流水比对。发现「平台已售本地未扣」或「本地已扣平台仍显示可售」,进入差异队列,支持规则自动修复与人工复核。
典型坑
- Webhook 与定时拉取双写无协调:共享同一套幂等键
- 把「渠道库存」当真相源做盘点:盘点以本地实物为准,再向渠道推送校正
- 大促队列堆积仍同步推送:优先保证本地扣减,渠道投影允许短暂延迟并监控滞后
运营可见性
商家需要看到:某 SKU 在各平台的可售数、在途占用、最近同步时间与最后错误原因。错误应可分类(鉴权失败、限流、映射缺失),方便一线客服解释,而不是统一「同步失败请稍后再试」。
组合 SKU 与捆绑销售
Bundle、变体、多渠道 SKU 映射是超卖高发区。ERP 内维护「渠道 SKU → 本地 SKU / 组件清单」映射表,扣减时展开到组件层。映射缺失时不应默认扣减成功,而应阻塞并告警,避免 silent wrong deduction。
上线前检查清单
- [ ] 单 SKU 多渠道扣减可逐笔追溯
- [ ] Webhook 重复投递不会重复扣减
- [ ] 定时对账能产出可行动的差异清单
- [ ] 渠道 API 限流有退避与告警
- [ ] Bundle 与变体映射缺失会阻断而非误扣
大促前建议做一次「影子对账」:不改动渠道,只比对本地投影与平台快照,提前发现映射错误与 Worker 积压。差异结果应能指派到具体店铺与 SKU,方便运营跟进而不是只看汇总数字。ERP 的价值是让商家少切后台;底线是库存数字经得起仓管盘点和平台抽检。实时流负责快,对账任务负责对——时间尺度不同,哲学相同。
小结
库存同步的权威应落在本地可售库存,渠道侧做投影与告警。事件乱序、捆绑商品映射与影子对账是长期痛点,需要在架构里预留位置。定期盘点差异比追求「实时绝对一致」的口号更务实。