← 返回蜂巢洞察

如何设计人们真正会使用的送礼功能:来自58款应用程序的实证数据

在2025年的假期购物季期间,美国消费者花费了约290亿美元购买礼品卡,其中43%的消费者至少购买了一张礼品卡。根据 全国零售联合会 的调查数据,礼品卡确实成为了人们最想要的购物方式。 这些数据解释了为什么企业会备有礼品卡这一商品。然而,这些数据并没有说明在什么情况下提供礼品卡服务才能取得最佳效果。在本文中,我们将探讨是否值得在应用程序中加入礼品赠送功能。为了回答这个问题,我在 Mobbin的参考库 中研究了58款应用程序。 礼品赠送的功能可以表现为礼品卡、订阅服务、直播打赏或是结账时的附加选项等多种形式。在这58款应用程序中,有49款提供了完整的礼品赠送流程,用户可以通过9种不同的方式触发这

在2025年的假期购物季期间,美国消费者花费了约290亿美元购买礼品卡,其中43%的消费者至少购买了一张礼品卡。根据全国零售联合会的调查数据,礼品卡确实成为了人们最想要的购物方式。

这些数据解释了为什么企业会备有礼品卡这一商品。然而,这些数据并没有说明在什么情况下提供礼品卡服务才能取得最佳效果。在本文中,我们将探讨是否值得在应用程序中加入礼品赠送功能。为了回答这个问题,我在Mobbin的参考库中研究了58款应用程序。

礼品赠送的功能可以表现为礼品卡、订阅服务、直播打赏或是结账时的附加选项等多种形式。在这58款应用程序中,有49款提供了完整的礼品赠送流程,用户可以通过9种不同的方式触发这一流程。

例如,Etsy会保存用户的购物车内容;Duolingo会在屏幕上显示学习伙伴的已完成课程数量;而Blinkit则会在商品促销日历中标明相关活动。每款应用程序都能准确判断用户何时可能选择赠送礼物。

以下章节将详细介绍这9种触发礼品赠送的时机,同时说明开发这些功能所需的成本,以及在设计阶段需要准备哪些内容。

先决条件

为了顺利理解后续内容,您需要具备以下条件:

  • 具备设计或研究背景,熟悉消费者购买流程,了解入口点、转化节点等概念。

  • 掌握客户获取相关的经济原理,包括客户获取成本、激活费用,以及为什么推荐奖励与追加销售的价格会有所不同。

  • 具备基本的SQL知识,能够阅读CREATE TABLE语句。不过您不需要亲自编写SQL代码。文中涉及SQL的两部分内容已经做了标记,如果您跳过这些部分,也不会影响对整体内容的理解。

目录

九种场景中有八种具有触发条件

以下是这58款应用中这些场景的分布情况(有些应用会在多行中出现)。例如,仅Uber Eats就涉及其中五种场景。

场景 应用数量 触发因素
结账时推荐额外商品 12款应用 购物车已满,且用户已准备好付款
为交易金额添加零头 4款应用 当交易金额过于简洁时,用户需要额外的零头信息
节日或生日主题推荐 19款应用 日历上显示的节日或生日日期
平台赠送的礼物 5款应用 企业希望用户重复进行的操作
将推荐行为表现为“给予”行为 7款应用 在某件事进展顺利之后立即推荐相关内容
共享进度信息 2款应用 共同目标明显存在不平衡情况时
实时发生的社交互动场景 10款应用 当前正在进行的社交互动
储值礼品卡 22款应用 用户需要主动去寻找这些礼品卡
订阅服务推广 9款应用 用户已经是满意的订阅者时

推荐奖励是针对推荐者的,而平台赠送的礼物则是企业送给自己的客户的。因此,如下图所示,在这两类情况下,金钱和接收者都属于企业。

在58款应用中,礼品卡推广情况的条形图。储值礼品卡以22款的数量位居首位,其条形颜色较浅且被括起来,因为这类推荐行为实际上并不会触发任何具体的操作;其次是节日或生日主题推荐,有19款应用采用这种方式;接下来是结账时推荐额外商品,有12款应用使用这种方式;实时发生的社交互动场景排在第10位,有10款应用适用;订阅服务推广排在第9位,有9款应用使用这种方式;推荐行为排在第7位,有7款应用采用这种方式;平台赠送的礼物排在第5位,有5款应用使用这种方式;为交易金额添加零头排在第4位,有4款应用适用;共享进度信息排在第2位,有2款应用使用这种方式。

礼品卡的推广数量远远领先于其他方式。而且,在这些场景中,只有礼品卡这种推荐方式没有特定的触发条件——因为用户想要赠送礼品卡的念头必须先于应用程序的提示而产生。

列表中的其他所有场景都是为了在用户产生这个想法之前就促成相应的推荐行为。如果礼品卡一旦被发送出去,那么相关的推荐行为也就随之终止了。

这种区别对于团队决定开发什么功能来说非常重要。礼品卡本身是一种可供购买的物品,而不是促使用户购买的理由。因此,如果一个团队只是简单地发送礼品卡而不再进一步推动后续的推荐行为,那么他们所开发的实际上只是礼物卡的供应机制,而非真正的需求驱动型功能;这样的功能只会出现在“账户”菜单中,等待那些本来就打算使用它的用户。

其余八种场景的存在目的都是为了激发用户的这种购买意愿,每种场景都将推荐行为与产品已经能够检测到的特定时刻相结合起来。

