电商场景下,多种优惠叠加时的商品平摊和退款规则

9 评论 6252 浏览 84 收藏 11 分钟

每到大促时,各种优惠叠加算到我们头疼。那么对于产品经理而言,电商场景下存在一个订单中使用了多种优惠的场景,会涉及到退款和优惠平摊的规则,这时候该怎么设计才合适?作者结合具体案例,谈谈其中的逻辑。

在电商下单时,存在一个订单中使用了多种优惠的场景,当多种优惠叠加时,涉及到商品的优惠平摊计算规则以及退款场景下的退款金额计算逻辑,本文用具体案例与大家分享多种优惠叠加时的详细计算逻辑。

一、前提

  • 价格为1分钱的商品不参与抵扣
  • 系统保留2位小数,向上取整
  • “部分退款” 时优惠券不退;“全部退款” 时优惠券可退

二、退款分摊规则

1. 优惠券 + 用户金额合并支付

A:全额退款:

订单销售价8.99 = 商品A销售价5.01 + 商品B销售价3.42 + 商品C销售价2.13 – 优惠券抵扣金额1.57

此时,用户发起全额退款,则:用户实际获得:商品原价(5.01+3.42+2.13)* 100% = 10.56元( 实付8.99元+优惠券1.57元)

B、部分退款(抵扣金额平摊法):

订单销售价8.99 = 商品A销售价5.01 + 商品B销售价3.42 + 商品C销售价2.13 – 优惠券抵扣金额1.57

备注:在优惠平摊时,需要按照商品价格进行正序排列,使得商品价格高的排到最后,避免发生最后一个商品的价格不足抵扣的情况

此时,将优惠券抵扣金额平摊到各商品上,各商品的实付价格为:

  • 商品A实付价格= 5.01 – (1.57 * (5.01/(5.01+3.42+2.13)))= 5.01 – (1.57 * 0.47) = 5.01 – 0.73 = 4.28
  • 商品B实付价格= 3.42 – (1.57 * (3.42/(5.01+3.42+2.13)))= 3.42 – (1.57 * 0.32) = 3.42 – 0.50 = 2.92
  • 商品C实付价格= 2.13 – (1.57 * (2.13/(5.01+3.42+2.13)))= 2.13 – (1.57 * 0.20) = 2.13 – 0.31 = 1.82(特别注意:这是错误计算方法)
  • 商品C实付价格= 2.13 – (1.57 – 0.73 – 0.50) = 2.13 – 0.34 = 1.79(特别注意:由于精度问题,最后一个商品要用该商品的价格减去各商品优惠的价格)

商品实付金额计算公式:

①非最后一个商品的销售价 = 该商品销售价 – (优惠券抵扣金额 * (该商品销售价/各商品销售总价的比例))

②最后一个商品销售价 = 该商品销售价 – (优惠券总金额 – 第一个商品的优惠券承担金额 – 第二个商品的优惠券承担金额)

当对商品进行退款时,会涉及到退款比例,以退款比例80%为例。

(原则:为防止被薅羊毛,商品实付金额和优惠金额同时乘以退款比例):

①用户实付:商品实付金额乘以退款比例

退商品A时,退款金额 = A商品实付金额*80% = 4.28*80% = 3.42 (故A商品退3.42元)

退商品B时,退款金额 = B商品实付金额*80% = 2.92*80% = 2.33 (故B商品退2.33元)

退商品C时,退款金额 = C商品实付金额*80% = 1.79*80% = 1.43(故C商品退1.43元)

②优惠模块:部分退款时,优惠券不退

2. 红包 + 优惠券 + 用户金额合并支付:

A:全额退款:

将红包、优惠券、用户余额原路退回

订单销售价8.00 = 商品A销售价5.01 + 商品B销售价3.42 + 商品C销售价2.13 – 优惠券抵扣金额1.57 – 红包抵扣金额0.99

此时,用户发起全额退款,则:用户实际获得:商品原价10.56 * 100% = 10.56元( 实付8元+优惠券1.57元+红包抵扣金额0.99元)

B、部分退款:

平摊顺序:优惠券 > 红包 > 用户支付金额

优先判断是否满足优惠券使用门槛

订单销售价8.00 = 商品A销售价5.01 + 商品B销售价3.42 + 商品C销售价2.13 – 优惠券抵扣金额1.57 – 红包抵扣金额0.99

此时,将优惠券抵扣金额平摊到各商品上,各商品的实付价格为:

商品A实付价格= 5.01 – (1.57 * (5.01/(5.01+3.42+2.13)))= 5.01 – (1.57 * 0.47) = 5.01 – 0.73 = 4.28

商品B实付价格= 3.42 – (1.57 * (3.42/(5.01+3.42+2.13)))= 3.42 – (1.57 * 0.32) = 3.42 – 0.50 = 2.92

商品C实付价格= 2.13 – (1.57 * (2.13/(5.01+3.42+2.13)))= 2.13 – (1.57 * 0.20) = 2.13 – 0.31 = 1.82(错误算法)

商品C实付价格= 2.13 – (1.57 – 0.73 – 0.50) = 2.13 – 0.34 = 1.79(正确算法)

使用优惠券的商品实付金额计算公式:

①非最后一个商品的销售价 = 该商品销售价 – (优惠券抵扣金额 * (该商品销售价/各商品销售总价的比例))

②最后一个商品销售价 = 该商品销售价 – (优惠券总金额 – 第一个商品的优惠券承担金额 – 第二个商品的优惠券承担金额)

最后,再将红包抵扣金额平摊到各商品上,各商品的实付价格为:

