跳转到内容
全部文章
约 4 分钟阅读

一份不止于首页的 SaaS 发布检查清单

在邀请用户进入产品之前,验证登录、客户数据、付费访问、失败任务与支持路径。

supastack 团队

走一遍客户的首次会话

在你计划发布的环境中创建一个全新账户。走完验证或供应商回调、重载应用、更新资料并退出登录。再用键盘在窄屏幕上重复一遍。你平常的开发会话可能掩盖缺失的配置步骤与陈旧状态。

检查那些解释下一步该做什么的提示。空状态界面应提供有用的操作。失败的请求应说明如何重试,而不是暗示工作已成功。在这些提示中使用产品实际的语言,并确保账户与支持链接指向真实目的地。

每种登录方式都把这段旅程重复一遍。Google 和 GitHub 的 OAuth 回调各有自己的重定向与失败模式(OAuth 设置指南讲了怎么配置),供应商的测试授权页与生产环境的表现也不一样。

  • 新账户创建与会话恢复可用。
  • 退出登录会撤销访问并清除上一位用户的界面呈现。
  • 空、加载与错误状态在移动端依然可理解。
  • 每个 OAuth 供应商都能在真实域名上完成回调。
  • 验证与重置邮件能送达、读起来清楚,并且链接到正确的环境。
  • 首次使用体验能告诉新用户下一步做什么。

在服务端证明付费访问

结账只是容易的那一半。在供应商沙箱里走完整条生命周期:购买、Webhook 收到并验证、权益落库、付费功能解锁——然后是续费、取消与退款。每一次转换都应改变服务端持有的状态,而不只是客户端的一个标志位。计费指南标明了 supastack 把这份状态放在哪里。

然后测试那些你巴不得见不到的事件:投递了两次的 Webhook、失败的支付、任务进行到一半时订阅过期。权益回答的是请求时刻的“现在是否允许”;仪表盘上的徽章回答不了。

  • 一次沙箱购买能完成并解锁付费功能。
  • 重复的 Webhook 投递是安全的——处理是幂等的。
  • 取消与退款在服务端边界撤销访问。
  • 如果提供按席位或按用量的限制,超限会被拒绝。

用真实依赖验证边界

用两个独立账户验证归属。尝试用一个账户读取与修改另一个账户的记录,包括任务状态与恢复 URL。在服务端动作边界检查付费访问,而不是只在界面里隐藏按钮。

按工作区划界的记录是多租户产品的脊梁——工作区边界一文解释了这个模型。无论你的技术栈是什么,发布问题都一样:每次读写是否都从服务端的已认证上下文推导归属,而没有任何记录 ID 或客户端发来的工作区被当作证据?

  • 跨工作区的读写被拒绝。
  • 恢复与任务 URL 本身不会授予访问权。
  • 列表与详情视图执行同样的范围限定。
  • 如果提供 API 密钥和 Webhook,它们也携带工作区范围。

故意演练失败路径

后台任务有两种截然不同的失败方式,每种都需要自己的测试。派发失败会让客户端不确定是否有任务入队——任务级幂等键与已保存的提交让恢复可以复用原始请求,而不是复制一份。完成失败意味着工作跑了但结果从未到达——重试与状态轮询应该补上这个缺口,而不是触发第二次生成。

同样的思路也适用于供应商:一次 AI 供应商超时、一封被退回的邮件、一次计费 API 错误。每一种都应该落到一个具体、可解释的状态,而不是静默的半拉子结果。任务恢复指南记录了套件的生产路径如何处理这些情况。

  • 提交超时后的重试不会复制工作或成本。
  • 失败的完成是可见、可恢复的,而不是静默丢失。
  • 供应商错误以诚实的状态到达用户,而不是笼统的崩溃。

为第一次故障做好准备

确保有人能找到错误、把它关联到相关任务,并帮助用户恢复——同时不暴露供应商密钥。确认存在哪些日志与审计记录、保留多久,以及运维如何访问它们。

发布前先决定“出问题了”长什么样:任务投递失败、Webhook 校验错误、供应商花费突然攀升。没人收到的告警不算监控——可观测性设置讲了这些信号怎么接线。

把备份当作运维演练:配置了备份不等于恢复过备份。在你需要它的那天到来之前,先在与生产相似的数据上真跑一遍恢复。

  • 一个错误能追溯到引发它的请求、用户与任务。
  • 日志与审计记录有负责人、保留策略和访问规则。
  • 备份被真正恢复过,而不只是配置过。
  • 失败的任务和 Webhook 错误会触发真人能收到的告警。

检查产品周围的界面

