Twenty:把 CRM 当成代码来构建和版本化的开源方案
开源 CRM,定位为 Salesforce 的替代方案,让技术团队基于 NestJS、PostgreSQL 与 GraphQL,用代码定义对象、字段和视图。
秒懂
- 它是什么?
- Twenty 是一个用 TypeScript 写的开源 CRM,主打把对象、视图和工作流定义为代码,并通过 CLI 发布到云端或自托管环境。本文基于 README 和仓库信息,分析它的设计思路、适用人群和实际限制。
- 适合谁用?
- Twenty 适合那些已经把业务系统代码化的技术团队,尤其是需要快速定制 CRM 且不想被厂商锁定的场景。它不适合没有开发资源、只想开箱即用的业务人员,因为核心能力都建立在代码定义和 CLI 工作流之上。
- 能商用吗?
- 请先确认。这个仓库使用的许可证不在我们自动归类的范围内,商用前请阅读仓库里的 LICENSE 文件。
- 还在维护吗?
- 在维护。仓库最近一次提交在 1 天前。
- 用什么语言写的?
- 主要是 TypeScript(依据 GitHub 的语言统计)。
以上回答依据项目的 GitHub 数据(最近同步于 2026年9月14日)和我们的分析,不构成法律意见。
开源项目深度解析
它解决什么问题
传统 CRM 如 Salesforce 的问题在于定制成本高,业务逻辑被锁在厂商的配置界面里,难以用代码审查、测试和版本控制。Twenty 的定位是给技术团队提供构建自定义 CRM 的积木,包括对象、视图、工作流和 agents,并允许用代码扩展。它的目标用户是那些想把 CRM 当作软件栈一部分来管理的工程师,而不是只想点击配置的业务用户。README 里明确说,Twenty 是“你像构建和版本化其余技术栈一样构建、发布和版本化的 CRM”。
核心机制:对象即代码
Twenty 的独特之处在于数据模型不是通过后台界面拖拽生成,而是用 TypeScript 定义。README 给出了一个 defineObject 的例子,其中 nameSingular 和 namePlural 定义对象名称,fields 数组声明字段类型,比如 FieldType.TEXT、FieldType.CURRENCY、FieldType.DATE_TIME。这个定义文件可以提交到 Git,和普通代码一样走 code review 和 CI。发布时使用 npx twenty app:publish --private 命令,把定义推送到工作区。这种设计把 CRM 的 schema 从数据库迁移变成了代码变更,理论上可以回滚和审计。
安装与运行:三条路径
README 提供了三种启动方式。最省事的是云服务,在 twenty.com 注册后一分钟内创建 workspace,无需管理基础设施。第二种是本地构建应用,先运行 npx create-twenty-app my-app 生成项目,然后用 defineObject 定义对象,最后用 npx twenty app:publish --private 发布。第三种是自托管,使用 Docker Compose 部署,或者通过本地开发环境贡献代码。技术栈方面,后端是 NestJS,搭配 BullMQ 做任务队列、PostgreSQL 存数据、Redis 做缓存,前端是 React 配合 Jotai 状态管理。这意味着自托管需要同时维护数据库和消息队列,运维复杂度不低。
AI 与扩展:agents 和逻辑函数
README 提到 Twenty 支持 agents 和 logic functions,文档里也有专门的 AI 用户指南。但具体 agents 如何定义、如何与对象交互,README 没有给出细节,只提供了文档链接。这说明 AI 能力是产品的一部分,但可能还在快速迭代中。对于想要深度定制 AI 行为的团队,需要自己查阅文档确认当前支持的范围。另一个值得注意的是,发布命令有 --private 选项,暗示应用可以保持私有,不会强制公开到某个市场。这一点对企业用户很重要,但 README 没有说明私有应用的限制,比如是否影响更新或协作。
明显的局限:不适合非技术团队
Twenty 的代码优先理念决定了它的门槛。如果你没有 TypeScript 经验,或者团队里没有工程师,那么定义对象、发布应用这些操作会变成障碍。Salesforce 之所以流行,部分原因是业务人员可以自己配置字段和流程,而 Twenty 把这条路堵死了。另外,自托管需要处理 PostgreSQL、Redis 和 BullMQ 三个组件,对于小团队来说运维负担不小。云服务虽然省事,但数据主权和长期成本需要权衡。README 没有提到数据迁移工具,从 Salesforce 或其他 CRM 导入历史数据的能力未知,这是采用前必须验证的风险点。
替代方案:对比 Salesforce 和 Supabase
最直接的替代是 Salesforce,它提供成熟的可视化配置界面、庞大的生态和第三方应用市场,但定制化需要 Apex 语言和复杂的 metadata 管理,且成本高昂。另一个思路是使用 Supabase 这类后端即服务,自己定义表结构、写 API,再搭配前端框架搭建 CRM。Supabase 没有内置视图、工作流和 agents,但提供了更通用的数据库和认证能力。区别在于 Twenty 是完整的 CRM 应用层,而 Supabase 是数据基础设施。如果你的需求只是简单的客户管理,用 Supabase 加一个现成的开源前端可能更轻量;如果你需要 CRM 特有的功能,Twenty 更接近开箱即用。
维护与升级成本
Twenty 的发布节奏很快,最近一次发布是 v2.37.0,间隔大约两天就有新版本。频繁更新意味着功能迭代快,但也给自托管用户带来升级压力。每次升级可能需要同步数据库迁移、重新构建前端、重启服务。由于项目使用 Nx 管理 monorepo,本地开发环境需要安装 Node.js 和依赖,对机器性能有一定要求。License 在仓库信息中显示为 unknown,这是采用前必须澄清的问题。如果 License 不是宽松的 MIT 或 Apache 2.0,可能影响商业使用。建议在 GitHub 上查看 LICENSE 文件,或者联系维护者确认。
编辑结论
Twenty 适合那些已经把业务系统代码化的技术团队,尤其是需要快速定制 CRM 且不想被厂商锁定的场景。它不适合没有开发资源、只想开箱即用的业务人员,因为核心能力都建立在代码定义和 CLI 工作流之上。如果你考虑采用,先验证三件事:一是确认你的数据模型能否用 defineObject 表达,二是检查自托管时 PostgreSQL、Redis 和 BullMQ 的运维成本,三是查看当前版本对工作流和 AI agents 的支持程度是否满足实际需求。Twenty 的价值在于把 CRM 变成可版本化的代码,但这也意味着你要接受一套新的开发和部署范式。
社区笔记