商品A实付价格= 4.28 – (0.99 * (5.01/(5.01+3.42+2.13)))= 4.28 – (0.99 * 0.47) = 4.28 – 0.46 = 3.82

商品B实付价格= 2.92 – (0.99 * (3.42/(5.01+3.42+2.13)))= 2.92 – (0.99 * 0.32) = 2.92 – 0.31 = 2.61

商品C实付价格= 1.79 – (0.99 – 0.46 – 0.31) = 1.79 – 0.22 = 1.57

使用红包的商品实付金额计算公式:

①非最后一个商品的销售价 = 该商品用完优惠券的销售价 – (红包抵扣金额 * (该商品销售价/各商品销售总价的比例))

②最后一个商品销售价 = 该商品用完优惠券的销售价 – (红包总金额 – 第一个商品的红包承担金额 – 第二个商品的红包承担金额)

a、当对商品进行退款时,需要判断退款比例,以退款比例50%为例:

暂不考虑部分退款后,付款金额不满足优惠券使用门槛的场景

①用户实付:商品实付金额乘以退款比例

退商品A时,退款金额 = A商品实付金额*50% = 3.82*50% = 1.91(故A商品退1.91元)

退商品B时,退款金额 = B商品实付金额*50% = 2.61*50% = 1.30(故B商品退1.30元)

退商品C时,退款金额 = C商品实付金额*50% = 1.57*50% = 0.78(故C商品退0.78元)

②红包模块:优惠金额乘以退款比例

退商品A时,红包金额 = A商品红包抵扣金额*50% = 0.46*50% = 0.23(故A商品退0.23元红包)

退商品B时,红包金额 = B商品红包抵扣金额*50% = 0.31*50% = 0.15(故B商品退0.15元红包)

退商品C时,红包金额 = C商品红包抵扣金额*50% = 0.22*50% = 0.11(故C商品退0.11元红包)

③优惠券模块:部分退款时,优惠券不退

A商品实退金额:可退红包0.23 + 可退金额1.91 = 2.14

B商品实退金额:可退红包0.15 + 可退金额1.30 = 1.45

C商品实退金额:可退红包0.11 + 可退金额0.78 = 0.89

b、用户再次申请部分退款(再退50%,产生全部退款的效果):

当判断退款比例达到100%时(也就是最后一次退款),用各支付方式的实付金额减去上一次的退款金额(防止精度丢失问题造成的金额错误)

故:

A商品再退金额:红包0.23 + 退金额1.91 = 2.14

B商品再退金额:红包0.16 + 退金额1.31 = 1.47

C商品再退金额:红包0.11 + 退金额0.79 = 0.90

以及退出一张:0.73 + 0.5 + 0.34 = 1.57的一张优惠券

三、总结

1、价格为1分钱的商品不参与抵扣

2、在优惠平摊时,需要按照商品价格进行正序排列,将商品价格高的排到最后,避免发生最后一个商品的价格不足抵扣的情况

3、最后一个商品的实付价 = 该商品销售价 – (优惠券总金额 – 第一个商品的优惠券承担金额 – 第二个商品的优惠券承担金额)

4、在退款时,商品实付金额和优惠金额同时乘以退款比例(不可先退实付金额后退券,否则在部分退款场景下会被用户薅羊毛)

本文由 @我是PM 原创发布于人人都是产品经理 ,未经许可,禁止转载。

题图来自 Unsplash,基于 CC0 协议。

该文观点仅代表作者本人,人人都是产品经理平台仅提供信息存储空间服务。

更多精彩内容,请关注人人都是产品经理微信公众号或下载App
评论
评论请登录
  1. 你好。如果商品支付总额等于优惠额度 那么部分退款怎么处理。

    来自四川 回复
  2. 如果一个订单有多件商品,其中一个商品买2件,那这个商品是按单件计算优惠均摊,还是按单个商品计算优惠均摊呢

    来自福建 回复
  3. 你好,文章写得很棒,但是文中的这段话我不是很明白,可以指导解释一下吗?
    [备注:在优惠平摊时,需要按照商品价格进行正序排列,使得商品价格高的排到最后,避免发生最后一个商品的价格不足抵扣的情况]

    来自广东 回复
    1. 如果不做排序,可能最后一个商品的价格是0.02,但是最终需要他平摊的优惠金额是0.04,就会导致最后一个商品不够减了(本质原因是为了防止优惠的精度丢失,最后一个商品的优惠金额是用总优惠减去其他商品的优惠得出来的,但是这个优惠并没有跟商品的金额做关联绑定,如果恰巧朋友最后一个商品的价格过低,就会发生优惠金额反而大于最后一个商品金额的问题)

      来自江苏 回复
    2. 如果不做排序,可能最后一个商品的价格是0.02,但是最终需要他平摊的优惠金额是0.04,就会导致最后一个商品不够减了(本质原因是为了防止优惠的精度丢失,最后一个商品的优惠金额是用总优惠减去其他商品的优惠得出来的,但是这个优惠并没有跟商品的金额做关联绑定,如果恰巧碰到最后一个商品的价格过低,就会发生优惠金额反而大于最后一个商品金额的问题)

      来自江苏 回复
    3. 如果订单中有多个不同的商品,每个sku买2件,这个最后一个商品是按单件算还是按单个商品

      来自福建 回复
  4. 退款比例怎么理解?比如买了A B C三种商品时,如果全退了A,对A是100%,B C都是0%,只需要将A分到的都退就可以,A部分退款时也要考虑退比例

    来自北京 回复
    1. 是这意思

      来自江苏 回复
  5. 很全,先收藏以备不时之需

    来自广东 回复