2026.07.19

KYC 说我文件已提交 · 那晚我做了 3 件蠢事

那晚十一点多,屏幕上跳出「无法验证您的身份」。前面用了六个小时把 Creem 后端一次跑通,12 种 webhook 事件全过,就差 KYC 最后那一屏。以及后来我搭出的那条不用人工的客服邮件通道。

那晚十一点多 · 屏幕上跳出一句「很遗憾 · 我们无法验证您的身份」。

前面用了六个小时把 Creem 后端一次跑通 · 12 种 webhook 事件签名全过 · 4 个产品在生产环境实打实躺好。就差 KYC 最后那一屏。

结果卡在这。

事情大概是这样

datenix.xyz 是我最近在鼓捣的一个 B2B 数据 API。两块东西 · 259K 个 SaaS/AI 工具域名 · 加 1.6M 个电商店铺 · 都是从 30 多个公开目录聚出来的。给做销售、做市场的团队查线索用。

打算走 Creem。它是 Merchant of Record · 意思是它替我收钱、替我交税 · 我只管把 API 写好、把产品卖掉。对独立开发者来说这个模式省事到令人感动。

前面所有环节都很顺:

  • 老账号里有个 2025 年建的测试产品 · API 一条命令删掉 · 账户干净
  • 4 个真产品 (Starter $29 · Pro $99 · Business $499 · CSV 一次性 $299) 一个 bootstrap 脚本全建好 · 拿到 prod_XX ID
  • Cloudflare Worker 里的 creem.js 模块写了 12 个导出 · 用的 WebCrypto 校验 HMAC · 无 SDK 依赖
  • 12 种 webhook 事件全过 · signature_valid=1 · processed=1 · 挂到 D1 审计表
  • Landing 页 Terms/Privacy/AUP 三份法律文档都上线
  • 网站 footer 里 hi@datenix.xyz 通过 Cloudflare Email Routing 直接转发到我 Gmail

按理说 KYC 那点信息填一下就上线了。

结果我在 Business Details 的最后一屏 · 提交 PEP 声明后 · Sumsub 直接给我甩了个「文件已在另一个个人资料中提交」。

蠢事 1: 以为 archive 就是 delete

Creem 账号里有 3 个老 store · 都是随手起的名字 · 有的直接用邮箱命名。

我以为把老 store 里的产品 archive 掉 · Creem 就当那 3 个店不存在了。

其实 Creem 的 store 层删除是 dashboard 手动操作 · API 里根本没有 /v1/stores 端点。archived 的产品也是软删除 · 数据库里留着记录。更关键的是 · Sumsub (Creem 的 KYC 供应商) 键的是身份证件本身 · 不是 store。

于是我前面在其他老 store 上试过一次没走完的 KYC · 那个身份证 hash 就永远绑在那个 Sumsub applicant 记录上了。新 store 提交同一份 · duplicate 拒绝。

蠢事 2: 一到就把 KYC 走完

先建产品 · 再建 store · 再走 KYC — 这个顺序很自然。

但如果一开始知道 Sumsub 会记忆 · 我会先在 dashboard 里把 3 个老 store 请求删除 · 等 Creem 客服确认删完 · 才开始新 store 的 KYC。

这样 Sumsub 那边就不会有历史 applicant 记录。

现在只能反过来 · 走完 KYC 再补锅。这就是那晚发的那封求助邮件的核心内容:「我以前在其他 store 试过 KYC · 那些 store 已经删了 · 请把 Sumsub 那边我的 applicant 记录 reset · 让我在 datenix store 重新走一遍」。

蠢事 3: 没提前搭好客服邮件通道

拒绝界面出来那一刻 · 我准备立刻发邮件求助。

发件这件事本来该是「点一下命令 · 邮件出去」。结果发现我没有这个通道。以往我给客服发邮件都是打开 Gmail 网页手工写手工发 · 一次两次没什么 · 但真到 KYC 拒了那一刻 · 我意识到 · 支付通道搭得再好 · 客户回信一直靠人工 · 事情就断在这里。

那封邮件我最后是手工发的。发出去之后立刻着手补上这个洞。

后来搭出来的东西是这样: 我的 Cloudflare Worker 反正已经跑在 datenix.xyz 上了 · 加一个 /api/send-email 端点 · 校一个 header · 收 JSON · 转手用 HTTPS 打给 Resend 的 API · Resend 再送到目标邮箱。

Resend 免费额度 100 封 / 天 · 独立开发者阶段完全够用。默认发件人写的是 Datenix Team <onboarding@resend.dev> · Resend 自家共享 domain · 不用验证。回复地址依然是 hi@datenix.xyz · 通过 Cloudflare Routing 转到我 Gmail 收。

写了个 PowerShell 函数叫 Send-DatenixEmail · 放到本地脚本目录 · 以后哪个终端 · 一句话就把邮件发出去。

这个通道现在对我来说等于一条「我总能给任何人回信」的保底。KYC 沟通 · 客户 receipt · welcome 邮件 · 都靠它。

事后总结

Creem 客服那边 24-72 小时回。回信之前 KYC 这一步就是干等 · 别乱点。

我把当天做的东西整理成了一份可以给下个人接手的文档 · 30 KB 15 章 · 时间线到分钟、每个失败的原因、后续该怎么继续。这份东西的价值可能比通道本身还高 —— 独立开发者最缺的不是钱不是时间 · 是「上次遇到这坑我怎么解的」的记忆。

一个人干这些事 · 记忆放脑子里靠不住。每次遇到能停 5 分钟落一段的坑就该落一段。

后来那封求助邮件我实际写了两遍。第一遍中英双语版 · 后来发现 Creem 是欧洲团队 · 只发英文更快。英文那版我把关键信息塞成一张小表 —— 账户邮箱 · 已删的老 store 名字 · 新 store 名字 · 已完成的技术工作 (4 个 prod_XX ID · webhook endpoint URL · 12 event 验证结果) · 想要他们做的三个选项。

写这种邮件的窍门 · 是把「你能帮我做什么」拆成 A/B/C 让对方挑 · 而不是「我遇到问题请帮忙」。挑总比想快。

那晚学到的

一个是 · KYC 供应商的记忆比支付平台的记忆长。清账户不等于清 Sumsub。 二是 · 客户服务、transactional email 这一层基础设施 · 必须一开始就搭。挂了一晚上救急我才反应过来 · 以后每次都靠人工发根本 scaling 不起来。 三是 · 独立开发者一天能踩两次坑很正常 · 一天能落一份可以给下个人接手的文档才算把损失补回来。

第二天早上打开邮箱 · Creem 客服还没回。但我起码已经不慌了 —— 通道搭好了 · 文档写好了 · KYC 那边等就等吧。

回信第二天下午到 · Sumsub 那边一句「Done · please retry」。事情比我想的简单。那封邮件写得清楚可能起了作用 —— 里面账户信息、已完成的技术工作、想要的选项 (Reset applicant / Merge / Delete old stores) 三张小表 · 客服基本上直接选了 Reset 那一条 · 回信只有一句「Done · please retry」。

比我预期快很多。

一个人做产品能省人力最大的地方 · 不是自动化 · 是把每一次和外部方的沟通都做到「对方选 A/B/C」而不是「对方还要想」。这个道理跟前面搭邮件通道其实是同一个 —— 消除中间环节的不确定性 · 让每一步都是可选可执行的。