去年黑五晚上十一点多,一个做家居收纳的卖家给我打电话,声音都是抖的。他 Shopify、Amazon、TikTok 三个店同时在卖,一款桌面收纳盒备了 800 件,结果两小时内超卖了 230 单。客服连夜打电话安抚,砍掉了一半订单,店铺评分直接掉了半颗星。第二天他就问我:三个渠道都说自己没问题,这锅到底该谁背?

先说结论:多渠道超卖,十次有九次不是某一家平台的问题,是中间那一层——库存同步链路——出了问题。而这条链路的排查,我习惯按五个环节一步步掐,掐到哪一段断了,责任就落在哪一段。

先别急着修技术:这到底是真超卖还是假超卖

第一步不是看日志,是先问一句:卖出去的这些订单,对应的"可售库存"到底怎么定义的?

我见过太多仓,把"物理库存"直接当"可售库存"推送给各渠道。货架上有 800 件,可售就是 800。但这 800 里,可能有 60 件是待检的,40 件已经分配给了明天要发的批发单,还有 50 件是客户退货刚到、还没质检。真能卖的其实只有 650,渠道端却按 800 在卖,多卖 150 单一点不冤。

所以排查的第一步:把四个数并排放一起看——物理库存、在途和待检数量、已分配未出库的预留量、平台端显示的可售数。四个数对不上,就别往下查了,先把"可售库存 = 物理库存 - 预留 - 待检 - 冻结"这个口径定死。口径不定,技术做得再漂亮也是在错误的基础上精确。

仓库员工手持扫描枪在货架间盘点

库存更新到底慢了几分钟

口径没问题,就查时间差。超卖的本质几乎都是时间差:渠道 A 卖掉了最后 10 件,渠道 B 的页面上这 10 件还显示"有货"。

要查三组时间戳。第一,WMS 这边库存变化发生的时间——出库单确认的时间;第二,WMS 把库存推送出去的时间;第三,各平台实际更新页面库存的时间。把这三组时间戳按订单排成时间线,延迟藏在哪一段一目了然。

常见的坑有这么几个。有的系统给各渠道推送库存的频率不一样——给一个渠道是实时推送,给另一个是每隔几分钟批量推一次(以下间隔数字均为举例示意,具体以各平台官网最新文档为准,比如每 5 分钟或每 15 分钟推一次)。大促那天偏偏批量推送的那个渠道卖爆了,延迟窗口里多卖出几十单太正常了。还有的用的是轮询而不是回调,平台来拉库存的间隔本身就带着延迟;轮询间隔再叠加上网络重试,一次推送晚到 10 分钟,足够把安全库存吃光。

我一般让客户做一件事:挑大促那天超卖的 20 个订单,把每个订单的下单时间、WMS 扣减时间、平台库存更新时间拉出来画一条时间线。十次有八次,超卖订单都落在"延迟窗口"里——延迟多长,超卖就发生在延迟的那几分钟里。

同一秒下单,到底谁抢到了库存

还有一种更隐蔽的:三个渠道在同一秒、甚至同一毫秒各自下了一单,WMS 这边收到了三条扣减请求。库存还剩 2 件,三单都说"我先来的",最后三单都成交了。

这是典型的并发竞态。查的方法是看 WMS 库存扣减接口的日志:同一 SKU 在同一秒内是不是出现了多次扣减成功,而扣减时的"当前库存"读到的都是同一个旧值。如果是,说明扣减逻辑没有做原子操作——读库存和写库存之间没有锁,三个请求读到的都是"还剩 2 件",于是都放行了。

解法不复杂,但得在技术方案里明确写出来:库存扣减必须是一个原子操作,要么数据库行锁,要么用消息队列串行化。小仓量不大的时候这个问题不明显,单量一上来,大促一来,必爆。我 2024 年在安大略(Ontario)一家 5 万平方英尺的 3PL 仓就见过这出:平时一天 3000 单风平浪静,黑五当晚单量冲到 2 万单,并发扣减直接把一款爆款卖超了 400 件。

退货回来了,库存没回来

最后一个环节最容易被忽略:退货。客户退了 100 件,货回到了仓库,质检没问题上了架,但可售库存没加回去——或者加回去了,但加回去的时间比退货入库晚了两天。

这会造成两种伤害。一种是"隐性缺货":明明有货,渠道显示没货,白白丢单;另一种更要命:退货在系统里走了两次回库流程,可售被重复加了两次,凭空多出 100 件可售,渠道按虚高的数接着卖。

查的方法:抽 20 笔退货单,对比"退货质检完成时间"和"可售库存增加时间"。时间差超过你们自己定的标准(比如 4 小时),这一环就是漏的。很多仓的退货流程和正向出库是两套人马、两套系统,退货入库了,库存同步的推送压根没触发。

落点:先定口径,再谈技术

五个环节查完,超卖的原因基本就定位了。但我想强调的是顺序:先把"可售库存"的统一口径定下来,写进文档,让运营、技术、三个渠道的人都认;再去谈推送频率、回调还是轮询、要不要做渠道间的安全库存隔离这些技术方案。口径是 1,技术是后面的 0。

最后附一个我每次给客户做检查用的清单,照着打勾就行:

  • 可售库存口径文档化:物理库存 - 预留 - 待检 - 冻结,四个数每天对账
  • 每个渠道的库存推送方式(实时回调还是定时轮询)和间隔时间列成表,大促前复核一遍
  • WMS 库存扣减接口确认是原子操作,并发压测跑一遍
  • 各渠道是否做了安全库存隔离:比如总可售 1000 件,给每个渠道只放 900,留 100 做缓冲池
  • 退货回库触发可售增加的链路打通,抽查时间差
  • 大促前做一次全链路演练:模拟超卖场景,看告警能不能在 5 分钟内响起来

超卖这锅,查清楚了其实谁都不用背——它是系统设计里一个个小延迟、小口径差异攒出来的。把链路掐明白了,下次大促晚上十一点,你就不用接那种声音发抖的电话了。