ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

把沟通变记录:自研桌面CRM的完整设计与实践

把沟通变记录:自研桌面CRM的完整设计与实践 我最早有这个想法是因为发现自己每天都在客户管理和沟通工具之间来回横跳。客户在微信里问报价在邮件里确认合同在电话里说完需求我转头还要把这些信息一条条录入到 CRM 系统里。时间一长系统里的客户资料永远比真实情况慢半拍跟进记录全靠记忆补想想都觉得荒唐。所以我给自己做了一套叫 DeskcommCRM 的桌面端客户关系管理工具核心思路就一句话把沟通和客户管理放在同一个桌面上让客户资料跟着沟通走而不是逼着人从沟通里抽身出来再去填一堆表单。这篇文章就把这套东西的完整设计思路、技术选型、落地过程和一些踩坑记录整理出来给有类似需求的朋友做个参考。1. 为什么我决定自己写一套 CRM而不是直接用现成的1.1 传统客户管理的最大问题数据靠人喂市面上成熟的 CRM 产品不少从国际大厂到国内各种 Saas 平台都有功能一个比一个全但真正深入用过的朋友应该都有体会系统本身解决不了录入意愿的问题。销售和客服每天把大部分精力花在聊天、打电话、回邮件上真正留给系统的时间非常少。哪怕系统做得再好如果客户刚在微信里说了一句这个方案我们觉得不错下周一讨论一下预算你得手动打开 CRM找到这个客户新建一个跟进记录选阶段、填内容、设定提醒时间——这一套操作下来至少两三分钟。一天有十几个这样的沟通节点谁还有精力坚持录数据录不进去后面的一切分析、提醒、报表全都是空中楼台。这不是产品功能的问题而是操作成本和用户习惯的问题。我见过不少团队买了很贵的 CRM最后用成了通讯录就是因为录入这件事在真实工作流里太反人性了。1.2 Deskcomm的含义桌面优先沟通优先DeskcommCRM 这个名字取自 Desk Communication 的组合。我在设计这套系统时给自己定了两条规矩第一它必须是一个跑在桌面端的程序不是网页。浏览器里开着十几个标签页CRM 只是其中一个很容易被忽略。桌面端独立窗口随时可见用快捷键就能呼出这种永远在手边的感觉对客户管理的持续性很重要。第二它的核心逻辑是沟通即记录。在 DeskcommCRM 里你不需要刻意去录入一条跟进记录你只需要正常发邮件、发消息系统会自动把沟通内容挂到对应客户的名下。客户画像、跟进阶段、下一步计划都是从沟通过程中自动沉淀出来的而不是人为填出来的。这个思路其实跟很多现代协同工具类似——不是让人去适应数据的结构而是让数据从人的自然行为中生长出来。1.3 技术选型的取舍本地优先兼顾协作技术栈方面我最终选了 Electron React SQLite 这套组合。可能有朋友会说Electron 打包体积大、内存占用高为什么不用 Tauri 或者干脆做纯 Web我的判断是这样的团队规模不大核心使用场景是单机为主、轻量协作为辅Electron 的开发效率和生态成熟度更符合我的需求。Tauri 确实更轻但 Rust 那层的学习和维护成本摆在那里为了省几十兆内存去增加开发成本短期内不划算。至于纯 Web 方案最大的问题是离线场景太弱我之前在没信号的高铁上想查一个客户的历史沟通记录网页端根本无能为力本地数据文件随手就能打开这一点让我下定决心走桌面端路线。数据库用的是 SQLite没有上 MySQL 或者 PostgreSQL。原因很简单数据量级在几十万条以内单机 SQLite 的表现绰绰有余而且本地文件备份非常方便复制一个文件就是全量备份。协作用最轻量的方式实现——每个人本地一份数据通过导出导入的方式合并关键信息不搞实时同步那套重架构。2. 核心功能模块拆解每个功能都围绕减少来回切换设计2.1 客户时间线所有沟通记录自动汇聚这是 DeskcommCRM 最核心的功能也是整个系统的基础。每当你通过关联邮箱发了一封邮件或者导入一段即时通讯的聊天记录系统会自动识别涉及的客户并把这条内容追加到该客户的专属时间线上。时间线的设计上我做了两个关键决策。第一是时间线只做追加不提供修改和删除。沟通记录是事实哪怕后来发现某条消息发错了也应该保留原始记录用新记录来覆盖而不是直接抹掉历史。第二是每条时间线事件支持打标签比如报价投诉合同后续筛选和统计就非常方便。实现上我用的是一个简单的消息队列客户端每产生一条沟通记录就写入一个待处理队列后台线程批量解析收件人、主题、关键词自动匹配到已有客户档案匹配不上的就进入待认领列表。实测下来几千条历史记录导入后的自动匹配准确率大约在 86% 左右剩下的需要手动确认一下联系人归属这个比例已经能省下大量整理时间。2.2 轻量任务系统从沟通中一键生成待办光有记录还不行客户管理最怕的是看了就算做了。时间线上经常会冒出类似客户说要回去和团队商量一下这种信息如果当时不形成任务基本转头就忘。所以我在每条时间线记录旁边加了一个转为待办按钮。点击后可以直接把该条记录的内容带到一个新建任务表单里只需要选择负责人、设定截止日期就能创建不用重新打字。任务到期前会在桌面端弹出提醒也会在首页的今日待办面板里置顶显示。这个功能的实现逻辑不复杂但交互细节上我打磨了很久。比如从时间线创建任务时系统会默认把截止时间设为三天的同一时刻减少手动调整又比如任务支持关联多个客户因为一个项目经常涉及甲方的好几个对接人。这些细节不需要什么高深技术但实际用起来非常顺手也直接影响用户愿意不愿意用这个功能。2.3 数据看板与提醒机制客户管理的价值在于持续的注意力而不是某一天集中爆发式地处理。所以 DeskcommCRM 提供了一个非常朴素但实用的首页看板今天到期的跟进任务、超过 7 天没有新沟通的沉默客户、本周新增客户数、各阶段客户的转化分布。这些数据都来自客户时间线和任务的实时统计不需要人工维护。我最常用的是沉默客户这个列表——它把所有超过 7 天没有联系过的客户拉出来让我能主动去跟进一下而不是被动等着客户找上门。提醒机制方面除了系统内通知我还接入了桌面通知能力到期的任务会直接弹一条系统级别的通知不需要打开软件也能看到。不过这里我要提醒一句通知频率不能太高我一开始把所有类型的事件都做了提醒结果一天弹几十条很快就免疫了。最后只保留了两类提醒——任务到期和重大客户状态变更效果立刻好很多。2.4 自定义字段与简单的自动化规则现成的 CRM 一定会有各种标准字段但每个团队的实际业务差异很大。DeskcommCRM 在客户档案里预设了公司、联系人、来源、阶段等基础字段同时支持自定义字段类型包括文本、数字、日期、下拉选择等几种常见形态。比自定义字段更进一步的是一个简单的规则引擎支持类似当客户阶段变为已成交时自动创建一条回访任务和当客户标记为高意向但三天无跟进时在首页置顶提醒这样的触发逻辑。规则用 JSON 配置本质上是一个事件触发器的变种。做的时候我没有上复杂的规则语言而是让用户用事件 条件 动作三步来配置技术上就是注册监听器然后执行预设动作。可能有人觉得这些功能太朴素但朴素反而是优势。需要花时间学习配置的系统往往在新鲜劲过后就被搁置像这种改一个下拉框就能生效的东西才能真正融入日常工作。3. 完整落地过程从零到一搭起这套系统3.1 环境准备与工程骨架开发环境我用了 Windows 11 作为主力机Node.js 版本 20 LTS包管理器用的 pnpm因为它在依赖安装速度和磁盘占用上的表现确实比 npm 好一些。工程初始化就两步pnpm create vite deskcomm-crm --template react-ts cd deskcomm-crm pnpm add electron electron-builder concurrently wait-on --save-devElectron 工程的核心是主进程和渲染进程的配合主进程负责窗口创建、系统托盘、数据库访问这些底层能力渲染进程跑 React 界面通过 IPC 来向主进程请求数据。为了开发体验我配了一个 concurrently 工具同时启动 Vite 的开发服务器和 Electron等 Vite 准备好后 Electron 再加载页面改代码能热更新效率高很多。3.2 数据模型设计数据库表我设计得比较克制初期只有四张核心表客户表、联系人表、沟通记录表、任务表。这个阶段最重要的是把客户和联系人分开很多初级系统把这两个混在一起后面就会出现一个人换了公司就丢了全部历史记录的问题。客户表的核心字段包括公司名称、来源、阶段、负责人、自定义字段。联系人表包含姓名、职位、邮箱、电话、所属客户 ID。沟通记录表存储时间线数据包含类型邮件、即时通讯、电话等、方向收到或发出、摘要、原文存储路径、关联的客户 ID 和联系人 ID。任务表除了基本的时间、负责人、描述之外还加了来源记录 ID这样能从任务反查到是哪条沟通记录触发的事项。索引方面我除了给主键建索引外还给客户表的阶段字段、沟通记录表的客户 ID 和创建时间建了组合索引。这个细节特别重要——客户时间线页面理论上要按客户拉出该客户的所有沟通记录如果没有索引数据量一上来查询速度会成倍下降。3.3 数据同步模块连接邮箱和即时通讯邮件这块我用的是标准 IMAP 协议。初始化配置只需要填邮箱账号、密码、IMAP 服务器地址和端口代码里用一个独立的轮询进程定期拉取最新邮件然后通过简单的规则——比如发件人在联系人表里能查到或者邮件主题里包含客户名称——来把邮件挂到客户时间线上。即时通讯端的整合更麻烦。因为各个平台开放程度不一我的做法不是直接对接 API而是做了一个导入机制从聊天软件导出聊天记录我写了解析器来处理各个平台的导出格式把其中的联系人信息和聊天内容自动归类到客户档案下。这个方案不是实时的但对个人和小团队来说每天导入一次也够用了。之前做 Web 端的时候这个模块完全没法落地因为浏览器环境里处理和存储这些数据会遇到很多限制。桌面端加上 Node 层的能力后同样的代码逻辑就能顺畅跑起来这也是我坚持做桌面端的原因之一。3.4 桌面端打包发布与备份打包用的 electron-builder目标格式是 NSIS 安装包。这里有个配置细节值得分享一下如果你的应用需要写入大量本地数据建议在安装时选择按用户安装而不是装到 Program Files 系统目录。因为系统目录权限受限写入数据库文件经常触发权限问题按用户安装就直接避免了这个坑。数据备份我用了最简单也最可靠的方案数据库文件直接复制。SQLite 的好处就是单文件我在设置里放了一个立即备份按钮一键把当前的 data.db 文件复制到一个指定目录文件名带上日期。最近又加了一个定时备份功能每天凌晨自动执行一次保留最近 14 天的备份文件过期自动清理。这个粒度对一个桌面端工具来说足够了。4. 常见问题与排查技巧4.1 邮件被重复导入这是最早遇到的坑。IMAP 轮询拉到邮件后如果解析或入库的逻辑中途报错可能导致同一封邮件被处理两次客户时间线上出现一模一样的记录。解决办法比较简单在沟通记录表上为邮件 ID 客户 ID建了唯一索引入库前先做一次查重。如果程序崩溃后重启重新拉取时发现邮件 ID 已经存在就直接跳过这也保证了操作的幂等性。类似的思路在处理外部数据导入时都非常管用。4.2 时间线查询越来越慢用了大概两个月客户时间线的加载速度肉眼可见地变慢了排查后发现是沟通记录表的数据量已经涨到了几十万条而最初我只给时间字段建了普通索引没考虑组合查询的情况。优化措施是加了一个客户 ID 创建时间的组合索引同时把时间线页面从一次性全量加载改成了分页加载每页 50 条。改造之后即使用了几十万条记录打开客户时间线仍然是秒开。这个过程中的教训是数据量不大时感觉不到的索引问题一定要在系统设计初期就考虑到不然后面返工的代价不小。4.3 多设备之间数据冲突我一开始没有做多设备实时同步自然也就没有版本冲突的问题。但后来用户提出希望家里和办公室各用一台电脑这就要考虑怎么合并数据。我的方案不算优雅但很实用备份文件本身就是全量数据在另一台电脑上恢复时系统会把备份里的记录和当前数据库做合并以更新时间较新的记录为准。因为 SQLite 的每张表我都加了更新时间字段所以合并逻辑写起来很简单。但如果同一时间段内在两台设备上同时改了同一条数据就会以更后面恢复的那台设备为准这可能覆盖先前的内容。所以我的建议是以一台电脑为主力设备另一台作为查阅和临时录入用这样冲突几乎不会发生。4.4 界面卡顿与无响应有一段时间程序运行几天后就会变得卡顿任务管理器一看内存占用非常高。复盘后发现是两个问题叠加的结果一是轮询邮件的线程没有做异常兜底IMAP 网络异常时重试得太频繁二是时间线页面渲染某些包含大量图片的历史邮件时过于消耗资源。解决办法是给 IMAP 轮询增加了指数退避策略网络异常时等待时间从 30 秒开始成倍增加最高不超过 15 分钟。同时给时间线的邮件内容做了预处理默认只显示纯文本摘要完整的 HTML 内容和图片要点击才加载。这两个调整同时生效后程序跑一个多月内存依然稳定。5. 这套工具的适用场景与启用建议5.1 什么人适合直接用 DeskcommCRM最适合的其实是两类人一类是独立顾问、自由职业者和小微企业主他们的客户量级通常在几百个以内但每个客户的沟通频率很高需要的就是一个能随时看到上次和这个人聊了什么、下一步该做什么的轻量工具。另一类是销售和客服岗位的从业者尤其是需要通过桌面端办公、一天大量时间花在处理邮件和即时消息上的朋友。这类人群最大的痛是信息分散DeskcommCRM 的价值在于把零散的沟通片断聚合成完整的客户脉络让他们不用花整块时间去整理客户笔记。5.2 什么场景下不建议自研这类工具如果你的团队超过二三十人或者客户数据需要分发到多个部门、多方协作那我不建议自己开发更建议采用成熟的商业化 CRM。原因不是桌面端做不了协作而是协作里面的权限控制、审批流程、数据隔离都是非常重的系统性问题不是一个小工具短时间内能补完的。这个边界要心里有数。另外如果你的业务对移动端要求很高需要随时随地在手机上录入和查看客户信息桌面端方案也有天然短板最多是把数据库文件同步到手机做只读访问。移动端的体验很难跟原生 App 相提并论这种情况下直接用成熟的 SaaS CRM 可能更合适。5.3 给同样想自研工具的人几点建议第一先用起来再完善功能。我第一版只做了客户时间线和创建待办两个功能用了两周觉得顺手才逐步加上看板、规则、备份这些模块。一开始就想着做全功能很容易陷入开发泥潭。第二重视导出能力。数据在你自己的系统里但你的数据永远有可能要迁到另一个平台去。所以我从一开始就做了一个非常开放的导出功能所有客户数据和沟通记录都可以导出成 CSV 或 HTML 文件哪怕哪天不用这个系统了数据也随时能带走。第三留出顺手维护的能力。真正的工具不是靠人逼着自己去用的而是嵌入到每天的日常动作里让人在不知不觉中完成了数据维护。设计的时候多想想用户在这一步会不会嫌麻烦比多做十个花哨功能都重要。这套系统目前已经在我自己的日常工作中稳定跑了八个月最大的变化不是报表多好看而是我再也没有因为忘了跟进某个客户而懊恼过。以前客户管理靠自律现在系统用一套简单自然的机制把跟进这件事变成了习惯的一部分。如果你也有客户信息散落各处、跟进靠记性、系统录入靠毅力的困扰不妨参考这套思路从一个自己能下决心用起来的最小版本开始一步步迭代成适合自己的工具。
返回列表