← 文章 / 产品与设计
freeCodeCamp 5小时前 · 2026-09-15 05:54:07 · 7 阅读

设计用户真正使用的礼品功能:基于 58 款应用的证据

2025 年假日购物季,美国消费者在礼品卡上的支出约为 290 亿美元,其中 43% 的人至少买过一张。据全美零售联合会(National Retail Federation)的调查,礼品卡高居人们“最想要的礼物”榜首。

这些数字解释了公司为什么要备货礼品卡,但它们并没有告诉我们:产品应该在什么时候引导用户送出礼物,才能获得最好的效果。本文将探讨送礼功能是否值得做进你的应用。为了回答这个问题,我调研了 Mobbin 参考库中的 58 款应用。

这里的“送礼”涵盖很广:礼品卡、赠送订阅、直播打赏,或结算时的加购项,都算在内。这 58 款应用中,有 49 款带有用户可以从头走到尾的送礼流程,触发方式多达 9 种。

举例来说,Etsy 会保存购物车内容,Duolingo 会在界面上直接显示好友的课程进度,Blinkit 则把节日纳入了营销日历。每款产品都清楚用户在什么时候可能想送出礼物。

下文将逐一介绍这 9 个触发时机,包括各自的开发成本,以及在开发动手之前需要设计好的界面。

前置知识

阅读本文,你最好具备:

  • 一定的消费类产品设计或研究经验,熟悉入口、流失、转化这些日常概念。

  • 对获客经济学的基本了解,包括获客成本(CAC)、激活,以及为什么推荐激励的定价逻辑不同于追加销售。

  • 能看懂 CREATE TABLE 语句的 SQL 基础。你不需要亲手写,用到 SQL 的两节会明确标出;即使跳过,设计方面的结论也完全独立成立。

目录

九类场景中有八类存在明确触发点

以下是 58 款应用的分布情况(部分应用横跨多行)。例如,仅 Uber Eats 一家就覆盖了上述五种场景。

场景 应用数 触发条件
结账加购 12 购物车已装满且用户已输入卡片信息
资金包装 4 转账时,纯数字显得过于冷冰冰
节日目录 19 日历上的节日或生日
平台发放礼物 5 公司希望用户重复执行的动作
拟赠型推荐 7 刚刚完成一次顺利体验之后
共享进度 2 目标可见且双方进度明显失衡的共同目标
即时社交货币 10 正在发生的实时互动
预存价值(即礼品卡) 22 用户需主动寻找
订阅激励 9 成为满意的老订阅用户

推荐奖励支付的是发起者引荐新用户的费用,而平台发放的礼物则是公司颁给自家用户的奖品。因此,在这两类场景中,资金和接收方在本质上已归属公司,如下方图表所示。

条形图展示了 58 个应用中礼品功能的引入环节。储值礼品卡以 22 个应用居首,因缺乏触发点故以空心显示;其次是 occasion catalogue(19)、checkout upsell(12)、social currency(10)、subscription seeding(9)、referral(7)、platform-issued gift(5)、money wrapping(4)和 shared progress(2)。Referral 和 platform-issued gift 的条形图颜色较浅并带有方括号,因为这两种场景实际上并未发送礼品

礼品卡在数量上遥遥领先。在列表中,它也是唯一不需要任何触发的场景,因为赠送的意愿必须在使用应用之前就已经产生。

列表上的其他所有场景,目的都是在赠送者想到之前提供这个理由。如果只开发礼品卡功能并止步于此,需求侧也会被随之切断。

这种区别对团队决定构建什么功能至关重要。礼品卡是购买对象,而非购买理由。因此,只开发礼品卡并止步于此的团队,构建的是礼品交易的供给侧而非需求侧,该功能只能躺在账户菜单里,等待那些已经打算使用它的用户。

其余八种场景旨在制造这种意愿,每种都将请求绑定到产品可以检测到的特定时刻。

每种场景都将触发点与强化手段配对

