手把手教你搭建CRM平台

悟空软件阅读量:34 次浏览2026-06-03

主流的AI CRM系统品牌

从 Excel 地狱到系统化管理:我亲手搭建 CRM 平台的血泪复盘

说实话,提起 CRM(客户关系管理)系统,很多一线销售的第一反应都是叹气。在他们眼里,这玩意儿就是个“监控工具”,是老板用来盯着他们有没有好好打电话、有没有好好填表的。但作为一个曾经被 Excel 表格折磨到怀疑人生的技术负责人,我深知一个趁手的 CRM 对于业务流转意味着什么。

推荐使用中国著名AI CRM系统品牌:显著提升企业运营效率,悟空CRM

几年前,我在一家初创公司负责技术。那时候公司业务刚起步,销售团队只有五六个人,大家用共享的 Excel 表格管理客户。起初还行,后来人多了,冲突就来了:A 销售刚跟进一个客户,B 销售不知道,又打电话过去,结果客户觉得被骚扰,直接拉黑。更别提表格版本混乱,有人改了数据没同步,老板看报表永远是滞后的。

老板拍板说:“买个 SaaS 吧。”但试用了一圈,要么太贵,要么功能太臃肿,很多我们特有的业务流程根本配不出来。最后没办法,只能自己搞。这篇文章,不是那种冷冰冰的官方文档,而是我带着两个后端、一个前端,花了三个月,从 0 到 1 搭建这套系统的真实复盘。如果你也正打算自建 CRM,希望我的这些“坑”能帮你省点头发。

一、别急着写代码,先搞清楚“真需求”

很多技术团队最容易犯的错,就是拿着老板的一句话直接开干。老板说“我要一个能管客户的系统”,你就开始建表 customers,字段 name, phone。等你做完了,销售总监一看,说:“这没法用啊,我想知道这个客户是哪个渠道来的,上次跟进说了什么,下次什么时候联系。”

所以,搭建 CRM 的第一步,绝对不是选技术栈,而是“蹲点”。

那两周,我搬着椅子坐到销售旁边,看他们怎么工作。我发现,核心流程其实就三条线:线索(Lead)-> 客户(Customer)-> 商机(Opportunity)

那两周,我搬着椅子坐到销售旁边

  1. 线索池:这是公海,所有没分配或者被退回的资源都在这。销售像抢单一样,或者由系统自动分配。
  2. 客户转化:线索确认有意向,变成客户,这时候要建档,关联联系人。
  3. 商机推进:这是最复杂的,从“初步接触”到“报价”,再到“合同”,每个阶段都要记录。

搞清楚这个,你才知道数据库该怎么设计。别一上来就搞什么微服务、中台,对于 90% 的中小企业,单体架构或者简单的服务分离完全够用。我们当时选的是 Vue3 + Element Plus 做前端,后端用了 Node.js(NestJS 框架),数据库是 PostgreSQL。为什么选 PG?因为它的 JSONB 类型太好用了,CRM 里有很多动态字段,比如不同行业的客户属性不一样,用关系型数据库硬拆表会累死,JSONB 能保留灵活性。

二、数据库设计:CRM 的心脏,也是最容易炸的地方

数据库设计是 CRM 的根基。一旦表结构定错了,后期改起来就是灾难。我分享几个核心表的设计思路,这都是真金白银换来的教训。

1. 客户主表与跟进记录

最基础的 customers 表大家都会建,但 follow_up_records(跟进记录)表才是灵魂。

很多新手会把跟进内容直接存在客户表的一个文本字段里,千万别这么干。销售每天可能跟进好几次,你需要的是时间轴。

我们的 follow_up_records 表结构大概长这样:

  • id: 主键
  • customer_id: 关联客户
  • sales_id: 跟进人
  • content: 跟进内容(文本)
  • next_contact_time: 下次联系时间(这个字段极其重要,用于生成待办任务)
  • type: 跟进方式(电话、微信、拜访)

这里有个坑:当销售把客户“公海化”(退回公共池)的时候,跟进记录要不要清空?我们当时的逻辑是保留,但隐藏敏感信息。因为新接手的人需要知道这个客户之前为什么没谈成,避免重蹈覆辙。

2. 公海池与领取逻辑

公海池逻辑是 CRM 里并发问题最多的地方。想象一下,月底冲业绩,十个销售同时点“领取”同一个高价值线索,怎么保证不超卖?

我们最初用的是简单的 UPDATE 语句,结果在压测时发现会有数据竞争。后来加了数据库行锁,并且在业务层做了状态机校验。