每个场景都会将触发条件与强化机制配对使用

以下每一项都说明了是什么触发了这一流程,使得最初的礼物转化为了第二份礼物。

22款应用中的“存储价值”功能

发送者会选择一个金额选项,挑选一张卡片设计,填写收件人和寄件人的信息,撰写留言,然后完成支付。这22款应用都采用相同的操作流程。这是本次研究中最为常见的送礼功能,而且这些应用在设计方面所花费的工作量也是最少的。

触发条件:**发送者通过打开菜单来寻找礼品卡,因此,在应用程序做出反应之前,发送礼物的意愿就已经产生了。而其他八种场景则是为了满足这种送礼需求而设计的。

强化机制:**Blank Street、Airbnb和Blue Apron允许发送者安排送礼时间,这样他们就可以在想起来的时候立即行动,而不必等到指定的日期;Urban Outfitters则将送礼窗口设置为送礼前90天内。预览功能会让发送者清楚地看到收件人将会看到的内容。而Blank Street还会在购买确认页面上添加一款蛇形街机游戏,并提供免费咖啡作为奖励。

使用这一功能的平台包括:**Uber、Uber Eats、Starbucks、sweetgreen、DoorDash、Shopee、SHEIN、Blank Street、App Store、Shipt、Blinkit、Zip、HelloFresh、Blue Apron、Airbnb、Urban Outfitters、Base44、Satispay、Walmart、Amazon、Everyday Rewards、Lovi。

19款应用中的“节日礼物推荐目录”功能

有19款应用会根据不同的节日来推荐相应的礼品。在这些应用中,日历是触发这一功能的最为常见的手段,顶部的标签栏起到了提示作用。

四张Uber Eats的界面截图:一张包含斋月、生日、祝贺和感谢等选项的礼品卡目录;一张用于填写送礼人信息、收件人信息以及电话号码的定制礼物表格;一张显示“点击打开礼物包装”的预览页面;另一张显示“Alex给你准备了一份礼物”的预览页面

发送者在开始使用这些应用时可能并没有特定的送礼目的,但标签栏会帮助他们确定送礼的场合。Starbucks提供了父亲节、毕业典礼、生日和感谢等场景下的推荐礼物;Walmart则增加了“Just Because”这一选项,用于那些并不属于特定节日的场合。

地区性的日历在这里起到了更为重要的作用。Blinkit和Zomato会针对排灯节推出相关推荐;GoPay则会为开斋节和独立日提供礼品建议;Shopee则会推出毕业祝福相关的推荐;而仅在美国使用的某个节日推荐选项则不会被其他地区的用户看到。

触发条件:**日历提供了发送者认为有必要送礼的日期。

强化机制:**特定的送礼场合会为礼品卡搭配相应的设计和留言内容,因此发送者根本不需要自己撰写留言。GoPay还会提供主题封套、名人语音留言,以及诸如“别长大吧,那是个陷阱”之类的推荐语。

使用这一功能的平台包括:**Uber、Uber Eats、Postmates、Starbucks、sweetgreen、Walmart、Amazon、Shopee、Grab、Blinkit、Zomato、Ulta Beauty、SKIMS、GoPay、Letterboxd、Nike、Shipt、Target、Faire。

在12款应用中实现的结账时附加销售功能

有12款应用在用户进行配送和付款操作的过程中加入了这一功能:Etsy和Instacart使用开关形式来触发该功能,Ulta Beauty和Yami则通过弹出窗口来实现,而DoorDash和Uber Eats则将相关选项显示在结账列表中。用户只需轻轻点击一下即可完成这一操作。

触发条件:由于用户已经掏出了信用卡,因此进行这一操作并不会产生任何费用。

激励机制:Ulta Beauty收取3.99美元的费用提供礼品包装服务,Blinkit则收取30卢比的费用;而发送礼品信息的本身是不收费的。Lululemon承诺会将礼品信息打印在收据上,同时隐藏价格信息,从而缓解用户的疑虑。Apple Store则会询问用户是希望公开赠送的礼品还是希望保持惊喜效果。

使用这些功能的平台包括:Etsy、Instacart、Yami、Ulta Beauty、Lululemon、Apple Store、Best Buy、DoorDash、Uber Eats、Blinkit、Natural AI、Blank Street。

在10款应用中实现的“实时社交货币”功能

有10款应用将赠送礼物的行为融入到实时的聊天互动中,并使用自定义的“货币”来计算礼物的价格。Telegram提供了一种名为“Stars”的虚拟货币,用户可以使用这种货币来购买礼物;当礼物被发送后,聊天界面中会出现彩带效果,同时还会显示“您花费了15 Stars购买了这份礼物”这样的提示信息。

在Telegram的聊天界面中,礼物被发送后会出现彩带效果,同时会显示‘您花费了15 Stars购买了这份礼物’的提示信息,以及一张写着‘送给Jane的礼物’的卡片,界面上还有‘查看’按钮

因为这些聊天界面有大量的观众,所以赠送礼物这一行为不仅能提升礼物的价值,还能增加发送者的影响力。

