Seat-based billing lets you charge customers based on the number of users, team members, or licenses they need. It’s the standard pricing model for team collaboration tools, enterprise software, and B2B SaaS products.
Implementation Tutorial
Step-by-step guide with code examples.
Add-ons Documentation
Learn about the add-on system that powers seat-based billing.
Subscription Management
Manage seat-based subscriptions and plan changes.
Webhooks
Track seat changes with subscription webhooks.
What is Seat-Based Billing?
Seat-based billing (also called per-user or per-seat pricing) charges customers based on the number of users who access your product. Instead of a flat fee, the price scales with team size.Common Use Cases
Benefits of Seat-Based Pricing
For Your Business:- Revenue scales naturally as customers grow
- Predictable pricing customers can budget for
- Clear upgrade path from individual to team to enterprise
- Higher lifetime value as teams expand
- Pay only for what they use
- Easy to understand and forecast costs
- Flexibility to add/remove users as needed
- Fair pricing that matches team size
How Seat-Based Billing Works in Dodo Payments
Dodo Payments implements seat-based billing using the Add-ons system. Here’s how it works:Architecture Overview
A Team Pro subscription costs 15/month for each extra seat. For example, if your team needs 15 seats:- Base Plan: $99/month (includes 5 seats)
- Add-ons: 10 extra seats × 150/month
- Total monthly cost: 150 = $249 for 15 seats
Key Components
Pricing Strategies
Choose the seat-based pricing strategy that fits your business:Strategy 1: Base + Per-Seat Add-on
Include a set number of seats in the base plan, charge for additional seats. Example:Strategy 2: Pure Per-Seat Pricing
Charge a flat rate per seat with no base fee. Example:Strategy 3: Tiered Seat Pricing
Different base plans with different per-seat rates. Example:Strategy 4: Seat Bundles
Sell seats in packs rather than individually. Example:Setting Up Seat-Based Billing
Step 1: Plan Your Pricing
Before implementation, define your pricing structure:1
Define Base Plan
Decide what’s included in the base subscription:
- Base price (can be $0 for pure per-seat)
- Number of included seats
- Features available at this tier
2
Set Seat Pricing
Determine the per-seat add-on cost:
- Price per additional seat
- Any volume discounts (via multiple add-ons)
- Maximum seats allowed (if applicable)
3
Consider Billing Frequency
Align seat pricing with your billing cycle:
- Monthly subscriptions → monthly seat charges
- Annual subscriptions → annual seat charges (often discounted)
Step 2: Create the Seat Add-on
In your Dodo Payments dashboard:- Navigate to Products → Add-Ons
- Click Create Add-On
- Configure the add-on:
Step 3: Create the Base Subscription
Create your subscription product:- Navigate to Products → Create Product
- Select Subscription
- Configure pricing and details
- In the Add-Ons section, attach your seat add-on
Step 4: Attach Add-on to Product
Link the seat add-on to your subscription:- Edit your subscription product
- Scroll to Add-Ons section
- Click Add Add-Ons
- Select your seat add-on
- Save changes
Your subscription product now supports seat-based pricing. Customers can purchase any quantity of additional seats during checkout.
Managing Seats
Adding Seats to New Subscriptions
When creating a checkout session, specify the seat quantity:Changing Seat Count on Existing Subscriptions
Use the Change Plan API to adjust seats:Removing Seats
To reduce seat count, specify the lower quantity:Removing All Additional Seats
Pass an empty addons array to remove all add-ons:Proration for Seat Changes
When customers add or remove seats mid-cycle, proration determines how they’re billed.Proration Modes
按比例收费示例
场景:剩余15天计费周期,添加5个座位,每个座位10美元- prorated_immediately
- difference_immediately
- full_immediately
- do_not_bill
更改前的预览
更改前始终预览按比例收费:使用 Webhooks 跟踪座位
通过监听订阅 Webhooks 来监控座位更改:相关事件
Webhook 处理程序示例
强制执行座位限制
您的应用程序必须强制执行座位限制。Dodo Payments 负责计费,但您控制访问权限。执行策略
- Hard Limit
- Soft Limit with Warning
- Auto-Upgrade
严格阻止添加超过座位数的用户。
高级模式
不同类型的座位
提供不同定价的座位类型:年度座位折扣
提供年度座位定价折扣:最低座位要求
对某些计划要求最低座位数:最佳实践
定价最佳实践
- 清晰沟通:在定价页面上突出显示每个座位的定价
- 包含座位:考虑在基本价格中包含一些座位以减少摩擦
- 数量折扣:为较大的团队提供较低的每座位费率以赢得企业交易
- 年度激励:年费计划折扣以改善现金流和保留率
技术最佳实践
- 缓存座位数:在本地缓存订阅座位数以避免每次请求时进行 API 调用
- 定期同步:通过 API 定期将本地座位数与 Dodo Payments 同步
- 处理失败:如果座位更改失败,显示清晰的错误信息和重试选项
- 审计追踪:记录所有座位更改以解决计费争议和合规性
用户体验最佳实践
- 实时反馈:在调整座位时立即显示成本影响
- 确认步骤:在计费变更前要求确认
- 按比例收费透明:在应用收费前清楚解释按比例收费
- 轻松降级:不要使减少座位变得困难(这会建立信任)
故障排除
Seat count mismatch between app and billing
Seat count mismatch between app and billing
症状:您的应用程序显示的座位数与订阅不同。原因:
- 未接收或处理 Webhook
- 座位更改期间的竞争条件
- 缓存数据未更新
- 为
subscription.plan_changed实现 Webhook 处理程序 - 添加“与计费同步”按钮以获取当前订阅
- 设置缓存 TTL 以确保定期刷新
Proration charges unexpected
Proration charges unexpected
症状:客户对周期中期费用金额感到困惑。原因:
- 未清晰传达按比例收费模式
- 客户未看到确认前的预览
- 更改前始终使用
previewChangePlan - 清晰地展示细分:“添加 X 个座位 = 今天 $Y(按 Z 天按比例收费)”
- 在帮助中心记录您的按比例收费政策
Add-on not appearing in checkout
Add-on not appearing in checkout
症状:结账时座位附加组件不可用。原因:
- 附加组件未附加到产品
- 附加组件已存档或删除
- 产品和附加组件之间的货币不匹配
- 在产品设置中验证附加组件是否附加
- 在“附加组件”仪表板中检查附加组件状态
- 确保货币完全匹配
Cannot reduce seats below current usage
Cannot reduce seats below current usage
症状:客户希望减少座位数量,但已分配用户。解决方案:
- 显示必须在减少座位数前移除哪些用户
- 实现工作流程:移除用户 → 减少座位
- 考虑在实施座位减少前设置宽限期
相关文档
Seat-Based Pricing Tutorial
完整实现指南,含代码。
Add-ons
深入了解附加系统。
Plan Changes & Proration
处理订阅修改。
Subscription Webhooks
跟踪订阅事件。