SaaS 和产品团队
你的产品知道任何营销工具都观察不到的事
谁完成了新手引导,谁卡在第三步。谁邀请了同事。谁这周两次撞到上限。谁两周没打开过那个东西。每一个都是比邮件打开率更好的触发器,而它们离成为触发器只差两行代码。
事件就是全部集成
用你自己的令牌调用 POST /v1/events:一个你起的名字、一个联系人、一份数据、一个幂等键。这就是全部的对接。没有需要保持更新的 SDK,没有映射界面,也没有一套你必须把产品翻译过去的我们的词汇表。
每个事件都落在联系人的只追加日志上,从那里它同时是三样东西。一个触发器,事件到达时启动漏斗。一个谓词,让细分可以说“最近十四天内做过这件事”,或者更有用的——“没做过”。还有一个目标,让序列在某人完成它所推动的那件事的那一刻结束。
第三点正是让生命周期消息变得可以接受的原因。催你完成账户设置的提醒,应该在账户设置完成的那一秒就消失,而在大多数工具里它不会,因为序列和产品之间互不相通。
- ⚡触发器
api_event—signup.completed,套餐free。 - 2发送邮件先做这一件事。不是十一个功能的导览。
- 3等待 2 天运行记录上的
wake_at。没有排队的任务,就算你明天重写这段,也没有什么需要拆解的。 - ?条件
project.created到达了吗?没有 → 走帮助分支。有 → 走下面的目标。 - 4帮助分支一条消息,主动提供他们没做的那件具体的事。然后再等一次。
- 5目标
project.created到达。流程退出。这个人从此再也不会收到任何引导邮件。
你的事件名称你对“已激活”的定义
五条漏斗
按实际发生的顺序排列的生命周期
1 · 激活
触发条件:注册。两三条消息,每条只讲一个动作,每条都带一个目标——该动作一旦发生,序列即结束。这是你会搭建的最有价值的漏斗,也是最值得重写三遍的那一个。
2 · 停滞
触发条件:segment_enter——已注册,但七天内没有任何有意义的事件。一条以询问而非说教为主的消息,再一条提供某件具体事情的消息。然后就停。给一个已经无视了三条消息的人发第四条,等于发给没有人。
3 · 扩展时刻
触发条件:一个表明他们正在获得价值的事件——达到上限、邀请了第三位同事、第二次导出。这是唯一一个升级消息受欢迎的时刻,而且你的产品可以精确地命名这个时刻。
4 · 续订与催缴
触发条件:续订前的 date_field,或某个支付事件。通知、提醒,以及——如果支付失败——一个在成功那一刻立即停止的短序列。在催缴中目标节点不是可选项;它是提醒与骚扰之间的分界线。
5 · 唤回
触发条件:segment_enter——已取消或休眠六十天。两条消息,真诚的那种,然后打上标签,归于沉默。“他们离开之后发生了什么变化”是一条比打折更好的消息。
还有内部那条
notify_team 会在一个值得人工关注的账户越过某条界线时通知一个人。漏斗不必以给客户发邮件收尾;有时正确的动作是让你这边的人拿起电话。

没有人是故意流失的。他们只是不再打开它了。
为什么开发者可能真的会喜欢这个
当你就是那个做集成的人时,真正要紧的部分
没有私有端点
每个界面都可以用公开 API 搭建,因为除此之外不存在别的 API。如果你想把一份活动报告嵌入自己的管理后台,没有任何东西挡你的路,也不需要逆向工程任何东西。
幂等键无处不在
每一条会修改数据的路由上都有。你的重试逻辑、你的至少一次投递队列和你不稳定的网络,全都变成别人的问题——确切地说,是一个唯一索引的问题。
上线之前先模拟
POST /v1/simulate 会把一个联系人干跑一遍漏斗,返回路径以及它会发送的每一条消息。愿意的话可以放进 CI:漏斗是一张图,而图是可以测试的。
一个 MCP 服务器
把一个智能体指向 /mcp,让它编写并检查漏斗。具备发送能力的工具需要显式确认,并受配额限制,所以一次误读的提示词不会变成五万封邮件。
Webhooks 输出
带签名、按退避策略重试、至少送达一次。使用与报表相同的事件词汇,这样你的数仓和你的仪表盘对“已送达”的含义不会各执一词。
真正能触达各处的删除
一个删除请求会在这里移除该联系人及其消息历史,并扩散到每一个持有副本的兄弟服务。一次请求,一个结果,而且当被问起时你有东西可以指。
边界在哪里
ClickSomo 持有一份邮件列表以及这份列表做过什么。它不是你的用户数据库,也不打算成为:一个联系人永远不携带凭据、永远不登录、永远不会变成一个账户。你的用户住在你的产品里;联系人住在这里,两者通过一个电子邮箱地址和你选择发送的事件连接起来。
这种分离是刻意的,也正是同意模型能够成立的原因。你是你的用户的数据控制者;我们代表你进行处理。一个让营销工具悄悄变成身份存储的设计,是日后无法解开的,而这正是本设计要避免的失败。
实操版本:发送事件,发送你想用来分群的属性,其余的一切都留在原处。如果你发现自己正在把整个数据库模式往这里推,那你试图构建的那个分群,很可能本应是你自己数据库里的一个查询,以一个布尔值属性的形式送达即可。