那些用于约会应用的平台已经找到了精确地定价的方法:在Hinge平台上,一朵玫瑰的售价为……;在Coffee Meets Bagel平台上,一朵花的售价也是……。这些应用都会在自己的界面中明确标注这一点。而Telegram则提供了相应的功能,使得这些操作能够在社交环境中顺利实现。 四张Telegram屏幕截图:一张显示了为期3个月、6个月和12个月的礼品套餐的页面;一张列出了价格从15 Stars到100 Stars不等的礼品目录的页面;一张允许用户选择是否隐藏自己名字的送礼界面;以及另一张显示了隐藏名字选项被激活后的界面的页面

“隐藏我的名字”功能允许发送者只向接收者透露自己的身份,而不会让其他任何人知道。Twitch也提供了类似的“匿名赠送礼物”的选项。

触发条件:发送者希望在自己的聊天信息中脱颖而出,吸引更多人的注意。

激励机制:当观众看到礼物被发送过来时,Telegram会通过“稀缺性标记”和分级定价机制来增加这一行为的吸引力。100 Stars的售价为2.90美元,而35,000 Stars的售价则为1,048美元。总体来说,这七个等级的售价范围在每100 Stars 2.88美元到2.99美元之间,因此这种定价方式实际上是在根据礼物的数量来收费,而不是提供折扣。

在Twitch上,赠送订阅服务的价格会从6.99新元降至4.99新元,当赠送数量达到5个订阅账户时价格就会保持不变;而对于更多的赠送数量,这一优惠也会持续有效。任何负责设计这些赠品界面的开发者都应该先根据每个等级对应的赠送数量来调整定价。

哪些应用会使用这种推广方式: Telegram、Discord、Instagram、TikTok、Twitch、Azar、Binance、Badoo、Hinge以及Coffee Meets Bagel。

9款应用中的订阅赠送功能

有9款应用允许现有订阅用户为尚未订阅该服务的人购买试用账户,这种推广方式可以说是一种非常有效的用户获取手段。这些应用的界面都会明确说明这一功能,例如Thrive Market会用美元来表示赠送金额。

四款应用中的订阅赠送界面:Discord提供Nitro会员资格作为礼物;Twitch的“匿名赠送订阅”选项;Lovi提供为期7天的会员资格作为礼品卡;Headway的赠送界面会显示接收者的电子邮件地址以及赠送日期为10月25日10点

触发条件:订阅用户需要持续使用该服务一段时间后,才能被允许为他人赠送订阅资格。Discord、Telegram和Headway会将这一功能设置在“设置”选项中、支付页面上或接收者的个人资料页面上。

激励措施:Thrive Market会为赠送会员资格的发送者提供30美元的购物积分作为奖励,公司认为这种成本低于其他推广方式带来的收益。Lovi则直接赠送价值7天的无限访问权限礼品卡。

Telegram会根据订阅期限提供折扣:购买3个月的订阅服务可享受10%的优惠,而购买1年的订阅服务则可享受45%的折扣,因此发送者投入的时间越长,每月支付的费用就越少。此外,这种赠送方式会自动续订,因为根据Thrive Market的规定,接收者在每个周年纪念日都需要支付59.95美元才能取消订阅。

哪些应用会使用这种推广方式: Thrive Market、Discord、Instagram、Telegram、Headway、Lovi、Shipt、Blackbird以及Twitch。

7款应用中将推荐行为表现为赠送行为

有7款应用在文字描述和图标设计上都将推荐行为明确表现为赠送行为,这些应用会使用包装礼物的图案,并用“赠送”这个词来引导“获得”这个动作。

DoorDash推出了“赠送5美元即可获得1美元”的优惠活动。Base44则在同一账户菜单中,将“赠送礼品卡”这一选项放在“推荐朋友”之后,这体现了该公司认为用户之间是一种亲密的关系。

触发条件:Peerspace会在订单确认后的几秒钟内,在订单页面上显示推荐链接。

激励措施:Peerspace会向双方展示奖励内容,将推荐的积分上限设定为5,000美元,并提供用于短信和电子邮件的分享文本。

哪些应用会使用这种推广方式: DoorDash、Lugg、Peerspace、Superpower、Preply、Manus以及Base44。

5款应用中的平台赠送功能

有五款应用会为顾客送上礼物,并营造出相应的庆祝氛围。Grab的“神秘奖励”功能会在用户完成某项任务后带来惊喜,还会播放拆包动画;而Temu则会简单地发送一条消息:“你有8份礼物尚未领取。”

触发因素:企业希望用户重复某种行为,因此会为这种行为设置奖励。
强化机制:Grab会在随机时间发放奖励,并通过播放拆包动画来实现这一过程,而这个过程对用户来说只消耗时间而已。未领取的奖励会以徽章的形式显示出来,而过期时限则会将用户的兴趣转化为紧迫感。Finch则是这些应用中最为温和的一个例子——它只会告诉接收者“送礼人希望他们能喜欢这份礼物”,然后就不再做任何其他事情。
使用这些功能的应用包括:Grab、Shopee、Temu、Everyday Rewards、Finch。

四种应用中的“红包包装”功能

有四款应用将支付环节视为次要部分,而是把全部设计精力都投入到礼物的包装上。例如,Binance的“红包”功能会通过代码或二维码将随机金额分配给多个接收者,而Revolut则会安排在接收者当天早上收到这笔钱。实际上,转账本身只需要一条指令而已。