以下每个条目都阐明了启动场景的触发点,以及如何从第一次赠送转化为第二次赠送。

储值功能(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 款应用按场合来陈列礼品目录,这让「日历」成为八种触发机制中使用最广的一种。顶部的标签页负责引导用户。

Four Uber Eats screens: a gift card catalogue with tabs for Ramadan, Birthday, Congratulations and Thank You; a Customize your gift form asking who the gift is from, who it is for and the recipient's phone number; a preview reading Tap to unwrap; and the unwrapped preview reading Alex got you a gift

送礼者点进这个页面时往往没想好要庆祝什么,标签页便顺势提供了一个。Starbucks 排列着父亲节、毕业季、生日和感谢,而 Walmart 还加了一个「Just Because(只因想送)」标签,专门覆盖那些算不上节日的日子。

地域性节日更重要。Blinkit 和 Zomato 主打兄妹节(Rakshabandhan),GoPay 主打开斋节和 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 款应用:结账时的加购推荐

12 款应用在购物车里、发货与支付之间塞入一个开关。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款应用中的社交货币实时时刻

十款应用将礼品功能嵌入实时互动中,并使用专属货币定价。Telegram 销售一种名为 Stars 的货币,其礼品会伴随彩带出现在聊天线程中。

一条 Telegram 聊天线程,礼品在彩带后到达,标注“你用 15 Stars 发送了礼品”,显示一张泰迪熊卡片写着“送给 Jane 的礼品”并带有“查看”按钮

由于该线程有观众,礼品购买的是可见度而非单纯的好感。

约会应用已经精确定价了这种价值。Hinge 上的玫瑰和 Coffee Meets Bagel 上的花朵都承诺让发送者立即显现,正如后者按钮上所言。Telegram 随后添加了使这一切在社交空间可行的控制选项。

四个 Telegram 界面:Gift Premium 面板显示三、六、十二个月的定价;礼品目录网格价格从 15 到 100 Stars;发送面板中“隐藏我的名字”开关关闭;同一面板中该开关开启

“隐藏我的名字”允许发送者对除收件人外的所有人隐匿身份。Twitch 也提供相同的“匿名赠送”选项。

触发点:发送者希望在实时线程中压过其他争夺注意力的竞争者。

强化反馈:观众目睹礼品到达,Telegram 用稀缺性标记和分层阶梯为该时刻定价。100 Stars 售价 2.90 美元,35,000 Stars 售价 1,048 美元。摊算下来,七个档位每百个的价格在 2.88 到 2.99 美元之间,因此阶梯销售的是数字规模而非折扣。

在 Twitch 上,赠送订阅的单价随档位增加而下降:前五份为 SGD 6.99,第五份之后降至 SGD 4.99 并保持不变,但页面上的“划线价节省”提示始终显眼。负责审核这些徽章的设计师,应当先计算每个档位的单均价格。

使用此功能的平台: 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:00 的发送日期

触发条件:订阅者留存足够久,从而愿意推荐产品。Discord、Telegram 和 Headway 将入口设置在设置页、付费墙或接收者资料页。

强化机制:Thrive Market 向赠送者提供 30 美元店铺积分,这是公司认定比替代方案更具性价比的获客成本。

Lovi 则完全绕开现金奖励,改为在账户中注入 5 张礼卡,每张兑换 7 天无限访问权。

Telegram 按订阅时长给予 Premium 折扣,3 个月打九折,1 年打五五折,这意味着承诺周期越长,每月实际支付越少。礼物会自动续费,因为根据 Thrive Market 的条款,接收者每年纪念日需支付 59.95 美元,除非主动取消。

使用此功能的平台: Thrive Market、Discord、Instagram、Telegram、Headway、Lovi、Shipt、Blackbird、Twitch。

7 款应用将推荐包装为赠予

有 7 款应用在文案和图标设计上将“推荐”表述为“赠送”,使用礼物包装插画,并让动词“赠送”优先于“获取”出现。

DoorDash 的标语是“给 5 美元,得 1 美元”。Base44 将“发送礼品卡”直接放在“推荐好友”下方,同处一个账户菜单,表明团队视二者为同源功能。

触发时机:Peerspace 在预订确认成功的页面上展示推荐链接,也就是用户刚完成预订后的那几秒钟。

强化手段:Peerspace 同时展示奖励的双边收益,将推荐返现上限设为 $5,000,并预先提供可直接发送的 SMS 和邮件分享文案。

采用此模式的产品:DoorDash、Lugg、Peerspace、Superpower、Preply、Manus、Base44。

平台发放礼物的 5 个应用

这五个应用主动送给用户一份礼物,并自己制造送礼的由头。Grab 的 Mystery Rewards 承诺完成任务就有惊喜,然后播放一段拆礼物动画;Temu 则更直接,推消息告诉你“你有 8 份礼包待领取”。

触发时机:平台希望某个行为被反复执行,于是把奖励挂在这个行为上。

强化手段:Grab 以随机间隔发放奖励,用户只需花几秒钟看一段开箱动画,无需其他付出。未领取数量以角标形式呈现,到期倒计时则把好奇心转化为紧迫感。Finch 是本次研究中做法最特别也最温暖的一个:只告诉收礼人“守护者们希望你喜欢这份礼物”,点到为止。

采用此模式的产品:Grab、Shopee、Temu、Everyday Rewards、Finch。

金钱包装的 4 个应用

这四个应用把转账本身看作小事,把全部设计心思花在“包装”上。Binance 的 Red Packet 可以把随机金额通过口令或二维码分发给多个接收者;Revolut 则会安排红包在接收者当地早晨送达。转账本身只是一行记录。

触发时机:送礼人有特定场合要庆祝,而干巴巴的转账显得生硬冷淡。

强化手段:Binance 把整个领取过程做成了限时体验:红包可在首个人领取后 45 秒内过期,倒计时由发送者设定,未领完的金额三天后自动退款。Rewards Booster 还提供付费选项,可将口令曝光量最多提升 90%。GoPay 则在分享动作上加了抽奖机制,接收者每次领取都会掉落 Coins。

采用此模式的产品:GoPay、Binance、Revolut、Satispay。

共享进度型的 2 个应用

这两个应用让礼物具备实际功能而非仅是象征,这也是本次研究中最少见的场景。

Duolingo 好友任务的两张截图:展示共同的学习目标,每个头像旁标注各自的贡献进度,其中一名学习者明显领先,下方设有 NUDGE 和 GIFT 按钮

Duolingo 的好友任务为两人设定共同目标,并并排展示各自贡献。例如,在三天内完成 15 课的剩余名额中,Sam 还没开始学习,而另一位学习者已完成 1 课。这种进度差异在任何人考虑赠送礼物之前就已直观呈现在界面上。头像下方设有 NUDGE 和 GIFT 两个按钮。

触发机制:Duolingo 展示正在进行的共享目标,让落后一方的进度一目了然。App 主动指出谁拖了后腿,无需学习者费力寻找助力的途径。

强化反馈:学习者消耗 XP 加速器推动任务进度。发送者在撰写留言时容易卡壳,Duolingo 自动代写文案。消耗的 20 颗宝石来自用真金白银购买的软货币,一旦耗尽便需充值,因此慷慨送礼驱动的购买行为与修复连续打卡记录的动机如出一辙。发送后按钮状态变为 SENT 并持续显示,让双方都能清晰感知这一行为。

Finch 在好友个人主页将“Send Gift”与“Share Goal”并列放置,价格为 200 颗彩虹石,功能列表至此结束。

适用对象:Duolingo、Finch。

九大场景中的六类共性痛点

无论团队选择哪种场景,发送流程中反复出现相同的六大问题。以下逐一阐述问题本质以及受调查 App 的应对策略。

1. 识别尚未注册的用户作为接收者。

发送者通常在填写接收者信息时受阻,因为目标用户尚未拥有账号。受调查 App 通常收集手机号或邮箱,并为两者皆无的情况提供通讯录选择功能;Grab 允许一次性添加最多 10 位接收者。面向陌生人的 App 采用最简标识符(只要该标识符能承载消息即可),将账号创建推迟到领取环节。

2. 在信息送达前获取从未授权的用户同意。

礼物会向与产品毫无关联的用户发送短信或邮件。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 的 Earn Thrive Cash 面板,鼓励用户赠送会员;一个 eGift Card 产品页,标注礼物永不过期;How it works 条款说明非会员收礼人必须先注册账户才能兑换;以及总价在 $59.95 会员费和 $25.00 购物金之间切换

领取页上有两步必须按顺序走通。

第一步,收礼人要顺利打开礼物。中途放弃的人根本走不到注册环节。Meta Quest 要求输入二十五位兑换码,把一个陌生的链接变成一个有明确终点的任务;Binance、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. 不同类型的礼物适用不同的过期规则。

Binance 把红包当作一种活跃气氛的玩法,四十五秒后即过期。而购买的礼品卡则是另一类法律意义上的对象。在美国,CARD Act 通常禁止储值在五年内过期,一些州的规定还要更严格。

如果四类礼物共用一个过期时长,这个功能就会变成合规隐患。每份礼物应有自己的过期时间,由其对象类型决定;「已过期」和「已退款」要分开存储,因为欠用户一笔退款和已经把钱退出去,是两回事。

一份礼物需要十七个字段来存储

上面五个决策最终都落在存储上,答案是设计一张十七列的表。这些列可以分为五组。

  • 身份,六列,因为礼物有发送方和接收方,而接收方可能还不存在。

  • 授权,两列,因为勾选框必须留作证据。

  • 送达,两列,因为发送方的意图是一个日期加时区,而不是某个精确时刻。

  • 过期与结果,三列,因为「已过期」「已领取」「已退款」是三种不同的状态。

  • 金额与状态,四列,包括金额、币种、行的唯一标识,以及它在状态图中的位置。

研究中的四款应用多年前就定下了其中六列,然后不知不觉地把它们直接搬上了自己的界面。

界面展示的内容 背后隐含的字段
Uber Eats:「这份礼物来自谁?」为必填项 sender_name
Uber Eats:「接收方手机号」为必填项 recipient_phone
Telegram:「隐藏我的名字」开关 hide_sender
Thrive Market:条款规定非会员需创建账户才能兑换 recipient_id,必须接受 null 值
Duolingo:按钮状态从“赠送”变为“已送出” status
Duolingo:礼物价格显示为二十个宝石而非美元 currency,无法精简为三个字母

PostgreSQL 将上述 schema 写出如下。每个非显而易见的字段后都附有一行注释,标明其源自哪个应用,以便读者能对照上方的截图追溯每一行。跳读 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,

  -- 过期时间因物品而异:币安红包仅 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();

一个每几分钟运行一次的 worker,会在悉尼的早晨发放悉尼的礼品,九小时后再发放伦敦的那份,每份对应一行数据;当某国政府在购买与生日之间调整夏令时规则时,同一行数据在不同时刻会得出不同结果,而表本身无需改动。

“领取”这一动作本身就封装在一条语句里,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());
左右两栏对比双指点击 Claim 的处理方式。左侧为读后写:两次点击都选中礼品,都看到已送达状态,钱包被入账两次共 \(50,日志中却无任何记录。右侧为条件 UPDATE:首次点击锁定该行,第二次点击阻塞后重新校验 WHERE 子句,发现影响行数为零,钱包仅入账一次 \)25

