Payment Provider Comparison
Creem、Waffo Pancake 和 Stripe 的业务模型、商业模型与选型建议
Creem、Waffo Pancake 与 Stripe 支付模型对比
背景
这份文档用于比较三个支付平台在软件、SaaS、数字商品和用量型产品中的建模方式:
- Creem:面向 SaaS 和数字产品的 Merchant of Record。
- Waffo Pancake:面向独立开发者和软件产品的 Merchant of Record。
- Stripe:通用支付、Billing、Checkout、Tax、Invoicing 和 Managed Payments 平台。
文档关注的不是接入代码,而是业务对象如何映射到商业模式:产品、价格、checkout、订单、支付、订阅、折扣、积分、退款、税务和 webhook。
一句话总结
| 平台 | 最适合的心智 | 主要优势 | 主要代价 |
|---|---|---|---|
| Creem | SaaS / 数字商品 MoR,内建支付、订阅、折扣、客户积分 | 接入轻、MoR 语义直接、Customer Credits 对 AI / credits 模式友好 | 生态和可组合能力不如 Stripe 深 |
| Waffo Pancake | 开发者友好的 MoR + 产品目录 + 动态定价 | Product version、product group、priceSnapshot、authenticated checkout 心智清晰 | 内建 coupon / credits 能力相对没那么一等对象化 |
| Stripe | 通用支付基础设施 + Billing 平台 | 生态最强,产品/价格/订阅/发票/优惠/用量计费能力最完整 | 默认不是 MoR,税务、合规、退款和支持责任需要额外处理或开启对应产品 |
如果只卖软件或 SaaS,且希望「支付、税务、合规、退款」尽量交给平台,优先看 Creem / Waffo。
如果希望获得最强的支付生态、Billing 复杂度、企业销售、用量计费和财务系统对接,Stripe 更强。
核心对象模型
Product
Product 是「卖什么」。
Creem 中 Product 直接包含价格和计费类型,例如 onetime 或 recurring。如果同一个套餐有月付和年付,通常建成两个 Product,再由应用自己的 plan catalog 合并展示。
Waffo 中 Product 是计费对象,可以是一次性产品、订阅产品,也可以作为动态定价的基础对象。Waffo 支持产品版本,更新名称、描述、图片或价格会影响新购买,已有订单和订阅保留原版本。
Stripe 中 Product 只描述商品或服务,真正的收费规则在 Price 上。Stripe 文档明确区分 Product 和 Price:Product 定义业务提供物,Price 定义金额和收费频率。一个 Product 可以有多个 Price,例如月付、年付、不同币种、不同 tier。
Price
Price 是「收多少钱,多久收一次」。
Creem 的价格通常在 Product 上,通过 cents 表达,例如 29900 表示 299 USD。
Waffo 的金额使用展示金额字符串,例如 "299.00"。它特别强调不要混用 cents 整数和 display amount。
Stripe 的 Price 是独立一等对象。Price 可以是 one-time 或 recurring,也可以支持 tiered、usage-based、multi-currency 等复杂定价。Stripe 建议改变价格时创建新 Price,而不是修改已有 Price,因为旧价格需要作为历史交易记录保留。
Checkout
Checkout 是「一次购买意图」。
Creem 通过 Checkout Session 返回 checkoutUrl。你传入 productId、successUrl、customer、metadata、discountCode 等,用户跳转到 Creem 完成支付。
Waffo 可以使用公开购买链接,也可以通过 API 创建 checkout session。API checkout 可以传入 buyerIdentity、currency、productType、priceSnapshot 等。buyerIdentity 很重要,用于订单归因、试用防滥用和客户门户。
Stripe Checkout Session 是 Stripe 的核心入口之一。创建 Checkout Session 时传入 line items、mode、success URL、customer、discounts 等。Stripe 的 mode 决定交易类型:
payment:一次性支付subscription:订阅setup:保存支付方式,未来扣款
Stripe 文档也提醒,发货或发放权限应等待支付成功 webhook,而不是只依赖 success page。
Order / Payment / Transaction
Order 是「业务订单」,Payment / Transaction 是「实际支付记录」。
Creem 里 checkout 完成后会产生 order / transaction。一次性购买主要关注 checkout/order paid;订阅则关注 subscription 和后续续费 transaction。
Waffo 明确区分 checkout session、one-time order、subscription order、payment 和 refund ticket。一次性订单会进入 paid,订阅订单有完整 lifecycle。Payment 有 succeeded、failed、canceled 等状态。
Stripe 的底层对象更细:
- Checkout Session:结账会话
- PaymentIntent:一次支付意图和支付状态
- Charge:实际扣款记录
- Invoice:账单
- Subscription:订阅协议
- Customer:客户
Stripe Billing 中,每次订阅扣款都会生成 Invoice 和 PaymentIntent。Invoice paid 后,subscription 通常变为 active。
Customer
Customer 是支付平台中的买家身份,不一定等同于应用里的 user。
三者都需要把平台 Customer 和应用 User 绑定。推荐做法是:
- checkout 创建时传入应用 user id。
- webhook 事件中读取 metadata / buyerIdentity / customer id。
- 在本地维护
user_id -> provider_customer_id映射。
Creem 常用 metadata.referenceId。
Waffo 推荐 authenticated checkout 的 buyerIdentity。
Stripe 常用 metadata.userId 或预先创建 Customer 后在 checkout session 中传入 customer。
订阅模型
Creem
Creem 的 recurring Product 创建订阅。订阅支持 trial、升级、暂停、取消、客户门户等。Webhook 里需要关注:
subscription.activesubscription.trialingsubscription.paidsubscription.canceledsubscription.expiredsubscription.past_duesubscription.paused
业务上通常把 active、trialing、paid 视为可访问,把 expired、长期 unpaid 或 paused 视为不可访问。
Waffo Pancake
Waffo 的订阅状态包括:
pendingactivetrialingpast_duecancelingcanceledexpiredclosed
Waffo 的 product group 很适合做套餐族。例如 Pro Monthly 和 Pro Yearly 属于同一个 group,并共享试用限制。文档强调 authenticated checkout 和 buyerIdentity 对试用防滥用很重要。
Stripe
Stripe 的订阅模型最完整,也最复杂。核心对象是 Subscription、Invoice、PaymentIntent 和 Customer。
Stripe 订阅状态包括:
trialingactiveincompleteincomplete_expiredpast_duecanceledunpaidpaused
Stripe 文档建议通过 webhook 处理订阅事件。例如:
checkout.session.completedinvoice.paidinvoice.payment_failedcustomer.subscription.updatedcustomer.subscription.deleted
Stripe 还支持 proration、subscription schedule、usage-based billing、trial、customer portal、revenue recovery 和复杂企业账单。
折扣模型
Creem
Creem 有一等 Discount Code 能力。适合:
- 首月优惠
- 限时折扣
- 早鸟价
- 固定金额优惠
- 百分比优惠
Checkout 创建时可以传入 discount code,也可以让用户在 checkout 中输入。
Waffo Pancake
当前文档中没有看到像 Stripe / Creem 那样完整的一等 coupon / promotion code API。Waffo 更适合用三种方式表达折扣:
- 年付折扣:创建单独 yearly product。
- 固定促销价:创建促销产品或发布新产品版本。
- 动态折扣:应用后端验证优惠码,然后创建 checkout session 时传入折后
priceSnapshot。
这意味着 Waffo 的折扣规则更适合放在你的应用里,Waffo 负责按最终金额收款。
Stripe
Stripe 的折扣模型最完整。它有:
- Coupon:折扣规则,可以是 percentage off 或 amount off。
- Promotion Code:客户输入的优惠码,映射到 Coupon。
- Discount:Coupon 或 Promotion Code 被应用后的实例。
Coupon 支持:
onceforeverrepeating- max redemptions
- redeem by
- applies to specific products
- multi-currency amount off
Checkout Session 可以直接设置 allow_promotion_codes,让用户在 Stripe Checkout 中输入优惠码。也可以在 API 中显式传入 discounts。
积分和用量模型
Creem
Creem 有 Customer Credits 能力,适合 AI credits、prepaid wallet、points、gems 等模型。它可以让你给 customer credit / debit / check balance,并保留账本记录。
如果你的产品是 AI 调用、生成次数、API credits,Creem 在这方面比较顺手。
Waffo Pancake
Waffo 很适合收「充值包」的钱,但当前文档里没有看到一等余额 API。推荐做法:
Waffo one-time product / priceSnapshot 收款
-> order.completed webhook
-> 应用本地 credit_ledger 增加积分
-> 用户消费时应用本地扣减固定充值包可以建多个 one-time products。自由金额充值或超额账单可以用一个 base product 加 priceSnapshot。
Stripe
Stripe 有两套相关能力:
-
Customer invoice balance
用于给客户未来 invoice 增加 credit 或 debit。负数是 credit,正数是 debit。它会自动应用到后续 invoice,适合账单抵扣,不适合做任意站内积分钱包。 -
Billing credits
用于 usage-based billing 的 prepaid 或 promotional credits。Stripe 文档说明 Credit Grant 可以给客户发放 prepaid / promotional billing credits,并在 metered subscription item 的 invoice finalization 时应用。
Stripe 的 Billing Credits 很适合「订阅 + 用量计费 + 预付额度」模型,但它有适用范围限制,例如主要用于 metered prices 和 subscription invoices。若要做灵活的站内积分、实时扣点和非 Stripe invoice 消费,仍建议维护应用自己的 credit ledger。
税务和 Merchant of Record
Creem
Creem 是 MoR。它作为法定销售方处理支付、税务、合规、退款和争议。这对个人开发者和小团队很重要,因为你不需要自己在多个国家处理 VAT / GST / sales tax 注册和申报。
Waffo Pancake
Waffo 也是 MoR。文档明确说它作为记录商处理税务、合规和付款,并支持个人身份收款。这是它和 Stripe 普通模式最大的差异之一。
Stripe
Stripe 默认是支付基础设施,不默认替你成为 MoR。普通 Stripe 模式下,你通常仍是 merchant,需要自己承担税务注册、申报、退款政策和客户支持责任。
Stripe 可以通过两类能力补齐:
- Stripe Tax:自动计算、收取、报告税务,并辅助监控注册义务。
- Managed Payments:Stripe 的 MoR 方案,用于数字产品,Stripe 文档说明它处理 80 多个国家的 sales tax、VAT、GST 合规,并通过 Link 作为交易中的 merchant of record。
因此 Stripe 有两种心智:
普通 Stripe:
你是商户,Stripe 是支付和 Billing 基础设施。
Stripe Managed Payments:
Stripe / Link 承担 MoR 角色,适合数字产品全球销售。商业模式映射
一次性付费
适合源码、模板、课程、license、电子书、单次服务。
| 平台 | 推荐模型 |
|---|---|
| Creem | onetime Product |
| Waffo | one-time Product |
| Stripe | Product + one-time Price + Checkout mode=payment |
本地 webhook 动作:
payment/order completed
-> 找到 user
-> 找到 product 对应的 local plan
-> grant entitlement终身访问
终身访问应该技术上建模为一次性付款,不应该建模为订阅。
| 平台 | 推荐模型 |
|---|---|
| Creem | onetime Product: Lifetime Access |
| Waffo | one-time Product: Lifetime Access |
| Stripe | one-time Price + Checkout mode=payment |
本地 entitlement 可以永久有效:
{
userId,
type: 'lifetime',
source: 'stripe' | 'creem' | 'waffo',
productId,
expiresAt: null,
}月度 / 年度订阅
| 平台 | 推荐模型 |
|---|---|
| Creem | 月付 Product + 年付 Product |
| Waffo | 月付 subscription product + 年付 subscription product + product group |
| Stripe | 同一 Product 下创建 monthly Price 和 yearly Price |
本地业务层应该抽象成一个 plan:
{
id: 'pro',
prices: [
{ interval: 'monthly', providerPriceId: '...' },
{ interval: 'yearly', providerPriceId: '...' },
],
}多档套餐
例如 Starter / Pro / Team。
Creem 和 Waffo 倾向于每个可购买选项一个 Product。Stripe 倾向于每个 tier 一个 Product,每个 Product 下有多个 Price。
Starter Monthly
Starter Yearly
Pro Monthly
Pro Yearly
Team Monthly
Team YearlyWaffo 可以用 product group 组织相关产品。Stripe 可以用 Product + multiple Prices 表达得更自然。
席位计费
| 平台 | 推荐模型 |
|---|---|
| Creem | checkout / subscription 中传 units 或 seat 数,取决于 SDK 支持 |
| Waffo | subscription product + quantity / subscription item 语义 |
| Stripe | Price + subscription item quantity,天然支持 seat-based billing |
Stripe 在 seat-based billing、proration、升级降级方面最成熟。
用量计费
| 平台 | 推荐模型 |
|---|---|
| Creem | Customer Credits 或自建 usage ledger |
| Waffo | one-time dynamic charge with priceSnapshot,或本地 usage ledger |
| Stripe | Usage-based Billing + Metered Price + Meters / Metronome |
如果需要严格按用量生成账单,Stripe 最强。
如果只是「充值点数后站内扣减」,Creem 更省心,Waffo / Stripe 也可以做,但通常需要本地 ledger。
充值积分 + 消费
固定充值包:
| 平台 | 推荐模型 |
|---|---|
| Creem | Customer Credits 或 one-time Product 后 credit |
| Waffo | one-time Product,webhook 后本地加积分 |
| Stripe | one-time Price 收款,webhook 后本地加积分 |
自由金额充值:
| 平台 | 推荐模型 |
|---|---|
| Creem | 动态 checkout 或自定义 credit 充值 |
| Waffo | base Product + priceSnapshot |
| Stripe | Checkout line item price_data |
对 Arche 这种产品,如果积分用于 AI / 构建 / API 调用,我更建议维护本地 credit_ledger。支付平台只负责收款,积分消费由应用自己保证幂等和实时性。
订阅 + 每月额度 + 超额
这是 AI SaaS 常见模型:
Pro Monthly:
每月 1000 credits
超额:
购买 top-up pack
或按月底 usage invoice| 平台 | 推荐模型 |
|---|---|
| Creem | Subscription + Customer Credits |
| Waffo | Subscription + 本地 credits + overage priceSnapshot |
| Stripe | Subscription + Metered Price + Billing Credits |
Stripe 在「月底按 meter 出 invoice」最强。
Creem 在「用户买 credits 然后消费」更轻。
Waffo 在「某次事件动态金额 checkout」很顺。
企业报价 / 定制合同
| 平台 | 推荐模型 |
|---|---|
| Creem | 自定义 Product 或 checkout metadata |
| Waffo | base Product + priceSnapshot |
| Stripe | Quotes / Invoices / custom Price / Checkout price_data |
Stripe 在 quote、invoice、企业应收账款和 CRM / 财务系统对接上最强。
对 Arche 的建议
保留 provider-agnostic billing catalog
不要把平台 product id 散落在业务代码里。建议保留本地 billing catalog:
const plans = [
{
id: 'lifetime',
type: 'lifetime',
grants: ['github_repo_access'],
prices: [
{
provider: 'creem',
productId: 'prod_xxx',
amount: 29900,
currency: 'USD',
},
{
provider: 'waffo',
productId: 'PROD_xxx',
productType: 'onetime',
amount: '299.00',
currency: 'USD',
},
{
provider: 'stripe',
priceId: 'price_xxx',
mode: 'payment',
amount: 29900,
currency: 'USD',
},
],
},
]Product / Price 是支付平台的 SKU,Plan 是 Arche 自己的业务语义。
Webhook 统一成 entitlement event
三个平台 webhook 都应该归一到本地事件:
type BillingEvent =
| { type: 'one_time_paid'; provider: Provider; productId: string; userId: string }
| { type: 'subscription_active'; provider: Provider; subscriptionId: string; userId: string }
| { type: 'subscription_past_due'; provider: Provider; subscriptionId: string; userId: string }
| { type: 'subscription_canceled'; provider: Provider; subscriptionId: string; userId: string }
| { type: 'refund_succeeded'; provider: Provider; paymentId: string; userId: string }然后业务层只处理:
BillingEvent
-> entitlement
-> credit ledger
-> GitHub invite / revoke
-> email当前 lifetime access
当前 Arche 的 lifetime access 最适合:
Creem:
onetime product
Waffo:
one-time product
Stripe:
Product + one-time Price + Checkout mode=payment付款成功后:
grant github_repo_access forever退款成功后:
视产品政策决定是否 revoke github_repo_access未来 SaaS / credits 模式
如果 Arche 未来变成 SaaS + AI credits,我会这样分层:
支付平台:
负责收款、订阅、退款、税务、发票、折扣入口
Arche:
负责 plan、entitlement、credit ledger、usage event、权限判断推荐路径:
- 先用 Creem 的 lifetime + subscription,保持接入轻。
- 如果需要更强动态报价、个人开发者 MoR 和
priceSnapshot,评估 Waffo。 - 如果进入复杂 Billing、企业合同、用量账单、财务对账和全球支付方式,评估 Stripe。
最终选型
| 场景 | 更推荐 |
|---|---|
| 独立开发者卖源码、模板、课程 | Creem 或 Waffo |
| 希望平台承担 MoR、税务、合规 | Creem 或 Waffo,或 Stripe Managed Payments |
| 当前 Arche lifetime access | Creem 已足够 |
| 要做 AI credits 充值和消费 | Creem 最轻,Stripe 最强但更复杂,Waffo 需要本地 ledger |
| 要做订阅 + 每月额度 | Creem / Stripe |
| 要做复杂 usage-based billing | Stripe |
| 要做动态报价或事件型收费 | Waffo 的 priceSnapshot 很清晰,Stripe 的 price_data 也可行 |
| 要做企业 invoice / quote / 财务集成 | Stripe |
| 要最大化生态、支付方式、可扩展性 | Stripe |
我的判断是:Arche 当前阶段继续用 Creem 是合理的。它和当前 lifetime access、Better Auth、GitHub invite 的链路贴合,复杂度最低。Waffo 值得作为备选 MoR,尤其是未来需要动态报价或更清晰的 authenticated checkout。Stripe 更像下一阶段的基础设施选择,适合当产品从「卖访问权」走到「复杂订阅、企业销售、用量账单、财务对账」之后再引入。