2025年假日购物季期间,美国消费者在礼品卡上的花费约达290亿美元,其中43%的人至少买了一张。据美国零售联合会统计,在人们最想收到的礼物清单上,礼品卡高居榜首。
这些数字解释了商家为什么要备货礼品卡,却没有回答一个更关键的问题:产品该在什么时机引导用户送礼,效果才最好。本文将探讨送礼功能在你的应用里到底值不值得做。为了回答这个问题,我调研了Mobbin参考库中的58款应用。
送礼的形式五花八门:礼品卡、赠送订阅、直播打赏、结账加购,都在此列。这58款应用中,有49款提供了用户可以完整走通的送礼流程,触发方式多达九种。
举个例子:Etsy会记住购物车里的商品,Duolingo的界面上已经显示出挑战搭档完成的课程数,Blinkit则把各个节日提前排进了商品运营日历。每款产品都心里有数——用户会在什么时候送出礼物。
下文将逐一剖析这九个送礼时机,说明各自的开发成本,以及在开发人员动手之前,需要先设计出哪些界面。
前置知识
要跟上本文的思路,你需要具备:
有设计或用户研究方面的功底,熟悉消费级产品的用户流程——入口、流失、转化这些词对你来说张口就来。
对获客经济学有基本认识,包括获客成本、激活,以及推荐激励的定价为何不同于追加销售。
SQL水平只需达到能读懂
CREATE TABLE语句的程度,完全不需要会写。用到SQL的两个章节都做了标注,即使跳过,设计方面的结论也依然成立。
目录
九个场景中有八个存在触发条件
以下是全部 58 款应用的分布情况(有些应用不止出现在一行里)。举个例子,仅 Uber Eats 一家就用到了其中五种场景。
| 场景 | 应用数 | 触发条件 |
|---|---|---|
| 结账追加销售 | 12 | 购物车已满,付款卡已经掏出 |
| 转账包装 | 4 | 一笔转账——只给一个数字,显得冷冰冰 |
| 节庆场合目录 | 19 | 日历上的某个节日或生日 |
| 平台发放礼品 | 5 | 公司希望用户重复执行的操作 |
| 以赠礼为名的推荐 | 7 | 某件事刚顺利完成的时刻 |
| 共享进度 | 2 | 一个双方投入明显失衡的共同目标 |
| 即时互动中的社交货币 | 10 | 此刻正在发生的互动 |
| 储值类,即礼品卡 | 22 | 需要用户自己主动去找 |
| 订阅培育 | 9 | 身为一名满意的订户 |
推荐奖励,是为一次成功引荐付给推荐人的钱;平台发放礼品,则是公司直接送给自家用户的奖赏。所以在这两行里,钱和收礼人本来就都握在公司手中,如下图所示。
礼品卡在数量上遥遥领先。它也是表里唯一没有触发因素的场景——想送卡的心意,只能先于应用出现在用户心里。
清单上其余每个场景,存在的意义都在于抢在送礼者想到之前,替他备好那份理由。如果只把礼品卡功能做出来就止步于此,需求也会随之中断。
这一区分直接关系到团队决定要打造什么。礼品卡是一件用来购买的商品,而不是一个促成购买的理由。因此,只上线了礼品卡便就此打住的团队,建成的只是赠送的供给侧,而非需求侧——这个功能会静静躺在账户菜单里,等那些本来就打算用它的人找上门。
另外八种场景的存在,正是为了制造这份意愿——每一种都把请求挂到产品本来就能识别的某个时刻上。
每个场景都是一次触发与一次强化的搭配
下面每一项都会说明是什么触发了该场景,让第一次赠送延续为第二次。
储值卡,出现在 22 款应用中
赠送者选定金额档位,挑一张卡片样式,填好“送给”与“来自”,写上留言,然后结账。22 款应用采用的都是同一套流程。它是研究中最常见的赠送功能,设计投入却是所有场景里最少的。
触发:赠送者要打开菜单、主动寻找,才能到达礼品卡页面——想送礼的念头在应用出手之前就已经存在。另外八种场景要做的,恰恰是替用户补上这个念头。
强化:Blank Street、Airbnb 和 Blue Apron 支持预约投递时间,赠送者一想到就能先行安排,而不必等到当天再动手;Urban Outfitters 则把预约期限设在九十天以内。预览功能让赠送者准确看到收礼者将看到的内容。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 款应用按场合来编排商品目录,这让日历成为八种自带触发的场景中普及度最高的一个。页面顶部的标签页负责提示。
赠送者来到这个页面时,心里未必想到什么场合,标签便替他们补上了。Starbucks 用上了父亲节、毕业季、生日和感谢这几类标签,Walmart 则多加了一个叫 Just Because 的标签,专门覆盖那些压根算不上由头的日子。
地区性的节日日历才是关键。Blinkit 和 Zomato 押注兄妹节(Rakshabandhan),GoPay 押注开斋节(Lebaran)和 THR 节日津贴,Shopee 押注毕业季(Selamat Wisuda),而一套只覆盖美国节日的运营方案,根本触达不到这些买家。
触发点:日历给出了一个日期,送礼者本来就觉得在这个日子不得不有所表示。
强化点:节日直接带来贺卡画面和配套文案,送礼者完全不必自己想祝福语。GoPay 先给出主题信封,再附上名人语音留言,最后还推荐一句祝福,风格类似"别长大,长大是个坑"。
谁在用:Uber、Uber Eats、Postmates、Starbucks、sweetgreen、Walmart、Amazon、Shopee、Grab、Blinkit、Zomato、Ulta Beauty、SKIMS、GoPay、Letterboxd、Nike、Shipt、Target、Faire。
结账追加销售,12 款 App 实例
十二款 App 在购物车流程中、配送与支付环节之间塞进一个开关:Etsy 和 Instacart 用的是切换开关,Ulta Beauty 和 Yami 弹出底部面板,DoorDash 和 Uber Eats 则把它升级成结账清单里的一行。用户只需点一下就能完成。
触发点:买家这时已经掏出了付款卡,此时提出请求几乎零成本。
强化点:Ulta 的礼品袋收 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 款 App 实例
十款 App 把送礼嵌进了实时互动里,并用平台自有货币计价。Telegram 的货币叫 Stars,用它送出的礼物会出现在聊天记录中,背后还伴随彩带动画。
正因为聊天记录里有观众在围观,这份礼物买下的不是交情,而是曝光。
交友应用们已经想明白了怎么为这份曝光定价。Hinge 上的一朵玫瑰和 Coffee Meets Bagel 上的一朵花,兑现的都是 Coffee Meets Bagel 印在自己按钮上的承诺:送花能让发送者立刻获得展示。而 Telegram 补上了那个关键控制项,让这一切在社交空间里变得可行。
「隐藏我的名字」让送礼者对除收礼者之外的所有人隐去身份。Twitch 也以「匿名赠送」(Gift Anonymously)提供同样的选项。
触发: 送礼者想在直播评论区里压过其他争夺注意力的用户。
强化: 观众能亲眼看着礼物送达,Telegram 则用稀缺印章和分层阶梯为这一刻定价。100 Stars 售价 2.90 美元,35,000 Stars 售价 1,048 美元。换算下来,七个档位每 100 Stars 的单价在 2.88 到 2.99 美元之间——这套阶梯卖的是数字的大小,而不是折扣。
在 Twitch 上,单份赠送订阅的价格从 6.99 新元降到 5 份套餐时的 4.99 新元,之后无论买多少份都维持这个价,而划线价省下的差额始终醒目地显示着。任何要在这些标签上签字的设计师,都该先把每档价格除以数量再下结论。
谁在用: Telegram、Discord、Instagram、TikTok、Twitch、Azar、Binance、Badoo、Hinge、Coffee Meets Bagel。
订阅馈赠拉新:9 款应用
九款应用允许老用户为非订阅者购买试用——这是系着蝴蝶结的获客渠道。做得出诚意的产品会直接在界面上说明这一点。Thrive Market 干脆用美元来说话。
触发: 用户使用产品的时间够长,足以产生推荐意愿。Discord、Telegram 和 Headway 把入口放在设置页、付费墙或收礼者的个人主页上。
强化: Thrive Market 给送礼者 30 美元商店积分,作为赠送会员的回报——公司已经算过,这笔获客成本比其他渠道都划算。
Lovi 干脆不碰钱,直接往账户里放进 5 张礼品卡,每张可兑换七天的无限使用权。
Telegram 按订阅时长给 Premium 打折:三个月减 10%,一年减 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 款应用
有 5 款应用会主动给用户送上一份礼,还要为它造出一个由头。Grab 的“神秘奖励”承诺完成任务就有惊喜,随后播放一段拆盒动画;Temu 则直接发来一条消息:“您有 8 份礼物待领取。”
触发时机:公司希望某个行为被反复执行,于是给这个行为挂上一份奖品。
强化机制:Grab 以随机间隔发放奖励,再藏进一段揭晓动画——用户付出的只是时间,分文不花。未领取的数量用角标提示,到期倒计时则把好奇心逼成紧迫感。Finch 是本次研究里的异类,也是最温柔的一个:它只告诉收礼人,守护者们希望你享受这份礼物,说完便打住。
谁在用:Grab、Shopee、Temu、Everyday Rewards、Finch。
给钱裹上包装:4 款应用
有 4 款应用把钱本身看得无足轻重,设计功夫全花在包装纸上。币安的“红包”(Red Packet)用一句口令或一个二维码,把一笔随机金额拆给多位收款人;Revolut 则把到账时间安排在收件人自己时区的清晨。至于转账本身,不过一行字而已。
触发时机:送礼人想纪念一个日子,而一笔光秃秃的转账读起来未免冷冰冰。
强化机制:币安为整个兑换流程设计了时间机制:红包可在首次领取后四十五秒过期,计时器由发送者设定,未领取的金额三天后自动退回。Rewards Booster(奖励助推器)最高可将口令的曝光度提升 90%。GoPay 则把抽奖直接嵌进分享动作本身,每当有收件人领取,就送出 Coins。
谁在用:GoPay、Binance、Revolut、Satispay。
共享进度:仅 2 款应用
只有两款应用让礼物真正发挥了功能,而不止于象征意义——这也使共享进度成为整个研究中最罕见的场景。
多邻国的“好友任务”给两人设定一个共同目标,把各自的贡献并排呈现出来:一边的学习者停在一节课的进度上,另一边的 Sam 一节未动,而十五节课要在三天内完成。不等任何人想到送礼,这种不对等已经明明白白摆在了屏幕上。头像下方有两个按钮:NUDGE 和 GIFT。
触发点:多邻国展示一个正在进行中的共享目标,其中一名学习者明显落后。在用户主动寻找帮忙的办法之前,应用已经指出了是谁掉了队。
强化机制:学习者花掉自己的 XP Boost,任务进度随之推进。发送者在写留言时容易卡壳,多邻国干脆替他们写好。那二十颗宝石出自应用内的软货币,用完之后就得花真钱补充——于是,慷慨送礼与修补连胜驱动的是同一种消费。按钮随后翻转为 SENT 并保持不变,让这次赠送对双方都一目了然。
Finch 则在好友资料页上,把 Send Gift 放在 Share Goal 旁边,赠送一次要花 200 颗彩虹石。名单到此为止。
谁在用:Duolingo、Finch。
九大场景中反复出现的六个问题
无论团队选定哪种场景,发送流程中都会遇到同样这六个问题。下文逐一指出这些问题,并说明研究中各应用的应对之策。
1. 确认收件人——对方可能还不是用户
发送者最先在收件人一栏卡住,因为应用里没有现成的账户可供指向。研究中的流程会收取手机号或邮箱地址,并为两者都没有的人配上通讯录选择器;Grab 更是一次最多可发给十位收件人。凡是面向陌生人的应用,都选用成本最低、又能承载消息的标识符,账户则留到领取时再解决。
2. 在消息发给从未同意接收的人之前,先征得对方许可。
送出礼物会触发系统向一个与产品毫无关系的人发送短信或邮件。Uber Eats 和 DoorDash 都会要求发送方在收件人收到短信前确认自己已获对方同意,等于把这份责任转交给了唯一了解收件人的那个人。
3. 送礼人猜不透收礼人喜好时,如何选礼。
猜不透喜好的送礼人往往会中途放弃购买。Grab 和 Uber Eats 都选择把决定权交出去,而不是强人所难:Grab 最多提供三个选项让收件人自己挑选,Uber Eats 则在“让收件人自选送达时间”之外,还提供“订单取消时让收件人领取积分”的选项。
4. 决定礼物可以多有个人色彩。
光秃秃一个金额显得毫不用心,而每一层个性化都要多付一个页面的代价。个性化的层次从贺卡图案,到手写祝福,再到 GoPay 里的语音留言,以及 Uber Eats 和 Postmates 里的录制视频。每上升一级,送礼人的投入就多一分,普通金额看起来也更有分量,团队要做的,就是选出与礼物价值相称的那一级。
5. 选择礼物送达的时间。
送礼人往往是想起来才送,而那一天很少是真正重要的日子。Revolut 会把礼物安排在收件人当天早上送达,Apple Store 只允许今天或指定日期,Urban Outfitters 则可以提前最多九十天预约。定时功能让送礼人趁冲动当下行动,礼物仍能在合适的日子准时抵达。
6. 决定双方各自能看到什么。
这里涉及两个维度的保密,而各应用在这两点上各有取舍。Uber、DoorDash、Uber Eats 和 Grab 都会在付款前展示收件人将看到的完整界面,Grab 还给这个页面起了个名字——“最后确认一步”,让那些购买自己永远看不到的体验的送礼人更加安心。Apple Store 则反过来对收件人隐藏礼物内容,Telegram 的“隐藏我的名字”和 Twitch 的“匿名赠送”则对收件人隐藏送礼人身份。
发送方会按这个顺序遇到这六个问题,研究中各应用的应对方式如下:
| # | 问题 | 应用的应对方式 |
|---|---|---|
| 1 | 收礼人可能没有账号 | 只需手机号或邮箱,领礼时再创建账号 |
| 2 | 收礼人从未同意接收消息 | 发送方在发出任何内容之前,先确认已获许可 |
| 3 | 发送方猜不透对方想要什么 | 把选择权交给收礼人,或者收窄到两三个选项 |
| 4 | 光给一个金额显得没心意 | 比普通贺卡多一层个性化,到此为止 |
| 5 | 发送方提前行动,日期却在后面 | 定时送达,预约窗口设有上限 |
| 6 | 礼物内容和收礼人身份分别保密 | 经过两次专门决策,另外让发送方预览收礼人看到的界面 |
领取页把一份礼物变成一位新客户
礼物以链接的形式送到收礼人手上——可能在短信、邮件或应用内消息里。收礼人一点开,就会看到一个页面,上面显示有人送来了什么,以及打开的方式。设计师把它叫作领取页。九个场景无一例外都以它收尾:发送方的流程到付款就结束了,而收礼人的流程正从这里开始。
站在这个页面上的人可能从没用过这款产品,手里却拿着朋友已经付过钱的东西。增长团队把这种模式称为礼物驱动获客。获客成本由发送方承担,至于公司能否收获这位客户,就看领取页的表现了。
在这个页面上,有两步必须做对,而且顺序不能乱。
首先,收礼人得把礼物完整打开。半途而废的人根本走不到创建账号那一步。Meta Quest 要求输入 25 位验证码,把一条陌生的链接变成一项终点明确的任务;币安、Finch 和 Shopee 则各自播放一段领取动画,让揭晓时刻慢上一拍,算是对点击的奖励。应用们把这些设计恰好安放在收礼人本可能关掉标签页的位置。
接下来,产品会要求对方注册账号,而正是这个请求完成了转化。Thrive Market 在自家服务条款里写得直截了当:收礼人若还不是会员,必须先创建账号,礼物才会打开。Instagram 会把赠送的创作者订阅保持未激活状态,直到收礼人从收件箱里领取为止——也就是说,在此期间发送者付了钱,却什么也没得到。收礼人用一个账号“支付”了这份礼物,而且是心甘情愿,因为那份值得拥有的东西已经在等着了。
把领取页面草草做成占位页的团队,早在注册和转化发生之前,就已经把顾客弄丢了。
Uber Eats 保留了“我的礼物”标签页,Satispay 把“已发送”和“已收到”分成两栏,GoPay 则在未打开的礼物旁标注一行“待领取余额”。如此一来,一份没人打开的礼物反而成了发送者回来追进度的理由——发送者也有了可以查看状态的地方。而在本次研究中,其他所有产品的流程都是:款一付完,发送者就被晾在一边。
五个设计决策如何变成工程问题
一个人付钱送礼物,另一个人接收——而后者很可能压根还没有账号。礼物甚至可能还没被打开,就已经过期了。
由此衍生出五个问题。越早意识到这一点,就越能省去日后的推倒重来。
上面的示意图展示了一份礼物会经历的九种状态,下文讨论的五个问题,每一个都落在其中一条状态转换上。
顶行是所有人默认会设计的那条路径:礼物从草稿状态开始,此时发送者正在填写表单;进入结账环节后变为待付款;在送达时刻到来之前一直停留在已排期状态;到达收礼人手中时变为已送达;对方打开礼物的那一刻,最终定格为已领取。而最后这一步,只有收礼人自己能完成。
底行则是其余所有状态,大部分设计功夫其实都花在这里。刷卡被拒,礼物进入付款失败;发送者反悔,礼物变为已取消,被丢弃的草稿同样会停在这里;领取窗口到期,礼物变为已过期,随后自动转入已退款。这四个状态里有三个是终态,意思是礼物到此为止、再无下文,而这三个终态中的每一个,都会把钱退回发送者手中。
1. 礼物需要两个人参与,而他们可能都还没有账号
一份礼物牵涉两个身份,而每个身份都各自带来难题。
发送者的身份无法直接从账户里读出来。Uber Eats 要求用户手动填写发送者姓名,而不是自动推断,因为付款的人可能是在替家人、团队或用公司账号下单,礼物上的署名是传达给对方的信息,不是账单记录。
而接收者的身份可能根本不存在。Uber Eats、Thrive Market 和 Blank Street 都只要求一个邮箱或手机号,这样应用就能在对方领取的那一刻再为其创建账户。
第二个决策则关系到商业成败。如果产品要求接收者先有账户才能收礼,那它触达的只会是已有客户,送礼功能便沦为留存工具,而非获客工具。公司做送礼,图的就是触达自己还没有的用户;加了这个前提,等于抹掉了做这个功能的大部分理由。Thrive Market 和 Blank Street 都让接收者账户保持空白,直到有人真正来领取。
2. 同意记录必须作为证据存档。
送礼功能会向从未注册过任何服务的人发送消息,在美国,这类消息受《电话消费者保护法》(TCPA)约束。DoorDash 要求发送者在短信发出前确认已取得接收者同意,勾选这个框就算符合规定。
如果团队把这个勾选只存成一个 true 或 false,两年后投诉上门,公司必须拿出证据说明发送者当时同意了什么——可那时同意条款的措辞已经改过三四轮了。存储的 true 只能证明有人勾选过某个东西,却说不出那个东西到底写了什么。
两列就能解决这个问题:一列存同意文案的版本号,一列存时间戳,每个版本的措辞都保留存档。过去无法回应的争议,如今查一次表就能了结。
3. 定时送达必须经得起时制规则的变动。
Revolut 承诺礼物会在接收者所在时区的早上八点送达。伦敦的用户给悉尼的朋友安排生日礼物,这个承诺必须按悉尼时间兑现,否则礼物会在生日前一晚就到。
各国政府调整时制规则时往往只提前几个月通知,所以下单那一刻冻结的时间戳,到礼物该送达时可能已经不准了。Revolut 的承诺以日期加时区的形式保存,直到调度器真正运行时才换算成具体时刻。
4. 在“领取”上点两次,可能入账两笔。
接收者点了领取,网络慢时界面上毫无反应,于是再点一次。两个请求读取的是同一份礼物,都发现它尚未被领取,于是各自发放了一笔。钱就这样出去了,日志里却找不到任何报错。
只需一次条件写入就能解决问题,因为第二轮尝试时,会发现已经没有可领取的内容了。具体的语句放到下一节。
5. 不同类型的礼物,适用不同的过期规则。
币安把红包看作一种活跃气氛的互动玩法,45 秒不领就自动过期。而花钱购买的礼品卡在法律上属于另一种对象。在美国,《CARD 法案》一般禁止储值在五年内过期,有几个州的规定还要更严。
四类礼物若共用同一个过期时长,整个功能就会变成合规问题。每种礼物都应携带各自的过期时间,由其对象类型决定;“已过期”和“已退款”也要分成两条独立记录,因为“欠着一笔退款”和“退款已经发出”是两种不同的事实。
一份礼物需要 17 个字段来存储
前面这五个决策,最后全都落到存储上;把它们一一回答清楚,就得到一张含 17 个字段的表。这些字段可以归为五组。
身份,6 个字段,因为一份礼物既有发送者也有接收者,而接收者此时可能还不存在。
授权确认,2 个字段,因为勾选框必须作为证据留存下来。
送达,2 个字段,因为发送者表达的意图是“某天某个时区”,而不是一个精确的时间点。
过期与结果,3 个字段,因为过期、已领取、已退款是三种彼此不同的事实。
金额与状态,4 个字段,涵盖金额、币种、这行记录的标识符,以及它在状态图中所处的位置。
本次研究涉及的应用里,有 4 款早在多年前就把其中 6 个字段确定了下来,随后又在无意间把它们摆上了自家界面。
| 界面上显示的内容 | 背后对应的字段 |
|---|---|
| Uber Eats:“礼物来自谁?”为必填项 | sender_name |
| Uber Eats:“收件人手机号码”为必填项 | recipient_phone |
| Telegram:“隐藏我的名字”开关 | hide_sender |
| Thrive Market:条款写明非会员需注册账号才能兑换 | recipient_id,此字段必须允许空值 |
| Duolingo:按钮文字从 GIFT 变为 SENT | status |
| Duolingo:礼物以 20 颗宝石计价,而非美元 | currency,不能简化成三个字母的货币代码 |
完整的建表语句如下。每一列只要含义不够一目了然,都会附带注释,标明它来自哪个应用,因此任何一行都能对应回上面的截图。读者直接跳过 SQL 也一无所失,除了那几个列名——仅仅十七列,就撑起了整个功能。
CREATE TABLE gifts (
id uuid PRIMARY KEY,
status text NOT NULL, -- one of the nine states above
-- Two identities. Uber Eats asks the sender to type their own name
-- rather than inferring it from the account.
sender_id uuid NOT NULL REFERENCES users(id),
sender_name text NOT NULL,
hide_sender boolean NOT NULL DEFAULT false, -- Telegram ships this toggle
-- Nullable until the claim. Thrive Market, Blank Street and Uber Eats
-- accept a bare email or phone and create the person on the other end later.
recipient_id uuid REFERENCES users(id),
recipient_email text,
recipient_phone text,
-- Consent as a record. DoorDash confirms permission before the text goes
-- out, and under the TCPA the evidence is which wording was agreed to.
consent_copy_version text,
consent_at timestamptz,
-- Delivery intent, not an instant. Revolut promises 08:00 in the
-- recipient's own timezone, and governments move clock rules.
deliver_on date NOT NULL,
deliver_tz text NOT NULL,
-- Expiry differs by object: 45 seconds for a Binance red packet,
-- five years minimum for US stored value under the CARD Act.
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 便能在收件人所在的时区兑现这个承诺——若只存一个冻结的时间戳,“八点整”这层含义便会彻底丢失。调度器只需一条查询,就能找出所有到期的任务。
-- Gifts due now, resolved per recipient rather than per server.
SELECT id FROM gifts
WHERE status = 'scheduled'
AND (deliver_on + time '08:00') AT TIME ZONE deliver_tz <= now();
一个每隔几分钟运行一次的工作进程,会在悉尼的清晨送出悉尼的礼物,九小时后再送出伦敦的那份,各自只涉及一行记录;而一旦某个政府在购买与生日之间更改了时钟规则,同一行记录就会给出不同的答案。这张表本身却纹丝不动。
这个断言本身就浓缩在一条语句里,而 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());
第二次点击执行同一条语句,发现该行已经变成 claimed,报告影响零行,于是钱只会扣一次。礼物过期同样返回零行。要区分这两种情况,只需多读一次 status 和 claimed_at。
领取页面能显示什么,完全取决于这次读取返回了什么。收件人在链接发出一个月后才点开时,看到的应是一段清晰的说明,而不是空白页面或一个干巴巴的“错误”:礼物已于 3 月 12 日被领取,或者已经过期、钱款已退回发送者。如果产品从未存储 claimed_at,就只能退回那句“出了点问题”,把用户打发去客服。这些文案由设计师来写,但能写到多诚实,上限是由表结构决定的。
如何为产品挑选合适的场景
场景虽有九种,一款产品却很少需要用上多种。下图以页面数为单位,统计了各场景的开发成本。
在统计的六种场景中,包钱红包成本最高,中位数达十二个页面;GoPay 更是用了十六个页面,才做出主题信封、明星语音祝福、推荐祝语和未拆礼物提醒这一整套功能。Telegram 的整个赠送流程只用四个页面,Duolingo 只用三个——因为两者一进来就把收件人放在首屏,金额也只需再点一下。
有结账流程的产品,应当优先开发结账加购。已有十二款应用上线了这一功能。整个开发量不过是一个开关、一个留言输入框,再加上订单表里的一列,而它面对的,正是那些已经掏出银行卡的送礼者。
周期性出现的文化时刻指向了场合目录。共有 19 款应用提供这一功能,多于任何其他场景,而且预置文案承担了大部分转化工作,所以预算主要花在撰写分类页签和祝福语的人身上,而不是花在工程上。
订阅制产品应该靠赠送拉新,并且应该给送礼人付报酬。Thrive Market 用 30 美元商店抵用金换来一位新会员,广告则一支都没投过。
用户之间的实时互动,为社交赠送打开了大门。Telegram 和 Twitch 做的事情,本质上是裹着礼品纸的曝光位竞拍。做这个功能,虚拟货币、充值流程和内容审核规则都得先定下来,然后才轮到插画师去画那只泰迪熊。
共同目标或连续打卡,让进度赠送成为顺理成章的选择。58 款应用中有 2 款做了这个功能,流程中位数只有 5 个屏幕,任何已有好友列表的产品都够得着。应用明明知道有人落后了,与其再推一条通知,不如送上一份像样的礼物。
至于其余场景,礼品卡同样管用,前提是设计师给它一个像样的入口。储值流程从 Urban Outfitters 的 3 个屏幕到 Shopee 的 17 个屏幕,是所有场景中差距最大的一档。这道差距恰恰说明,流程里有相当一部分是设计师塑造出来的,而不是简单拼装出来的。
结语
赠送这件事,时机先于设计。在本研究覆盖的 58 款应用中,九种场景的主要差别,就在于各自选择开口的时机。其中八种都把开口挂在了产品已经掌握的事实上——一份装满的购物车、日历上的某个日子、一场正在进行的对话,或者一个进度落后的共同目标。
无论产品上线哪种场景,发送流程都会撞上同样的六个问题,从如何识别一位没有账号的收礼人,到双方各自能看到什么。而真正把钱赚回来的,是领取页。一个手里握着朋友已付款礼物的收礼人,是这个功能距离新用户最近的一刻。
在那些页面上做出的五项设计决策,最终会以一张 17 列的数据库表落定。赶在开发动手之前把它们敲定清楚,代价只是一次讨论,而不是一次表结构迁移。
实际成本比看起来要小:结账处加一个开关只需几个屏幕,Duolingo 的共同进度也只用了 5 个。Duolingo 的好友任务(Friends Quest)早就知道有位学习者需要帮助——还剩 3 天、15 节课没完成——并把一颗 20 宝石的 XP 加成放在了送礼人一眼就能找到的位置。这份礼物几乎没花什么成本。
研究中的 22 款应用则选择改卖礼品卡,静静躺在账户菜单里,等一位早已打定主意的送礼人。好友任务页面的开发成本并不比它高,却恰好在学习者正想着“要送给哪位朋友”的那一刻开口。