触发因素:发送者希望借助这一行为来庆祝某个特殊场合,但单纯的转账方式显得过于生硬。
强化机制:Binance会精确控制整个转账过程的时机。红包可以在首次领取后的45秒内过期,这个时限由发送者自行设置;未领取的金额会在三天后退还给发送者。某些应用还会提供“奖励增强”功能,使代码的曝光率提高多达90%。GoPay甚至会将这种转账行为变成一场抽奖活动,每次接收者领取红包时都会获得相应数量的代币。
使用这些功能的应用包括:GoPay、Binance、Revolut、Satispay。

两种应用中的“共同进步”功能

有两款应用让礼物具有实际意义而不仅仅是象征性的东西,这使得这种模式在本次研究中显得极为罕见。

Duolingo的‘好友任务’功能界面:两个学习者共享同一个学习目标,每个人的贡献会显示在他们的头像旁边;其中一位学习者的进度明显领先于另一位,页面下方还有‘鼓励’和‘赠送礼物’按钮

Duolingo的“好友任务”功能为两个学习者设置了共同的目标,会同时显示他们各自的贡献情况。其中一位学习者需要在三天内完成15个学习任务,而另一位则不需要;在头像下方还有“鼓励”和“赠送礼物”按钮。

触发因素:Duolingo展示了两个学习者共同追求的目标,同时明确了其中一位学习者的落后情况,这就促使另一方想要想办法帮助对方。
强化机制:学习者可以通过消耗“经验值增强道具”来推动任务的进展;如果发送者迟迟不写祝福信息,Duolingo会代为完成这部分工作。当学习者的“虚拟货币”用完时,他们可以用真实货币购买这些道具,因此慷慨行为实际上会促使人们做出与平时相同的消费决策。按钮状态会在发送信息后变为“已发送”,这样双方都能清楚地看到这一操作结果。

Finch会在朋友的个人资料页面上将“发送礼物”选项放在“分享目标”选项旁边,以换取200颗彩虹石,而这样一来,该列表就会被清空。

使用这些功能的应用程序: Duolingo、Finch。

九种场景中都会出现的六个常见问题

无论团队选择哪种场景,发送礼物过程中都会出现同样的六个问题。以下分别列出了这些问题以及相关应用程序对此采取的应对措施。

1. 识别那些可能还不是该应用用户的接收者

当发送者填写接收者信息时,如果该接收者还没有注册账户,应用程序就会遇到困难。研究中的各种应用程序会接受电话号码或电子邮件地址作为接收者信息;对于既没有电话号码也没有电子邮件地址的情况,一些应用程序会提供联系人选择功能;而Grab允许一次指定多达十位接收者。那些需要联系陌生人的应用程序会选用最简单、最能传递信息的识别方式,并将接收者的账户信息暂时保留,直到接收者确认接收礼物为止。

当需要送给与产品无关的人礼物时,这些应用程序会先发送短信或电子邮件进行确认。Uber Eats和DoorDash都会要求发送者确认收件人已经同意接收礼物,这样这个责任就落在了了解收件人情况的人身上。

3. 当发送者无法猜测收件人的喜好时如何选择礼物

如果发送者无法猜出收件人的喜好,他们就会放弃购买礼物的计划。Grab和Uber Eats都会将选择权交给收件人,而不是强行为收件人指定礼物。例如,Grab会提供三种选项供收件人选择,而Uber Eats则提供了“让收件人自行选择送餐时间”以及“如果订单取消,可以让收件人获得积分”等选项。

4. 决定礼物的个性化程度

过于简单的礼物会显得缺乏用心;而每一层个性化的处理都会增加用户的操作步骤。个性化选项包括卡片设计、书面留言、GoPay中的语音留言,以及Uber Eats和Postmates提供的录制视频等。每一种个性化处理方式都会增加发送者的投入成本,也会提升礼物的价值感,因此团队会根据礼物的实际价值来选择适当的个性化程度。

5>决定礼物何时送达

发送者通常会在想起的时候才去发送礼物,但这个时间往往并不是收件人期望的接收日期。Revolut会安排在收件人的早晨送礼,Apple Store则会选择今天或用户指定的日期送礼,而Urban Outfitters则允许最多提前90天送礼。这样的安排使得发送者可以根据自己的意愿随时发送礼物,而且礼物仍然能够按时送达。

6>决定双方能看到哪些信息

在这个过程中,存在两种不同的处理方式,各种应用程序也在这方面存在差异。Uber、DoorDash、Uber Eats和Grab会在支付之前向收件人展示礼物的具体内容;而Grab还会在屏幕上显示“最后确认”提示,这让购买体验型礼物的发送者感到安心,因为他们知道自己永远看不到这些礼物具体的内容。Apple Store则会隐藏礼物的详细信息,不让收件人看到;而Telegram的“隐藏我的名字”功能和Twitch的“匿名送礼”功能则能保护发送者的隐私。

发送者在面对这六个问题时会依次遇到它们,而研究中的这些应用程序则是这样解决这些问题的:

)
# 问题应用程序的处理方式
1 接收者可能没有账户 要求接收者提供电话号码或电子邮件地址,然后会在接收时创建账户
2 接收者从未同意接收消息 发送者在发送任何内容之前会先确认接收者的许可
3 发送者不知道接收者想要什么 让接收者自己选择,或者将选项限制为两三个
4 只赠送最基本的内容显得太不贴心了 提供一些个性化选项会比单纯的礼物更好,但也不能过度
5 发送者提前行动了,但接收日期却较晚 可以安排定时送达,并设定一个时间范围
6 礼物的内容和接收者的身份信息是两个不同的信息 需要接收者和发送者分别做出决定,同时发送者还可以预览接收者的界面显示效果