第二次点击执行同一条语句,发现该行状态已变为 claimed,返回影响行数为零,资金因此只划转一次。已过期的礼品同样返回零行。要区分这两种情况,只需多读一次 statusclaimed_at

领取页面只能展示该读取返回的内容。一个月后点开链接的收件人,看到的是说明而非白屏或“Error”——他会知道礼品在 3 月 12 日已被领取,或已过期、款项已退回给发送方。若产品当初没存 claimed_at,就只好回退到“出错了”并让用户去找客服。文案是设计师写的,但数据库结构决定了它能有多诚实。

如何为产品选对场景

虽然共有九种场景,但一个产品通常很少需要超过一种。下图统计了每种场景的开发成本,以页面数计。

各送礼流程所需页面数的区间图。Money wrapping 最长,中位数为 12 页;其次是 stored value 8.5 页、checkout upsell 5.5 页、shared progress 5 页、social currency 4 页、subscription seeding 3.5 页。每根柱形表示观察到的最短和最长流程,每个场景旁列出了被测量的应用

在已测量的六种场景中,Money wrapping 成本最高,中位数是十二页,GoPay 为主题红包、明星语音祝福、推荐贺词和未拆礼物追踪功能一共做了十六页。Telegram 的整个发送流程只有四页,Duolingo 只要三页,因为两者一开始就选中了收礼人,金额一点即达。

