新闻详情

新闻详情

首页 / 资讯中心 / 详情

自研CRM实践:从沟通归集到权限设计,打造销售愿意用的客户管理系统

发布时间:2026/9/26 13:16:48来源:尧图网络
自研CRM实践:从沟通归集到权限设计,打造销售愿意用的客户管理系统
团队从Excel客户表切换到自研的DeskcommCRM已经稳定运行一年多。这个系统解决了我们最痛的问题客户信息散落在销售个人微信、邮件、通话记录里管理者无法掌握真实跟进进度。写这篇东西是想把DeskcommCRM从需求分析、数据建模、沟通归集、权限设计到落地排坑的完整思路梳理一遍给正在纠结到底要不要自研CRM或者CRM怎么做才不像个花架子的朋友一个参考。先泼一盆冷水市面上现成的CRM工具不少功能一个比一个全但真正落到销售愿意用、管理者看得清这两个基本点上很多产品是失位的。销售觉得录入是负担管理者觉得报表是摆设最后系统成了摆设。DeskcommCRM这个名字里有两个关键词Desk代表桌面办公场景comm代表通信Communication我们的核心思路很简单——把客户管理从人去找系统变成系统自己汇总人后面所有设计都围绕这一点展开。1. 为什么放着现成CRM不用要自研一套DeskcommCRM先说需求背景。我们是一个20人左右的小型业务团队销售10人加上售前、运营和管理层。在DeskcommCRM出现之前客户信息主要存在三个地方销售自己的微信和手机通讯录、企业微信聊天记录、各自的Excel跟进表。每周一开例会每个人口头汇报这周聊了几个客户、有几个意向信息失真非常严重。1.1 现成方案在实际使用中的三个断层第一个断层是数据主动性问题。市面上的SaaS CRM核心逻辑是销售主动录入字段比如客户名称、联系方式、跟进阶段、预计成交金额。这个逻辑看似合理但和销售的真实工作习惯是冲突的。销售一天的工作流里大量时间在处理聊天、邮件、通话让他在处理完一个客户之后再去系统里填七八个字段每次操作一二十分钟一周下来他就烦了。一旦录入不及时报表就是滞后的管理者看到的永远是上周甚至上个月的历史。第二个断层是沟通记录和业务数据是分离的。很多CRM有一个跟进记录模块但它是独立存在的和实际发生的聊天记录、邮件、通话录音没有打通。销售写客户对价格有异议正在考虑但具体异议是什么和客户在微信里怎么聊的管理者看不到。真到了复盘或者客户交接新接手的销售还是要翻聊天记录。第三个断层是权限模型僵化。小团队的诉求其实很具体我需要让每个销售只能看到自己的客户同时让管理层看到全部数据但不要让销售A看到销售B的客户。现成系统大多提供了角色权限但配置复杂而且一旦出现抢单撞单的情况缺乏灵活的归属判定和转移机制。我们用Excel的时候撞单靠喊靠管理层仲裁上了系统之后这个矛盾会更尖锐必须从机制上解决。1.2 自研的边界在哪里看到这里可能有人说你们20人的团队花几个星期自研CRM是不是太奢侈了我的判断依据是有没有不可替代的核心逻辑。如果只是维护一张客户表那确实用现成的就好但我们的核心诉求是沟通记录自动归集和权限内数据隔离这两件事需要深度对接企业微信、邮件服务器和通话系统属于高度定制化的逻辑现成系统要么不支持要么需要额外付费购买API接口且数据不落地。自研的技术成本其实没有想象的那么高。团队里两名后端工程师一名前端我用周末和晚上前后大概花了三周时间做完了MVP版本。真正有价值的不是那几百行CRUD代码而是把业务流程拆解清楚、把数据模型设计合理。这个思路花的时间反而最长也是这篇文章想重点展开的部分。2. 数据模型设计客户、商机与跟进记录怎么组织CRM的数据模型是地基地基歪了后面加什么功能都是徒劳。DeskcommCRM的第一版数据模型我参考了Salesforce和HubSpot的经典设计但做了大量减法只保留了一线销售真正用得上的实体客户Account、联系人Contact、商机Opportunity、跟进记录Engagement。四个实体之间的关系很简单一个客户下有多个联系人和多个商机一个商机关联多个跟进记录。2.1 为什么不把联系人和客户合并成一张表很多自研者容易犯的第一个错误就是把客户和联系人混在一起觉得一家公司就是一个联系人。实际业务里完全不是这样一家客户公司可能有采购对接人、技术对接人、财务对接人三个人关注点完全不同。如果你只建一张客户表那三个联系人的信息只能堆在备注字段里查询、筛选、关联商机全都麻烦。所以我坚持拆分。客户表存公司层面的信息公司名称、所属行业、规模、地址、来源渠道联系人表存个体层面的信息姓名、职位、电话、微信、邮箱、生日用于维系关系。两张表通过customer_id关联。这个设计在后期接入沟通记录时价值非常大——一条微信消息可能来自某位具体联系人我直接关联到联系人ID再通过联系人找到所属客户整个链路就通了。2.2 商机阶段和金额字段的动态设计商机Opportunity是销售管理里最核心的一个实体但也是最容易被过度设计的一个实体。我看过一些团队自己建的表光是商机阶段就搞了十几个状态什么初步接触需求调研方案提报商务谈判合同审批看着专业实际销售人员根本分不清需求调研和方案提报的边界最后全选一个中间状态报表失去意义。DeskcommCRM的商机阶段只保留了四个1-初步沟通、2-需求确认、3-方案报价、4-赢单/输单。每个阶段绑定一个预计成交概率10%、40%、70%、100%销售在推进时只需要选择当前最贴切的一个阶段。金额字段则是预估金额和实际成交金额分开存储预估可以随时改但系统保留修改历史管理层看的漏斗图基于阶段和金额自动汇总。字段设计还有一个经验每个表都保留一个JSON类型的扩展字段PostgreSQL的jsonb类型。这是给未来可能出现的个性化需求留的口子。销售团队今天说要记客户偏好明天说要记竞品情况不可能每次加需求都改表结构。扩展字段可以在不改表的情况下存储任意结构的数据查询时用GIN索引也能保证效率。2.3 跟进记录和联系计划分开存一开始我把跟进记录设计成一张大宽表字段包括沟通方式、沟通内容、下一步计划、下次联系时间。后来发现一个明显问题销售经常在沟通完现场写下一步计划但这个计划过两天就变了如果直接在原记录上修改沟通历史就被污染了管理员想复盘当初客户是怎么从意向变成流失的就找不到原始依据。所以我把实际发生的沟通和计划中的下一步动作拆成了两张表跟进记录表engagements只存不可变的历史事实包括沟通时间、方式、摘要、关联商机联系计划表tasks存待办事项包含计划时间、内容、状态待执行/已完成/已取消完成后可以反链到某条跟进记录上。这个拆分让数据性质非常干净历史是历史计划是计划报表取数时各取所需不会互相污染。3. Comm的落地把散落的沟通记录统一塞进客户时间线DeskcommCRM最花心思的模块是把整个团队在微信、邮件、电话里的沟通记录自动收集起来按时间轴归集到对应的客户档案下。销售打开一个客户页面就能看到从第一次接触到最近一次沟通的全部往来不用再去翻聊天记录。这也是comm这个词的真正含义。3.1 企业微信消息接入的核心链路因为业务团队主要在企业微信里和客户沟通第一优先级是接入企业微信的消息记录。这块技术方案是典型的Webhook模式在企业微信管理后台配置消息存档回调URL指向DeskcommCRM的消息接收服务每当有销售和客户之间的聊天消息产生企业微信会把加密的消息内容推送到我们的服务器。注意这里有个坑企业微信的消息存档接口默认是关闭的需要企业认证且单独申请开通而且消息内容用公钥加密必须在本地用私钥解密。我们第一次联调时卡了两天最后定位到是公钥ID匹配问题——企业微信回调里带的是公钥版本号需要根据版本号动态选择对应的解密公钥而不是永远用最新一把。这个细节在官方文档里写得很隐晦希望后来者少走弯路。解密后的消息结构是一个XML包里面有消息类型text、image、voice、发送人、接收人、消息内容、时间戳。我们的处理服务拿到后通过发送人和接收人的手机号或者企业微信ID去联系人表里匹配对应的客户联系人ID匹配成功的消息就写入消息归档表并按客户ID归集到时间线。匹配不成功的比如销售和同事的内部聊天直接丢弃不做归档。3.2 邮件归集IMAP拉取与发件人身份识别邮件这块相对简单但涉及两个隐蔽问题。我们用的是IMAP协议每五分钟增量拉取销售邮箱的未读邮件检查发件人域名是否和客户表里的公司域名匹配。匹配上的邮件把正文和附件摘要同步到客户时间线里。第一个隐蔽问题是时区。邮件头部Date字段有时带时区有时不带如果统一按服务器时区解析就会出现客户凌晨发的邮件被记录成了昨天这类错误。我们的做法是优先使用Date头里显式声明的时区偏移量缺失时才使用销售邮箱的默认时区。第二个问题是自动回复。客户设置的外出自动回复如果被当作正常沟通归集时间线上会混入大量本人出差期间无法及时回复这类噪声消息。我们在邮件过滤规则里加了一个疑似自动回复识别标题以Re:开头但正文检测到出差、假期、自动回复等关键词时打标但不进主时间线只在全部邮件tab里保留备查。3.3 通话记录怎么处理通话是销售和客户沟通里信息密度最高的方式但由于合规和隐私限制我们第一版没有做通话录音和实时语音转写只通过手机系统或者运营商通话详单的接口拉取通话记录呼叫方、接听方、时间、时长在时间线上展示某某销售与某某联系人通话X分X秒。至于通话内容销售通过语音转文字的快速输入在跟进记录里补充摘要听写转文字的准确率其实已经比手动打字高得多我们用了一款第三方ASR接口销售对着手机说一分钟自动转成文字草稿再改改错别字填进去。这里有个产品设计上的心得不要试图把所有东西都做成自动的。通话内容涉及商业机密和个人隐私强制录音会让销售产生被监控感反而不愿意用系统。让销售自己决定这一次沟通值不值得做详细记录反而能沉淀出高质量的信息。3.4 时间线的实现事件溯源思路所有归集到客户页面的数据最终都统一渲染成一条垂直时间线。时间线上的事件类型包括微信消息、邮件往来、电话记录、线下拜访、跟进记录、商机阶段变更。实现上我用的是事件溯源Event Sourcing的思路每一类事件表都包含统一的接口字段——event_time发生时间、source_type来源类型、source_id来源记录ID、summary摘要文本、linked_opportunity_id关联商机ID。渲染时间线时系统按客户ID和创建时间合并查询所有事件表按时间倒序取最近50条事件形成时间线。一次性跨表查询在数据量大的时候会慢我们的策略是维护一张客户时间线索引表消费者各事件写入方在每次事件写入成功后以事务方式向索引表插入一条待聚合记录定时任务聚合后更新索引表的聚合结果。这个方案把查询时间从几百毫秒降到了几十毫秒销售打开客户页面时体验顺畅很多。4. 销售团队最在意的权限模型数据隔离、抢单与交接自研CRM比现成产品更有优势的一点是权限模型可以根据团队真实的管理风格定制。销售团队的权限需求通常有三层谁能看哪些客户、谁能改哪些客户、客户归属发生变化时怎么处理。4.1 基于RBAC的数据范围控制DeskcommCRM采用经典的RBAC模型加数据范围Data Scope控制。角色分为三类管理员、销售主管、销售。管理员拥有全部权限包括系统配置销售主管可以查看管辖范围内所有销售的数据但不能编辑他人的客户销售只能查看和编辑自己的客户。数据范围的控制不是简单的owner当前用户而是通过一张数据范围和角色映射表实现。映射表里存了角色、部门、数据范围类型全部/本部门/仅本人。查询客户列表的时候系统动态拼接SQL条件判断当前用户的数据范围类型自动附加相应的SQL过滤条件。这个设计让后端接口不需要在每个查询里手动写死权限判断统一在一个QueryInterceptor里处理新增角色时只要配一条映射记录即可。这里要提醒一句数据范围的判断不能被前端控制不能因为在页面上隐藏了其他销售客户的入口就觉得安全了。所有权限校验必须落在后端因为前端隐藏入口只是用户体验层面的东西直接调API的人不care页面长什么样。4.2 撞单检测与客户归属仲裁小团队常见的撞单场景是销售A给客户王总发了方案客户暂时没回销售B不知道情况通过别的关系找到了王总也在跟进。如果不做机制最后就成了两个人私下争抢甚至有人在客户面前互相拆台。技术层面能做的是在创建客户时自动检测疑似重复。我们的实现思路是模糊匹配算法新建客户时系统提取公司名称的归一化字符串去掉空格、括号、公司后缀等用编辑距离算法比对现有客户表如果相似度超过阈值则在保存前弹窗提醒疑似与已有客户重复请确认是否继续创建。归属仲裁则依赖一个简单的保护期机制客户创建后有7天保护期保护期内其他销售无法抢单超出保护期后如果原归属销售超过14天没有更新跟进记录系统自动将该客户标记为可认领其他销售可以申请认领原归属销售会收到通知并有一个3个工作日的申诉窗口期。这个机制写进了系统也作为团队管理规定发给了所有人规则透明之后撞单矛盾少了很多。4.3 客户交接的数据完整性销售离职或者转岗时客户交接是管理上的痛点。DeskcommCRM做了一个一键交接功能管理员选择原归属销售再选择新归属销售系统会把所有客户、商机、跟进记录、联系计划的owner批量转移并且记录一条交接审计日志。审计日志里包含交接时间、操作人、原归属、新归属、涉及的客户数量。这个功能看似简单但隐藏着一个重要设计交接的客户列表不是管理员人肉选的而是系统自动生成的。我花了很大的精力来确保该交接的全部交接不该交接的别动。规则是该销售名下所以状态不是已赢单且不是已流失的客户、以及这些客户下的联系人、商机、开放式任务全部转移。已赢单和已流失的客户归入历史数据不转移而是保留在原归属名下便于后续财务报表审计。5. 从Demo到稳定运行搜索、去重、通知这几个硬骨头的处理MVP版跑通后真正让DeskcommCRM从能用变成好用的是几个容易被忽视的底层能力。这些能力看着不起眼做不好却非常影响日常使用体验。5.1 客户搜索为什么不用ES销售找客户最常用的操作是搜索输入客户名、联系人姓名、手机号马上出结果。第一反应是上Elasticsearch但我掂量了一下团队数据量撑死也就几万客户、几十万条沟通记录为了这个规模引入一套ES集群运维成本和部署复杂度太高了。最后选了PostgreSQL原生的全文检索能力tsvector和GIN索引。建表时在客户表上加了一个search_vector字段通过触发器在客户名称、联系人姓名、手机号等字段更新时同步更新tsvector查询时直接对search_vector做匹配。配合pg_trgm扩展做模糊匹配搜索华信能匹配到华信科技北京华信信息技术这种不完全一致的结果实测搜索响应在100毫秒以内完全够用。5.2 模糊去重先建立归一化词库去重引擎是DeskcommCRM里不断迭代的一个模块。第一版只做了完全匹配公司名称完全一致才提示重复结果撞单场景几乎没有被拦截到因为销售录入的腾讯科技和深圳市腾讯计算机系统有限公司根本对不上。第二版我开始做名称归一化先建立一个公司与行业后缀的词库把有限公司股份有限公司科技信息技术集团等高频词条记下来归一化时把这些词去掉只保留核心商号部分。比如深圳市腾讯计算机系统有限公司归一化成腾讯计算机系统腾讯科技深圳有限公司归一化成腾讯科技两者编辑距离接近但不完全相等。再结合模糊匹配算法阈值取0.85基本能把同公司的不同写法识别出来误报率也能控制在可接受范围内。这里必须说明的是没有一个去重算法是完美的。我们遇到过华为技术有限公司和华为海洋网络有限公司被提示重复的情况虽然实际上是两家不同的子公司但销售手动确认一次也不是什么大事。宁可有少量误报也不能漏报这个取舍我认为是对的。5.3 通知机制与沉默客户唤醒CRM系统最怕的是成为信息坟墓——数据都在但没人看。DeskcommCRM做了一个沉默客户唤醒的定时任务每天早晨9点扫描所有处于初步沟通阶段的商机如果距离最近一次跟进记录超过5天系统自动给归属销售推送一条企业微信应用消息客户【XX】已经5天没联系了记得跟进一下。这个小功能的数据基础是时间线索引表查询效率很高而且不需要销售主动去系统里看谁该跟进了。配合联系计划表里的到期任务销售每天打开企业微信就能看到当天该做什么系统从被动记录的账本变成了主动提醒的助手。这个转变是销售团队真正开始依赖系统的转折点。通知的发送走的是企业微信应用消息接口需要提前申请一个自建应用配置好AgentId和Secret。定时任务用系统的cron表达式控制本来想做成可配置的后来发现团队所有人的习惯都差不多就硬编码了每天早上九点。保持简单把精力花在更有价值的事情上。6. 上线后的真实收益、反思与继续迭代的方向DeskcommCRM上线到现在一年半中间经历过一次小规模的2.0重构整体收益是多方面的我这里只挑几个数字和感受说。6.1 管理者视角和数据成果最直接的变化是周一例会的效率。以前每个人挨个说这周聊了几个客户口头汇报半个小时现在管理层打开系统看漏斗图哪个销售手里有商机卡在需求确认阶段两周没动一目了然。决策从听汇报变成了看数据听解释信息失真的问题基本解决。从经营数据看在人员不变的情况下销售人均跟进的客户数量提升了约40%因为沉默客户唤醒机制帮每个销售捡回了很多本会遗忘的老客户。商机阶段的流转也更规范了赢单率的统计从拍脑袋变成了基于阶段概率的加权估算和实际结果的偏差在10%以内。这些数字不是说系统本身带来了增长而是系统让增长变得可追踪、可干预。6.2 复盘几个做得不够好的地方反思一下有一件事如果重来我会做得更早接入企业微信消息存档应该在第一版就做而不是第二版。第一版没有打通微信消息销售每天还要手动在跟进记录里贴聊天摘要使用意愿严重不足。第二版把消息自动归集之后录入成本几乎为零系统才真正被接受。这个先后顺序的教训是CRM的建设顺序必须以减少销售操作为主线先做自动归集再做分析报表。另一个做得不够好的是报表可视化。第一版直接在后台用表格展示数据管理层看着费劲后来前端用ECharts做了漏斗图和趋势图直观多了。如果一开始就把可视化考虑进去中间的返工成本就可以避免。6.3 下一步的路线图接下来想做的方向有几个按优先级排序第一是AI辅助跟进摘要通过自然语言处理从原始聊天记录中自动提取客户意向程度、预算、决策链等信息填充到结构化的标签里第二是移动端适配目前销售人员用着还比较依赖电脑但有相当一部分客户沟通发生在手机上简单适配一下核心页面很有必要第三是做更深的数据分析比如按行业、按来源渠道分析赢单率帮助管理层决定市场投放方向。按我自己做这个项目的体会CRM建设的核心从来不是技术难题而是对业务流程的理解深度。技术框架选熟悉、简单的就行把时间花在销售到底怎么干活这个问题上比堆新技术有价值得多。如果你们团队也在考虑自研CRM我的建议很简单先把数据模型想清楚再把权限模型设计好然后从自动归集沟通记录开始做其他功能都会水到渠成。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