领取页面能让礼物变成新客户

礼物通常会以链接的形式出现在短信、电子邮件或应用程序消息中,接收者点击链接后就会看到有人送来的礼物以及打开礼物的方法。设计者们将这个页面称为“领取页面”。在九种可能的场景中,最终都会进入这个页面,因为发送者的操作流程在支付环节结束,而接收者的操作流程则从这里开始。

出现在这个页面上的接收者可能之前从未使用过该产品,但他们收到的其实是一个已经由朋友付费购买的商品。市场拓展团队将这种营销模式称为“通过礼物吸引新客户”。发送者承担了获取客户的成本,而是否真正能够将这位客户转化为公司的会员,则取决于领取页面的设计。

Thrive Market的四个页面示例:一个‘赚取现金’板块提供30美元用于购买会员资格;一个电子礼品卡产品页面说明该礼品永远不会过期;一个‘使用说明’部分指出非会员接收者必须先创建账户才能兑换礼品;还有一个页面展示了59.95美元的会员资格与25.00美元购物积分之间的选择

在这个页面上,必须按照以下两个步骤依次操作才能成功领取礼物。

首先,接收者需要完成礼物的打开过程。如果有人在中途放弃,就永远不会进入账户注册环节。Meta Quest会要求输入一个25位数字的验证码,这样原本陌生的链接就会变成一个有明确完成目标的操作;而Binance、Finch和Shopee等应用程序则会播放领取动画,从而延迟信息的展示时间,并鼓励接收者继续操作。这些应用程序通常会将这个按钮放在接收者最有可能关闭页面的位置。

然后,产品会要求接收者创建账户,而这个注册环节才是真正实现转化的关键步骤。Thrive Market在其官方说明中明确提到了这一点:如果接收者还不是会员,就必须先创建账户才能打开礼物。Instagram也会将赠送给创作者的订阅服务设置为未激活状态,直到接收者在收件箱中点击领取才会激活它,因此在此期间发送者并没有支付任何费用。最终是由接收者使用自己的账户来支付礼物的费用,并且他们会自愿这样做,因为他们已经看到了一份值得拥有的礼物在等着他们。

<如果一个团队在客户进行任何操作之前就弄错了领取礼物的流程,那么这个客户就会流失。

五个设计决策最终演变成了工程问题

<当一个人为礼物付款,而另一个人接收礼物时,接收礼物的人可能还没有账户。这样一来,礼物可能在对方打开之前就失效了。

<由此会产生五个问题,而提前解决这些问题就可以避免以后出现更大的麻烦。

这张状态图展示了礼物从草稿状态、待支付状态、计划发送状态、已送达状态到被领取状态的整个流程。当卡片支付失败、送礼者取消操作或领取期限结束时,系统会进入相应的失败、取消或过期状态。其中“已被领取”是理想的状态,而其他三种状态都会将钱退还给送礼者。所有终端状态都是最终状态。 <上图展示了礼物在流转过程中会经历的九个状态,而下面提到的五个问题就发生在这些状态之间的某些转换环节中。

<最上面一行代表了大家通常设计的流程:礼物在送礼者填写信息时处于草稿状态,在结账时进入待支付状态,按照计划安排在指定时间送达接收者手中,收到后则进入已被领取状态。只有接收者才能完成这个最后的领取操作。

<最下面一行则包含了所有其他可能的情况,大部分设计工作也都集中在这一部分。如果卡片支付失败,礼物就会进入待支付失败状态;如果送礼者改变主意,礼物就会进入已取消状态;未完成的草稿也会被归入这一类别。如果领取期限结束,礼物就会进入过期状态,随后系统会自动将其退还给送礼者。其中三种状态都是最终状态,意味着礼物的后续处理就此终止,而且钱也会被退还给送礼者。

1. 一份礼物需要两个人参与,才能完成整个流程——在他们中的任何一个人创建账户之前,这份礼物都无法真正开始它的“旅程”。

<一份礼物具有两种身份属性,每种身份都会带来不同的问题。

<送礼者的身份信息不能简单地从账户中获取。Uber Eats要求用户必须填写送礼者的姓名,而不是自动推断出来,因为付款人可能是代表家庭、团队或公司来购买礼物的,而礼物上的姓名其实是一种信息表达方式,而非账单记录。

<接收礼物的人的身份信息可能根本不存在。Uber Eats、Thrive Market和Blank Street这些平台都接受纯电子邮件地址或电话号码作为识别依据,因此应用程序可以在接收者领取礼物的那一刻为他们创建相应的账户信息。

第二个决定具有重要的商业意义。那种需要用户先注册账户才能赠送礼物的系统,只会将礼物送给已经成为其客户的人,因此这种送礼功能实际上更像是一种维护客户忠诚度的手段,而非吸引新客户的工具。企业本来设立送礼功能是为了吸引那些尚未成为他们客户的人群,但既然有了这样的要求,那么设立这一功能的意义就大打折扣了。Thrive Market和Blank Street这两种平台会让接收礼物的账户保持空白状态,直到有人来领取礼物。

对于那些从未注册过任何服务的人来说,这种送礼功能其实是在向他们发送某种信息,在美国,这类信息受到TCPA法规的约束。DoorDash要求发件人在发送短信之前确认已经获得了接收者的许可,而这个复选框的存在正好满足了这一规定。

