Overview
Enterprise billing features:- Seat-based Pricing: Pay per active user in your organization
- Flexible Billing Periods: Monthly or annual subscriptions
- Trial Periods: Optional trial before payment
- Usage Tracking: Monitor booking usage and seat utilization
- Self-Service: Manage seats and billing independently
- Custom Pricing: Enterprise pricing for large deployments
License Requirements
Enterprise License Key
To enable Enterprise features, obtain a license key:.env
.env.example:21-26
To obtain a license:
- Visit cal.com/sales
- Complete the Enterprise inquiry form
- Receive your
CALCOM_LICENSE_KEYandCAL_SIGNATURE_TOKEN - Add to your
.envfile
License Setup
For new deployments without a license:- Navigate to
/auth/setupas admin - Select your license type
- Enter license key and signature token
- Complete setup wizard
.env.example:19
Billing Configuration
Environment Variables
Configure Stripe billing integration:.env
.env.example:206-221, .env.example:319-321, .env.example:418
Organization Billing Flow
1. Organization Creation
When creating an organization, billing details are collected:packages/features/ee/organizations/lib/OrganizationPaymentService.ts:174-206
2. Stripe Customer Creation
A Stripe customer is created or retrieved:packages/features/ee/organizations/lib/OrganizationPaymentService.ts:88-123
3. Subscription Checkout
A Stripe Checkout session is created:packages/features/ee/organizations/lib/OrganizationPaymentService.ts:270-308
4. Payment Confirmation
After successful payment:- Stripe webhook confirms payment
- Organization is activated
- Users are provisioned
- Subscription is active
Pricing Models
Standard Pricing
Monthly:- $37 per seat per month
- Minimum 30 seats (configurable)
- Billed monthly
- $37 per seat per month (billed annually)
- Minimum 30 seats (configurable)
- 12-month commitment
.env.example:320-321
Custom Pricing
Admins can configure custom pricing:packages/features/ee/organizations/lib/OrganizationPaymentService.ts:175-183
Custom Stripe Prices
For non-standard pricing, custom Stripe prices are created:packages/features/ee/organizations/lib/OrganizationPaymentService.ts:244-268
Seat Management
Automatic Seat Calculation
Seats are automatically calculated based on:- Existing Team Members: Unique members across migrated teams
- Invited Members: New users being added during onboarding
- Minimum Requirements: Configured minimum seats
packages/features/ee/organizations/lib/OrganizationPaymentService.ts:137-172, .ts:358-365
Adding Seats
To add seats to an existing subscription:- Navigate to Organization Settings → Billing
- Click “Manage Subscription”
- Update seat quantity
- Confirm changes
Seat Utilization
Monitor seat usage:- Active Seats: Currently occupied by users
- Available Seats: Purchased but unassigned
- Utilization Rate: Active / Total seats
Usage Tracking
Booking Usage Increment
Organization bookings are tracked for billing:packages/features/ee/organizations/lib/billing/tasker/types.ts:9-26
Usage Cancellation
Cancel usage increment when booking is cancelled:packages/features/ee/organizations/lib/billing/tasker/types.ts:17
Usage Rescheduling
Adjust usage tracking when booking is rescheduled:packages/features/ee/organizations/lib/billing/tasker/types.ts:19-25
Billing Periods
Monthly Billing
Annual Billing
packages/features/ee/organizations/lib/OrganizationPaymentService.ts:125-135
Trial Periods
Configure trial periods for new organizations:.env
- Full access to all features during trial
- No payment required to start trial
- Automatic conversion to paid after trial
- Cancel anytime during trial with no charge
.env.example:221, OrganizationPaymentService.ts:288
Admin Billing Bypass
Admins can create organizations without payment:packages/features/ee/organizations/lib/OrganizationPaymentService.ts:327-335
This allows:
- Internal testing
- Special partnerships
- Custom billing arrangements
Webhook Configuration
Stripe Webhooks
Configure webhooks to receive billing events:.env
.env.example:223-224, .env.example:418
Webhook Events
Handle the following Stripe events:| Event | Action |
|---|---|
checkout.session.completed | Activate organization subscription |
customer.subscription.updated | Update seat count and billing details |
customer.subscription.deleted | Suspend organization access |
invoice.payment_succeeded | Confirm payment and extend period |
invoice.payment_failed | Notify admin and suspend if needed |
Webhook Endpoints
Organization Billing Repository
Access billing data programmatically:packages/features/ee/billing/organizations/organization-billing.ts:5-16
Troubleshooting
Payment Failed
Solutions:- Verify Stripe API keys are correct
- Check webhook secrets match Stripe dashboard
- Ensure Stripe account is not in test mode (production)
- Verify customer payment method is valid
- Check for declined transactions in Stripe dashboard
Missing Stripe Configuration
Error: “STRIPE_ORG_PRODUCT_ID is not set” Solution: Configure all required Stripe environment variables:packages/features/ee/organizations/lib/OrganizationPaymentService.ts:222-235
Unauthorized Custom Pricing
Error: “You do not have permission to modify the default payment settings” Solution: Only admins can set custom pricing. Either:- Use standard pricing ($37/seat)
- Request admin to create organization with custom pricing
- Upgrade user to admin role
packages/features/ee/organizations/lib/OrganizationPaymentService.ts:179-183
Webhook Not Receiving Events
Solutions:- Verify webhook endpoint is publicly accessible
- Check webhook secret matches Stripe configuration
- Test webhook endpoint in Stripe dashboard
- Review webhook logs for errors
- Ensure HTTPS is enabled (required by Stripe)
Best Practices
- Monitor Seat Utilization: Keep utilization at 80-90% for cost efficiency
- Use Annual Billing: Save ~8% with annual vs monthly (typically)
- Enable Trial Periods: Let users experience full platform before payment
- Set Up Webhooks: Ensure reliable payment event handling
- Track Usage: Monitor booking usage to optimize seat allocation
- Regular Audits: Review active users and remove inactive seats
- Test in Staging: Always test billing flow in Stripe test mode first
API Reference
OrganizationPaymentService
packages/features/ee/organizations/lib/OrganizationPaymentService.ts:77-417