促销优惠分摊算法的正确打开方式

13 评论 18556 浏览 76 收藏 18 分钟

我们来尝试一下,用做应用题的思路来设计一下算法。

在产品设计的过程中,经常会涉及到算法的设计,大家比较熟悉的,比如:千人千面的设计,电商活动商品价格分摊,股票K线等;无论何种场景,在设计算法之前,拥有一套正确的“解题”观念是很重要的,否则设计出来的产品经不起市场的考验,也面临着客户的信任感下降甚至流失客户。

为什么我会将“应用题”和产品的“算法”联系起来,读书的时候,解答应用题,最正确的姿势是:

  1. 认真审题,把所有的已知条件列出来,把需要求解的值列出来;
  2. 运用所学的知识,分析如何通过已知条件,求值得到答案;
  3. 将答案带入题目,检查是否正确;

这一系列的解题思路正好适用于我们的算法设计:

  1. 解读数据或客户/老板的需求,得出算法需要实现的目标,列出算法设计过程中需要考虑的问题;
  2. 设计算法的计算过程;
  3. 测试上线后收集相关数据与客户反馈意见。

下面分享我前不久的经历的一个实例:

一、需求描述(审题,分析需求目标)

1.1 需求描述

竞品推出了一个功能,在商品的列表和商品的详情页中,会综合商品目前正在参加的促销活动自动计算出一个折后价。此外,根据我们的市场人员反馈,客户对于该功能的需求比较强烈,因为我们的客户均为B端客户。

那么他们在采购的过程中,对于商品的采购价即成本会比较敏感,如果能够在采购时能看到商品的成本价,更加有助于他们进行快速购买决策,因此我们决定跟进推出此功能。

二、需求分析(列出已知条件,提炼需求点)

2.1 竞品分析

在决定跟进该功能之后,我们认真地分析了一下竞品对于该功能的设计(暂不详细描述),总结竞品的设计思路及需要改善的地方

2.2 需求分析

  1. 该功能的定位是基于单个商品计算其优惠的金额,这个在概念上来说需要与订单的优惠区分开来,在购物车或确认订单页面进行下单决策的时候,客户往往是基于整个订单的优惠金额去考量,单品折后价则往往是在决定是否将该商品加入购物车时起到至关重要的作用,所以单品折后价更多的是展示在商品浏览路径。(商品折后价应该在前端展示的位置)
  2. 客户需要知道该价格是怎么算出来的,我怎么才能相信你我能以这个价格买到,另外我要怎么操作才能以这个价格买到。(需要给出具体的计算步骤及每一步的优惠)
  3. 客户需要看到的是最终实际采购的价格,尤其是在最终的订单详情及发票中如果展示活动分摊后的价格的话,那么两个价格应该要一致,否则客户在购买后会感觉到自己被欺骗了。(折后价展示的最终价格需要与订单详情及发票中的价格保持一致)
  4. 计算公式不能太复杂,最好能符合客户计算成本价的习惯。(优化折后价算法,尽量简单且符合常规思路,可以允许少量偏差)
  5. 运营层面,希望客户的下单金额越大越好。当然对于多阶梯的活动来说,活动金额门槛越大,享受到的折扣幅度越大。

三、算法的设计(分析解题思路,设计最优算法)

3.1 根据上一步提炼出的要求,提出解决方案

由于每一种类型的活动,一个订单只能参加一次,所以基于运营层面的考虑,我们希望采购金额越大越好。(但是由于可能存在无门槛的活动,所以决定基于优惠金额去算,因为采购金额与优惠金额通常是对等的),如果一个活动存在多阶梯的规则,那么默认该商品适用优惠金额最大的规则。

由于每个活动均会设置门槛金额,只有在刚好达到门槛金额的时候是最优惠的,如满300减10元,当购买的金额越多,分摊到每一件商品的优惠会越少,所以在计算折后价时,参考购买金额都是基于门槛金额计算。

如果需要得到最终的折扣价,由于在购买的过程中,订单金额计算顺序为 单品优惠>>满减活动>>店铺券活动>>平台券活动 ,即平台券活动的门槛会以使用店铺券后的金额衡量,而店铺券活动的门槛会以扣除满减金额之后的金额衡量,满减活动的参加门槛会以单品优惠后的金额衡量。

所以在计算的过程中需要将上一部减去的金额考虑进来,而且实际采购金额需按照平台券>>店铺券>>满减一步步往前推算(单品优惠活动对实际需要采购金额无影响)。

实际采购金额的计算:如存在店铺券活动(满300减30)和平台券活动(满1000减100),那么最终的采购金额需要达到1000才能同时参加这两个活动,所以在参加店铺券活动之前订单金额需达到1000+30=1030。

但是实际上由于店铺券活动本身就存在活动门槛,所以实际采购金额需要同时满足着两个条件,即实际采购金额等于两者之间更大的那一个。

