资讯动态

自研DeskcommCRM:从通讯集成到客户管理的完整实践

发布时间:2026/9/16 7:13:30 来源:尧图企业网站定制
先讲个真实现场四十多个销售坐席桌上摆着话机电脑里开着三个Excel微信群里每天下班前接龙报当天联系了多少客户。客户名单在表格里通话行为在话机上跟进情况在微信里成交数据在OA里。想统计团队今天到底打了多少有效电话没人说得清。这种状态持续了半年后我们决定自己动手做一个把通讯和客户管理绑在一起的桌面端工具项目代号就定为DeskcommCRM。名字拆开看其实很直白Desk代表桌面端comm是Communication通讯CRM就是客户关系管理。这篇文章把我从需求梳理、架构设计、通讯集成到上线踩坑的完整过程整理出来给正在计划自研CRM或者准备做通讯产品集成的团队一个可参考的样本。如果你带过销售团队或者你在技术团队里接过类似的内部系统需求这篇内容应该能帮你省掉不少弯路。我会把功能边界怎么划、通讯弹屏怎么设计、上线初期会遇到哪些典型问题、以及如何让团队真正用起来这些环节一一讲清楚。整个过程不复杂但坑确实不少。1. 为什么需要DeskcommCRM数据割裂导致的管理黑洞1.1 传统工作方式下销售数据到底碎成了什么样我先把我们当时观察到的日常场景还原一下。一个销售从早到晚的工作流程大概是这样的早上从Excel里挑一批名单按自己的经验决定先打哪个打电话用桌面话机拨号前把号码抄到便签上打完一通如果客户说下周再联系他就翻出笔记本写一行字到了下午把当天联系过的客户在Excel里更新一下状态下班前在微信群里发一条今日联系18个客户意向2个。这套流程看起来很顺但一旦把视角切到管理层面问题全出来了。团队负责人想了解某个重点客户的跟进进度得把销售叫过来当面问销售请假了他手里那批客户完全处于停滞状态客户最近一次沟通内容是什么基本靠记忆时间一久就模糊了。更麻烦的是同一个手机号可能被两个销售先后拨打过客户接到第二通电话时明显不耐烦你们公司到底谁在跟我对接我后来把这些问题抽象成一句话所有的业务动作都发生了但没有任何系统把这些动作沉淀下来。数据不在一个地方过程无法回溯管理自然无从谈起。1.2 DeskcommCRM要解决的三个核心矛盾设计这个系统之前我们花了两周时间访谈了销售、销售主管和运营负责人最终把需求收敛成三个核心矛盾。第一个矛盾是客户资料分散与统一视图需求之间的矛盾。客户的联系方式可能散落在Excel表、手机通讯录、微信聊天记录、名片盒里。系统需要提供一个统一的客户档案页把基础信息、联系人、历史跟进、通话记录全部串在一条时间轴上。第二个矛盾是通讯行为不可见与过程管理需求之间的矛盾。传统话机模式下管理层看不到谁在什么时间给哪个客户打了电话、通话时长多少、是否接通。系统必须把通讯行为变成一条条结构化数据主叫、被叫、方向、时长、录音、归属坐席、归属客户。第三个矛盾是跟进依赖人肉记忆与自动化提醒需求之间的矛盾。销售经常说这个客户我记着呢但真到约定时间忙起来就忘了。系统应该帮人记忆每个客户设定下次跟进时间到点自动弹提醒超出约定时间未跟进的客户自动进入逾期跟进列表并同步给销售主管。这三个矛盾定了项目范围也基本定了。我们不做大而全的营销自动化不做复杂的销售漏斗预测先把客户资料统一、通讯行为透明、跟进自动化这三件事做扎实。1.3 为什么选择自研而不是直接买一套SaaS这个决定当时在内部也有过争论。市面上成熟的CRM产品不少按坐席数订阅开箱即用。我们最终还是选了自研核心原因有四条。第一市面通用CRM强在营销管理和销售漏斗但通讯能力普遍偏弱。销售团队每天大量外呼如果通讯靠外挂呼叫中心对接集成成本和稳定性风险都不低。我们需要的是通讯能力内建的产品。第二客户联系方式、通话录音、跟进记录属于核心数据资产。放在第三方SaaS上数据主权、导出便利性都有隐患尤其我们还要跟内部ERP做深度打通走标准API反而绕。第三团队有6名全职研发产品需求相对明确4个月左右能出一个可用版本。相比每年几十万的SaaS订阅费用自研的边际成本会更低。第四也是最关键的一点坐席团队的作业模式非常固定需要的功能就是客户管理加通讯加跟进。这类确定性需求自己研发反而更容易打磨到位。现在回头看如果当时团队没有研发能力或者需求是快速验证那买SaaS绝对是正确的。自研的前提是你很清楚自己要什么且有足够的人力来维护长期迭代。2. DeskcommCRM的功能边界与核心设计先想清楚做什么、不做什么2.1 按角色梳理功能销售、管理者、管理员各有各的界面项目启动后我们做了第一件事画角色地图。系统不是给一种人用的至少有三类角色每类角色关心的东西完全不同。销售坐席端是这个系统的核心。他们要的业务动作其实很少查客户、打电话、记跟进、处理待办。我们把这四个动作都做成了大按钮放在工作台首屏。坐席登录后看到的是一个今日工作台包含今日待跟进客户列表、新分配线索、快捷拨号盘、最近通话记录。客户详情页下方是一条纵向时间轴把联系电话、跟进记录、短信记录按时间排列。销售主管端做的是过程管理和结果查看。主管可以实时看团队今日外呼量、接通率、平均通话时长可以点进任何一个坐席的工作台查看其客户跟进情况。线索分配机制也放在这一端新线索进入公海池主管可以手工分配给具体坐席也可以设置自动分配规则。系统管理员端负责组织架构和配置管理。坐席账号开通、角色权限分配、业务字段增减、下拉选项维护、与ERP的接口配置都在这边完成。这块我们刻意做得简单管理员不需要关注业务数据本身只需要管好谁能用什么、数据长什么样。2.2 核心业务对象建模客户、联系人、跟进、通话记录功能梳理完之后真正的体力活是数据建模。这里我直接贴出我们最终确定的几个核心表结构给后面做类似系统的人一个参考。客户主表CREATE TABLE customers ( id BIGINT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(200) NOT NULL, level TINYINT DEFAULT 0, -- 0未知 1低 2中 3高 source VARCHAR(50), -- 来源渠道 owner_id BIGINT, -- 归属坐席ID status TINYINT DEFAULT 0, -- 0未跟进 1跟进中 2已成交 3无效 created_at DATETIME, updated_at DATETIME, INDEX idx_owner (owner_id), INDEX idx_source (source) );联系人表CREATE TABLE contacts ( id BIGINT PRIMARY KEY AUTO_INCREMENT, customer_id BIGINT NOT NULL, name VARCHAR(100), phone VARCHAR(30), wechat VARCHAR(100), remark TEXT, created_at DATETIME, INDEX idx_customer (customer_id), INDEX idx_phone (phone) );跟进记录表CREATE TABLE follow_ups ( id BIGINT PRIMARY KEY AUTO_INCREMENT, customer_id BIGINT NOT NULL, owner_id BIGINT NOT NULL, content TEXT, next_follow_at DATETIME, -- 下次跟进时间 created_at DATETIME, INDEX idx_customer_time (customer_id, created_at), INDEX idx_next_follow (next_follow_at) );通话记录表CREATE TABLE call_records ( id BIGINT PRIMARY KEY AUTO_INCREMENT, call_id VARCHAR(64) UNIQUE, -- 通讯网关回调的唯一ID caller VARCHAR(30), callee VARCHAR(30), direction TINYINT, -- 1呼入 2呼出 status TINYINT, -- 1接通 2未接通 3占线 duration INT DEFAULT 0, -- 通话时长(秒) recording_url VARCHAR(500), owner_id BIGINT, customer_id BIGINT, started_at DATETIME, INDEX idx_owner_time (owner_id, started_at), INDEX idx_customer_time (customer_id, started_at) );这几张表的关系很清晰一个客户下有多个联系人一个客户同时关联多条跟进记录和通话记录。通话记录通过主叫或被叫号码去匹配联系人从而联系到客户。有一个细节要提醒通话记录表一定要给 call_id 建唯一索引。我们的通讯网关在某些异常场景下会重复推送同一通电话的回调如果没有唯一索引兜底后续对账就痛苦了。2.3 为什么选桌面端而不是Web端功能里涉及来电弹屏这个需求直接决定了客户端形态。我们对比过Web端方案最后确定用桌面端。原因有几点。第一来电时弹屏必须足够及时和醒目。浏览器里如果用户开了十几个标签页或者把CRM标签页切到了后台消息通知的及时性和展示效果都打折。桌面端可以用系统级通知弹窗加窗口置顶第一时间把客户信息拍到坐席眼前。第二坐席的典型工作状态是边打电话边操作电脑。通话过程中可能需要快速查看客户上次的沟通记录、编辑跟进备注这时候多窗口并行操作比浏览器单标签页顺手得多。第三桌面端可以常驻后台进程随时感知软电话状态。坐席登录系统时自动注册分机退出时自动注销这需要客户端跟通讯网关维持一个长连接。浏览器实现类似能力要依赖Service Worker可靠性一般。技术选型上我们用了Electron加Vue3。Electron的跨平台能力和前端技术栈的复用让我们团队能快速上手。桌面端内部又分了两层主进程负责软电话状态监听、系统托盘、全局快捷键这类系统级能力渲染进程负责业务界面和交互逻辑。层的边界一开始就要划清楚不然后期很容易写成一个大泥球。3. 通讯与CRM打通的几个硬骨头坐席绑定、通话弹屏、录音关联3.1 软电话与坐席绑定的设计通讯和CRM打通的核心媒介是坐席账号和分机号的绑定关系。我们给每个坐席在通讯网关侧分配了一个SIP分机号同时把这个分机号配置到系统后台的坐席资料里。坐席在桌面端登录成功的那一刻前端通过WebSocket通知通讯服务执行SIP注册。退出登录时执行注销。这个设计保证了人即分机哪个人登录了电话才接到哪个分机。如果坐席直接关机或者断网桌面端会在重启或网络恢复后的下次拉取任务时自动做一次状态同步把离线掉的分机注销掉避免来电无人接听。状态联动也要做好。坐席在软电话上开始通话时CRM里的坐席状态自动切为忙线通话结束挂断状态回空闲。这个状态要实时推送给团队主管的工作台界面主管一眼就能看出团队里谁在忙、谁闲着。我们在实现时用Redis保存每个坐席的实时状态通过WebSocket做状态变更推送避免每次展示都去查通讯网关。3.2 通话弹屏的实现链路通话弹屏是整个系统里用户感知最强的一个功能也是我们花时间最多的地方。呼入场景下的链路是这样的客户的电话打到坐席分机通讯网关解析SIP信令里的主叫号码生成一个标准的通话事件回调推给CRM的事件服务。事件服务收到回调后先做两件事查Redis里的号码归属缓存查MySQL里的联系人表。缓存命中直接返回客户ID缓存未命中就查库查到后同步写回缓存查不到则标记为未知号码。拿到客户ID后事件服务组装一条弹屏消息客户名称、等级、所属坐席、最近三次通话记录、最近一条跟进记录、今日待办事项。消息通过WebSocket推送到目标坐席的桌面端桌面端接收后弹出客户摘要卡片并伴随提示音。外呼场景则反过来。坐席在拨号盘输入号码点击呼叫CRM调用通讯网关的外呼API。网关先呼叫坐席分机坐席接听后网关再呼叫客户号码实现双向接通。这种方式的好处是客户看到的永远是坐席的分机号坐席个人手机号不会暴露。通话接通后网关回调CRMCRM创建通话记录并自动关联当前正在操作的客户ID。真正的难点在号码匹配策略。我们最终采用了三级匹配第一级精确匹配联系人手机号第二级用去掉区号和特殊符号的后7位做模糊匹配第三级匹配不到就标记为新客户线索弹屏展示是否创建新客户按钮。为什么不用后4位测试下来后4位重复率太高会出现一个弹屏列着七八个同名客户的情况坐席反而更纠结。3.3 录音与客户时间轴的联动通话录音是销售过程管理的重要依据但录音文件本身只是一堆MP3必须和业务数据关联起来才有价值。我们的做法是通话结束后通讯网关把录音文件上传到对象存储回调消息里带上call_id、开始时间、时长等元数据。CRM侧用call_id匹配通话记录把录音文件的URL写入call_records表。录音文件命名遵循callId_时间戳_主叫_被叫.mp3的规则。这样即使数据库记录被误删也能通过文件名回溯到时间、号码等信息。客户详情页的时间轴把通话记录、跟进记录、短信记录混合排列按照时间倒序展示。坐席回访前先看时间轴十几秒就能掌握这个客户的完整沟通历史。这个功能上线后反馈很好坐席普遍认为不用再去翻聊天记录和笔记本了。4. 落地过程中的坑与实测从开发环境到全量上线的真实记录4.1 测试环境的三个假象功能开发完成后我们开始进入联调和测试阶段。这个阶段最大的教训是测试环境越是顺利越要警惕真实环境的差异。第一个假象来自SIP模拟。测试阶段我们用的是内网软电话模拟分机一切信令都是秒级响应。但真实运营商线路的接通延迟更高偶发信令超时、呼叫异常释放的情况。这些异常在模拟环境几乎不会出现导致我们低估了通讯回调的异常处理工作量。第二个假象是并发量。功能测试时基本是1到3路通话并发接口根本看不出压力。上线前我们做了一次50路并发外呼测试结果通讯网关服务CPU直接飙到90%消息推送出现明显延迟。后来优化了事件推送逻辑并扩充了消息队列的消费能力才把这个问题压下去。所以建议所有做通讯集成的团队功能测完一定要做并发压测不要跳过这一步。第三个假象是测试数据的规整度。我们自己造的数据字段完整、格式标准但真实导入的历史Excel数据脏得超乎想象手机号前面带括号区号的、中间有空格和横线的、全角数字的、同一客户登记了好几个相似号码的。数据清洗和去重的代码量最后比CRM主功能本身还要多。4.2 上线初期遇到的真实问题及排查过程这里挑几个上线初期影响面最大的问题把排查过程完整写出来给后面的人参考。问题一通话弹屏偶发延迟从点击接听到弹屏出现要等两三秒。第一版的事件处理逻辑是同步的收到网关回调后立刻查数据库取客户信息查完再推送。数据库慢查询时整个链路就被拖住了。排查了两天后我们做了三点改造把号码归属缓存到Redis事件处理改为异步队列模式先回给网关已接收再做业务处理弹屏消息先推号码匹配中的占位状态等客户信息查出来后再发完整弹屏。改造后弹屏延迟基本稳定在500毫秒以内。问题二坐席直接关电脑导致分机未注销电话打进来没人接。桌面端退出登录才会通知通讯服务注销分机但很多人下班直接锁屏关电源根本不会先点退出。这个问题的排查不算难但暴露了设计缺陷。我们补了两个兜底桌面端监听系统的关机、注销事件主动上报注销请求后端增加心跳超时机制坐席90秒没有心跳自动注销分机。问题三通话记录出现重复。第三次看到同一通电话在数据库里出现两条记录时我们意识到是网关回调发了两次。排查确认是网关侧对网络超时的重试机制导致好在我们在建表时加了call_id唯一索引重复数据直接插入失败并抛出告警。后来在消费端加了幂等判断这条问题算是最早暴露但解决得最快的。问题四Windows缩放导致弹屏错位。坐席电脑有Win7的、Win10的、Win11的显示缩放有125%也有150%弹屏窗口偶尔出现在屏幕外。这个纯属客户端适配问题解决方式是Electron窗口记录上次位置启动时做工作区边界校正窗口大小按DPI缩放比例自动调整。问题五报表时区混乱。统计坐席每日外呼量时发现晚上8点打的电话被算到第二天。根因是通话开始时间存成了UTC报表分组时又直接按数据库日期分组没有做时区转换。统一改成按坐席本地时区分组后数据才对了。这个坑建议大家在设计报表模块时就提前约定好时间的存储和展示规范。4.3 性能与稳定性优化的关键动作系统跑起来之后数据量开始快速增长通话记录表是最先膨胀的。上线一个月40个坐席每天800到1200通电话通话记录表一个月就多了3万条。查询开始出现明显变慢。我们对通话记录表做了按月分表处理查询条件强制要求带时间范围。客户详情页的时间轴查询则通过customer_id加created_at的联合索引来保障。Redis缓存这块我们缓存了号码归属关系、坐席在线状态、客户基础信息快照有效降低数据库压力。消息推送链路的稳定性同样重要。WebSocket连接断开后客户端要能自动重连重连成功后服务端补推最近1小时的事件。设计思路是宁可重复推送不能丢消息客户端对事件按call_id做去重。这套机制经受住了几次网络抖动的考验坐席那边几乎无感知。还有一条降级预案这里值得单独说一下通讯网关如果整体故障坐席不能彻底停摆。我们保留了使用实体话机外呼通话结束后在CRM手工补录外部电话记录的能力。这条降级路径虽然会给坐席增加操作量但保证了业务永远有一条可以走通的底线。5. 上线之后效果验证、使用反馈与后续迭代方向5.1 数据对比系统上线前后到底改变了什么上线三个月我们拉了一组数据做对比。客户资料完整度以关键字段非空率为统计口径从上线前的46%提升到92%。跟进记录覆盖率从基本为零提升到每周人均22条。销售主管不再需要每天在下班时间等大家报数系统自动生成团队日报今日外呼总量、接通率、平均通话时长、有效沟通客户数。对坐席来讲最大的改变是告别了白天打电话、晚上补记录的状态。通话记录自动生成跟进记录也在刚挂断时弹窗提醒填写很多人的记录是当场写完的攒到下班统一补录的情况大幅减少。离职交接的体验也好了很多新接手的同事打开客户详情页就能看到完整的历史沟通链条不需要再向前任员工要Excel。5.2 让团队真正用起来的三个关键动作系统上线是一回事团队日常用不用是另一回事。这段时间我们也总结了一些经验。第一培训不要讲功能菜单要讲业务动作。不要跟销售说今天教大家使用跟进记录功能而是说以后打完电话系统会帮你弹出跟进页你只需要写三个内容客户讲了什么、你回复了什么、下次什么时候再联系。以动作带功能坐席的理解成本会低很多。第二强制性的关键动作必须一开始就定好规则。我们要求客户认领后必须填写下次跟进时间超过时间未跟进的客户自动回到公海池。前两周有人不适应丢了几次客户之后规则很快就被遵守了。这个过程管理的硬约束是保证数据质量最有效的手段。第三给管理者也做一套抓手。我们给主管工作台加了一个每日一句话卡片每天早上推送团队昨日关键数据和今日待跟进预警。管理者愿意打开系统看数据下面的人自然会跟着用起来。指标上线前上线三个月后客户资料完整度46%92%人均周跟进记录数基本为零22条主管日报生成方式微信群人工接龙系统自动生成离职客户交接周期3到5天当天完成5.3 下一步可以怎么迭代系统跑顺之后内部已经在酝酿第二阶段的规划。方向大致有三个。第一是智能外呼。现在坐席每天要手动拨号未来可以做批量外呼任务系统按规则自动呼叫接通后再转给空闲坐席。再往后可以做预测式外呼通过算法预估坐席空闲时间提前发起呼叫把坐席的等待时间压缩到最低。这个方向能直接提升外呼产能。第二是AI通话摘要。通话录音已经有了下一步接入语音识别自动转写对话内容并生成要点摘要。坐席挂断电话后只需要确认摘要、补充细节跟进记录的填写成本会进一步下降。这对坐席来说吸引力很强。第三是与ERP、财务系统的深层打通。现在订单数据还在ERP里客户详情页看不到历史订单和回款情况。第二阶段计划通过接口拉取关联数据在CRM里直接形成从线索到回款的完整视图。这会多花一些对接成本但对管理者判断客户价值帮助最大。从我个人的体会来说做这类内部系统的关键不在于功能堆得多满而在于把主链路做扎实。我们整个一阶段的核心其实就四条客户资料统一、来电弹屏、拨号外呼、跟进记录。这四条链路跑顺了系统的价值就已经被团队实实在在感知到了。如果一开始就铺开做一堆营销自动化、数据分析大屏大概率会陷入功能做了一堆、使用率却很低的尴尬局面。最后再分享一个经验系统上线后的头三个月一定要保留人工兜底手段。技术系统再稳定也难免遇到网络抖动、网关异常这类外部因素。我们的做法是即使弹屏失败坐席还能通过最近通话列表手动补录保证数据不丢。这类兜底设计不需要多复杂但在关键时刻很能稳住团队对系统的信任。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价