法务与沟通界面是发布的一部分,不是锦上添花:描述产品实际行为的隐私政策与条款、能到达真人的支持地址,以及一个已验证的发件域名,让事务邮件从你拥有的地址发出。

像客户一样读一遍每封自动邮件。验证、重置、收据与完成通知都应该带产品名、指向正确环境的链接,以及一条不是 noreply 死胡同的回复路径。

  • 隐私与条款页面描述的是你实际运行的产品。
  • 事务邮件从你拥有的已验证域名发出。
  • 支持与计费问题有能联系到的去处。

把放行与否的决定说清楚

整理好发布记录:构建版本、目标环境、测了什么、怎么测的,以及仍未验证的部分。一份如实标注缺口的清单胜过自信的总结——缺口通常就是第一次事故藏身的地方。

在需要回滚路径之前先定好它:怎么回退部署、中间写入的数据怎么办、由谁拍板。然后发布你能完整支撑的最小版本,再有计划地扩大。

常见发布问题

发布清单总在可预测的地方掉链子。这些问题能拦住其中的大多数。

  • 大多数 SaaS 发布忘了什么? —— 流程的末端:真正会撤销的退出、真正移除访问的取消,以及为纸面上存在的备份做一次恢复演练。
  • 我需要几个测试账户? —— 目标环境里至少两个。数据隔离和邀请流程用一个账户是验证不了的。
  • 沙箱测试还是生产测试? —— 都要。沙箱证明生命周期逻辑;一笔小额真实交易证明密钥、域名和 Webhook 接对了地方。
  • 什么时候发布才安全? —— 当每一项保护客户数据或资金的项目都已验证,而未验证的项目都写了下来并有了负责人——而不是当功能清单看起来完整的时候。
  • 发布之后有什么变化? —— 保留发布记录、盯着你配置的失败告警,并在认证、计费或范围限定有任何重大改动后重跑一遍清单。

常见问题

14 个问题

supastack 是什么?

supastack 是用于构建 AI 驱动 SaaS 产品的模块化基础。它把通用基础设施整合在一起,让你专注于产品专属的功能。

它支持 Web 和移动端吗?

支持。supastack 包含 Next.js 与 Expo 应用,作为 Web 与移动端体验的起点。

包含哪些认证方式?

Better Auth 覆盖邮箱/密码、OTP 与社交登录。个人工作区随账户一起开通,产品记录从第一天起就有边界。

AI 是如何支持的?

supastack 包含可配置的多供应商 AI、用量追踪、预算,以及加密的自带密钥(BYOK)支持。

订阅如何处理?

对于基于该套件构建的产品,Stripe 计费、订阅与权限构成付费访问的基础。供应商密钥仅存于服务端。

我的产品专属代码放在哪里?

产品专属功能保留在独立的代码库中,产品通过配置接入 supastack 的基础模块。

supastack 如何定价?

套件为一次性购买、终身更新:单框架 249 美元(限时优惠价,较常规价 349 美元优惠 100 美元),或全框架(Next.js、iOS、Android)499 美元(限时优惠价,较常规价 599 美元优惠 100 美元),每个额外开发者席位 75 美元。套件本身没有订阅。本站结账后通过邮件发送许可证密钥,仓库访问通过 GitHub 邀请授予。

工作区如何界定我的数据?

用户记录按 workspaceId 划定边界。身份、权限、AI 用量、计费事件与审计条目都留在个人工作区边界内。

后台任务如何工作?

Trigger.dev 是明确的任务运行时。JobRunner 契约只承诺 enqueue、status 与 cancel——工作流语义保持 Trigger.dev 专有且显式。

邮件与营销触达有何不同?

事务性邮件覆盖产品工作流,如任务完成通知。冷触达与营销活动属于产品自身的范畴,不在本套件的邮件模块内。

移动端购买如何运作?

移动端已支持 RevenueCat 原生购买和恢复购买,访问权限由服务端验证。发布前需配置商店账户并完成设备测试。Web 计费保持独立。

AI 供应商密钥存放在哪里?

自带密钥凭证经过加密且仅存于服务端。密钥在日志中被脱敏;用量与预算在工作区级别保持可见。

结账支持哪些付款方式?

Stripe 托管结账接受银行卡,在 Stripe 账户启用后还可提供支付宝与微信支付——方便中国买家。钱包授权为异步确认,付款完成后许可证页面会立即更新。

我能申请退款吗?

获得代码仓库访问权限后,supastack 将永久归你所有,因此无法退款。但请放心,你将获得包含终身更新的完整源代码,可为你自己或客户构建并发布无限数量的产品。你只需注意不能转卖代码,也不能将仓库作为启动模板二次分发。

CN