Prodantix
概要一览
Prodantix 是为做软件的人而做的。每个产品团队都在问同样的三个问题:用户在我们的应用里究竟在做什么,哪些人该看到哪些部分,以及什么时候开口最合适。
大多数公司会为这三件事分别买一套工具,麻烦就是从这里开始的。每套工具都各自保存一份关于你用户的记录,而这些记录会慢慢对不上。一套认为这位客户已经把账户设置完成了;另一套还没跟上,于是给她发来上周就已经做完那一步的操作说明。没人会发现,直到她投诉,或者两个看板显示出不同的数字。
这套引擎是怎么搭起来的
这套引擎由四个基本单元构成,其余一切都建立在它们之上。按顺序理解最省力,因为每一个都喂给下一个。概念参考文档有完整说明。
事件
用户做的一件事,在发生的当下被记录下来:完成注册、打开某个页面、填到一半放弃表单。事件是原始信号,也是唯一从外部进入系统的东西,其余一切都由它推导而来。
用户状态
关于某位用户所知一切的实时可查询投影,由其事件推导而来,并在新事件到达的那一刻更新。分析、功能开关和消息读的都是这同一份事实来源。它不是夜间汇总,也不是靠某个作业维持同步的副本,它只有一份。
判定
一条基于用户状态求值的规则:谁属于某个人群,谁拿到某个功能开关,谁符合某条消息的条件。由于判定是在被问到的那一刻读取实时状态,它不可能依据一张过期的画面作答。
动作
判定触发后引擎所做的事:开放某项功能、发送消息、启动工作流。动作本身也会被记录为一个事件,正是这一点让闭环成立:引擎做过什么,成为它所知道的一部分。
分析就是读取状态
Prodantix 里的分析不是一个另存一份用户副本的独立库,而是直接读取用户状态。漏斗、留存和人群都是对同一份实时投影的查询,引擎其余部分也作用于它。因此没有到数仓的 SQL 往返,也不必等夜间汇总:状态本就是按问题的形状组织的。人群在这里是一等对象:有名字,由条件子句定义,并随着人们符合或不再符合条件而保持成员关系更新。
把还会再问的问题存下来
一块看板是一组起了名字的图块,而一个图块就是你已经跑过的一次查询,加上你希望它怎么画出来。查询会照探索器提交时的原样存下,所以图块留住的是问题,而不是答案的一张图:打开它,查询会重新跑一遍,你也就回到探索器里、停在同一个查询上,随时可以挪动时间窗或换个拆分维度。所以看板不会是一份过期的导出,而是一组问题,每次你去看,引擎都从实时状态重新作答。
当一个数字自己动了
没有人盯得住每一张图。盯着看这件事由 Prodantix 来做:它一格一格地读一条序列,算出这条序列的基线和离散程度,再把离得太远的那些格子标出来,两个方向都标。跌和涨都会报,各自带着它偏离的基线和偏离了多远,于是你分得清真正的断裂和寻常的波动。灵敏度是一个可调的设置,而不是写死的规则;检测器也不肯瞎猜:一条几乎平直的序列,或者还短得看不出形状的序列,得到的是什么都没有,而不是一次误报。
状态所描述的那些人
用户状态是一份投影,而人员目录就是你一个一个人地去读它的地方。控制台列出这个项目见过的所有人,最近活跃的排在前面,配一个搜索框和一份随着你往下走继续加载的列表。每一行都带着引擎为这个人攒下的东西:多少事件、多少个不同会话、第一次和最后一次见到是什么时候、最后做了什么、属于哪些分组,以及被保留的几项特征(姓名、邮箱、电话、头像)单独拎成了列。点开一行会显示完整的属性表,里面装的是你的事件放进去的东西,而不是一组固定字段。分组有自己的页签和自己的属性,因为一家公司或一个工作空间本身就是一个实体,它的事实属于它,而不属于它的每一个成员。
一个人,好几个标识
访客先到,你后知道他是谁。SDK 先给他一个标识,他读了三个页面,之后才注册。在有人告诉引擎他是谁之前,这份档案就是没有名字的,目录也照实这么显示,而不去猜。等注册真的发生,这些标识会被连成一条链,指向同一个规范身份,于是那段匿名足迹并入了具名账号,而不是另起一份档案。每一行都会显示有多少个标识指向它,档案里也列得出来。引擎自己判断不了的地方,你可以手动把两份档案并起来:由你选定哪个身份留下,冲突时以它的属性为准,计数相加。这一步之后就分不开了。合并前档案的样子留在审计记录里,所以它当时说过什么还能查回来,但这两个人一旦并了就再也分不出来。
把一次会话重看一遍
分析能告诉你昨天有十一个人在同一个表单上中途离开,却说不出为什么。会话回放录的是页面本身:浏览器 SDK 会捕捉文档以及使用者操作时对它的每一次改动,把这些改动按顺序打成分片上传给录制服务,控制台再照原样把这段会话播放出来。每份录制都归在引擎其他部分所用的同一个标识之下,所以一段会话属于一个你本来就能查到的人,而不是只存在于另一套工具里的访客编号。
一份录制被允许留下什么
还没等你去配置,遮蔽就已经开着。填进输入框的每一个字符,都会在分片上传之前于浏览器里换成星号,所以到达录制服务的内容从一开始就不含正文:长度和词的边界留下来,回放看着仍像那张页面,字句本身却已不在。密码、邮箱和电话字段无论遮蔽开着还是关着都会被抹去,所以关掉它也不可能暴露一个凭据字段。页面上可见的文字则会保留,除非你要求把它一并遮蔽。每个分片都会记下自己是否被遮蔽,控制台据此在会话上做标记,你随时知道自己看的是哪一种。录制本身存放在私有存储里:控制台一次只为一个分片申请一条短时效的签名链接,没有它就取不到任何东西。此后一段会话还能留存多久,由你的套餐决定。
给不同的人看不同的东西
团队常常想先把新东西放给一小撮用户,看看效果如何,再决定要不要让所有人都用上。Prodantix 通过对用户状态求值条件来决定谁能看到什么:一个属性、一个运算符和一个值,在开关被询问的那一刻现场判断,而不是查一份存好的名单。你可以把新功能给百分之二的客户,观察他们怎么用,然后无需再发一次版本就扩大范围或者收回。
在还有用的那一刻送达的消息
一条消息只有在还帮得上忙的时候才值得发。Prodantix 可以在某人做了某件事,或者没做成某件事的那一刻就把消息发出去。客户一碰到套餐上限就会知道,而不是等到第二天早上,那时他早已放弃、转投别处。
当他们回信过来
消息一直是单向的,直到有人回过来,那就成了一条支持会话。这类会话 Prodantix 也一并承接,而里面的 AI 只起草,不发送。模型拿到的只有这条会话和这个人自己的状态,别的没有:不是另一位客户的对话,也不是你项目里的其他东西。它写出一条建议回复,而这条回复只有在你的客服按下发送时才会成为会话中的一轮,所以“建议,不代发”是代码本身的搭法,而不是谁得记住的规矩。这条会话还有自己的凭据。项目密钥标识的是一个项目,而且随着装了 SDK 的每一个页面一起发出去,所以它不能代表一个人;每条会话拿到自己的令牌,只对那一条会话有效,请求体里的标识永远决定不了你在跟谁说话。开启会话是唯一一条只需要公开密钥的路径,所以它按项目和按调用方分别做了限流。
自己把步骤接起来
有些响应不止一步,而你想自己把它排出来。一条工作流就是一张小图:它由手动触发,或者在某人进入、离开某个分组时触发,然后沿着节点往下走。动作节点去做一件事(写一行日志,调用你自己的 webhook)。延迟节点等待,最长三十天。等待节点会一直停在那里,直到某个具名信号到来,信号始终不来时它有自己的出口。分支节点拿条件去比对用户状态,走匹配上的那条路,或者走兜底那条。运行一次推进一个节点,每一步都先落定再去认领下一步,所以重启之后是从这次运行真正走到的地方继续,而不是从头重放。Webhook 在被调用之前会先过检查:目标必须是公网 https 地址,请求最终发往的就是检查放行的那些地址,不跟随重定向,挂住不返回的调用会被掐断。
AI 编排,以及闭环是怎么合上的
上面几个面仍然把串联的活儿留给你:注意到某件事,判断它对谁成立,决定该做什么。Prodantix 可以自己跑完这个闭环。引擎在实时状态中识别关键时刻,选出适用的人群,并决定动作。让它超出普通自动化的是最后一步:动作本身被记录为事件,于是又折回到下一次判定所读取的同一份用户状态里。系统自身的行为成为它对这个人所知的一部分,而不是发生在旁边的另一件事。
提案要等一个人点头
引擎不会照着自己的结论直接动手。它产出的是一份提案,而提案是一份写下来的计划:这些开关、这些分组、这条消息。在获准之前,提案里提到的每一个开关、分组和会话都会拿到你自己的租户里去对,对不上的引用会让整份提案作废,而不是被悄悄丢掉,这正是让一个读到了恶意内容的模型伸不出你项目之外的原因。批准是人的动作,也是任何事情真正开始发生的那一刻:执行走的是你手动操作时的同一套开关与消息通道,所以权限、审计记录和你套餐里的额度统统照旧生效。批准两次,第二次什么也不会发生。
把事件送进来
一切都始于一个发往接入端点的事件,引擎会立即把它折进用户状态。SDK 覆盖 Web、移动端和服务端。React 是唯一的例外:它的生命周期需要专用适配器,只安装一次客户端,并且兼容 StrictMode。快速上手用几行代码就能接好。
密钥与环境
每次 SDK 调用都带着一个项目密钥,密钥来自控制台。创建项目会生成两个环境,live 与 test,各有自己的密钥:开发时用 test,上线用 live。两个密钥都只在创建后显示一次,因为服务端只保存哈希,任何界面都无法再次展示。轮换会为你选定的环境重新签发一把,旧密钥是立刻失效还是经过宽限期,由你决定。
与它对话的四种方式
REST 分布在三台主机上:一台负责功能开关与消息,一台负责事件接入,一台负责会话回放,各自在 /openapi.json 提供自己的 OpenAPI 文档。接入返回 202,意思是事件已被接收待处理,而不是已经存下:格式有问题的事件仍可能在后续管道中被丢弃。GraphQL 覆盖完整的应用模型,包括项目、开关、工作流、分析、消息、人群与计费。实时接口广播开关变更、消息与工作流运行,并立即断开未认证连接。MCP 接口让智能体通过工具调用读写,它是机器对机器的,拒绝浏览器请求。
数据始终是你的
你可以把 Prodantix 跑在我们的服务器上,也可以跑在自己的服务器上,两种方式没有区别。放进去的一切,随时都能完整地取回。我们不出售你的数据,也不拿它训练 AI 模型。由于设计使然,Prodantix 手上握着你在任何地方都找不到的、最完整的一份客户记录,所以这句承诺在这里比在别处更有分量。
适用人群
Prodantix 适合那些为此同时跑着两三套工具、已经受够它们互相打架的团队。当你的客户多到没法再靠随口问一问来掌握他们在做什么时,它最派得上用场。
访问 Prodantix: prodantix.com