然而,当企业将用户的操作结果仅以“是”或“否”的形式进行存储时,两年后一旦出现纠纷,企业就不得不去证明发件人当初同意了什么内容。而此时,相关的同意书文本可能已经经过三到四次修改。虽然系统中保存的“是”这个结果能够证明用户确实进行了操作,但这个结果并不能说明用户具体同意了哪些条款。

为了解决这个问题,可以在系统中设置两列数据:一列用于存储同意书的版本标识符,另一列用于存储时间戳。这样,无论将来出现什么纠纷,都可以通过这些数据来进行查询和核实。

3. 定时送礼功能必须能够在时钟规则变更的情况下依然正常运行。

Revolut承诺会在接收者所在时区的早上八点送达礼物。如果发件人在伦敦为悉尼的朋友安排生日礼物,那么这个送礼时间就必须按照悉尼的时区来计算,否则礼物就会在前一天晚上送达。

各国政府通常会提前几个月通知公众调整时钟规则,因此,在购买礼物时记录的时间戳在礼物实际送达时可能会出现误差。不过,Revolut通过指定具体的日期和时区来确保送礼时间的准确性,只有在实际发送礼物时,这个时间才会被最终确定下来。

当接收者点击“领取”按钮时,如果网络连接速度较慢,可能不会立即看到任何反馈信息,于是他们会再次点击。无论是哪一次操作,系统都会识别出是同一份礼物,并且都会显示该礼物尚未被领取,随后就会完成付款流程。在整个系统中,没有任何错误记录能够说明这笔交易出现了问题。

为了解决这个问题,系统会通过一次条件判断来确保第二次操作时确实已经没有可以领取的礼物了。接下来我们会进一步讨论这个相关内容。

5. 不同类型的礼物的有效期遵循不同的规则。

Binance将红包视为一种社交活动工具,因此允许其在45秒后失效;而购买的礼品卡则属于另一种性质的法律物品。在美国,《CARD法案》通常规定存储价值的礼品卡的有效期不得少于五年,不过有些州的规定更为严格。

如果所有四种类型的礼物都采用相同的有效期设置,那么这一功能就会引发合规性问题。因为每种礼物的有效期都是根据其性质来确定的,而且退款操作和实际送礼行为也是属于不同的事情,因此需要将它们分别记录在系统中。

一份礼物需要十七列来存储其相关信息

这五个决策最终都与数据存储有关,解决这些问题后就会得到一张包含十七列的表格。这些信息可以被分为五组。

  • 身份信息,需要六列,因为一份礼物有发送者和接收者,而接收者可能还不存在。

  • 同意意愿,需要两列,因为必须保留复选框这一记录作为证据。

  • 配送信息

    , 需要两列,因为发送者的意图通常是一个具体的日期和时区,而不是立即交付。

  • 有效期及处理结果,需要三列,因为“过期”“被领取”或“已退款”是三种不同的情况。

  • 金额与货币信息,需要四列,包括金额、货币种类、记录的唯一标识符,以及该记录在状态图中的位置。

研究中的四个应用程序早在几年前就已经确定了其中六列的内容,然后不自觉地在自己的用户界面中展示了这些信息。

用户界面上显示的内容 对应的列名
Uber Eats:将“这份礼物的发送者是谁?”设为必填项 sender_name
Uber Eats:将“接收者的电话号码”设为必填项 recipient_phone
Telegram:提供“隐藏发送者信息”的选项 hide_sender
Thrive Market:有说明非会员也需要创建账户才能领取礼物的条款 recipient_id,该字段可以接受空值
Duolingo:按钮状态会从“礼物”变为“已发送” status
Duolingo:礼物的价格用“宝石数”而非“美元”来表示 currency,这个字段的长度不能为三个字母

PostgreSQL会按照以下结构生成数据库表,其中每个非显而易见的列名都会标注出对应的应用程序名称,因此读者可以通过这些列名来对照上面的截图。如果跳过SQL代码,读者只会错过这些列名而已;但实际上这十七列包含了所有必要的信息。

CREATE TABLE gifts (
  id            uuid PRIMARY KEY,
  status        text NOT NULL,   -- 上述九种状态之一

  -- 发送者和接收者的身份信息。Uber Eats要求发送者输入自己的名字,
  -- 而不是从账户信息中自动推断出来。
  sender_id     uuid NOT NULL REFERENCES users(id),
  sender_name   text NOT NULL,
  hide_sender   boolean NOT NULL DEFAULT false,   -- Telegram提供了这个选项

  -- 在领取之前,这些字段可以是空值。Thrive Market、Blank Street和Uber Eats
  -- 接受仅包含电子邮件或电话号码的信息,之后再创建相应的接收者账户。
  recipient_id    uuid REFERENCES users(id),
  recipient_email text,
  recipient_phone text,

  -- 同意意愿的相关信息。DoorDash会在发送信息之前确认接收者的同意,
  -- 根据TCPA法规,同意的文字内容也会被作为证据保存。
  consent_copy_version text,
  consent_at           timestamptz,

  -- 配送相关的信息。Revolut会承诺在接收者所在时区的08:00进行配送,
  -- 而各国的时间规则可能会发生变化。
  deliver_on    date NOT NULL,
  deliver_tz    text NOT NULL,

  -- 有效期的规定因对象而异:Binance的红包有效期为45秒,
  -- 根据美国CARD法案,存储型礼物的最低有效期为五年。
  expires_at    timestamptz,
  claimed_at    timestamptz,
  refunded_at   timestamptz,

  amount_minor  bigint NOT NULL,
  currency      char(3) NOT NULL,

  CONSTRAINT recipient_reachable CHECK (
    recipient_id IS NOT NULL OR recipient_email IS NOT NULL
                             OR recipient_phone IS NOT NULL)
);

