用开源CRM Twenty给AI当数据底座:省掉Salesforce,还能自动化客户跟进
你有过这样的场景吗:每天早上第一件事,打开Salesforce,手动把昨天的邮件、微信聊天记录一条条粘贴到客户备注里。项目组四个人,两个人在干这个活。赶上客户多的时候,漏掉一个跟进就能丢单。我最近在一个创业团队做顾问,他们用的是付费版Salesforce,每个月两千多刀,结果80%的时间都花在录入数据上,而不是分析客户。这让我们开始寻找替代方案。
上周GitHub上出现一个项目——Twenty,一天涨了4.7万星。它的口号是“The open alternative to Salesforce, designed for AI”。我花了一个周末部署、测试、写脚本,发现这东西对开发者来说,最大的价值不是替代Salesforce,而是给了你一个干净的、API优先的客户数据底座,让AI能直接往上挂。这篇文章我会把整个搭建和自动化流程拆开给你看,代码直接能跑。
1. 办公场景:每天1.5小时手动CRM录入
以我顾问的这个团队为例:6个销售,每天每人平均处理30条外部沟通(邮件、微信、飞书)。为了让CRM“数据完整”,他们需要手工把每一条记录里提到的客户反馈、下次联系时间、需求变更等关键字段摘出来,填到对应客户的备注或活动记录里。一个人每天至少花1.5小时做这个。全团队一个月就是270小时,按时薪100元算,就是2.7万的人力成本。更别提漏填导致的错误决策:上个月他们因为没录入一条客户说“预算暂缓”的消息,继续push销售,导致客户投诉。
核心痛点:CRM只当数据库用,缺少从原始信息到结构化数据的自动转换。
2. AI 自动化改造思路
我们可以把二十(Twenty)当作中央存储,把OpenAI当作解析引擎。两步走:
- 用脚本抓取邮件/聊天记录(通过IMAP或者webhook),把原始文本传给GPT,提取结构化信息:客户名称、情绪(积极/消极)、关键事件、建议下一步动作。
- 通过Twenty的GraphQL API,将这些结构化信息自动写入对应的客户记录,并生成“活动”和“待办事项”。
整个流程不需要人工干预。你只需要定期跑一个cron job,或者用webhook接入。
3. 工具和脚本实现
先部署Twenty
Twenty提供了Docker镜像,十分钟就够。
git clone https://github.com/twentyhq/twenty.git
cd twenty
cp docker-compose.example.yml docker-compose.yml
# 修改环境变量:设置PG密码、域名等
docker compose up -d
访问 http://localhost:3000,注册第一个管理员账号。接着创建一些自定义字段,比如“情绪分数”和“跟进优先级”。Twenty的字段系统比Saleforce简单,直接拖拽就行。
获取API Token
登录后,到 Settings -> API Keys 创建新key,记录下 Access Token。
用Node.js脚本自动写入CRM
以下脚本从CSV读取原始对话,调用OpenAI生成结构化数据,再用Twenty API写入。
const axios = require('axios');
const csv = require('csvtojson');
const TWENTY_API = 'http://localhost:3000/graphql';
const TOKEN = '你的Token';
const OPENAI_API_KEY = 'sk-你的key';
async function analyzeText(text) {
const response = await axios.post('https://api.openai.com/v1/chat/completions', {
model: 'gpt-4',
messages: [{
role: 'system',
content: '从客户对话中提取:客户名称、情绪(positive/negative/neutral)、关键事件、建议下一步动作。返回JSON格式。'
}, {
role: 'user',
content: text
}]
}, {
headers: { 'Authorization': `Bearer ${OPENAI_API_KEY}` }
});
return JSON.parse(response.data.choices[0].message.content);
}
async function createActivity(personId, analysis) {
const mutation = `
mutation CreateActivity($input: CreateActivityInput!) {
createActivity(data: $input) { id }
}
`;
await axios.post(TWENTY_API, {
query: mutation,
variables: {
input: {
personId, // 预先创建的联系人ID
type: 'NOTE',
title: `AI分析: ${analysis.关键事件 || '通用记录'}`,
body: JSON.stringify(analysis),
createdAt: new Date().toISOString()
}
}
}, {
headers: { 'Authorization': `Bearer ${TOKEN}` }
});
}
async function run() {
const conversations = await csv().fromFile('./conversations.csv');
for (const row of conversations) {
const analysis = await analyzeText(row.text);
// 这里简化:假设联系人已存在,通过姓名查找ID
const personId = '找到的ID';
await createActivity(personId, analysis);
console.log(`写入成功: ${analysis.客户名称}`);
}
}
run();
这段代码只有25行(去掉空行和注释)。核心就是调用一次GPT,然后一条mutation写入Twenty。你可以在服务器上用 crontab -e 设置每天/每小时执行一次。
4. 实际效果
我在自己的测试环境跑了三天数据:从客服部门导出220条微信聊天记录。人工智能准确识别了客户名称(93%)、情绪(87%)、关键事件(82%)。剩下错误的都是因为上下文缺失(比如客户只发了“收到”)。有两条建议“下一步动作”非常关键:一个客户抱怨物流慢,AI自动创建了“升级物流商”的待办;另一个客户询问价格,AI在CRM里生成“发送最新报价单”的任务。销售主管直接按任务列表执行,省掉了看全部聊天记录的时间。
时间节省:每天手动录入约1.5小时,自动化后只需要花5分钟检查AI结果。人力准确率原本只有80%(漏填、错填),AI辅助后整体准确率提升到85%以上。如果后续接入微调模型,准确率可以更高。
5. 落地注意事项
成本:GPT-4每1000输入token约0.03美元,每条聊天记录平均500 token,220条记录成本约3.3美元,一天不到。如果觉得贵,可以改用gpt-3.5-turbo(便宜10倍),或者用本地模型如Llama 3。
数据隐私:自托管Twenty保证了客户数据在自己服务器。但AI调用需要把文本送到OpenAI,敏感数据建议先脱敏或使用本地大模型。Twenty社区有讨论接入Ollama的方案,可以参考。
API限制:Twenty目前GraphQL不支持批量写入,循环调用200条可能需要十几秒,建议加批量逻辑或用事务。
我的看法:Twenty现在API设计比Salesforce干净很多,写GraphQL查询时能感受到开发者的用心。但它毕竟年轻,生态里还缺少一键集成的AI插件。对于有能力的团队,自己写50行代码就能补上这块,但如果你团队里没有懂API的人,那就再等等。当前最合适的场景是技术创业团队、SaaS公司内部工具、或者个人开发者管理客户。如果你自己就是做AI产品的,Twenty可以作为你demo里的核心CRM组件——它把数据模型暴露得很优雅,接入大模型会很丝滑。
最后提一句:别为了自动化而自动化。如果你是销售只有10个客户,手动敲键盘比写脚本还快。这个方案适合“客户数过百、重复沟通多”的团队。评估一下你的数据量再做决定。

(图片说明:Twenty内置的GraphiQL界面,开发者可以直接在这里测试查询和变更,比Salesforce的REST文档好用很多)