我做了一个浏览器扩展用来记笔记。功能很简单:按下 Ctrl+Shift+Q,弹出窗口打开,输入内容,保存。上周我打算调查为什么转化率这么低,结果发现了一个更严重的问题。
这个扩展有免费版和一次性付费解锁的 Pro 版。免费版限制笔记数量,并且——这是我一直没再想过的一环——每条笔记最多 500 字符。
这个限制的代码是这样的:
async function saveCurrentNote() {const limits = getCurrentLimits();if (limits.maxCharsPerNote !== Infinity && elements.noteContentEditor) {const charCount = (elements.noteContentEditor.textContent || '').length;if (charCount > limits.maxCharsPerNote) {showLimitWarning(limits.maxCharsPerNote + ' character limit reached');return;await db.updateNote(noteToSave.id, { title, content });}saveCurrentNote 是自动保存函数,在你打字时定时运行。所以在免费版里,一旦超过 500 字符,自动保存就停止写入。不是“停止写入超出部分”,而是完全停止写入。return 语句位于 db.updateNote 之上,标题、正文,全部都停。
你会看到一个提示条,说你达到了限制,然后一个升级弹窗会覆盖在你正在写的内容上。等你关掉弹窗,上一次保存在限制内之后输入的所有内容,全部消失。
这段代码是我写的,已经上线运行了好几个月。
事情比想象的更糟。扩展给所有新用户 7 天完整访问权限。在这 7 天里没有字符限制,所以人们会写真正的笔记——长笔记。然后试用期结束,限制回来了。
现在所有这些长笔记都变得永远无法编辑。打开一条,修一个错别字,自动保存触发,字符数超过 500,直接 return。这条笔记永远无法再保存。你能读它,但不能碰它。
我构建了一个机制,恰恰惩罚了那些已经充分使用产品、足以考虑付费的人。
最扎心的部分在于:我有一套端到端测试套件,25 个测试。但没有一个测试覆盖“先超过 500 字符再删除到 500 以内”这种场景。所以我完全没发现这个 bug。
如果你是这个扩展的用户,并且受到了影响,我真的很抱歉。这是我犯过的错误里最讽刺的一个:为免费用户加限制,结果我们惩罚的恰恰是那些最信任我们的人。
热门跟贴