不一定该商品参加所有优惠活动的时候是最便宜的,因为活动的优惠需要平均到每个单品身上,所以当某个活动的参加门槛特别大时,反而有可能不参加这个活动获得的优惠更多,所以需要把所有可能参加的活动组合全部计算一次。

但是这中间会需要考虑到如果参加A活动则必然会参加B活动,而这一点也不受影响,因为结果集已包含所有情况且如果在同一采购金额下,同时满足两种情况,那么一定是参加活动多的那种情况更优惠

3.2 根据以上的分析,可以开始算法的设计了

3.2.1 所有活动组合

列出该商品当前参加的所有活动,将单品活动拿出来,其他活动共3种(满减、店铺券、平台券)进行组合,最终可能存在7种情况,即只参加一种活动的共3种,同时参加两种活动的共3种,同时参加三种活动的共1种。

程序中可以枚举7种情况,每一种情况后面对应一个计算公式,与该商品参加活动的情况做匹配,所有情况如下:

  1. 只参加满减活动;
  2. 只参加店铺券活动;
  3. 只参加平台券活动;
  4. 同时参加满减活动和店铺券活动;
  5. 同时参加平台券活动和满减活动;
  6. 同时参加平台券活动和店铺券活动;
  7. 同时参加满减活动,店铺券活动和平台券活动。

3.2.2 计算不同情况下实际需采购的金额

步骤1:商品匹配活动方案

找出商品所参加的所有活动及每种活动要求的门槛金额(满减/满折,店铺券,平台券),例如:A商品原价为200,参加特价活动且特价为100,同时参加满1000减100的满减活动,满100元9折的店铺券活动。

则A商品除了特价活动之外还参加了满减和店铺券活动,匹配到活动方案1,2,4;且满减门槛为1000,店铺券门槛为100。

多阶梯的满减/店铺券/平台券活动,选择满减优惠金额最大的那个规则作为满减/店铺券/平台券活动规则。如果活动形式为满折,那么使用门槛金额*折扣率作为满减优惠金额。例如:A商品参加满减活动,活动规则为满1000减100,满2000减200,满3000减300,那么在计算折后约的整个过程中,默认A商品参加的满减活动规则为满3000减300。

步骤2:定义每种情况下的最优采购金额

假设满减的门槛金额为X,店铺券的门槛金额为Y,平台券的门槛金额为Z(未设置门槛则默认为销售价)。

  • 情况1:只参加满减活动,最优采购金额=满减门槛X
  • 情况2:只参加店铺券活动,最优采购金额=店铺券门槛Y
  • 情况3:只参加平台券活动,最优采购金额=平台券门槛Z
  • 情况4:同时参加满减活动和店铺券活动

其中在满减活动形式为满减时,最优采购金额=max(店铺券门槛Y+满减优惠,满减门槛X);在满减活动形式为满折时,最优采购金额=max(店铺券门槛Y/折扣率,满减门槛X)。

  • 情况5:同时参加满减活动和平台券活动

其中在满减活动形式为满减时,最优采购金额=max(平台券门槛Z+满减优惠,满减门槛X);在满减活动形式为满折时,最优采购金额=max(平台券门槛Z/折扣率,满减门槛X)。

  • 情况6:同时参加店铺券活动和平台券活动

其中在店铺券活动形式为满减时,最优采购金额=max(平台券门槛Z+店铺券优惠,店铺券门槛Y);在店铺券活动形式为满折时,最优采购金额=max(平台券门槛Z/折扣率,店铺券门槛Y)。

  • 情况7:同时参加满减活动,店铺券活动和平台券活动,情况比较复杂,所以需要分两步计算

第一步:先计算只参加店铺券活动和平台券活动的情况下的最优采购金额1(方法参照情况6);

第二步:根据上一步得出的最优采购金额1,再得出最终的最优采购金额2。

其中在满减活动形式为满减时,最优采购金额2=max(最优采购金额1+满减优惠,满减门槛X),在满减活动形式为满折时,最优采购金额2=max(最优采购金额1/折扣率,满减门槛X)。

步骤3:计算折扣价

在步骤2中,已经得到了最优采购金额,分别根据不同方案下的最优采购金额,计算出符合各个最优采购价条件下最终折后价,找出折后价最低的方案;计算顺序依次为单品优惠,满减优惠,店铺券优惠,平台券优惠。

单品优惠:特价活动折后价A即为特价,买降活动折后价A即为最低的活动价;单品优惠金额=原价-折后价A

满减优惠:(优惠金额/最优采购金额四舍五入之后保留四位小数)

  1. 优惠金额X:对于满减形式的,则优惠金额X=活动设置的金额;对于满折形式的,则优惠金额X=(1-折扣率)*最优采购金额;
  2. 折后价:对于满减形式的,满减折后价B=折后价A*(1-优惠金额X/最优采购金额);对于满折形式的,满减折后价B=折后价A*折扣率;
  3. 单品满减优惠=折后价A-折后价B;
  4. 满减优惠后金额=最优采购金额-优惠金额X。

