库存状态与到货通知模块
库存状态与到货通知模块告诉顾客“这个配置现在能不能买、能不能送到我这里、什么时候可能有货”,并在买不到时提供一个不夸大承诺的下一步。它不是商品页角落里的一行“Sold out”,而是把库存事实、配送与取货条件、预售规则和通知订阅统一成一套可验证的状态。
库存状态与到货通知 = 变体库存事实 × 状态词表 × 地点与配送条件 × 通知订阅
先确定模块在完成什么任务
- 顾客问题:有没有货?能不能预订?我所在地区送得到吗?能不能去门店取?没货了能不能等通知?
- 对象层级:状态属于变体,不属于商品。商品页显示的“有货”必须对应当前选中的变体;商品级“至少一个变体可售”只能用在列表或卡片的粗粒度提示。
- 进入前已知:当前变体、买家地区与市场、取货地点(如有)、库存是否被追踪。
购买按钮的可用与禁用由购买区执行;加购后因库存被拒的处理见购物车摘要;配送范围与时效的正文见配送信息。本模块只负责“状态如何表达与如何订阅通知”。
状态词表与判据
| 状态词 | 判据(必须可追溯到平台字段或业务规则) | 文案要求 |
|---|---|---|
| 有货 | 当前变体可售,且按追踪规则库存充足 | 不写具体数量,除非该数量是真实的可售数量 |
| 低库存 | 库存被追踪,且可售数量低于商家书面定义的阈值 | 阈值、口径与负责人有记录;用真实数量或“仅剩少量”,不虚构 |
| 售罄 | 当前变体不可售 | 说明是该配置售罄,并提供替代与通知入口 |
| 缺货预订 | 库存为零或负但仍允许购买 | 只写“缺货预订”,发货时间只在有真实到货计划时给出 |
| 预售 | 通过销售计划或预购应用出售的未上市商品 | 写明预计发货时间、收款方式与取消规则 |
| 不可配送 | 买家所在地区不在配送范围,或平台判断该商品在此地点不可用 | 写明是哪个地区;不与售罄混用 |
| 不可取货 | 所选地点未开通取货,或该地点库存不满足 | 写明是哪个地点,并给出其他地点或配送作为替代 |
| 已停售 | 商品下架或不再销售 | 不显示购买与通知入口 |
不得伪造稀缺。 “仅剩 3 件”“别人正在看”这类稀缺与热度提示是高风险模式。本模块的规则是:数字必须来自当前库存数据并在读取时刻为真,阈值来自事先书面确定的真实库存规则,不得随机生成、循环展示或在数量恢复后仍保留。FTC 2022 年 9 月的员工报告《Bringing Dark Patterns to Light》把“库存实际充足却声称库存很少”列为 False Low Stock Message,并列出无根据的倒计时与虚假热度;该报告是监管机构员工的分类与示例,不是法律条文,各市场的具体适用与责任需要法务或合规确认。倒计时的同类真实性红线见 Countdown Timer。
信息来源与输入
| 输入 | 来源 | 最低要求 |
|---|---|---|
| 可售性 | 平台状态(变体可售标志) | 每次更新变体后重新读取,不缓存 |
| 库存数量 | 平台库存数据 | 仅在追踪库存且允许展示时使用,注明口径 |
| 阈值规则 | 业务规则(库存负责人维护) | 有数值、口径、生效日期与负责人 |
| 缺货可购买标志 | 平台状态 | 与预订文案同源 |
| 到货计划 | 资源数据或业务记录 | 无真实计划时不写日期 |
| 配送范围、取货地点 | 平台状态 + 配送信息内容 | 与结账一致 |
| 订阅信息(邮箱、变体、市场) | 交易动作 | 见到货通知一节 |
库存追踪、地点与取货的语义
- 追踪关闭:官方 Liquid 文档写明,不追踪库存时
variant.inventory_management为nil,且inventory_quantity返回的是已售数量而不是库存。页面在这种变体上不得显示“剩余 N 件”或低库存。first_available_variant的条件也包含“不跟踪库存”,即这类变体按可购买对待。 - 继续销售缺货商品:帮助中心写明该设置允许在库存为零或以下时继续购买,并支持预购等场景;仅在追踪库存时才生效,且不适用于 Shopify POS。开启后“缺货”与“可购买”并存,页面必须用“缺货预订”而不是“有货”。
- 多地点:帮助中心写明,处理线上订单的地点库存为零时,商品在线上显示为缺货,即使其他地点有库存。所以“有库存”必须限定到哪个地点、哪条履约路径,不要把各地点数量相加。详见库存与地点。
- 本地取货:帮助中心写明取货按地点开通,默认只有整张订单在取货地点都有库存才可取货,商家可开启门店调拨;支持的主题在商品页显示取货可用性与预计时间。开发文档写明可用性同时取决于变体与地点。能力模块的归属见店面能力模块。
状态与退化
| 状态 | 处理方式 |
|---|---|
| 零项(商品无可售变体) | 商品级显示“暂时无货”,不显示购买按钮,保留通知入口 |
| 一项(仅默认变体) | 直接显示该变体状态,不出现选项 |
| 多项 | 每个选项值可标出不可用;切换变体后状态与价格同步更新 |
| 加载 | 状态区显示加载中,不沿用上一变体的状态 |
| 错误 | 无法读取库存时不写“有货”,写“暂时无法确认”,由结账把关 |
| 过期 | 停留后加购被拒时,说明库存已变化,不沿用旧状态 |
| 跨市场 | 不可配送、取货与预售信息按买家市场与地点重新读取 |
| 无 JavaScript | 页面服务端渲染当前状态;通知订阅走普通表单提交 |
到货通知
到货通知让顾客在某个变体不可购买时留下联系方式,等有货时收到提醒。
Shopify 侧的核验结果(2026-09-29):官方帮助中心的 Shopify Flow 页面写有“Product variant back in stock”触发器,当变体库存从零或负变为一或以上时触发,来源不限于订单、手动调整或应用,且商品需开启库存追踪;它是商家侧自动化触发器,不是面向顾客的订阅表单。旧的到货通知表单帮助页在核验时已 301 跳转,未能读取;Shopify 员工在开发者社区帖子(2026-06-12)中确认 Horizon 主题没有到货提醒功能。因此在已读官方页面范围内,未找到面向顾客的官方到货通知订阅功能;是否另有其他官方入口未核验。实现订阅与发送需要另行选型,本文不点名推荐。
订阅字段与状态:
| 项 | 要求 |
|---|---|
| 字段 | 邮箱(必填)、订阅的变体与市场;其他字段有明确用途才收集 |
| 提交成功 | 说明订阅了哪个变体,通知何时发送,不承诺库存预留 |
| 重复提交 | 显示“已订阅”,不新建第二条 |
| 邮箱无效或失败 | 保留输入,说明原因与重试方式 |
| 变体已恢复有货 | 立即显示购买入口而不是继续收集邮箱 |
| 取消 | 通知中提供取消方式;订阅在发送后或过期后结束 |
| 通知内容 | 发送时重新确认是否仍有货;说明数量有限时不保证抢到 |
同意与隐私:到货通知的用途限于告知该变体有货,不得默认勾选并加入营销订阅;需要营销联系时另设可选项并写明发送主体、频率与退订方式,做法见邮件订阅邀请。订阅数据只用于声明的目的,保存期限、退订与删除按目标市场核对;是否属于营销通信及需要怎样的同意,需要法务或隐私负责人确认。
可选展现与交互
- 状态文字:紧邻价格与按钮的一行文字,配以图标但不只靠颜色,由购买区呈现;商品卡上的“售罄”等标签可用 Badge,其口径必须与本模块词表一致。
- 订阅表单:变体售罄时在购买区内展开内联表单;只需一个邮箱时不必弹出Modal。
- 提交确认:成功用Toast,但错误与“已订阅”留在原位。
- 取货地点详情:地点列表放在可展开区,可用性摘要本身要直接可见;不要只藏进Popover。
页面组合中的位置
主要出现在商品页购买区、商品卡与集合页的粗粒度状态、购物车中的库存变化提示。不应出现在首页大幅横幅或与商品无关的营销弹窗里,也不要与倒计时叠加成“快没了且快结束”的组合压迫。
无障碍与性能
- 状态不能只靠颜色区分(WCAG 2.2 的 1.4.1 Use of Color,A)。
- 变体切换引起状态变化时,用状态消息通知(4.1.3 Status Messages,AA;MDN 写明
role="status"隐含礼貌型 live region,更新时不要把焦点移入)。 - 订阅表单有可见标签或说明(3.3.2 Labels or Instructions,A)。
- 库存读取只在需要时请求,取消过期请求,不在页面里长期缓存状态。
映射到 Shopify
核验于 2026-09-29,只写官方页面所写。
| 机制 | 官方页面所写 |
|---|---|
| 变体状态 | Liquid variant.available、inventory_management、inventory_policy、incoming、next_incoming_date、store_availabilities |
| Storefront API | availableForSale、currentlyNotInStock(缺货但仍可购买,用于缺货预订)、quantityAvailable(在线销售渠道的可售总量,访问要求未核验)、storeAvailability |
| 购物车警告 | MERCHANDISE_NOT_ENOUGH_STOCK、MERCHANDISE_OUT_OF_STOCK、PRODUCT_UNAVAILABLE_IN_BUYER_LOCATION |
| 预售 | 帮助中心写明预购需安装预购应用,且仅适用于 Shopify Payments 或 PayPal Express;开发文档写明预购通过销售计划暴露给主题,主题需提供计划选择器并在购物车与订单显示 |
| 隐藏缺货商品 | 帮助中心写明这不是内置设置,可通过集合条件(库存大于 0,须匹配全部条件)、应用或 Shopify Flow 实现,前提是开启库存追踪 |
| 低库存提醒 | 帮助中心的库存页面提到商家可通过第三方应用或 Shopify Flow 获得低库存通知(商家侧);顾客侧“仅剩 N 件”的官方主题机制未核验 |
主题层面的库存与取货表现未核验,需在目标主题的固定版本正文中确认;Horizon 购买流程只说明按钮初始状态由可售状态与数量规则生成,未展开库存状态的表达。地点与履约的配置排查见履约与配送。
验证一次库存状态与通知
- 在测试店铺把一个变体的库存依次设为高于阈值、低于阈值、零,检查商品页、商品卡与购物车的状态词与词表一致。
- 关闭库存追踪,确认页面不显示数量与低库存;再开启并开启“继续销售缺货商品”,确认显示“缺货预订”而非“有货”。
- 设置两个地点,只让非线上履约地点有货,确认线上仍显示缺货。
- 更换买家地区,确认不可配送提示与结账一致;对取货地点分别设置有货与无货,检查取货提示。
- 订阅到货通知,重复提交、输入无效邮箱、订阅后补货,检查每种反馈与通知内容;确认没有默认加入营销订阅。
- 用键盘与读屏软件切换变体,检查状态变化是否被朗读。
记录时间、变体、地点、库存设置与看到的状态,避免不同时间的截图互相比对。
固定版本主题实现
- Dawn 购买区与可售状态、Horizon 吸底加购与可售状态:两个主题的可售状态、低库存与取货实现。Dawn 与 Horizon 在全仓库搜索中均未找到到货通知或补货订阅。
固定基线为 Dawn v15.3.0 与 Horizon 4.2.0;结论限于这两个提交,均为静态源码分析,未运行验证。
待继续完善
- 核验 Shopify 是否提供面向顾客的官方到货通知订阅,并在测试店铺验证。
- 其他主题与版本的库存状态、低库存与取货表现需要逐项核对;固定版本实现见「固定版本主题实现」。
- 缺少预售与缺货预订的完整样例与收款说明。
- 稀缺提示与营销通知的法规要求需要法务确认。