做CRM系统开发这几年,我自己从零搭过、也给别人的系统做过重构,踩过的坑比写过的代码还多。CRM这个东西,听起来不就是个“客户管理”吗?真做起来你才会发现,它的技术难点根本不在“管理”两个字上,而在“客户数据怎么流转”“销售流程怎么落地”“权限边界怎么划”“跟外部系统怎么对接”这些听起来枯燥、做起来要命的地方。这篇就围绕客户关系管理的技术架构和实践,把我自己的经验和思考完整地梳理一遍,给准备做CRM或者正在做CRM的同学一个参考。
1. 内容整体设计与思路拆解
1.1 CRM系统到底是什么,很多人理解偏了
先说个我自己的观察。很多团队做CRM,一开始就把系统定义成“客户档案库”,然后拼命设计客户表、联系人表、跟进记录表,最后做出来一个非常漂亮的“电子台账”。但真正用起来,销售不愿意录,管理者看不到东西,系统很快就成了摆设。
CRM系统的核心不是“记录客户”,而是“管理销售流程”。“管理”两个字背后,是线索分配、商机推进、跟进提醒、成交转化、数据分析这一整条链路。技术架构要服务的,也是这条链路,而不是某个孤立的页面。
我自己的理解是,CRM系统本质上是一个“以客户数据为中心的流程引擎”。它要解决的是三个问题:客户数据怎么统一沉淀,销售过程怎么标准化推进,管理层怎么实时掌握业务状态。技术架构的所有设计,最终都要回答这三个问题。
1.2 自研还是买现成,这个选择题要先做
很多文章一上来就聊技术栈,我觉得这是本末倒置。第一步要想清楚的,是“要不要自己开发”。
如果团队人数不到20人,业务模式又比较标准,说实话买现成的SaaS CRM更划算,自己开发的人力成本、维护成本、迭代成本加起来,大概率比你想象的高得多。但如果你遇到的是下面这几种情况,自研就是合理的选择:
- 业务模式特殊,现成产品的字段、流程、权限模型根本套不上
- 客户数据敏感,数据必须完全掌握在自己手里,不能放到第三方平台
- 需要跟内部的ERP、工单系统、财务系统做深度打通,现成产品开放接口不够灵活
- 公司本身有技术团队,且CRM是核心业务系统,不是辅助工具
我在经历过几个项目后,自己的判断标准很简单:如果CRM是公司业务的中枢,那一定要自研。如果CRM只是辅助销售的记录工具,那买现成的就行,别折腾。
1.3 整体技术栈选型,我走过的一条完整路线
技术栈的选择,跟团队规模和系统定位强相关。我的经验是:不要一上来就上微服务、分布式、消息队列,大部分CRM项目,单体应用加合理分层就能扛住。
我自己比较常用的一套组合是:
- 后端:Java + Spring Boot,稳定、生态好、招人容易
- 数据库:MySQL,存储结构化业务数据,加上Redis做缓存
- 前端:Vue或React,管理后台类的系统这两个都很成熟
- 文件存储:OSS类对象存储,用来放附件、头像、导入文件
- 搜索:如果数据量到了几百万条,可以引入Elasticsearch,前期用MySQL的模糊查询就行
这套组合的核心特点就是“稳”。CRM系统不是高并发场景,真正的瓶颈在复杂查询、权限过滤和数据一致性上,把精力花在业务建模上,比花在技术炫技上值得多。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心细节解析与实操要点
2.1 客户数据模型的设计,这是地基中的地基
客户数据模型是整个CRM系统的地基。我见过太多项目,一开始客户表设计得很简单,后面业务复杂了就开始各种打补丁,加字段、加关联表、加类型判断,最后代码逻辑乱到没人敢动。
先给一套我常用的核心表结构设计,你可以直接参考:
客户表(customer)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键 |
| customer_name | varchar(128) | 客户名称 |
| customer_type | tinyint | 客户类型:1-企业,2-个人 |
| industry | varchar(64) | 所属行业 |
| source | varchar(32) | 客户来源 |
| owner_id | bigint | 负责人ID |
| status | tinyint | 状态:1-潜在,2-跟进中,3-已成交,4-已流失 |
| level | tinyint | 客户等级 |
| phone | varchar(32) | 联系电话 |
| address | varchar(255) | 地址 |
| created_at | datetime | 创建时间 |
| updated_at | datetime | 更新时间 |
| deleted | tinyint | 逻辑删除标记 |
跟进记录表(follow_record)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键 |
| customer_id | bigint | 客户ID |
| user_id | bigint | 跟进人ID |
| content | text | 跟进内容 |
| next_time | datetime | 下次跟进时间 |
| follow_type | tinyint | 跟进方式:1-电话,2-拜访,3-微信,4-其他 |
| created_at | datetime | 创建时间 |
商机表(business_opportunity)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键 |
| customer_id | bigint | 客户ID |
| name | varchar(128) | 商机名称 |
| amount | decimal(10,2) | 预计金额 |
| stage | tinyint | 阶段:1-初步接洽,2-需求确认,3-方案报价,4-商务谈判,5-赢单,6-输单 |
| owner_id | bigint | 负责人ID |
| expected_deal_date | date | 预计成交日期 |
| created_at | datetime | 创建时间 |
| updated_at | datetime | 更新时间 |
这里有几个设计要点我需要重点提醒:
第一,客户和联系人要拆开。一个企业客户下面可能有多个联系人,采购、技术、财务各一个,如果联系人字段直接塞在客户表里,后面做对接、做数据分析都会很痛苦。
第二,必须用逻辑删除。CRM系统里客户数据是核心资产,物理删除导致的数据丢失事故我见过不止一次。用deleted字段标记删除,查询时统一过滤,误删还能找回。
第三,status和stage要区分开。status是客户的整体生命周期状态,stage是商机的销售阶段。这俩如果混在一起,后面统计销售漏斗、分析客户转化率的时候,数据会非常难算。
第四,owner_id这个字段极其关键,它直接关联到权限模型。谁的客户、谁能看、谁能改,全部靠它来驱动。
2.2 权限模型设计,CRM里最容易翻车的地方
权限模型是CRM系统里最容易被低估的模块。很多项目把权限做成“管理员全部可见、销售只可见自己”的粗粒度控制,一上线就发现各种冲突:经理要看团队的,总监要看全公司的,跨部门协作的客户到底算谁的,离职员工的客户怎么交接。
我实践中比较推荐的是“数据范围”模式,核心思路是在所有数据查询层统一拼装数据权限条件:
- 本人数据:owner_id = 当前用户ID
- 部门数据:owner_id IN (当前用户所在部门的所有用户ID)
- 部门及下属部门数据:owner_id IN (当前用户部门及所有子部门的所有用户ID)
- 全部数据:无额外条件
实现上,每个用户挂一个data_scope字段,查询时根据data_scope动态拼接SQL条件。这个方法看起来简单,但非常实用,能覆盖90%以上的CRM权限需求。
这里有个关键细节:权限过滤必须放在SQL层面,不能查出所有数据后在内存里过滤。我接过一个外包项目,权限是在Java内存里过滤的,客户数据到5万条的时候,接口响应时间直接飙到10秒以上,整个系统基本没法用。
另外一个容易踩坑的点是“字段级权限”。比如普通销售只能看客户的电话和地址,不能看客户的成交金额;经理可以看成交金额但不能看成本。这种需求在字段层面做控制,建议在查询时动态选择返回字段,或者在实体类上用注解的方式做字段权限标记。别想着在前端隐藏,前端隐藏只是视觉上的,接口层面必须过滤。
2.3 客户查重与合并,听起来简单做起来复杂
客户查重是个很有意思的功能。需求文档上往往就一句话:“录入客户时自动查重”。但真正做起来,你会发现要处理的问题非常多:手机号换了格式怎么处理,企业名称带了“有限公司”和没带怎么算重复,同一家客户被不同销售录入了怎么合并。
我的实践经验是分三步走:
第一步,录入时精确查重。客户名称完全一致、或联系电话完全一致,直接提示“该客户已存在”。这一步用普通索引查询就够了。
第二步,数据清洗。手机号统一去掉空格和横线,企业名称统一去掉“有限公司”“有限责任公司”等后缀,再做精确匹配,能消除大部分格式导致的重复。
第三步,定期合并。对于历史数据中的重复客户,写一个定时任务扫描,用相似度算法(比如编辑距离或分词匹配)找出疑似重复,由管理员确认后合并。注意合并时要把跟进记录、商机、订单这些关联数据一起转移,不能只合并客户主表。
这块最容易出问题的就是合并操作。两个客户的跟进记录、商机记录要归并到一个客户下,如果操作不当,轻则数据错乱,重则把另一个客户的数据直接覆盖掉。我这里给一个相对安全的合并流程:开启事务,先迁移子表数据(把被合并客户的关联数据owner_id改成保留客户ID),再删除被合并客户主表,最后提交事务。顺序一定不能反。
2.4 表结构设计里的几个通用坑
除了客户核心表,CRM系统还有用户表、部门表、字典表、操作日志表、导入导出记录表这些通用表。这里有几个通用性的坑,我帮大家提前排掉:
-
字典表不要写死在代码里。客户来源、行业、跟进方式这些枚举值,建议集中放到字典表里,前端动态加载,后台可配置。否则每次加一个选项都要发版,会把人烦死。
-
金额字段用decimal,不用float/double。CRM涉及金额计算的地方不少,比如商机金额、订单金额、回款金额,用float会出现0.1+0.2不等于0.3的问题。
-
时间字段统一用datetime,并且建议统一存UTC。CRM系统如果涉及多地区部署,时区问题会很麻烦。我自己的习惯是数据库统一存UTC,接口层转本地时区,前端展示层再格式化。
-
所有核心表都要有created_at、updated_at、deleted三个字段。这不是可选项,是必须项。后面做数据同步、增量更新、日志追溯都靠它们。
3. 实操过程与核心环节实现
3.1 客户跟进流程,从录入到转化的完整链路
我来说说最核心的一段流程实现。以“线索录入到成交”这条主线为例,完整的链路是这样的:
- 销售录入线索(客户信息+联系人信息)
- 系统自动校验查重,分配负责人(默认是录入人自己)
- 销售跟进客户,每次跟进后填写跟进记录,系统自动更新客户status为“跟进中”
- 销售在跟进过程中发现客户有明确需求,创建商机,填写预计金额和预计成交日期
- 商机进入销售漏斗,管理者可以按阶段查看转化情况
- 商机阶段更新为“赢单”时,系统自动把客户status更新为“已成交”
- 最终客户进入售后阶段,由售后人员继续跟进
这段流程的代码实现,核心在状态机。客户表的主状态和商机表的阶段状态之间是有联动关系的。我建议用一个状态机组件来管理,不要用一堆if-else写状态流转,否则后面加状态、改流程的时候,代码会乱到怀疑人生。
状态机的设计思路是这样的:定义状态和事件,状态流转通过事件触发,比如“创建商机”这个事件,会把客户状态从“潜在”变为“跟进中”;“赢单”这个事件,会把商机阶段从“商务谈判”变为“赢单”,同时把客户状态从“跟进中”变为“已成交”。每个事件触发时可以挂各种动作:写日志、发通知、算提成。
3.2 跟进提醒和自动化的落地方式
CRM系统里另一个高频需求是“提醒”,包括:今天要跟进的客户、逾期未跟进的客户、长期未成交的商机、即将到期未续费的客户。
这块的实现方式,我推荐用定时任务+消息通知的组合方案。任务调度用XXL-JOB或者Spring自带的Scheduled都行,核心流程是:每天凌晨跑一次扫描,查当天需要跟进的客户列表,然后通过站内信、短信或企业微信推送给对应负责人。
这里有几点经验想分享:
第一,提醒规则一定要可配置。别把“跟进间隔几天提醒一次”写死在代码里。不同行业、不同规模的客户,跟进频率是完全不同的。规则配置做成后台可维护的,会省掉你后面无数个“改需求”的麻烦。
第二,通知要做防打扰设计。我见过一个系统,每天早上八点准时给销售弹20条待办提醒,结果销售直接把通知权限关了,彻底失效。正确的做法是聚合推送,把当天所有的待办汇总成一条摘要,让用户自己决定何时处理。
第三,状态变更要实时通知到人。比如客户被重新分配了、商机被其他同事更新了、自己负责的客户有新提醒,这类通知要即时推送,避免信息滞后导致跟进时机延误。
3.3 销售漏斗与数据看板的实现
管理层每天打开CRM系统,第一眼要看的就是销售漏斗和数据看板。这部分的实现,核心是聚合统计。
我常用的SQL写法就是按阶段分组统计:
sql复制SELECT
stage,
COUNT(*) AS opportunity_count,
SUM(amount) AS total_amount
FROM business_opportunity
WHERE deleted = 0
AND owner_id IN (SELECT user_id FROM sys_user WHERE dept_id IN (...))
GROUP BY stage
ORDER BY stage;
这里的重点还是权限过滤,统计结果必须限定在当前登录用户能看到的数据范围内,否则就是严重的数据越权。
另外一个要点是,统计接口要做缓存。销售漏斗、仪表盘这些数据,频繁变化但其实不需要秒级实时。我的做法是缓存5-10分钟,如果有人觉得数据不够新,再加一个手动刷新按钮就行了。别小看这个优化,数据量大之后,这种聚合查询对数据库的压力非常大,缓存能帮你扛住95%以上的访问量。
对于超大数据量的场景,比如客户量超过百万、商机记录超过千万,建议用定时任务把统计结果预先计算好,落到单独的统计表里,前端直接查统计表,不要在业务高峰期实时计算。
3.4 第三方集成与开放API
回到标题里的“客户关系管理”这个定位,CRM系统很少是孤立存在的。它几乎一定要跟外部系统打通。以我实际做过的项目来看,最常见的集成包括:
支付回写集成
很多CRM系统会内嵌收款功能。客户在销售推进过程中需要在线支付定金或者尾款,支付完成后要自动回写CRM,把订单状态变为已支付。我自己的做法是:对接聚合支付渠道,支付成功回调后通过消息队列通知CRM服务,CRM更新订单状态并写入操作日志。这里有个经验,支付回调一定要做幂等处理,否则网络重试会导致重复更新数据。
短信与邮件通知
跟进提醒、验证码、营销通知,都需要通过短信或邮件通道发出。建议抽象一个统一的消息服务,把短信、邮件、站内信、企业微信都封装成同一种接口,业务方只需要调一个方法,不用关心底层用的是什么通道。
企业微信/钉钉集成
这块在国内做CRM基本绕不开。企业微信集成主要做两件事:一是组织架构同步,企业微信里的部门、成员定期同步到CRM;二是消息通知,跟进提醒、审批通知这些推送到企业微信。钉钉的逻辑类似,但接口差异很大,建议在集成层做适配器模式,隔离不同平台的差异。
开放API
如果CRM未来可能要给外部合作伙伴或移动端使用,从第一天就要设计好开放API。API规范建议直接走RESTful风格,使用OAuth2.0做认证授权。这里我有个血的教训:API接口一定要做参数校验和访问频率限制。我做过一个项目没做限流,被第三方系统的一个bug触发了死循环调用,直接把CRM数据库连接池打满,整个系统瘫痪了半小时。
4. 常见问题与排查技巧实录
4.1 问题速查表,我把踩过的坑都列出来
下面这些是我在CRM项目里真正遇到过的问题,整理成了一张速查表:
| 问题现象 | 可能原因 | 排查思路 |
|---|---|---|
| 客户列表越来越慢 | 缺少索引或索引失效 | 查看慢查询日志,分析执行计划,给常用查询条件加联合索引 |
| 数据权限错乱 | 权限过滤条件缺失 | 检查SQL是否统一拼接了数据权限条件,排查自定义SQL是否绕过权限 |
| 重复客户频繁出现 | 查重逻辑不严谨 | 检查查重是否覆盖了手机号、企业名称规范化后的匹配 |
| 跟进记录丢失 | 子表数据未做逻辑删除,被物理删除 | 检查delete操作是否统一走逻辑删除接口 |
| 销售漏斗数据对不上 | 统计SQL没做权限过滤 | 核对统计条件是否和前端用户数据权限一致 |
| 客户分配后原负责人还能看到 | 权限判断只校验了页面,没校验接口 | 前后端都要做权限控制,以后端为准 |
| 导入Excel时报内存溢出 | 一次性读取所有数据到内存 | 改为流式读取,分批插入,同时在事务中处理 |
| 推送通知收不到 | 消息队列消费失败且无重试机制 | 增加失败重试和死信队列,以及告警监控 |
4.2 客户撞单问题,解决思路比技术更重要
CRM系统里有个业务层面的经典问题:同一个客户,两个销售都录入了,算谁的?这个问题技术本身不难,难的是业务规则的制定。
我的建议是采用“保护期+申诉”机制:客户首次录入后,设置一个保护期(比如7天),保护期内只有录入人及其上级能看到和跟进;保护期结束后,如果客户长期(比如30天)未跟进,系统自动回收并放入公海池,其他销售可以获取。这样既保护了先录入者的利益,也防止了客户资源被长期占用。
技术上的实现核心是一个定时任务,扫描客户表的last_follow_time,超过阈值且status不是“已成交”的记录,自动把owner_id改成空,状态置为“公海”。这段逻辑要写在事务里,并且处理好并发问题,避免多个销售同时抢同一个客户。我一般会用乐观锁来解决,在更新时加上“条件:owner_id = NULL”,保证只有一个更新成功。
4.3 数据导入导出,这个环节最容易出事故
CRM系统上线初期,最痛苦的事情就是把老系统的数据迁移过来,或者从Excel导入。很多项目都卡在这一步,导了几天几夜,数据还对不上。
我的经验是,导入功能一定要做成“可校验、可预览、可回滚”的流程:
- 先上传文件,系统解析后不做入库,而是把数据展示给用户预览
- 预览界面同时标出每行数据的校验结果:哪些字段缺失、哪些手机号格式不对、哪些客户重复
- 用户修正或确认后,再真正入库
- 入库采用分批事务,每批100条左右,一批失败不影响其他批
- 记录完整导入日志,出错时可以按批次回滚
还有一个细节,导入时一定要做幂等处理。如果用户不小心点了两次提交,不能产生两批重复数据。我一般会用“导入批次号”来做控制,同一批次号重复提交,直接提示“该批次已处理”,不再执行。
导出功能同样要注意。大数据量导出,不要把数据一次性加载到内存里再生成Excel,要分批查询、流式写入。否则客户量过10万的时候,导出接口很容易OOM。另外导出过程中如果用户关掉了页面,后端任务要能后台继续执行,完成后提供下载链接,这个体验会好很多。
4.4 性能优化,我把优化优先级排序给你
CRM系统的性能问题,多半出在列表查询和数据统计上。我给出了一个优化优先级排序,按照这个顺序做,收益最大:
第一优先级:SQL层面的优化。检查所有核心列表查询是否走了索引,常用条件是否有联合索引覆盖。大部分性能问题在这一步就能解决。比如客户列表查询常用条件是owner_id + status + created_at,那么建一个(owner_id, status, created_at)的联合索引,性能会翻好几倍。
第二优先级:缓存优化。给热点数据加Redis缓存,比如数据字典、系统配置、销售漏斗统计结果。这些数据读多写少,缓存效果非常明显。
第三优先级:数据库层面的优化。读写分离、分库分表,这些方案能不上就不上,复杂度太高。如果真到了这个量级,优先考虑读写分离,把统计类的查询全部引导到从库。
第四优先级:应用层面的优化。异步化处理耗时操作,比如导入导出、批量通知、报表生成,全部丢到消息队列里异步处理,不能阻塞主流程。
这里我想特别提醒一句:别在一开始就为不存在的性能问题做设计。CRM系统如果预期用户量就几百人,那单体架构加合理的SQL优化完全够了,没有必要上微服务。微服务带来的分布式事务、链路追踪、部署复杂度,会把你拖死在开发阶段。
5. 一些值得你复制去用的设计细节
5.1 操作日志,别等出问题才后悔
CRM系统里的每一个操作,都建议记录下来:谁在什么时间把客户状态从“潜在”改成了“跟进中”,谁把商机金额从10万改成了20万,谁在什么时间把客户负责人从A转移给了B。这些操作日志,平时可能没人看,但一旦出现问题需要追责或者数据审计,就是唯一的线索。
我推荐用AOP切面来做操作日志,在关键Service方法上打一个@OpLog注解,自动记录方法入参、操作人、操作时间和操作结果。好处是不侵入业务代码,开发效率高。注意日志不要记录敏感字段的完整值,比如手机号、身份证号,要脱敏后再落库,这是合规要求。
5.2 客户公海池机制,激活沉睡客户
公海池是CRM系统里非常实用的功能。简单来说,所有无主客户、超期未跟进的客户、主动放弃的客户,都会进入公海池,其他销售可以从中领取。这样可以避免客户资源被浪费。
实现上有几个点需要注意:公海池的领取规则,比如每个销售每天最多领取多少条、是否限制同行业客户;公海池的回收规则,比如客户领取后多少天内未跟进会自动退回;公海池的分配规则,可以按固定周期轮询,也可以让销售主动抢单。规则不复杂,重在灵活配置。
5.3 多租户设计,SaaS化要考虑在前面
如果你的CRM最终要做成SaaS产品,多租户设计从第一天就要想清楚。行业内的做法主要有三种:
- 独立数据库:每个租户一个库,隔离最彻底,但成本高
- 共享数据库、独立Schema:每个租户一个schema,隔离性中等,成本中等
- 共享Schema、租户ID区分:所有数据在同一个表里,通过tenant_id字段区分,成本最低,但隔离性最差
我个人的建议是,大部分SaaS CRM选择第三种就够了,在业务表里加上tenant_id字段,所有查询强制带上租户条件,配合行级权限控制。只有在客户数据特别敏感、合规要求特别高的场景,才考虑独立数据库。
这里有个关键点:多租户条件下,索引设计要把tenant_id放在联合索引的第一位,否则查询会把所有租户的数据都扫一遍,性能会非常差。
6. 项目落地时容易被忽视的坑
6.1 业务人员说“我要的很简单”,别信
做CRM系统的过程,本质上是一场业务梳理的过程。业务人员刚开始都会说“我要的很简单,就是个客户管理”,但当你真的去问细节时,会发现一点都不简单:客户状态有几个,由谁更新,字段由谁填写,哪些是必填,哪些人能看到哪些数据,客户冲突算谁的,离职怎么交接,审批流怎么走。
我建议在项目启动阶段,多花时间和业务人员、销售管理者聊,把业务规则一条条确认清楚,形成需求文档,让业务方确认签字。不要怕文档写得长,CRM系统最怕的就是需求不明确,上线后才来改流程,改数据模型,那是真正的灾难。
6.2 客户数据迁移,先摸清家底再动手
系统上线前的老数据迁移,是另一个容易翻车的环节。老系统的数据质量通常很差:客户名称不规范、手机号有重复、状态字段对不上、历史跟进记录缺失。如果不做清洗直接导入新系统,后面查重、统计、权限全部会出问题。
我的建议是,迁移前先做一轮数据盘点,输出数据质量报告,跟业务方确认清洗规则。比如老系统里状态为“已流失”的客户,迁移后是保留还是删除;手机号为空的客户,是否允许进入新系统;重复的老客户,是自动合并还是人工确认。这块工作很繁琐,但省不掉。
6.3 没有移动端,CRM等于废了一半
CRM系统的用户是销售,销售大部分时间在外面跑,不可能随时开着电脑。一个没有移动端的CRM,对销售来说就是“回到公司再录入”的工具,跟进记录的及时性和完整性都会大打折扣。
如果项目资源有限,至少要做一套H5或者小程序端的轻量版,覆盖核心功能:客户查看、跟进记录填写、拜访签到、商机更新、待办提醒。不用跟PC端功能一样全,但要抓住最核心的那几个动作,让销售在外面也能快速记录。
6.4 上线后的持续运营,比开发更重要
CRM系统上线只是开始,真正的考验在之后的一个月到三个月。销售的习惯很难改,他们习惯了Excel台账,你用CRM系统?体验不好就弃用。
我做过的一个项目中,销售开始觉得录入客户资料太麻烦,每天都拖着不录。后来我们做的几个动作非常有效:一是在每天早会上展示团队数据看板,让每个人看到自己的跟进统计;二是把系统里的数据跟销售提成挂钩,倒逼录入;三是不断收集反馈,持续优化录入体验,把常用操作简化为尽量少的点击次数。三个月后,系统的数据完整率才真正上来。
所以做CRM系统开发,技术方案只是三分之一,另外三分之二是需求梳理和运营推动。这一点,我说再多都不如你亲自体会一次来得深刻。
最后再说一个自己总结的小经验:CRM系统这类复杂业务系统,最忌讳“一次到位”的开发方式。我强烈建议先用最小可用版本跑通客户管理、跟进记录、权限控制这三个核心闭环,然后基于真实用户反馈,快速迭代商机管理、数据统计、集成对接这些外围功能。这样你能在最短时间内看到系统有没有被用起来,而不是埋头开发半年后,才发现方向走偏了。