店铺券优惠:(券面额/满减优惠后金额四舍五入之后保留四位小数)

  1. 优惠金额Y:对于满减形式的,则优惠金额Y=活动设置的金额;对于满折形式的,则优惠金额Y=(1-折扣率)*满减优惠后金额
  2. 折后价:对于满减形式的,店铺券折后价C=折后价B*(1-优惠金额Y/满减优惠后金额);对于满折形式的,店铺券折后价C=折后价B*折扣率
  3. 单品店铺券优惠=折后价B-折后价C
  4. 店铺券优惠后金额=满减优惠后金额-优惠金额Y

平台券优惠:(券面额/店铺券优惠后金额四舍五入后保留四位小数)

  1. 优惠金额Z:对于满减形式的,则优惠金额Z=活动设置的金额;对于满折形式的,则优惠金额Z=(1-折扣率)*店铺券优惠后金额
  2. 折后价:对于满减形式的,平台券折后价D=折后价C*(1-优惠金额Y/店铺券优惠后金额);对于满折形式的,平台券折后价D=折后价C*折扣率
  3. 单品平台券优惠=折后价C-折后价D
  4. 平台券优惠后金额=店铺券优惠后金额-优惠金额Z

实际计算的时候,不参加对应的活动的时候可以跳过对应的计算步骤。

例如:A商品原价为200,参加特价活动且特价为100,同时参加满1000减100的满减活动,满2000元9折的店铺券活动,满3000元减400的平台券活动。

则若该商品参加三种活动的情况下,最优采购金额2=max(最优采购金额1+100,1000);而最优采购金额1=max(3000/0.9,2000);所以最优采购金额1=3333.33;最优采购金额2=3433.33

最终实际计算完成后,结果如下,最终得出结果在同时参与三个活动的时候,折后价为11.65。

以此类推,计算出所有活动方案的折后价之后,最小折后价对应的方案即为最优方案。

步骤4:折后价展示

  • 商品卡片:在销售价后显示折后价,显示为“折后约¥”+“折后价”;特殊的:该商品只参加特价活动的情况下,还是显示原价(加划线)。
  • 商品详情:商品详情中需要展示具体的每一步的优惠金额,即需要分别展示原价,单品优惠金额,满减优惠,店铺券优惠,平台券优惠,折后价。

3.2.3 误差来源

  1. 计算的过程是分多步得出数据,所以中间的四舍五入会存在一个常规的误差;
  2. 由于后面生成订单的时候,会按照订单实际数据进行分摊,分摊算法的差异会造成误差存在;
  3. 由于在订单详情页无法知道最终客户下单总金额,若未按照门槛金额下单,会造成实际享受的优惠比页面显示的要小;
  4. 如果一张平台券跨店铺使用,可能会获得更多优惠,因为在每个店铺里面购买的金额变少了,那么该商品享受的优惠比例更大。

四、上线效果评估(检查答案的正确性)

从以下几个方面评估功能的效果:

  1. 通过市场,客服人员收集客户使用体验;
  2. 评估商品浏览转化率(加购物车),商品详情页,商品列表等页面的停留时间。

 

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

题图来自 Pixabay,基于 CC0 协议

更多精彩内容,请关注人人都是产品经理微信公众号或下载App
评论
评论请登录
  1. 优惠券平摊后,出现四舍五入差1-2分钱怎么办?

    来自山东 回复
  2. 感谢您的分享,还有别的文章么,特别想看,写的太好了。

    来自山东 回复
    1. 欢迎交流

      来自广东 回复
  3. 请问对于平摊优惠的算法精度取舍导致的误差问题如何解决呢

    来自河北 回复
    1. 平台优惠的误差放入商家子订单,店铺优惠的误差放入商品;取一个金额大的放进去即可

      来自广东 回复
    2. 请问这种情况该怎么放进去呢,比如一笔订单商品金额最大是20,有5个商品都是这个金额,成本都不相同,选哪个产品放最后的优惠金额呢

      来自四川 回复
    3. 如果5个商品都是这个金额的情况下,没有特殊的需求情况下,谁便选一个商品即可

      来自广东 回复
  4. 阐述和举例总感觉是分割的,看的一知半解..按照文章描述,也没梳理明白…

    来自北京 回复
    1. 可结合另一篇促销活动的文章一起看一下

      来自广东 回复
    2. 好的,感谢作者慷慨分享

      来自北京 回复
  5. 看不懂啊,太高深了

    回复
  6. 理这文章的逻辑脑壳都痛了~不过还是很棒的文章。建议用线性规划列表达式~

    来自四川 回复
    1. 感谢宝贵的建议,理论上来说把线性规划的思路代入,分析问题的思路会更加简单,而且容易看懂

      回复