Thrive Market、Blank Street以及Uber Eats会在之后根据地址来创建相应的账户。礼物可能在它的接收者出现之前已经存在了好几天,而可为空的recipient_id字段正是用来记录这一时间差别的;同时,底部的检查机制可以确保某一行数据不会在所有方向上都被视为“无法到达”的状态。

Revolut承诺会在早上八点发送礼物,而deliver_on与deliver_tz这两个参数则确保了礼物会按照接收者所在时区的时间来送达。如果使用固定的时间戳,就可能会完全错过八点的送达时间。不过,调度系统只需一次查询就能确定哪些礼物应该被发送。

-- 现在应该发送的礼物,按接收者而不是按服务器来处理。
SELECT id FROM gifts
 WHERE status = 'scheduled'
   AND (deliver_on + time '08:00') AT TIME ZONE deliver_tz <= now();

每隔几分钟就会运行一次这个查询的程序:悉尼的礼物会在悉尼当地的早上被发送出去,而伦敦的礼物则会在九小时后被发送;这样,每一条记录都会被正确地处理。即使政府在礼物购买时间和接收者生日之间调整了时间规则,同一条记录的处理结果也不会受到影响,数据库中的数据也不会被修改。

完成领取操作的整个流程只需要一条SQL语句,而WHERE子句的作用就替代了原本可能需要使用的锁定机制。

UPDATE gifts
   SET status = 'claimed', claimed_at = now(), recipient_id = $2
 WHERE id = $1
   AND status = 'delivered'
   AND (expires_at IS NULL OR expires_at > now());
两张图展示了‘领取’操作的不同处理方式。左图中,两次点击都会选中礼物,并都被视为已送达,结果钱包会被两次记入50单位的金额,且日志中不会出现任何记录;右图中,第一次点击会完成领取操作,第二次点击则会阻止进一步的操作,系统会重新检查<code>WHERE</code>条件,最终没有记录会被修改,因此钱包只会被记入25单位的金额。

第二次点击会执行同样的SQL语句,但会发现该记录已经被标记为“已领取”,因此系统会显示没有记录被修改;过期的礼物也会导致同样的结果。要区分这两种情况,只需要再查看一次status和claimed_at字段的值即可。

领取界面只能显示查询结果所反映的信息。如果接收者在礼物发送一个月后才点击链接,系统会向他们说明礼物已于3月12日被领取,或者礼物已经过期,钱款已退还给发送者;而对于那些从未保存过claimed_at字段的礼物,系统则会显示“出现了一些问题”,并引导用户联系客服。这些提示文本是由设计师编写的,而数据库的结构则限制了这些提示信息能够有多真实。

如何为产品选择合适的处理方案

尽管存在九种不同的处理方案,但实际上一个产品很少需要使用其中多种。下图展示了构建每种方案所需消耗的屏幕资源数量。

这张图表展示了构建每种赠送流程所需的具体屏幕操作次数。其中,‘货币包装’功能所需的屏幕操作次数最多,中位数达到了12次;其次是‘存储价值’功能,需要8.5次屏幕操作;‘结账附加销售’功能需要5.5次,‘分享进度’功能也需要5次,‘社交货币’功能需要4次,而‘订阅推广’功能则只需要3.5次。每个条形图都展示了观察到的最短和最长的操作流程次数,相关应用的名称也分别标注在每个场景旁边。

在所测量的六种赠送流程中,‘货币包装’功能所需的屏幕操作次数最多,中位数达到了12次;而GoPay平台在提供主题信封、名人语音留言、推荐祝福语以及未开启礼物的追踪功能时,同样需要16次屏幕操作。Telegram的整个赠送流程只需4次屏幕操作,Duolingo也需要3次,因为这两种平台的操作都是从接收者已经出现在屏幕上这一状态开始的,而且所需金额也只需要轻轻一点即可输入。

对于那些需要结账功能的产品来说,应该首先开发‘结账附加销售’环节。有12款应用实现了这一功能。具体实现方式包括一个切换按钮、一个消息输入框以及订单页面上的一列信息,这些设计都是针对那些已经准备好赠送礼物的发送者而言的。

与特定文化节日或场景相关的赠送功能,通常由19款应用提供。这一功能比其他任何场景都更受应用开发者重视,因为预先写好的祝福语在转化用户购买决策方面起到了关键作用。因此,开发这类功能的成本更多被用于编写信息内容,而非工程开发上。

对于订阅制产品来说,应该首先设计‘订阅推广’环节,并且要为此付出一定的成本来激励发送者参与。Thrive Market会为新会员提供30美元的商店积分作为奖励,而且从不投放任何广告。

用户之间的实时互动为社交赠送功能提供了可能性。Telegram和Twitch都推出了相关的活动。要实现这一功能,需要设计一种货币系统、设置充值流程以及制定管理规则,之后才能让设计师开始制作礼物图案。

