促銷優惠分攤算法的正確打開方式
我們來嘗試一下,用做應用題的思路來設計一下算法。
在產品設計的過程中,經常會涉及到算法的設計,大家比較熟悉的,比如:千人千面的設計,電商活動商品價格分攤,股票K線等;無論何種場景,在設計算法之前,擁有一套正確的“解題”觀念是很重要的,否則設計出來的產品經不起市場的考驗,也面臨著客戶的信任感下降甚至流失客戶。
為什么我會將“應用題”和產品的“算法”聯系起來,讀書的時候,解答應用題,最正確的姿勢是:
- 認真審題,把所有的已知條件列出來,把需要求解的值列出來;
- 運用所學的知識,分析如何通過已知條件,求值得到答案;
- 將答案帶入題目,檢查是否正確;
這一系列的解題思路正好適用于我們的算法設計:
- 解讀數據或客戶/老板的需求,得出算法需要實現的目標,列出算法設計過程中需要考慮的問題;
- 設計算法的計算過程;
- 測試上線后收集相關數據與客戶反饋意見。
下面分享我前不久的經歷的一個實例:
一、需求描述(審題,分析需求目標)
1.1 需求描述
競品推出了一個功能,在商品的列表和商品的詳情頁中,會綜合商品目前正在參加的促銷活動自動計算出一個折后價。此外,根據我們的市場人員反饋,客戶對于該功能的需求比較強烈,因為我們的客戶均為B端客戶。
那么他們在采購的過程中,對于商品的采購價即成本會比較敏感,如果能夠在采購時能看到商品的成本價,更加有助于他們進行快速購買決策,因此我們決定跟進推出此功能。
二、需求分析(列出已知條件,提煉需求點)
2.1 競品分析
在決定跟進該功能之后,我們認真地分析了一下競品對于該功能的設計(暫不詳細描述),總結競品的設計思路及需要改善的地方
2.2 需求分析
- 該功能的定位是基于單個商品計算其優惠的金額,這個在概念上來說需要與訂單的優惠區分開來,在購物車或確認訂單頁面進行下單決策的時候,客戶往往是基于整個訂單的優惠金額去考量,單品折后價則往往是在決定是否將該商品加入購物車時起到至關重要的作用,所以單品折后價更多的是展示在商品瀏覽路徑。(商品折后價應該在前端展示的位置)
- 客戶需要知道該價格是怎么算出來的,我怎么才能相信你我能以這個價格買到,另外我要怎么操作才能以這個價格買到。(需要給出具體的計算步驟及每一步的優惠)
- 客戶需要看到的是最終實際采購的價格,尤其是在最終的訂單詳情及發票中如果展示活動分攤后的價格的話,那么兩個價格應該要一致,否則客戶在購買后會感覺到自己被欺騙了。(折后價展示的最終價格需要與訂單詳情及發票中的價格保持一致)
- 計算公式不能太復雜,最好能符合客戶計算成本價的習慣。(優化折后價算法,盡量簡單且符合常規思路,可以允許少量偏差)
- 運營層面,希望客戶的下單金額越大越好。當然對于多階梯的活動來說,活動金額門檻越大,享受到的折扣幅度越大。
三、算法的設計(分析解題思路,設計最優算法)
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種情況,每一種情況后面對應一個計算公式,與該商品參加活動的情況做匹配,所有情況如下:
- 只參加滿減活動;
- 只參加店鋪券活動;
- 只參加平臺券活動;
- 同時參加滿減活動和店鋪券活動;
- 同時參加平臺券活動和滿減活動;
- 同時參加平臺券活動和店鋪券活動;
- 同時參加滿減活動,店鋪券活動和平臺券活動。
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
滿減優惠:(優惠金額/最優采購金額四舍五入之后保留四位小數)
- 優惠金額X:對于滿減形式的,則優惠金額X=活動設置的金額;對于滿折形式的,則優惠金額X=(1-折扣率)*最優采購金額;
- 折后價:對于滿減形式的,滿減折后價B=折后價A*(1-優惠金額X/最優采購金額);對于滿折形式的,滿減折后價B=折后價A*折扣率;
- 單品滿減優惠=折后價A-折后價B;
- 滿減優惠后金額=最優采購金額-優惠金額X。
店鋪券優惠:(券面額/滿減優惠后金額四舍五入之后保留四位小數)
- 優惠金額Y:對于滿減形式的,則優惠金額Y=活動設置的金額;對于滿折形式的,則優惠金額Y=(1-折扣率)*滿減優惠后金額
- 折后價:對于滿減形式的,店鋪券折后價C=折后價B*(1-優惠金額Y/滿減優惠后金額);對于滿折形式的,店鋪券折后價C=折后價B*折扣率
- 單品店鋪券優惠=折后價B-折后價C
- 店鋪券優惠后金額=滿減優惠后金額-優惠金額Y
平臺券優惠:(券面額/店鋪券優惠后金額四舍五入后保留四位小數)
- 優惠金額Z:對于滿減形式的,則優惠金額Z=活動設置的金額;對于滿折形式的,則優惠金額Z=(1-折扣率)*店鋪券優惠后金額
- 折后價:對于滿減形式的,平臺券折后價D=折后價C*(1-優惠金額Y/店鋪券優惠后金額);對于滿折形式的,平臺券折后價D=折后價C*折扣率
- 單品平臺券優惠=折后價C-折后價D
- 平臺券優惠后金額=店鋪券優惠后金額-優惠金額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 誤差來源
- 計算的過程是分多步得出數據,所以中間的四舍五入會存在一個常規的誤差;
- 由于后面生成訂單的時候,會按照訂單實際數據進行分攤,分攤算法的差異會造成誤差存在;
- 由于在訂單詳情頁無法知道最終客戶下單總金額,若未按照門檻金額下單,會造成實際享受的優惠比頁面顯示的要??;
- 如果一張平臺券跨店鋪使用,可能會獲得更多優惠,因為在每個店鋪里面購買的金額變少了,那么該商品享受的優惠比例更大。
四、上線效果評估(檢查答案的正確性)
從以下幾個方面評估功能的效果:
- 通過市場,客服人員收集客戶使用體驗;
- 評估商品瀏覽轉化率(加購物車),商品詳情頁,商品列表等頁面的停留時間。
本文由 @不橈 原創發布于人人都是產品經理。未經許可,禁止轉載
題圖來自 Pixabay,基于 CC0 協議
優惠券平攤后,出現四舍五入差1-2分錢怎么辦?
感謝您的分享,還有別的文章么,特別想看,寫的太好了。
歡迎交流
請問對于平攤優惠的算法精度取舍導致的誤差問題如何解決呢
平臺優惠的誤差放入商家子訂單,店鋪優惠的誤差放入商品;取一個金額大的放進去即可
請問這種情況該怎么放進去呢,比如一筆訂單商品金額最大是20,有5個商品都是這個金額,成本都不相同,選哪個產品放最后的優惠金額呢
如果5個商品都是這個金額的情況下,沒有特殊的需求情況下,誰便選一個商品即可
闡述和舉例總感覺是分割的,看的一知半解..按照文章描述,也沒梳理明白…
可結合另一篇促銷活動的文章一起看一下
好的,感謝作者慷慨分享
看不懂啊,太高深了
理這文章的邏輯腦殼都痛了~不過還是很棒的文章。建議用線性規劃列表達式~
感謝寶貴的建議,理論上來說把線性規劃的思路代入,分析問題的思路會更加簡單,而且容易看懂