arche

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。

一句话总结

平台最适合的心智主要优势主要代价
CreemSaaS / 数字商品 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 直接包含价格和计费类型,例如 onetimerecurring。如果同一个套餐有月付和年付,通常建成两个 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 有 succeededfailedcanceled 等状态。

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.active
  • subscription.trialing
  • subscription.paid
  • subscription.canceled
  • subscription.expired
  • subscription.past_due
  • subscription.paused

业务上通常把 activetrialingpaid 视为可访问,把 expired、长期 unpaidpaused 视为不可访问。

Waffo Pancake

Waffo 的订阅状态包括:

  • pending
  • active
  • trialing
  • past_due
  • canceling
  • canceled
  • expired
  • closed

Waffo 的 product group 很适合做套餐族。例如 Pro Monthly 和 Pro Yearly 属于同一个 group,并共享试用限制。文档强调 authenticated checkout 和 buyerIdentity 对试用防滥用很重要。

Stripe

Stripe 的订阅模型最完整,也最复杂。核心对象是 Subscription、Invoice、PaymentIntent 和 Customer。

Stripe 订阅状态包括:

  • trialing
  • active
  • incomplete
  • incomplete_expired
  • past_due
  • canceled
  • unpaid
  • paused

Stripe 文档建议通过 webhook 处理订阅事件。例如:

  • checkout.session.completed
  • invoice.paid
  • invoice.payment_failed
  • customer.subscription.updated
  • customer.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 支持:

  • once
  • forever
  • repeating
  • 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 有两套相关能力:

  1. Customer invoice balance
    用于给客户未来 invoice 增加 credit 或 debit。负数是 credit,正数是 debit。它会自动应用到后续 invoice,适合账单抵扣,不适合做任意站内积分钱包。

  2. 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、电子书、单次服务。

平台推荐模型
Creemonetime Product
Waffoone-time Product
StripeProduct + one-time Price + Checkout mode=payment

本地 webhook 动作:

payment/order completed
  -> 找到 user
  -> 找到 product 对应的 local plan
  -> grant entitlement

终身访问

终身访问应该技术上建模为一次性付款,不应该建模为订阅。

平台推荐模型
Creemonetime Product: Lifetime Access
Waffoone-time Product: Lifetime Access
Stripeone-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 Yearly

Waffo 可以用 product group 组织相关产品。Stripe 可以用 Product + multiple Prices 表达得更自然。

席位计费

平台推荐模型
Creemcheckout / subscription 中传 units 或 seat 数,取决于 SDK 支持
Waffosubscription product + quantity / subscription item 语义
StripePrice + subscription item quantity,天然支持 seat-based billing

Stripe 在 seat-based billing、proration、升级降级方面最成熟。

用量计费

平台推荐模型
CreemCustomer Credits 或自建 usage ledger
Waffoone-time dynamic charge with priceSnapshot,或本地 usage ledger
StripeUsage-based Billing + Metered Price + Meters / Metronome

如果需要严格按用量生成账单,Stripe 最强。
如果只是「充值点数后站内扣减」,Creem 更省心,Waffo / Stripe 也可以做,但通常需要本地 ledger。

充值积分 + 消费

固定充值包:

平台推荐模型
CreemCustomer Credits 或 one-time Product 后 credit
Waffoone-time Product,webhook 后本地加积分
Stripeone-time Price 收款,webhook 后本地加积分

自由金额充值:

平台推荐模型
Creem动态 checkout 或自定义 credit 充值
Waffobase Product + priceSnapshot
StripeCheckout line item price_data

对 Arche 这种产品,如果积分用于 AI / 构建 / API 调用,我更建议维护本地 credit_ledger。支付平台只负责收款,积分消费由应用自己保证幂等和实时性。

订阅 + 每月额度 + 超额

这是 AI SaaS 常见模型:

Pro Monthly:
  每月 1000 credits

超额:
  购买 top-up pack
  或按月底 usage invoice
平台推荐模型
CreemSubscription + Customer Credits
WaffoSubscription + 本地 credits + overage priceSnapshot
StripeSubscription + Metered Price + Billing Credits

Stripe 在「月底按 meter 出 invoice」最强。
Creem 在「用户买 credits 然后消费」更轻。
Waffo 在「某次事件动态金额 checkout」很顺。

企业报价 / 定制合同

平台推荐模型
Creem自定义 Product 或 checkout metadata
Waffobase Product + priceSnapshot
StripeQuotes / 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、权限判断

推荐路径:

  1. 先用 Creem 的 lifetime + subscription,保持接入轻。
  2. 如果需要更强动态报价、个人开发者 MoR 和 priceSnapshot,评估 Waffo。
  3. 如果进入复杂 Billing、企业合同、用量账单、财务对账和全球支付方式,评估 Stripe。

最终选型

场景更推荐
独立开发者卖源码、模板、课程Creem 或 Waffo
希望平台承担 MoR、税务、合规Creem 或 Waffo,或 Stripe Managed Payments
当前 Arche lifetime accessCreem 已足够
要做 AI credits 充值和消费Creem 最轻,Stripe 最强但更复杂,Waffo 需要本地 ledger
要做订阅 + 每月额度Creem / Stripe
要做复杂 usage-based billingStripe
要做动态报价或事件型收费Waffo 的 priceSnapshot 很清晰,Stripe 的 price_data 也可行
要做企业 invoice / quote / 财务集成Stripe
要最大化生态、支付方式、可扩展性Stripe

我的判断是:Arche 当前阶段继续用 Creem 是合理的。它和当前 lifetime access、Better Auth、GitHub invite 的链路贴合,复杂度最低。Waffo 值得作为备选 MoR,尤其是未来需要动态报价或更清晰的 authenticated checkout。Stripe 更像下一阶段的基础设施选择,适合当产品从「卖访问权」走到「复杂订阅、企业销售、用量账单、财务对账」之后再引入。

参考资料

On this page