自研CRM系统实战:客户唯一身份识别与自动化规则引擎架构解析

发布时间:2026/9/19 9:01:49
自研CRM系统实战:客户唯一身份识别与自动化规则引擎架构解析 1. 从付费CRM到自研DeskcommCRM我为什么决定自己造轮子我有很长一段时间被市面上的CRM折腾得够呛。团队从二十多人扩张到近百人销售的日常动作越来越多地沉淀在微信、企业IM、邮件这些分散渠道里而传统CRM还在逼着销售每天手动录入跟进记录。业务侧的意见非常统一不是不想用系统是系统让销售多干了活儿却没有真正帮他们省时间。真正压垮我的最后一根稻草是我们连续三个季度的客户重复跟进率都在百分之二十以上——同一个客户被两三个销售分别跟进线索从一个渠道进来之后在CRM里开了好几个分身。当时我考虑过继续加钱买更高配的商业版也认真调研过几家以通信能力为卖点的平台型工具。结论是要么太贵席位费加模块费半年下来够再养两个开发要么太封闭我们已有的一套外呼系统、一个自建客服工单平台根本接不进去。于是我不再纠结采购流程决定基于现有团队的技术积累自己搭一套贴合销售场景的CRM系统。这就是DeskcommCRM的由来。DeskcommCRM的定位从一开始就很明确它不是另一个仿Salesforce的巨型配置平台而是一套以沟通记录自动化沉淀为核心的轻量型客户关系管理系统重点覆盖三个业务场景——销售跟进、客户服务交接、跨部门协作。它解决的核心问题是让每一次和客户的沟通IM消息、邮件、电话、线下拜访录单都能自动归档到对应的客户档案里同时通过规则引擎自动提醒下一步动作把销售从录数据这件事里解放出来。如果你正在纠结CRM到底该买还是该做或者你已经有了CRM但觉得它只是个数据坟场销售只填不看那这篇文章的架构思路和实战细节应该能给你一些启发。我会把系统拆成几个核心模块来讲包括客户唯一身份识别、多渠道通信接入方案、自动化跟进规则引擎以及权限与数据安全设计也会把我在实际开发中踩过的坑一并交代清楚。2. 架构选型与模块划分DeskcommCRM的骨架是怎么定下来的2.1 技术栈选择背后的实际考量先交代一下技术底座。后端我选了Spring Boot 3.x MyBatis-Plus数据库用的PostgreSQL 16缓存用的Redis 7。前端管理后台是Vue 3 Element Plus桌面端辅助工具用Electron包了一层主要给销售做快捷外呼、短信发送和本地弹窗提醒。没有引入太重的微服务体系而是先用模块化单体Modular Monolith跑通全流程按业务边界拆包customer、communication、workflow、permission、report。这样做的直接原因是团队人不多微服务带来的分布式事务、链路追踪、独立部署成本在早期会把我们拖垮。这套技术选型可能看起来不够时髦但它在我们的场景里比较务实。PostgreSQL对JSONB的良好支持让我能灵活存储不同渠道返回的原始消息结构MyBatis-Plus大幅减少了日常CRUD代码量而Redis主要承担三件事通信消息的临时去重缓存、工作流触发器的待执行队列缓冲、热客户数据的短期缓存。Electron桌面端是后来加的因为销售们反馈用浏览器管理后台总忘记点开但一个常驻任务栏的小工具反而能推动行为改变。2.2 六大模块的边界划分与数据流DeskcommCRM的架构核心是一个客户档案N条沟通记录M次自动化动作。系统内部拆了六个模块它们的职责边界必须清晰否则后期改一个需求会牵连一大片接入层Channel Gateway统一接收IM回调、邮件解析、电话记录、线下填报外部渠道只和Gateway通信不关心下游逻辑。实体解析层Entity Resolution负责把来自不同渠道的字符串手机号、邮箱、微信ID、企业微信external_userid映射到统一客户ID这是全文最关键的模块。业务核心层Core Service管理客户档案、商机、合同、工单、跟进任务所有标准CRUD都在这一层。规则引擎层Rule Engine处理当事件满足条件时触发动作是自动化跟进的大脑。触达层Execution Layer负责实际推送包括站内提醒、短信、邮件、Webhook可被规则引擎和人工按钮复用。数据管理层Data Admin权限、审计日志、归档、备份、数据导出。数据流的主干是单向的接入层收到消息 → 实体解析层计算出正确的客户ID → 写入核心服务的动态表单 → 事件总线广播新跟进记录产生 → 规则引擎消费事件并执行动作。为什么一定要单向因为双向会形成循环——比如客户回复触发通知销售如果通知动作本身又算作一条沟通记录就会再次触发规则。我在设计时把人为操作产生的记录和系统自动执行的记录都统一建模为Event Action但在Action执行时给事件打上triggeredsystem的标记规则引擎对这类事件默认不响应这就断了循环。2.3 为什么我坚持先做模块化单体而不是微服务这几乎是我每次分享都会被问到的问题。坦白说以DeskcommCRM的体量一线销售最多同时在线的规模撑死几百人消息并发量根本到不了需要微服务的程度。微服务带来的服务间调用开销、数据一致性保障难度、环境部署复杂度全是需要额外人力去填的坑。模块化单体配合强制的包边界文档能保住未来拆分的基础又不用提前支付分布式成本。当然单体也有需要注意的地方定时任务必须做分布式锁保护否则多实例部署时会重复执行数据库连接池要预留余量缓存穿透的问题在热点客户档案上会很明显。这些我在后面第6章的坑位清单里会详细展开。3. 客户唯一身份与360度视图解决同一个客户开三个档案的死结3.1 ID-Mapping算法通信记录如何找到正确的客户档案这是DeskcommCRM里最需要耐心做的东西也是决定系统是否被销售接纳的一杆秤。没有准确的客户身份映射后面所有的自动化都是空中楼阁。我们的客户ID映射采用置信度打分机制。每条进系统的通信记录都会经历四步身份判断精确匹配手机号或邮箱完全一致直接命中已有客户档案置信度100分。模糊匹配当只有企业微信号或昵称时在已有客户档案的联系方式扩展表里查历史关联比如这个微信号两周前出现在另外一封邮件的签名区置信度给70分。疑似匹配同公司域名邮箱相似联系人姓氏同一来源渠道给50分进入人工确认队列。新建待定完全没有历史关联信息先创建为待验证客户等下一次通信命中再触发合并或确认。这个打分机制我用一张Redis的Set结构存储每个客户ID关联的所有识别键手机号、邮箱、微信unionid、企业微信external_userid映射查询走缓存避免每次通信回调都打一次数据库。实际运行中第一版最让我意外的是企业微信场景下的同一客户不同售前顾问接待问题——客户在渠道A添加的external_userid和在渠道B添加的是不同的导致识别键对不上客户被拆成两个档案。解决办法是引入联合键概念当售后工单和销售记录都关联到同一手机号就把这条手机号提升为高置信度主键同时绑定两个external_userid到同一个客户ID。注意建立客户唯一身份不要想着一步到位。先用精确匹配跑通再逐步开放模糊匹配否则前期数据质量不高时合并错误带来的业务事故会比档案稍多严重得多。我在第6章会详细讲一次由模糊匹配引发的客户合并事故。3.2 360度视图不是把所有字段平铺给用户我见过不少CRM把客户详情页做成了一张什么都有但什么都找不到的大表单。DeskcommCRM的设计逻辑是将客户档案拆成五个Tab概览、时间轴、商机、工单与售后、风险与偏好。概览页只展示六类信息核心联系方式、最近一次沟通时间、下次计划跟进时间、负责人、客户阶段、近30天活跃度指标。其他所有字段收进高级信息抽屉里避免信息轰炸。时间轴是我个人认为最重要的部分——它按时间倒序把所有和该客户相关的通信记录、任务状态变更、销售备注串接在一起销售打开档案后第一眼就能看到上次聊到哪了不需要在多个菜单里找上下文。这在技术上就是一次按客户ID查全量表再按事件时间排序真正麻烦的是数据写多读少还是写少读多的问题。我们的场景是读多写少——销售每天高频打开客户时间轴但每个客户新增的记录一天不过几条。所以读侧我用Redis做了时间轴快照缓存60秒失效写侧走消息队列异步追加保证列表接口的P95延迟控制在300毫秒以内。3.3 合并去重的完整流程与操作权限即便有ID-Mapping历史脏数据和人工录入错误还是会产生重复档案。DeskcommCRM提供了疑似重复列表功能每天凌晨跑一次分组算法按手机号组邮箱组公司名联系人姓组分别聚簇输出疑似重复对推送给系统管理员做合并决策。合并时的字段冲突策略我设计成了三级预设规则优先如客户姓名以最近建档的为准、字段级别覆盖确认弹窗让管理员逐项选、历史记录保留不覆盖合并前生成的商机、工单全部保留原关联。这块有一个容易忽略的点合并操作本身必须记审计日志而且要支持合并回滚——不是真的恢复数据而是把合并前的两份完整快照存入审计表出问题时可以重建档案。合并权限我只开放给销售主管和系统管理员两层普通销售只能提交合并申请不直接执行。一开始我开放过全员合并权限结果出现过一次两个销售为了抢客户执背景互相合并对方档案的情况后来才收紧的。这类权限设计跟着事故走的经验通常都是做过才知道。4. 多渠道通信接入IM、邮件、外呼电话记录的统一沉淀4.1 为什么接企微、邮箱而不是做内置聊天工具DeskcommCRM在初始设计时有一个被反复否掉的方案内置一个站内IM让销售都来系统里聊天。反对原因很实际销售和客户的关系本来就在微信、企微、邮件这些已有通道里让他们迁移沟通习惯基本不现实。系统的职责不应该是制造新的沟通渠道而是在不打断沟通的前提下把记录沉淀下来。所以接入策略是企微侧用官方API接收 external_userid 发送的消息事件邮件侧通过IMAP协议定时拉取销售绑定邮箱的收件箱外呼电话则由话务厂商回调话单录音URL。三个渠道统一异步写入Channel Gateway解析后调用实体解析层。这一步有个很关键的数据建模点每条记录都必须携带channel_type、channel_message_id、directioninbound/outbound、content_payloadJSONB存储原始结构邮件存HTML正文和附件元信息IM存消息类型和引用消息ID电话存时长和录音URL。存档展示时用统一模板渲染但原始数据永远保留。这样设计的好处是出了问题可以溯源也方便未来接入新的渠道类型。4.2 IM消息同步的幂等与实时性设计企微消息回调的实时性很好但有个不友好之处同一个事件会同时推送到多个回调地址如果配了多个应用消息撤回、编辑事件也会单独推送网络抖动时可能重复投递。所以Channel Gateway做的第一件事是以channel_message_id为唯一键做Redis幂等去重已处理消息ID写入Set结构并设置24小时过期超时重复消息直接丢弃。这里的实时触达链路我做了两级第一级是WebSocket把新消息推给对应销售的桌面端和Web端弹窗提醒客户来消息了第二级是如果销售3分钟未读会触发短信/企微应用消息提醒。实测下来企微侧消息从客户发出到销售屏幕弹窗的平均延迟在1.5秒左右大部分消耗在企微服务器的回调推送链路不是我们系统能优化的。IM消息里的图片和文件处理比较吃存储2GB以上的大文件先上传到对象存储消息体里只保存URL列表页缩略图走CDN不至于把应用服务器带宽拖垮。实际操作中有一个容易踩的坑企业微信API要求回调必须在5秒内响应否则会重推。我们Gateway收到回调后先立即返回success并落缓存再异步解析写入响应主体只做幂等判断和丢队列不做耗时计算。4.3 邮件聚合的IMAP轮询与入站解析邮件接入相比IM要糙很多。每个销售在系统绑定一个用于客户沟通的邮箱后台每60秒对这些邮箱做一次IMAP idlepoll混合检测。新邮件到达后先按Message-ID做幂等防止IMAP重拉再走解析流程。邮件解析最容易出问题的点是Thread会话线程聚合。客户A回复邮件时主题可能变成Re:原主题如果不做会话聚合时间轴会显示一堆零散邮件。我用References和In-Reply-To这两个Header拼接会话树取References链上最早一封邮件的Message-ID作为Thread根ID同一根ID下的所有邮件归入同一会话。没有References的邮件退而求其次用主题归一化收发人相同规则聚类。这个方案能用但不能保证百分百准确——遇到客户改了主题的回复可能被拆成新会话人工可以在邮件详情页手动合并到已有会话。4.4 外呼电话的记录与录音管理外呼电话的接入依赖话务厂商。厂商用户后台创建一个应用绑定到我们系统的回拨/外呼线路销售在桌面端点外呼按钮时系统先调到厂商接口发起呼叫通话结束后厂商异步回调一条话单记录包含unique_id、双方号码、开始/结束时间、接通状态、录音URL。这里有一个我比较满意的设计通话记录和跟进记录分离。通话记录是客观话单系统自动生成不可修改跟进记录是销售在通话后填写的主观内容客户意向、下一步计划关联到通话记录上。为什么分离因为很多销售打完电话后会拖一阵子才补写跟进内容有时候甚至不写。如果不分离系统就只能拿到打过电话这个事实拿不到客户意向。后来我们在通话结束后会自动弹窗提醒本次通话是否填写跟进同时给30分钟补录窗口超过窗口仍没补自动生成一条无内容的待办记录提醒销售主管。录音文件统一存在对象存储的私有桶里按天分目录文件名规范是channel_date_uniqueid.mp3数据库只存URL和时长。开放给销售的录音权限默认只读且下载操作会留下审计日志避免敏感录音被随意外传。5. 自动化跟进规则引擎从人追事到事找人5.1 规则配置事件、条件、动作的三段式设计DeskcommCRM的自动化能力由规则引擎支撑。一个规则由三个部分组成事件Event、条件Condition、动作Action。这是最简单的规则模型但足够覆盖绝大多数业务场景。事件不是所有操作都订阅我们抽象了五类标准事件customer.updated客户档案被更新communication.received收到客户入站消息/邮件/电话communication.sent销售发出外联动作task.overdue跟进任务到期未完成deal.stage_changed商机阶段被移动条件允许组合比如客户来源线下展会和最近一次沟通时间早于7天和负责人不在免打扰名单等条件按AND/OR嵌套组合。系统提供了规则测试面板——输入一条模拟事件运行规则引擎返回每个条件的命中结果方便配置时调试。动作支持四类创建任务比如分配给负责人一个跟进任务截止时间3天发送通知站内信、企微应用消息、短信或邮件变更字段自动修改客户阶段、负责人、标签调用Webhook把事件推给内部其他系统比如财务系统、客服工单系统我建议不要把规则引擎设计得太复杂。之前我尝试过支持条件分支并行多动作串行依赖的流程图式编排结果发现业务方根本配置不明白最后还是回到单事件-条件判断-多动作触发的模式。可视化编辑器里只需要一个配置表单和一个测试按钮就够了。5.2 典型案例未回复自动提醒与沉睡客户唤醒举两个我们实际跑得很好的规则案例方便你理解这套引擎的价值。第一个是3小时未回复提醒它的配置是事件是communication.received条件是客户消息来自IM且未包含退出关键词销售在180分钟内未在该会话下发出任何记录”动作是给销售发一条企微提醒并抄送销售主管。这条规则上线后一线销售的平均首响时间从5小时压缩到了1.5小时效果非常直观。第二个是沉睡客户唤醒计划。事件是task.overdue条件是该客户最近一次已发起的沟通记录距今超过30天且客户阶段在跟进中/待转化且不是已流失状态动作是创建一条上门/电话外呼任务同时给客户发送一条定向触达短信模板。这套规则帮助我们把沉睡客户池子的再触达率提升了接近两倍。不要小看这种简单的定时扫描条件判断动作在业务侧看来它就是把原来需要销售主管每天花半小时手动翻跟进列表的事情自动化了。5.3 规则引擎的环形触发防护与执行监控规则引擎有个老生常谈但必须严阵以待的问题规则之间互相触发形成死循环。比如客户阶段变更时发送欢迎短信这个动作如果短信发出后又算作一条communication.sent事件而这条事件又挂在别的规则上就可能无限循环。DeskcommCRM的处理办法是在事件总线层加两个开关事件来源标记人工操作、定时扫描、规则动作三类事件来源分别标记规则可以声明响应哪些来源。执行深度限制同一事件触发的规则动作最多往下传递两层规则动作产生的事件不参与新的规则响应并在规则执行日志里记录链路ID方便回溯。每一条规则的执行情况都会落一张rule_execution_log表触发事件ID、命中条件、执行动作、耗时、结果状态。这个日志不仅是审计需要也是调优规则的依据——如果发现一条规则每天触发了几百次动作但几乎没有带来跟进行为那大概率是条件设得太宽泛该收敛了。我还给规则引擎加了熔断开关。如果某个规则的错误率连续20分钟超过50%系统自动暂停该规则并给运维推送告警。为什么会考虑这个因为我曾经写过一个发短信的规则某次短信服务商接口故障规则每来一个事件就失败一次重试队列把短信通道打爆了。后来加了失败次数上限和半小时自动暂停这类拖垮下游的问题才没有再出现。6. 权限模型、审计日志与数据安全CRM系统的生命线6.1 三层的权限模型租户、部门、个人如果CRM里的客户资料被不该看到的人拿走后果就不只是不礼貌而是直接的法律风险。DeskcommCRM的权限模型分三层每一层解决一类问题。租户层系统本来就是给一个公司内部用的但考虑到集团多品牌子公司隔离的需求还是把租户模型做进去了。租户之间的数据物理隔离单独schema。部门层按部门边界控制客户数据可见范围。默认规则是同部门可见跨部门不可见可对特定客户组开放跨部门共享。销售和售后团队在跟进同一客户的场景下通过共享客户组来交叉可见不会全局放开。个人层记录级别的Owner权限控制每条客户档案、商机、工单都有明确的负责人和协作者列表。非Owner默认只读需要编辑先申请协作者权限。记录级权限又没有做成通用的数据行权限过滤器因为全表扫描去匹配部门规则会严重拖慢查询。我们是在写入时就把visible_scope_json字段计算好存到行上查询时直接走索引匹配。这是一个典型的用空间换时间的取舍维护成本在于权限变更后需要重算该客户所有关联记录的可见性但我们用异步任务处理了用户无感知。6.2 审计日志记录什么不只是谁改了字段合规是CRM系统的底线。一开始我对审计日志的理解很朴素记录什么人在什么时间改了什么字段、旧值是什么、新值是什么。真正做下来才发现只记录字段变更是不够的。有两个容易被忽略但同样重要的场景导出行为和访问行为。DeskcommCRM对所有数据导出操作强制走审批。导出请求提交后审批通过才生成下载链接链接有效期10分钟。导出日志详细记录导出人、导出数据筛选条件、导出条数、文件哈希、审批人、审批时间。这不止为了追溯也是提醒销售你导出的每一批客户资料都有备案对数据安全本身就有威慑意义。访问行为审计做的是页面访问快照。当有用户打开某个客户的360度视图时我们异步记录一条访问日志操作者、客户ID、访问时间、来源页面。一开始团队成员说这些日志太多了磁盘扛不住而且没人查。直到有一次客户信息安全事件复盘正是靠这些访问日志还原了数据是怎么从系统里流出去的。从那之后这套日志的保存时间设定为一年每天凌晨做冷备归档。审计日志绝不是写到日志文件里就结束了。必须是数据库事务的一部分——比如修改客户手机号这个操作客户表update和审计表insert必须在同一个本地事务里任一步失败则整体回滚。否则数据库字段变了但审计没记真出问题的时候你就只能摊手了。6.3 备份策略与灾难恢复的一次演练教训数据备份是那种99%的时间用不上但1%的时候救命的事情。我们的备份策略包括PostgreSQL每天的自动全量备份保留14天、WAL日志归档用于时间点恢复PITR、对象存储开启跨区域复制保存历史文件。备份恢复流程做了脚本自动化但是我只在测试环境演练过恢复。为什么说是演练教训去年机房故障演练时我们尝试在新环境完整恢复一次生产数据。结果发现恢复了数据库但没恢复RedisRedis里存了客户时间轴的热缓存恢复后数据库和缓存里的客户时间轴对不上导致某些客户的详情页出现空白段落。那次修复花了整整一个上午写缓存清理脚本。之后我把备份恢复的检查清单扩展到包含Redis、配置文件、对象存储bucket权限等所有依赖项并且每季度真正做一次全量恢复演练而不是只对着备份文件看两眼。7. 开发过程中踩过的深坑与性能优化实测7.1 客服消息去重没做好的事故企微回调重复推送上线第一周我们就经历了一次事故。某个客户在企微上连续发来5条消息系统给销售发了一连串重复提醒而且每个提醒底部都显示客户消息后面跟着同一句话。排查后发现是Channel Gateway第一次收到回调时Redis去重逻辑只在channel_message_id加入Set后立即返回success但Set写入用的是普通set命令而不是带过期时间的setex导致部分消息ID的过期时间是永久。大量短期消息ID堆积在Redis里老ID不被删除新ID去重逻辑顺利通过但另一批网络重推的相同ID由于Set里找不到而重复入库。修复方式很直接改用setex设置24小时过期同时对所有入站消息在入库SQL里加唯一索引兜底重复插入直接捕获异常跳过。这样双保险之后这类重复入库再没出现过。做系统对接的同行应该都能体会幂等不是加个Redis查重就完事数据库唯一的兜底才是最后的防线。7.2 搜索接口从3秒到200毫秒索引和分词策略客户搜索是每个销售每天用几十次的入口我们的第一版客户搜索是直接对客户表做LIKE %关键词%模糊查询数据量几万条时勉强能用到了十万条级别就明显卡顿动辄两三秒。这显然不能忍。后来我把PostgreSQL的全文检索用起来了为客户的姓名、公司、手机号、邮箱、地址等字段建了GIN索引写了一个tsvector列再用触发器自动更新。搜索时用to_tsquery(simple, 关键词:*)做前缀匹配配合原来的精确手机号/邮箱倒排索引。效果是中文搜索的P95耗时降到了200毫秒左右准确率也明显提升。这里有一个细节值得注意simple分词配置对中文是整句全文检索没法像搜索引擎那样按语义拆词所以中文客户名必须额外保留一个按unicode拆分后拼接的前缀索引才能达到输入半个名字就能出来的效果。分词策略这件事如果你用的是MySQL可以考虑先上ES但PostgreSQL内置方案在万级到十万级租户数据场景下已经非常够用。7.3 数据库连接池被打爆工作流高频事件耗尽连接有一次上线新规则后系统出现大面积超时报警。排查发现新规则挂在了communication.received事件上而当天上午有个群发营销活动几条入站消息就触发了几百次规则执行每个执行动作里都包含创建任务、发通知、写日志等多次数据库操作连接池被瞬间用完。优化分三步走规则引擎的执行动作全部改成先写Redis队列、再异步任务消费不再在事件回调线程里同步执行每个租赁池的数据库连接数按规则执行并发上限做了校准数据库层面加了连接等待超时时间的监控告警。这套同步事件异步动作的模式后来成了标准写法凡是规则引擎发出的动作一律走队列不直接打数据库。通过这几轮调优我最大的体会是CRM系统的性能瓶颈往往不在于事务复杂度而在于你对异步边界的控制。能用队列削峰的就不要用同步事务扛否则流量一来你就得熬夜加班。7.4 部分浏览器兼容问题的奇怪案例还有一个让我印象深刻的奇怪bug在某款国产浏览器的IE兼容模式下销售点创建跟进记录按钮会偶发提交两次造成同一条跟进内容被写入两次。我们服务端明明已经做了防重复提交校验——前端按钮提交后立即置灰同时Header带一个requestId。后来发现是这个浏览器兼容插件把JavaScript的setTimeout行为改变导致前端节流逻辑失效。最后的解决方案是双保险后端按requestId加Redis分布式锁凡是同一个requestId的POST请求10秒内只能成功一次。这类问题不会在主流浏览器上复现但要兼容内部用户千奇百怪的浏览器习惯就得在后端把账号防重逻辑做扎实。8. 从DeskcommCRM项目沉淀下来的几点经验如果你也想自建一套类似DeskcommCRM的系统我给到的浓缩建议是不要一上来就追求大而全的自动化能力先解决客户唯一身份问题和通信记录自动归档问题把这两件事做透了系统就有了灵魂自动化规则从单个事件单个条件单个动作开始跑跑顺了再加入复杂编排权限与审计的完善程度决定系统能走多远这部分的设计必须从第一天就带着合规思维做而不是后期补救。另外开发顺序上可以先从IM接入和外呼记录这两个通道做起因为它们能最直观地减少销售的工作量。邮件聚合虽然重要但由于格式复杂、解析容易出错可以考虑第二阶段再做。每个渠道接入都需要独立的测试账号体系这个一定尽早准备我在开发中期被卡过一个月就是因为测试客户在企微侧的回调地址在沙箱环境里始终拿不到真实数据。我在实际开发中还有一个很明显的感觉给内部同事做CRM本质上是在做一套行为引导系统。技术上实现一个跟进提醒很容易难的是让销售真的愿意进系统记录、愿意按规则执行。DeskcommCRM的每一次迭代背后都至少有一场内部宣讲和一轮销售访谈。如果只和技术较劲不解决人的问题再强大的CRM也会被闲置成昂贵的摆设。