1. 项目背景:广告与库存之间的信息断层
在跨境电商的日常运营中,广告投放决策严重依赖实时库存数据——一个 SKU 如果可售库存只剩 30 件,而广告预算每天还在烧 200 美金,那就是典型的"断货式投放":广告费花了,转化率直线下降,库存直接卖光,listing 权重反而因为断货期而遭受重创。
然而现实是,广告数据和库存数据分属两座完全不同的"表山"。运营同事每天上午要花 30–60 分钟做一件事:登录亚马逊广告后台查看各 SKU 的花费,然后切换到飞书库存多维表手动比对在库数量,最后在脑子里做判断——这个 SKU 还能加预算吗?那个 SKU 是不是该暂停广告了?
| 运营维度 | 人工手动核对 | 本案交付:自动化联动看板 |
|---|---|---|
| 查看周期 | 每天上午人工核对,单次耗时 30–60 分钟 | 每日自动推送,即时可读 |
| 库存匹配 | 手动翻表,容易看错 VLOOKUP 行 | 按 SKU 自动匹配,优先 FBA,零库存自动切万邑通 |
| 聚合能力 | 无,逐 SKU 手动统计 | 支持前缀聚合(如同一父体多变体合并展示) |
| 决策精准度 | 极易遗漏关键项,断货预警靠感觉 | 广告花费降序排列,库存不足项高亮预警 |
2. 核心方案:多表联动 + 智能库存优选
这个系统只有一个核心脚本(report_ads_daily.py),但它做的事情远比名字表现出来的复杂。
2.1 数据源:两表协同
脚本同时连接飞书多维表中的两张互为独立的工作表:
- 运营数据日报: 包含每个 SKU 当天的广告花费、曝光量、点击率、转化率、RoAS 等核心广告指标。
- 库存追踪表: 包含每个 SKU 在当前各渠道(FBA、万邑通、WFS、FBT)的在库数量和预计入仓时间。
脚本以 SKU 为唯一关联键,从运营数据日报的主记录中定位 SKU,然后在库存追踪表中自动查找该 SKU 的实时库存信息。
2.2 库存优选逻辑:FBA 优先,自动降级
库存渠道不是随便选的。代码内置了一套渠道优先级链:
- 优先读取 FBA 在库数量——这是面向消费者的即时可售库存,直接决定能否承接广告流量。
- 如果 FBA 在库为 0,自动切换到万邑通在库数量(代表在途或备货状态,可作为投放决策参考)。
- 如果两个渠道都为 0,该 SKU 自动标记为🟥危险状态,推送卡片中该行整行高亮红色。
2.3 前缀聚合 + 降序排列
运营管理中存在一个常见场景:同一个父体下的多个变体(颜色、尺寸不同)需要整体查看。脚本支持SKU 前缀聚合——如果若干 SKU 共享同一前缀(代表同一父体),则在卡片中合并展示该父体的总广告花费和总库存,并标注拥有库存的变体数量。
最终推送的飞书卡片按照广告花费降序排列:花得最多的 SKU 排在最前面,运营一眼就能看到"那个花了最多预算的品,还有多少库存"。如果库存不足 7 天销量,卡片中自动标注 ⚠ 库存预警。
该系统上线后,运营团队从手动作业中解放出来,广告花费结构也得到显著优化:
3. 工程实现的巧思
这个脚本看似简单,但在三个细节上体现了工程级的设计考量:
- 双表解耦设计: 运营数据日报表和库存追踪表是独立的。脚本在运行时先完整拉取两张表的数据,然后在内存中进行 JOIN 关联。任何一张表的结构发生变化(比如新增一列),都不会影响另一张表的读取逻辑,降低了日常维护成本。
- FBA → 万邑通 → 0 的自动降级: 库存优选逻辑写成了一个纯函数,输入是"各渠道库存字典",输出是"最佳展示库存"。如果后续需要增加新的渠道(如第三方海外仓),只需在函数中新增一个优先级键即可,完全无须改动核心逻辑。
- 飞书富文本卡片的动态着色: 当某个 SKU 的库存低于 7 天销量预估时,卡片中该行的库存数字自动变为橙色;当库存为 0 时变为红色。纯前端渲染细节,但让运营看一眼就能判断紧急程度。
4. 业务侧的真实反馈
系统上线的第一周,运营团队反馈了一个意外惊喜:他们发现某个持续投入高广告预算的 SKU,FBA 库存早已在三天前清零,但万邑通的补货还需 5 天才能到仓——也就是说,这三天烧掉的 $850 广告费几乎全部浪费在了不可售的 listing 上。即刻暂停该 SKU 广告后,运营总监感叹:"过去半年我每天都在被这种信息差放血,今天才知道。"
5. 数字化转型背书
—— 某跨境品牌 运营团队负责人