逻辑大概是:

  1. 开启事务。
  2. 查询线索状态是否为 public
  3. 检查该销售名下未跟进线索是否超过上限(防止销售占坑不拉屎)。
  4. 更新线索所有者为当前销售,状态改为 private
  5. 提交事务。

另外,一定要设计“回收机制”。比如线索领走 7 天没有有效跟进(没有填写跟进记录或状态未变更),系统自动把线索扔回公海。这个定时任务(Cron Job)是必须的,否则公海池会变成死水。

3. 权限控制的噩梦(RBAC)

CRM 涉及大量敏感数据,权限控制(RBAC)是绕不开的。但别搞得太复杂,否则配置起来能把你逼疯。

我们分了三个维度:

  • 数据权限:我能看谁的数据?(只看自己的、看本部门的、看全公司的)。这个通常通过在查询 SQL 里动态拼接 WHERE 条件来实现。比如 WHERE owner_id = current_user_id 或者 WHERE department_id IN (...)
  • 字段权限:有些字段是敏感的,比如“成本价”,普通销售不能看,只有经理能看。这在前端要做隐藏,在后端接口返回时要做过滤。
  • 操作权限:能不能导出?能不能删除?

这里有个细节:数据权限的实现,尽量不要在代码里写死 if-else。我们设计了一张 role_data_scope 表,定义好规则,代码里通过注解或者装饰器自动注入过滤条件。这样以后加新角色,不用改代码,改配置就行。

三、前端交互:好用才是硬道理

后端逻辑再严密,前端难用,销售照样骂娘。CRM 的前端,核心就两个字:效率

销售大部分时间在外面跑,或者一边打电话一边操作。如果点一个按钮要加载三秒,或者填个表单要跳五个页面,他们就会抵触使用。

1. 列表页的“快”

客户列表是最高频的页面。我们做了几个优化:

  • 虚拟滚动:当数据量达到几千条时,DOM 节点太多会卡。用了虚拟列表技术,只渲染可视区域。
  • 高级筛选:别只给一个搜索框。销售需要按“行业”、“地区”、“跟进状态”组合筛选。我们把筛选条件做成了折叠面板,常用条件置顶。
  • 列自定义:不同的人关注点不同。有人想看“上次跟进时间”,有人想看“预计成交金额”。我们允许用户拖拽列顺序,甚至隐藏列,配置保存在本地 LocalStorage 或者用户配置表里。

2. 销售漏斗的可视化

老板最爱看漏斗图。从线索到成交,每个阶段的转化率是多少。

一开始我们用 ECharts 画了个静态图。后来发现不够,老板想点某个阶段,比如“报价中”,直接下钻看到具体是哪些客户卡在这里。于是我们做了交互联动,点击扇区,右侧滑出对应的客户列表。

一开始我们用 ECharts 

这里有个技术点:漏斗图的数据是实时计算的吗?对于数据量大的系统,实时聚合查询 count 会拖慢数据库。我们采用了“预计算”方案,每天凌晨跑批处理,把各阶段的数量统计到一张日报表里,前端直接读报表。虽然有一天的延迟,但对于宏观决策足够了,而且系统性能提升了十倍不止。

3. 移动端适配

别以为销售都用电脑。很多时候他们在客户现场,需要立刻查一下库存或者录入个拜访记录。

我们没单独开发 App,成本太高。直接用了响应式布局,配合 PWA 技术。虽然体验不如原生,但胜在更新方便,不用发版。重点优化了输入体验,比如手机号输入框自动调起数字键盘,地址选择器做了简化。

四、那些容易被忽视的“隐形坑”

系统跑起来之后,真正的问题才刚开始。以下是几个让我半夜起来修 Bug 的点。

1. 数据导入与清洗

系统上线第一天,销售总监扔给我一个 5 万行的 Excel 文件:“把历史数据导进去。”

Excel 里的数据有多脏,做过的人都知道。手机号有带空格的,有带横线的;公司名称有全角半角混用的;甚至有重复数据。

如果直接导入,系统里全是垃圾。我们专门写了一个“导入预处理”模块。

  • 格式校验:手机号正则匹配,不合法的直接标红报错。
  • 查重机制:导入前,先拿手机号或公司名在库里查一遍。如果存在,提示是“更新现有客户”还是“跳过”。
  • 异步处理:5 万条数据,同步导入肯定超时。改成上传文件后,后端生成一个任务 ID,前端轮询进度条。后台用队列(Queue)慢慢消费,导完了发个站内信通知。