有结账流程的产品,应优先做 checkout upsell。58 款应用中有 12 款上线了这个功能。整个开发量不过是一个开关、一个留言框和订单上的一列,而且面对的是已经掏出银行卡准备付款的用户。

周期性的文化节点适合做 occasion catalogue。有 19 款应用做了这个,是所有场景中最多的,而预写祝福语承担了大部分转化工作,所以预算应该花在写分类标签和祝福文案的人身上,而不是工程上。

订阅类产品应该做 subscription seeding,并给送礼人相应的回报。Thrive Market 用 30 美元店铺积分换取一名新会员,完全不用投广告。

用户之间的实时互动为社交送礼打开了大门。Telegram 和 Twitch 实际上是在做一场包装成礼物的曝光竞拍。这类功能在插画师画出一头泰迪熊之前,需要先准备好虚拟货币、充值流程和内容审核政策。

有共同目标或连续打卡记录的产品,做 progress gifting 是顺理成章的选择。58 款应用中有 2 款做了这个,中位数只要五页,任何已有好友列表的产品都够得着。应用知道谁落后了,一份有用的礼物比再弹一条通知有效得多。

其他所有场景依然能从礼品卡中受益,前提是设计师能赋予其真正的入口。余额储值功能的界面复杂度跨度极大:Urban Outfitters 仅需三个页面,而 Shopee 多达十七个,是研究中最宽泛的差异。这种差距表明,设计师是主动塑造了流程,而非简单拼凑页面。