当人们有共同的目标或正在坚持做某件事时,‘分享进度’功能的赠送环节就显得非常合适。在58款应用中,有2款应用实现了这一功能,平均需要5次屏幕操作。对于任何已经拥有好友列表的应用来说,这个需求都是可以满足的。当应用程序知道有人落后于进度时,一份实用的礼物往往比单纯的通知更能起到激励作用。

对于其他所有的赠送场景来说,礼品卡仍然是一种非常有效的工具,前提是设计师能够为它设计出合适的呈现方式。‘存储价值’功能的实现所需屏幕操作次数从Urban Outfitters的3次到Shopee的17次不等,这一差异充分体现了设计师在流程设计中的重要作用——他们可以大幅改变整个操作流程的长度。

结论

在赠送礼物的过程中,时机选择比设计本身更为重要。在这项研究涉及的58款应用中,9种不同的赠送场景主要在于它们选择在什么时刻向用户提出赠送请求。其中8种场景都是基于产品已经具备的某些条件来触发这一请求的,比如购物车已满、日历上标有特定日期、正在进行的实时对话,或者共同目标未能按计划完成等等。

无论一款产品采用哪种赠送场景,在具体的操作流程中都会遇到同样的六个问题:如何确定接收者的身份(如果接收者还没有注册账户),以及如何决定双方各自能看到哪些信息。‘确认收款’环节对于确保资金能够顺利回流至关重要。而当接收者收到的礼物其实是朋友已经付费购买的时,这一功能就最接近于吸引新客户了。

在那些界面上做出的五项设计决策最终会被存储在数据库中,形成一张包含十七列的表格。而在开发人员开始实际开发之前解决这些问题,只需要进行一次沟通即可,而无需进行数据迁移操作。

实际上,这些设计的实施成本并不像看上去那么高。例如,在Duolingo平台上,设置一个“完成检查”功能只需要几个界面;而实现学习进度共享的功能则只需要五个界面而已。Duolingo的“好友助力计划”能够及时发现哪些学习者需要帮助——比如当他们还有三天时间、但还需要学习15节课时,系统会自动在发送礼物的用户能轻易找到的地方提供一份含有20颗宝石的奖励道具。这种送礼方式几乎不会产生任何额外成本。

在这项研究中,有22款应用程序选择直接出售礼品卡,这些礼品卡会放在“账户”菜单中,等待那些已经决定要赠送礼物的用户来使用。“好友助力计划”这个功能的开发成本并不高,而且它会在学习者考虑好要送给哪位朋友的时候,及时提醒他们使用这一功能。

相关文章

技术实践

如何利用功能标志来实现安全、渐进式的功能推出

功能开关是团队在部署过程中最强大的工具之一。它们将 部署 与 发布 分离开来,这意味着你的持续集成/持续交付流程可以在每次代码合并时都将更新推送到生产服务器上,但只有当你明确启用这些功能开关时,用户才会看到新的变化。 “部署”是一个技术性操作,而“发布”则是一项产品决策。正是这种分离机制,使得本文中讨论的诸多内容成为可能。 然而,如果实现不当,功能开关反而会带来技术债务、测试难题以及运行时的复杂性。在这篇文章中,你将学习到实施功能开关的核心方法——从简单的布尔值切换,到基于百分比的比例化部署方案,再到针对不同用户群体的功能启用策略,同时还会了解相关的生命周期管理方法及应避免的错误做法。以下就是

阅读全文
技术实践

如何负责任地使用Lovable产品

过去,开发应用程序往往就像在没有任何说明书的情况下组装家具,而且还会缺少一半的螺丝。如今,像Lovable这样的人工智能工具可以帮助你用简单明了的语言描述自己的需求,从而将一个想法转化为可运行的网页应用。 这确实很令人兴奋——但同时也意味着一种责任。 Lovable能帮助你快速行动、尝试各种想法,并创造出实用的软件。不过,速度绝不能取代周密的思考。由人工智能生成的程序可能会存在安全问题、导致用户使用体验混乱、包含不准确的信息,或者其代码在演示环境中可以正常运行,但在实际使用中却会出故障。 在这份指南中,你将学习到如何在实际使用Lovable的过程中兼顾安全性、隐私性、可访问性以及用户的安全。我

阅读全文
技术实践

重新定义GIS:JupyterGIS中的声明式符号系统与协作工作流程

JupyterGIS是一款专为Jupyter笔记本设计的、专注于GIS功能的扩展插件。最新发布的0.16版本增强了协作功能、实时编辑能力,并提升了对大规模数据处理的支持力度,尤其是针对遥感数据的处理。该版本还提供了更强大的可视化工具,并进一步提升了与R语言用户的兼容性。社区用户反馈指出,目前该插件在实用性方面还存在一些不足,同时人们也希望能进一步提升其便携性。 作者:Olimpiu Pop

阅读全文
技术实践

JEP 540的建议是将该功能应用于JDK 28版本,并提供简单的JSON接口供使用。

JEP 540——这个简单JSON API项目,目前已经进入了JDK 28版本的开发阶段。该API提供了一种无需依赖任何外部库即可解析和生成JSON文档的功能。它专注于实现核心功能,同时提供了不可变的值结构;这种API允许用户进行简单的遍历和数据转换操作,并且严格遵守相应的语法规范。在测试阶段收集到的用户反馈将会对它的后续发展产生重要影响。 作者:A N M Bazlur Rahman

阅读全文