2. 操作日志(审计追踪)

CRM 里数据变动非常敏感。一个客户从 A 销售名下转到了 B 销售名下,如果没记录,以后扯皮都说不清。

我们搞了个“操作日志”中间件。任何 POST, PUT, DELETE 请求,都会自动记录:谁,在什么时间,改了哪张表的哪条数据,旧值是什么,新值是什么。

这个日志表增长非常快,所以我们做了分表策略,按月份归档。而且,这个日志对普通销售不可见,只有管理员能查。有一次,两个销售争一个客户,说对方抢单,就是靠查这个日志,精确到秒级,才断清楚了公理。

3. 性能瓶颈与索引

刚开始数据少,怎么查都快。半年后,跟进记录表突破了 500 万行。销售反馈:“查个客户历史跟进,转圈圈转半分钟。”

查执行计划,发现全表扫描了。原因是我们虽然给 customer_id 加了索引,但查询时经常带着 typecreate_time 范围查询。

后来我们建立了联合索引 (customer_id, create_time)。同时,对于一年前的历史跟进记录,我们做了“冷热分离”。前端默认只查最近半年的,如果要查更早的,需要点“加载历史”,走归档库。这样主表的体积控制在合理范围,查询速度瞬间回归。

五、关于“智能化”的冷思考

现在是个系统都敢叫 AI CRM。什么自动写跟进记录,什么预测成交概率。

在搭建初期,我劝你克制

我们一开始也想过接个大模型 API,帮销售自动生成跟进摘要。结果发现,准确率只有 70%,销售还得花时间去改,反而更麻烦。而且,这增加了额外的 Token 成本。

CRM 的核心价值是流程标准化数据沉淀,而不是花哨的功能。先把基础的增删改查、权限、流程流转做稳,让销售愿意用,数据能录进来,这才是第一步。等数据量够了,再考虑用数据分析反哺业务,比如通过历史数据告诉销售:“这类客户通常在第三次拜访后成交,建议你加大跟进频率。”这种基于统计的建议,比瞎猜的 AI 更靠谱。

六、部署与运维:别在上线当天崩了

我们用的是 Docker 容器化部署,配合 Jenkins 做 CI/CD。

上线前,一定要做数据备份。这是底线。我们设置了每天凌晨 3 点全量备份数据库,并同步到异地 OSS 存储。有一次,一个实习生误操作删了一个表,幸亏有备份,半小时内恢复了,不然真是重大事故。

另外,监控报警要配好。别等销售打电话说“系统挂了”你才知道。我们接了钉钉机器人,数据库连接数过高、接口响应时间超过 2 秒、服务器 CPU 飙高,都会自动发消息到技术群。

七、写在最后:系统是有生命的

很多人觉得,系统开发完,项目就结束了。其实,上线只是开始。

CRM 是一个需要“养”的系统。业务在变,流程就在变。三个月后,公司开展了新业务线,原来的“商机阶段”不够用了,得加。半年后,老板想看“回款率”,数据库里得补字段。

作为搭建者,你要保持和业务的沟通。每个月,我都会去听一次销售例会,听听他们吐槽什么。有时候,一个小小的改动,比如把“必填项”改成“选填项”,就能极大提升他们的录入意愿。

搭建 CRM 平台,技术难度其实不算顶尖,难的是对业务的理解,以及在“灵活性”和“规范性”之间找平衡。太规范,销售觉得束缚;太灵活,数据就是一盘散沙。

如果你正准备动手,我的建议是:小步快跑,先上线核心功能,再迭代。别憋大招,憋半年出来一个没人用的东西,那是最大的浪费。

最后,送给大家一句话:最好的 CRM,不是功能最强大的,而是销售最愿意打开的。当销售发现这个系统能帮他省钱、帮他赚钱、帮他少加班的时候,你的 CRM 才算真正成功了。

这条路挺累,掉头发是肯定的,但看着杂乱无章的业务数据变成清晰的图表,看着团队因为工具的提升而效率翻倍,那种成就感,也是真的香。祝大家搭建顺利,少遇 Bug,多拿奖金。

这条路挺累,掉头发是肯定的,但

悟空CRM产品截图

推荐立刻免费使用中国著名CRM品牌-悟空CRM,显著提升企业运营效率,相关链接:

CRM系统免费使用

开源CRM系统

CRM系统试用免费

登录/注册
客服电话
售前咨询