结论

送礼功能的核心取决于时机,其次才是设计。在本研究的五十八款应用中,九个场景的主要区别在于它们选择发起询问的时机。其中八个场景将询问绑定在产品已掌握的事实上,比如购物车已满、日历上的日期、实时对话,或是进度落后于目标的共享任务。

无论产品上线哪种场景,发送流程中总会浮现同样的六个问题,从识别没有账号的收件人到决定双方可见的内容。领取页面让交易回款。当收件人收到朋友已付费的礼物时,这一功能最接近转化新用户的时刻。

这几个页面上的五项设计决策最终汇入数据库,落成一张拥有十七列的表。如果在开发者动手之前确定这些决策,代价只是一次沟通;反之,则面临数据迁移。

实际成本比看起来更低:结账处的开关功能只需几个页面,Duolingo 的共享进度功能也仅涉及五个页面。Duolingo 的“好友任务”早已识别出哪位学习者需要帮助——剩余三天、还需完成十五课——并精准地将二十颗宝石的经验值加速包放在发送者容易找到的位置。这份礼物的成本几乎为零。

研究中二十二款应用选择销售礼品卡,它们隐藏在“账户”菜单中,等待那些本就打算送礼的用户主动寻找。相比之下,“好友任务”页面的开发成本并无增加,且它恰好在用户已想到要送礼给哪位朋友的那一刻发起询问。

原始来源: freeCodeCamp

评论 (0)