不会被用户讨厌的通知偏好:开关与静音时段
通过逐事件开关、静音时段、摘要和投递跟踪来设计通知偏好,让用户在不被轰炸的情况下保持知情。

为什么用户会讨厌通知
大多数人并不讨厌通知。他们讨厌在没有充分理由时被打断。当提醒出现得过于频繁、重复,或在错误的时刻到来时,用户就会停止阅读,开始划走。
核心问题通常不是数量,而是不匹配。对你的系统来说紧急的事情,对个人可能毫无意义。销售代表可能需要立刻得到线索分配通知,但并不需要在晚上 9:07 收到“每周技巧”。当所有事情看起来同等重要时,反而没有什么显得重要。
人们因为可预见的原因关闭通知:太频繁、与其角色无关、时机糟糕(睡眠、会议、通勤)、不清楚下一步该做什么,或不知道消息来自哪里。
有用的提醒能减少用户付出努力。噪音会增加成本。一个好的通知能快速回答三个问题:发生了什么?这对我重要吗?我接下来该做什么?
当用户愤怒地把所有东西都关掉时还有一个隐藏成本:他们会错过那条真正重要的消息。账户被锁、付款失败或安全警告可能因为用户在几周的低价值提醒后选择退出而被忽略。这就是“恼人”变成“支持工单”的方式。
好的通知偏好有一个目标:通过清晰的选项赋予用户控制权,让行为可预测。如果用户关闭某一类提醒,它应该一直保持关闭。如果他们设置了静音时段,应用应每次在所有渠道中尊重它们。
好的通知设置的一组简单规则
好的通知偏好始于一个问题:用户想跟进什么,什么可以等待。
如果某人打开了“新订单”提醒,他们通常意味着“尽快告诉我以便我采取行动”。如果他们想要“每周产品技巧”,则意味着“有时间时我会看”。围绕这种意图建立设置,而不是围绕你的内部事件列表。
保持事件数量少且易区分。如果你有五种“状态已更改”的变体,大多数人要么把所有东西都关掉,要么全部打开然后后悔。将相似事件合并为一个清晰选项,只有在下一步动作确实不同的时候才拆分。
默认设置比大多数团队想象的更重要。对于任何非关键项,默认保持安静,然后让人们主动选择。新用户应能不做任何事也感到被尊重。
使用通俗语言。除非你的用户真的会说“workflow”、“ticket lifecycle”或“webhook failure”,否则避免使用这些术语。按别人向同事解释的方式写标签。
当有人点击一个开关时,他们应该能理解三件事:
- 它可能发生的频率(即时、每日、每周)
- 它会到达哪里(推送、邮件、短信)
- 它将包含什么(详细信息或简短摘要)
在添加任何开关前先挑选合适的事件
在构建一长串通知偏好之前,先决定哪些事件值得有单独设置。大多数设置页面让人烦恼,是因为它们为嘈杂、低价值的事件提供选项,而真正重要的几项被埋没。
先按目的对事件分组,让人们能预测会收到什么:
- Security(安全)(新登录、密码变更)
- Billing(账单)(付款失败、发票可用)
- Account(账户)(计划变更、管理员被添加)
- Workflow updates(工作流更新)(任务分配、需要审批)
- Marketing(营销)(技巧、促销)
在每组内,将事件区分为关键、信息性和推广性。关键意味着需要采取行动或风险很高。信息性意味着“值得知道”。推广性意味着“可有可无”。为每个事件定义紧急程度和可接受的延迟。付款失败可能需要即时发送。每周报告可以等待摘要。
对那些“永远不允许关闭”的事件要小心。如果某些通知必须保持开启,请把列表做得非常短并解释原因(通常是安全和某些账单警报)。其他所有都应由用户控制。
一个实用规则:为每个事件写一句话,说明发生了什么以及为什么重要。示例:“有新设备登录你的账户,以便你能发现可疑访问。”如果在不含糊其辞的情况下你写不出这句话,这个事件可能不值得拥有自己的开关。
感觉公平且易理解的逐事件开关
当逐事件开关映射到用户真正关心的时刻时,它们才有用。如果事件可能让用户付钱、耗时或影响信任,就应有单独开关。如果主要是“供参考”,考虑将其归入摘要而不是增加另一个开关。
像描述真实事件那样为开关命名,而不是功能区域。相比“Billing updates”,“Payment failed” 更清晰。这就是让偏好显得受尊重与让它们像设置迷宫之间的区别。
在每个开关下显示一行消息示例。它能设定期望并便于决策。
- New comment on your ticket: “Alex replied: ‘Can you share a screenshot?’”
- Build finished: “Your web app build succeeded in 2m 14s.”
- Payment failed: “Card ending 4821 was declined. Update it to avoid interruption.”
分类开关只有在分类明显且稳定时才有用。“Security”、“Billing”和“Account access”通常很清晰。“Product updates”或“Activity”往往涵盖太多。
避免隐藏的依赖。如果关闭“评论”也会禁用“提及”,就在旁边说明。更好的是,将它们分开。惊喜会让人们不信任整个设置界面。
添加一个不会擦除选择的全局暂停。比如“暂停所有通知 1 小时 / 1 天 / 直到我手动打开”是忙碌时的安全阀,同时保留逐事件设置不变。
尊重时区和例外的静音时段
静音时段应该只有一个含义:在用户表示不想被打扰的时间内不发送非紧急消息。
时区会决定静音时段是感觉“正确”还是“失效”。有的人出差时希望静音时段跟随当前位置,有的人则希望保持固定的“在家”时间表。用像“使用我的当前时区”和“使用我的本地时区”这样的通俗标签同时提供这两种选项。
静音时段也需要清晰的例外。用户会接受在少数且易于理解的情况下绕过静音。将例外列表保持简短并基于风险,而不是营销:
- 账户安全警报(新登录、密码更改)
- 会导致服务中断的付款失败
- 有截止时间的紧急审批
- 提及或直接回复(可选)
边缘情况也很重要。夏令时可能使时间表前后移动一小时,所以在 UI 中显示下一个“静音开始于”和“静音结束于”的时间。
对于周末,避免让用户从头构建两套时间表。提供一个简单的“仅工作日”开关,或允许一键选择天数。
预设能帮助用户快速完成:例如“夜间(晚上 10 点到早上 8 点)”加“自定义”。允许在选择后编辑预设,这样用户不会觉得被困住。
在不让用户错过重要更新的前提下实现摘要模式
摘要就是一个承诺:“我们会让你知道,只是不打断你。”它最适用于嘈杂、低紧急度的更新,如反应、例行活动或每日统计。对于阻塞工作、需要快速回复或有截止日期的事项,摘要不合适。
摘要选项应先把事件分成两类。将高紧急事件保持为实时(安全警报、付款、审批、故障),将高流量事件放入摘要(热闹的评论线程、粉丝活动、例行汇总)。
保持频率选择的熟悉性:
- 每日
- 每周
- 有活动时发送
- 从不(关闭)
让用户选择摘要发送时间,并确认时区。凌晨 3 点到达的摘要会显得糟糕,即便“正确”。
清晰胜过花哨的控制。把每个事件标记为“实时”或“摘要”,这样用户不用猜。如果更改某事件会把它移入摘要,在控制项旁边说明。
预览能减少焦虑。显示摘要将包含的小样:几个标题、计数和最重要的条目。例如,“3 条新评论、2 次状态更改、1 次提及”,并附短摘录。
真正的投递跟踪(而非仅“已发送”)
“已发送”只说明你的系统把消息交给了提供方。用户关心接下来发生了什么。对关键警报来说,“我们尝试过”并不等于“你收到了”。
一个简单模型如下:
- Sent(已发送):你的应用将消息排队并交给邮件/短信/推送服务。
- Delivered(已送达):提供方报告消息已到达设备或邮箱(在该信号存在的情况下)。
- Opened/Read(已打开/已读):用户查看了消息(某些渠道可用,但并不总是可靠)。
当某些事情失败时,尽可能跟踪原因。“失败”太模糊,无法采取行动。更好的示例包括被拦截(运营商过滤)、退信(邮箱拒收)、地址/号码无效,或 token 过期(推送 token 无效)。即使你无法从每个提供方获得完美细节,也要存储你能得到的信息。
临时失败需要重试规则。一个好的默认策略是有限次数的退避重试,避免骚扰提供方或耗尽电量。例如:1 分钟后重试,然后 5 分钟、然后 30 分钟,再停止并标记为失败。像“无效号码”这样的永久错误不应重试。
对于关键消息,向用户显示简单状态。如果有人说“我没收到密码重置码”,显示一行可见状态如“短信发送失败:号码无效”可以避免挫败感并帮助他们修复问题。
为支持和合规保留审计轨迹。存储消息目标、所选渠道、每个状态的时间戳以及最后已知错误。
如何逐步实现通知偏好
把通知偏好当做产品逻辑,而不是一堆开关。如果你先构建规则,随着事件增加,UI 和发送系统会保持一致。
在做界面之前先构建规则
先列出你可能通知的事项清单。为每个事件决定其紧急度和适合的渠道(推送、邮件、短信)。然后选择默认值,让大多数人无需触碰设置也很合适。
一个实用检查:如果你不能用一句简短的话解释一个开关,它很可能合并了多个事件,应当拆分。
存储、评估、调度,然后衡量
确保每次发送都通过相同的决策点。在那里你应用用户的选择、静音时段和摘要逻辑,然后再发送任何东西。
以人们思考的方式存储偏好:按事件、按渠道、按时间。为静音时段和摘要窗口添加调度,包括时区处理和关键警报例外。记录完整链路:发送尝试、提供方响应(已送达、退信、失败)、以及用户操作(退订、设置更改)。
示例:用户关闭了“每周技巧”邮件,但保留“安全警报”邮件,并设置静音时段为晚上 10 点到早上 7 点。你的规则仍应允许在凌晨 2 点发送紧急密码重置邮件,同时将低优先级消息保留到早晨摘要。
导致用户愤怒关闭设置界面的常见错误
大多数人不介意收到更新。他们介意感到被困、困惑或被忽视。一些设计失误会把你的通知偏好界面变成用户只来一次、恼怒离开的地方。
常见模式:
- 太多带模糊名称的开关,如“Updates”或“Activity”,用户无法预测会收到什么。
- 一个主开关混合了事件与渠道(例如,“当有评论通知我”同时在邮件、推送和短信上生效却不说明)。
- 静音时段忽略时区变化或夏令时。
- 一个“摘要”仍然为同一事件发送实时提醒,导致用户既收到摘要又收到实时通知,以为产品坏了。
两个修复能防止大部分问题。首先,让每个控件回答一个问题:哪个事件、哪个渠道、什么时间。用具体名称,如“New invoice paid”而不是“Billing”。其次,把投递视为不仅仅是“已发送”,否则你会在邮件退信或推送未达到时仍宣称成功。
上线前的快速检查
在发布通知偏好前,像真实用户那样快速过一遍。设想你疲惫、忙碌,只想停止噪音同时不想错过重要的东西。
从最吵的事件开始。如果某人无法关闭一个噪声触发项而不同时失去关键警报,设置会显得不公平。
然后检查时间安排。用户不应猜测消息是现在到达、稍后摘要里到达,还是根本不会到达。界面应清楚说明,预览文本应与实际行为相匹配。
上线前检查表:
- 我能关闭一个恼人的事件而不同时关闭关键警报吗?
- 是否明显标明每个事件是实时、摘要还是已禁用?
- 静音时段是否易于设置,且显示正确的时区?
- 对重要警报,是否能看到投递状态(已送达、失败、退信),而不仅仅是“已发送”?
静音时段是混淆容易溜进来的地方。控件应显示像“22:00 到 07:00”这样简单的窗口,并解释被阻止的通知会怎样处理(静音、延迟或移到下一次摘要)。如果允许例外,用“始终允许安全警报”这样的普通词标注它们。
最后,测试从动作到证明的闭环。如果用户报告“我没收到”,你的系统应能回答:它是被排队了、交给了提供方、已送达设备,还是被拒绝了?
示例:适合忙碌用户的现实设置
Maya 领导一个 12 人的支持团队。她想知道任何可能危及客户数据的事情,但不希望手机为每条评论、表情或例行更新震动。她也经常开会,所以需要一个默认安静、只有必要时才响的设置。
她的偏好如下:
- Security alerts:推送 + 短信(始终开启)
- 密码重置和登录警告:推送 + 邮件
- 分配给我的新工单:推送
- 我关注工单的评论:每日摘要(邮件)
- 提及(@我):推送
她把像工单活动、状态更改和非紧急评论这样的背景噪音放到摘要。如果某事变得紧急,它就是警报,不属于摘要。
静音时段设置为工作日本地时间 21:00 到 07:00,例外为安全警报会绕过静音。如果凌晨 2 点有可疑登录,她仍会收到通知。
投递跟踪让她的设置不再凭感觉操作。当 Maya 请求密码重置时,她能看到它已送达给她的邮件提供方,而不仅仅是应用标记为“已发送”。另一方面,向客户发送的月度发票邮件出现退信,团队就知道它没到达收件箱。
当有人说“我没收到”时,支持有一条清晰路径:
- 检查事件日志(是什么触发了消息,以及何时触发)
- 检查渠道结果(已送达、延迟、退信或失败)
- 确认用户设置(开关、摘要、当时的静音时段)
- 重发或切换渠道(例如从邮件改为短信)并记录结果
接下来的步骤:发布更平静的通知体验
从一份书面的事件清单开始。为每个事件决定它是关键(安全、账单、账户访问)还是可选(评论、点赞、技巧)。如果你无法用一句话解释某事件存在的原因,它大概率不应该出现在首发版本中。
像对忙碌的人讲话那样写面向用户的标签。保持具体(“来自新设备的新登录”)并加上一行预览(“我们会为账户安全立即提醒你”)。
上线前加入投递日志,这样支持能回答真实的问题:“它到达我了吗?”跟踪从创建到排队、到提供方交付、再到已送达或失败的路径,并在可用时记录已打开。
如果你在无代码平台内构建偏好中心,比如 AppMaster,把通知作为一等产品特性来处理:定义事件、在 PostgreSQL 中存储每用户设置,并在业务逻辑中保留一个共享决策步骤。AppMaster (appmaster.io) 适合这种应用逻辑,在那里后端规则和 UI 设置需要随着产品增长保持同步。
先对小比例用户上线,然后观察退订率、“全部静音”使用情况、关于丢失提醒的支持工单,以及投诉主题。如果一个事件导致多数退订,先修复该事件再继续增加更多。
常见问题
因为警报与用户的意图不匹配。用户在通知确实帮助他们采取行动时愿意接受频繁提醒,但当消息重复、无关或在错误时间出现时,他们就会关闭它们。
对非关键项默认静音,然后让用户选择加入。将关键项(如安全和某些账单警报)默认开启,其他内容都应易于控制,让新用户即便不调整设置也感到被尊重。
当下一个动作相同时将相似事件分组,只有在决策不同的时候才拆分。一个简单规则是:如果你无法用一句短句解释这个开关(包括发生了什么和该做什么),它可能太模糊或太宽泛了。
用真实事件来命名并说明结果,而不是用产品区域来命名。比如“付款失败”或“来自新设备的登录”能设定预期,而“更新”或“活动”会让用户猜测,通常导致关闭。
仅对极少数高风险警报使用“不可关闭”——主要是安全和可能导致锁定或服务中断的账单失败。如果必须保持开启,用简单语言解释原因,让它看起来是保护而不是控制。
静音时段应在用户选定的时间窗内一致地延迟或静音非紧急通知,同时允许少量例外的高风险事件通过。它还应正确处理时区,这样出差或夏令时变化时设置不会显得“坏掉”。
对高流量、低紧急度的更新(如常规活动、反应或背景统计)使用摘要,紧急事项保持实时。关键是可预测性:用户不应同时收到同一事件的摘要和实时通知,除非明确告知会这样。
“已发送”只表示你已将消息交给第三方提供方,并不代表用户已收到。跟踪后续状态如已送达、退信、被拦截或目标地址无效,这样支持才能回答“它到你那了吗?”并帮助用户修正错误的邮箱或过期的推送 token。
对临时失败使用带退避的有限重试,然后停止并标记为失败,同时记录可采取行动的原因。不要对永久错误(如无效电话号码)重试,也要避免快速重复看起来像垃圾信息或耗电。
按事件、渠道和时间为每个用户存储偏好,然后将每条通知通过一个共享决策步骤应用这些规则后再发送。在 AppMaster 中,这通常意味着在 PostgreSQL 中建模偏好,并在一处业务流程中实施静音时段、摘要和例外逻辑,使 UI 与后端在添加事件时保持一致。