RetinaFace C++ ONNX推理实战:从模型加载到工程部署 2026/9/26 15:21:30

RetinaFace C++ ONNX推理实战:从模型加载到工程部署

简介:这是一份面向计算机视觉学习者与开发者的RetinaFace算法C工程实现,将人脸检测模型转换为ONNX格式后完成跨平台推理,可用于人像摄影、智能监控、安全验证等场景,也适合作为毕业设计或技术研究的实践基础。压缩包共12个文件&am…

阅读更多 →
三调数据库DLTB字段设计逻辑与业务校验实战 2026/9/26 15:21:30

三调数据库DLTB字段设计逻辑与业务校验实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Windows 11 LTSC 2024 安装激活与排查全指南 2026/9/26 15:21:24

Windows 11 LTSC 2024 安装激活与排查全指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
《从零手写操作系统 (06):虚拟内存初探——启用分页与高半核映射》 2026/9/26 15:20:58

《从零手写操作系统 (06):虚拟内存初探——启用分页与高半核映射》

前言:打破物理地址的枷锁在上一章中,我们实现了物理页帧分配器(PMM),内核终于能够动态申请和释放4KB的物理内存块。但此时所有代码和数据仍然直接使用物理地址,这意味着:内核和用户程序共享同一…

阅读更多 →
顶级机构押注的 CodexField,配 TaoToken 的 config.toml 骨架怎么搭? 2026/9/26 15:20:52

顶级机构押注的 CodexField,配 TaoToken 的 config.toml 骨架怎么搭?

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Cursor 使用教程(2025年更新版):TaoToken 统一 Key 接入与 settings.json 配置实战 2026/9/26 15:20:52

Cursor 使用教程(2025年更新版):TaoToken 统一 Key 接入与 settings.json 配置实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