WooCommerce 优惠券与促销
发得出去,也要算得清、收得回
优惠券是 WooCommerce 后台最容易上手、也最容易算错账的功能。折扣加在商品层还是购物车层、和税费谁先谁后、百分百折扣的订单支付网关收不收,这些细节决定了活动是带来订单还是带来售后工单。这篇按建券、限流、踩坑、复盘四段讲,每个环节给后台路径与处理动作。
四种折扣类型,算法完全不同
选错类型,对账就对不上
建券页面第一项是「折扣类型」,下拉里四个选项看起来差不多,落到订单金额上是四套算法。先把这四种算清楚,后面的限制条件才有意义。
百分比折扣
按符合条件商品的合计金额乘百分比,填 10 就是减一成。只作用于商品小计,不动运费。多件商品时按行小计比例分摊,退款也按分摊后的金额退,不会退成原价。
固定购物车折扣
从购物车总额里直接减一个固定数。当购物车金额低于券面值时,WooCommerce 把应付压到 0,不会出现负数。这类券最容易和运费叠加出问题,因为减免顺序在运费之前。
固定商品折扣
按件减。买 3 件符合条件的商品就减 3 次,填 50 意味着每件减 50。单价低于券面值时按单价封顶,那一行变 0 而不是负数。适合「第二件半价」这类按件设计的活动。
免费配送
只免运费,不减商品金额。前提是配送区域里已经配好可用方式,否则购物车本身算不出运费,这张券勾了也没效果。跨境站要注意它只免当前选中的那一种配送方式。
限制条件是一组「与门」
勾得越多,能用的人越少
后台一张券有三个折叠面板:通用、用量限制、用量限制/使用限制。很多「券用不了」的报障,最后都落在某个被顺手勾上的选项上。
金额门槛
- 最低消费按商品小计算,不含运费
- 门槛判断在折扣前,用原价不用促销价
- 开启「价格含税」后按含税小计判断
- 最高消费用于防止大单被过度减免
叠加与互斥
- 勾「单独使用」后不能与其他券同单
- 不勾则可叠加,顺序按用户输入先后
- 两张百分比券叠加是连续打折,不是相加
- 叠加场景客诉高,建议只留一张
商品与分类范围
- 勾父分类不会自动包含子分类商品
- 可变商品要勾父商品,变体不单独出现
- 「排除促销商品」会跳过硬打折中的 SKU
- 排除项优先级高于包含项
用量上限
- 全站上限统计已完成订单
- 单用户上限对访客按邮箱判断
- 订单取消或退款后用量不回滚
- 失败订单是否计数看订单状态设置
邮箱白名单
- 一行一个邮箱,大小写不敏感
- 适合售后补偿,不适合公开投放
- 客户换邮箱结算立刻失效
- 与账号绑定无关,只校验结算地址
有效期
- 到期时间按站点时区计算
- 服务器与站点时区不一致会差 8 小时
- 跨境活动要换算当地日期
- 过期券不自动隐藏,提示语需自定义
三个真会赔钱的坑
都发生在结算最后一步
下面三条是我们在代运维的商城里反复见到的,共同点是后台看不出异常,只有真实下单才会暴露。
百分百折扣,网关直接拒单
券把总额减到 0 后,PayPal 标准版不接受零金额交易,Stripe 也有各币种最低收款额,前台表现是点了下单没反应,日志里一条下单失败。处理办法是给这类券单独挂线下支付方式(见 支付接口接入),订单落成「待付款」,人工核对后标记完成;或者改成「免运费 + 低价赠品」,让订单保留最小金额。
折扣与税额的顺序算反
「设置 → 常规」里的「价格含税」决定折扣作用在含税价还是未税价上。未税模式先减净额再加税,含税模式先减含税额再倒算税。同一张 10% 的券,两种模式最终收款差一个税点的金额,跨境站还要牵扯各国税率表,务必在测试环境用真实订单核对。
页面缓存冻住购物车价格
缓存插件(见 缓存加速插件)如果把 /cart/ 和 /checkout/ 一起做了整页缓存,A 客户看到的折扣价可能是 B 客户算出来的结果,表现为加购后价格乱跳。要在缓存规则里把购物车、结算、我的账户三条路径排除,并确认购物车哈希在每次加购后都更新,别把 nonce 也缓存住。
批量发券与自动应用
一百张手动建,一万张走接口
线下展会、包装卡、邮件营销常需要成批的一次性码。后台一条条建只适合几十张的量级,再多就得换办法。
先定编码规则
前缀加年份加随机位,如 XK26-8F3K,别用连续编号,防止被猜到后批量刷。每张码的单用户上限设为 1。
走 REST 接口写入
用 /wp-json/wc/v3/coupons 逐条创建,认证走 consumer key 与 secret,必须 HTTPS。单条请求约写入十几行 postmeta,一万条以上要分批,每批 200 条并留间隔,否则容易打满数据库连接。
自动应用要谨慎
URL 带 ?coupon_code=xxx 的自动应用在较新版本默认关闭,需要额外挂钩子放行。开放前想清楚:任何拿到链接的人都能用,等同于公开券。
回收与作废
活动结束后把未使用的码批量改到期时间为昨天,而不是直接删除。删掉的券在历史订单里会显示成空折扣,对账时说不清。
接口写入前请先备份数据库。批量建券属于写操作,一旦编码规则写错,清理成本远高于重建,建议先在测试站跑一遍再上生产。商品结构如果还没稳定,先看 WooCommerce 可变商品与属性,把 SKU 理顺再发券,能省掉大量「券不生效」的排查。
四种类型对照
按活动目标选,不按习惯选
| 类型 | 计算方式 | 适合场景 | 需要注意 |
|---|---|---|---|
| 百分比折扣 | 商品小计 × 折扣率 | 全场促销、节日折扣、老客回馈 | 不减免运费;多商品按行小计分摊 |
| 固定购物车折扣 | 购物车总额 − 固定金额 | 满减、首单立减、清库存 | 低客单时总额被压到 0,网关可能拒单 |
| 固定商品折扣 | 符合条件件数 × 单件减免 | 第二件优惠、按件批发、样品单 | 单价低于券面值时按单价封顶 |
| 免费配送 | 运费用 0 计 | 运费敏感的跨境市场、大件议价单 | 只免当前选中的配送方式 |
| 叠加组合 | 按输入顺序连续计算 | 大促期间的组合优惠 | 需关闭「单独使用」,客诉率明显上升 |
商城刚起步时建议只用百分比与满减两类,规则简单、客服解释成本低。等订单结构稳定了再上叠加与阶梯,配合 WordPress 数据统计与分析 看每一档的真实转化,而不是凭感觉加码。
优惠券常见问题
五个被问得最多的
默认可以。商品已经打折的情况下,券仍按折后价计算减免。如果不希望叠加,在券的限制里勾上「排除促销商品」,正在特价的 SKU 就不参与这张券。注意排除项对所有促销商品生效,没有例外清单。
先看这张券的「单用户上限」是否设成了 1,再查该邮箱在订单列表里的历史记录,包括已取消和失败的订单。部分版本在订单创建时就计数,取消后不回落。临时处理是把上限加 1 并备注,长期办法是改用账号维度的限制。
可以,用「邮箱限制」填客户结算时使用的邮箱。它只校验结算页填写的地址,与是否登录无关,客户换个邮箱就失效。要按账号控制,需挂 woocommerce_coupon_is_valid 过滤器判断当前用户角色或 ID。
订单总额为 0 时,多数在线支付网关会拒绝创建交易。解决办法是给这类券配一个线下支付方式,让订单以「待付款」状态生成,再由人工确认;或者保留最小金额,用「免运费 + 赠品」替代全额减免。改之前先在测试环境用真实网关跑一笔。
商品 feed 一般取的是商品售价或促销价,不含购物车券。所以券的折扣不会出现在购物广告的价格里,也不会触发价格一致性问题。反过来说,如果想让折扣出现在 feed 中,需要把价格直接改成促销价,而不是发券。
券发出去了,订单却没进来?
把活动规则发我们,先算一遍再上线
折扣类型、门槛设置、支付方式、缓存规则,这四项凑在一起才决定一张券能不能顺利结算。商城正在跑活动又不敢改配置的,可以先做一次只读排查,确认风险点再动手。