「走得掉」不是一句承诺,而是一个客户不问你、也能自己完成的动作。
一、续费前三天的那封邮件
续费提醒发出去第三天,许南乔收到一封很短的回复。客户是一个六人团队,用了十一个月,只问了一句:「如果哪天不用了,我们的项目、任务、评论和附件怎么拿走?」他第一反应是「当然可以导」,打开后台才发现自己只有一条藏在设置页底部的「导出 CSV」,只导任务表,不含评论与附件,也没有任何字段说明。
以下情境为教学假设,人物、引语和数字不代表经核实的真实案例。
他把这句话读了两遍,意识到客户问的不是功能,而是退出路径。续费前问这个,通常不是准备走,而是在确认自己没有被锁住;答得含糊,反而会让对方认真考虑「是不是该趁现在走」。
他试着走了一遍现有导出:点按钮,页面转圈,最后下载到一个没有命名规则的 CSV,列名是内部字段名 assignee_id、status_code,附件只留了一列文件名。他用表格软件打开,第三列挤着两个值,日期是 Excel 序列号,中文全部是乱码。
更尴尬的是,他自己也说不清这个 CSV 能不能导回来。导入器认的是十四列模板,导出给的是十一个内部字段,两边对不上;客户拿着它换产品,等于要重新整理一遍。
那天下午他做了个决定:把导出当成一个产品功能来做,而不是一个后台按钮。判据很简单——一个不懂技术的客户,不提问、不找客服,能不能自己把数据拿走并看懂。
他给这个功能定了三条约束:自助、完整、可解释。自助指不经过工单;完整指主数据、附件、事件都在;可解释指包里有一份人能读的说明。三条缺一条,客户就还得回来问。
这三条后来变成了「四件套」,也变成了续费邮件里的一句话:「你随时可以把全部数据带走,不需要我们同意。」这句话写进去之后,他发现销售对话里少了一整类问题。
二、四件套:为什么 CSV 与 JSON 都要给
只给 CSV 是最省事的做法,也是最容易在半年后收到「你们当时给的文件打不开」的做法。CSV 适合人看和表格工具,但它丢三样东西:类型、嵌套,以及空值与空字符串的区别。
任务板的数据结构里,一条任务有评论(一对多)、有标签(多对多)、有附件(引用),CSV 只能把它们压成一行一列。压法有很多种,每种都要在 README 里写清楚,否则客户拿到的是一张看起来完整、实际需要猜的表。
JSON 保留嵌套与类型,适合程序读,也适合再导入。代价是人不愿意直接打开它。所以两份都给,不是冗余,是给两类读者:一份给人和表格,一份给程序和下一次迁移。
| 文件 | 格式 | 内容 | 主要读者 |
|---|---|---|---|
| data.csv | UTF-8 CSV | 项目、任务、评论压平后的主表 | 人、表格工具、对账 |
| data.json | UTF-8 JSON | 同源主数据,保留嵌套与类型 | 程序、二次导入 |
| attachments.zip | ZIP | 该工作区的全部附件原文件 | 需要取回文件的人 |
| README.txt | 纯文本 | schema、字段说明、状态映射、生成时间 | 第一次打开包的人 |
README 是最容易被跳过、也最影响体验的一件。它不需要长,但必须回答四个问题:这是什么版本、每个文件是什么、字段是什么类型、状态值怎么映射。回答不了这四个问题,另外三个文件就只是原料。
他把 README 写成纯文本而不是 PDF,因为纯文本能 diff、能搜索、能在任何系统打开,也不会因为字体缺失变成乱码。版本号放在第一行,字段说明按文件分组,状态映射单独一节。
四件套的命名带日期与工作区短标识,避免客户下载三次之后分不清哪个是最新。文件名里不放用户邮箱,避免导出包在转发时泄露身份;这一点在多租户产品里尤其重要,导出包经常会被转给外部顾问。
有人会问,为什么不直接给一个数据库 dump。因为 dump 绑定你的 schema 与版本,客户拿到也导不进别处;四件套的目标是「能被别的工具消费」,不是「能还原你的数据库」。这两个目标看起来相近,实际会导出完全不同的设计。
三、九十六秒与四点四五兆
他拿一个真实的样例账户跑了一遍:六人团队,十八个附件,数据量不大。从点下按钮到下载完成 96 秒,中位数 78 秒——第一次要预热缓存,后面几次快一些。两个数字都记下来,因为客户感知的是最慢的那一次。
96 秒不是一个可以拿去宣传的数字,但它决定了一件事:客户会不会在等待里放弃。等待期间没有进度、没有阶段提示,人就会怀疑是不是卡住了,然后去发工单,自助就失败了。
包里 4.45 MB,构成很集中:主数据两份格式共 58 KB,十八个附件 4.32 MB,事件日志 68 KB。附件占了绝大部分,这也解释了为什么导出慢的时候,通常不是数据库慢。
| 部分 | 大小 | 说明 |
|---|---|---|
| 主数据 | 58 KB | data.csv 与 data.json 同源生成 |
| 附件 | 4.32 MB | 十八个文件,保留原文件名 |
| 事件 | 68 KB | 谁在何时改了什么 |
| 合计 | 4.45 MB | 压缩后的下载包 |
事件日志单独给,是因为它回答「谁在什么时候改了什么」。客户要迁移时,任务本身可以重建,历史很难重建;但事件里可能含他人邮箱,所以 README 要写明字段含义与脱敏规则。
打包过程分三段:查库、序列化、压缩上传。三段都可能失败,所以导出任务要能重试,且每次重试用同一个导出 ID,避免客户拿到两个半成品。
下载链接是一次性签名,有效期写在页面上。链接不能永久有效,因为导出包里是全部数据;也不能短到客户还没下完就过期。他给的有效期覆盖一次下载加一次重试,过期后可在原页面重新生成。
data.csv
data.json
attachments/ 18 个文件
events.jsonl
README.txt
这份清单直接放在 README 第一屏和下载页上。清单里没有缩略图、没有临时文件、没有服务端日志——导出包只放客户的数据,不放系统的运行痕迹。
四、走得掉的商业价值
导出功能最容易被当成成本:要写序列化、要打包、要签名、要限流,还不产生收入。许南乔一开始也是这么算的,直到他把一年的导出请求拉出来:7 次,每次连沟通带确认 0.5 小时,合计 3.5 小时。
3.5 小时不多,但它买到的东西不便宜。有两个客户在续费沟通里明确提到「能导出」是留下来的原因之一;按 15 美元/月的价格,2 人 × 15 × 12 = 360 美元/年。
360 美元也不多。相比 17 个迁移用户带来的 3,060 美元/年,它只是零头。但它和迁移收入的性质不同:迁移收入来自「进来」,导出保住的是「不出去」,后者不需要清洗、不需要复核,也不占用迁移窗口。
更重要的是它降低了销售摩擦。客户问「数据怎么拿走」,他不用写一段保证,只要发一个链接,让对方自己试。7 次请求全部自助完成,失败 0 次——这个 100% 不是能力证明,而是设计目标:如果导出需要人工介入,它就不算「走得掉」。
他也见过反例:一个朋友的产品把导出放在「联系客服」后面,客户要在续费前发邮件申请,等几天才拿到一个压缩包。那几天里,客户已经在比较竞品了。导出慢不会直接导致流失,但会让「要不要换」这个问题在客户脑子里多待一阵。
复算:
导出耗时 96 秒(中位 78 秒);包 4.45 MB = 主数据 58 KB + 18 文件 4.32 MB + 事件 68 KB
四件套:data.csv / data.json / attachments.zip / README.txt(含 schema 与字段说明)
导出请求 7 次/年 × 0.5 h = 3.5 h
因可导出留下 2 人 × 15 × 12 = 360 美元/年
自助完成 7/7 = 100%;失败 0 次
复算里最值得看的是 7/7。它不是「成功率」,而是「自助率」:7 次请求都没有变成工单。只要有一次需要人工,3.5 小时就会变成 3.5 小时加上不可预测的等待,而客户对等待的容忍度远低于对价格的容忍度。
他也不打算把「能导出」写成营销标语。它是一个基础设施,像发票、像密码重置:平时没人夸,缺了就会在续费前被想起来。真要说它的价值,是让「走」这个选项一直存在,而客户知道它存在,才更愿意留下。
五、行动清单与复算验收
如果只做一件事,先把导出从「后台按钮」搬到「设置页第一屏」,并在旁边写清四件套里有什么。剩下的按清单推进,每条都要能指向一个页面、一个文件或一条记录。
- 把导出做成自助入口,不经过工单
- 四件套齐:data.csv、data.json、attachments.zip、README.txt
- README 写清 schema、字段类型、状态映射与生成时间
- 导出包用一次性签名链接,有效期写进页面
- 记录每次导出的请求人、时间与包大小
- 附件超限时给清单,不静默丢弃
- 每季度用一次真实导出做回导演练
- 在定价页与续费邮件里写明「随时可导出」
清单里最容易被跳过的是第 3 条与第 7 条。README 决定客户能不能自己看懂,回导演练决定你给的文件是不是真的可用;这两条都不产生新功能,但决定了导出是「一个压缩包」还是「一条退出路径」。
第 6 条来自附件导入的教训:静默丢弃比明确拒绝更伤人,因为客户要过几周才会发现少东西。导出同理,少一个附件不报错,客户只会在新系统里发现某个任务空了。
验收标准:任取一个账号,能在导出页自助拿到四件套,并把 data.json 原样导入一个新工作区,字段数与附件数一致。
使用边界与实操验收
边界一:导出不等于删除。 导出只是把数据交给客户,你这边仍然保留着副本;客户要求删除时,要走删除权:九张表、九十七行与两个等保留期的副本 那条流程,两件事不能互相替代。
边界二:导出不等于备份。 导出是给客户的权利,不是你的灾难恢复方案;备份的加密、离线副本与恢复演练由数据与备份:3-2-1、加密、离线副本与恢复演练 负责,别用一个导出按钮同时应付两件事。
边界三:不承诺格式永久不变。 schema 会演进,字段会增删;能做的是给版本号、在 README 里写变更、在改格式前公告,而不是承诺「十年后还能原样打开」。客户真正需要的是可解释的变更,不是一句不变。
边界四:导出包里不能有别人的数据。 评论、附件、事件都可能涉及其他成员;导出前要按权限裁剪,只给请求者有权看的部分。多租户产品里这条最容易出错,因为导出查询常常绕过平时的权限检查。
边界五:可携带权是法律底线,不是产品卖点。 GDPR 第 20 条要求以结构化、通用、机器可读的格式提供数据,这里是教学引用,具体适用以专业意见为准;产品可以做得比底线更好,但不能把底线当优势宣传。
这五条边界并不互相独立:删除流程依赖导出范围,导出范围依赖权限裁剪,权限裁剪又依赖多租户的数据模型。验收时如果只看单条,很容易漏掉它们之间的连锁反应。
把边界写进导出页的说明与 README 的末尾,比写在文章里更有用;下一次客户提问时,先看这两处有没有被更新。
关键参考与核验范围
- RFC 4180 :用于核对 CSV 的引号、换行与转义规则。
- RFC 8259 :用于核对 JSON 的编码与数值表示。
- GDPR Art 20 :用于核对数据可携带权的格式与范围表述。
- ICO 数据可携带权 :用于核对「结构化、通用、机器可读」的解释。
以上链接于 2026-10-26 实测可公开访问;未核验版本、价格与配额。核验日期:2026-10-26。
本文的核验范围限于格式规范与可携带权的公开表述;不核验任何厂商的导出格式、字段清单与配额,也不构成法律意见。架构组负责 schema 迁移,隐私组负责法定导出与删除,资产组负责备份恢复;本篇只回答「客户要离开时,数据怎么自己拿走」。
系列导航
- 回到本组目录:一个人的数据搬家:导入、去重、迁移与退出
- 上一篇:附件与限额:四十六个文件、三百一十二兆与五个跳过
- 下一篇:迁移验收:十项检查、四维评分与一次季度复盘
- 相关:平台风险与迁移:把渠道依赖变成可退出结构
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。