Skip to main content
Cal.com Enterprise billing provides flexible subscription management for organizations, including seat-based pricing, usage tracking, and payment processing through Stripe.

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
Source: .env.example:21-26 To obtain a license:
  1. Visit cal.com/sales
  2. Complete the Enterprise inquiry form
  3. Receive your CALCOM_LICENSE_KEY and CAL_SIGNATURE_TOKEN
  4. Add to your .env file

License Setup

For new deployments without a license:
  1. Navigate to /auth/setup as admin
  2. Select your license type
  3. Enter license key and signature token
  4. Complete setup wizard
Source: .env.example:19

Billing Configuration

Environment Variables

Configure Stripe billing integration:
.env
Source: .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:
Source: packages/features/ee/organizations/lib/OrganizationPaymentService.ts:174-206

2. Stripe Customer Creation

A Stripe customer is created or retrieved:
Source: packages/features/ee/organizations/lib/OrganizationPaymentService.ts:88-123

3. Subscription Checkout

A Stripe Checkout session is created:
Source: packages/features/ee/organizations/lib/OrganizationPaymentService.ts:270-308

4. Payment Confirmation

After successful payment:
  1. Stripe webhook confirms payment
  2. Organization is activated
  3. Users are provisioned
  4. Subscription is active

Pricing Models

Standard Pricing

Monthly:
  • $37 per seat per month
  • Minimum 30 seats (configurable)
  • Billed monthly
Annual:
  • $37 per seat per month (billed annually)
  • Minimum 30 seats (configurable)
  • 12-month commitment
Source: .env.example:320-321

Custom Pricing

Admins can configure custom pricing:
Source: packages/features/ee/organizations/lib/OrganizationPaymentService.ts:175-183

Custom Stripe Prices

For non-standard pricing, custom Stripe prices are created:
Source: packages/features/ee/organizations/lib/OrganizationPaymentService.ts:244-268

Seat Management

Automatic Seat Calculation

Seats are automatically calculated based on:
  1. Existing Team Members: Unique members across migrated teams
  2. Invited Members: New users being added during onboarding
  3. Minimum Requirements: Configured minimum seats
Source: packages/features/ee/organizations/lib/OrganizationPaymentService.ts:137-172, .ts:358-365

Adding Seats

To add seats to an existing subscription:
  1. Navigate to Organization Settings → Billing
  2. Click “Manage Subscription”
  3. Update seat quantity
  4. Confirm changes
API Approach:

Seat Utilization

Monitor seat usage:
  • Active Seats: Currently occupied by users
  • Available Seats: Purchased but unassigned
  • Utilization Rate: Active / Total seats
Recommended utilization: 80-90% for cost efficiency

Usage Tracking

Booking Usage Increment

Organization bookings are tracked for billing:
Source: packages/features/ee/organizations/lib/billing/tasker/types.ts:9-26

Usage Cancellation

Cancel usage increment when booking is cancelled:
Source: packages/features/ee/organizations/lib/billing/tasker/types.ts:17

Usage Rescheduling

Adjust usage tracking when booking is rescheduled:
Source: packages/features/ee/organizations/lib/billing/tasker/types.ts:19-25

Billing Periods

Monthly Billing

Annual Billing

Source: packages/features/ee/organizations/lib/OrganizationPaymentService.ts:125-135

Trial Periods

Configure trial periods for new organizations:
.env
Trial behavior:
  • 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
Source: .env.example:221, OrganizationPaymentService.ts:288

Admin Billing Bypass

Admins can create organizations without payment:
Source: 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
Source: .env.example:223-224, .env.example:418

Webhook Events

Handle the following Stripe events:

Webhook Endpoints

Organization Billing Repository

Access billing data programmatically:
Source: packages/features/ee/billing/organizations/organization-billing.ts:5-16

Troubleshooting

Payment Failed

Solutions:
  1. Verify Stripe API keys are correct
  2. Check webhook secrets match Stripe dashboard
  3. Ensure Stripe account is not in test mode (production)
  4. Verify customer payment method is valid
  5. 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:
Source: 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:
  1. Use standard pricing ($37/seat)
  2. Request admin to create organization with custom pricing
  3. Upgrade user to admin role
Source: packages/features/ee/organizations/lib/OrganizationPaymentService.ts:179-183

Webhook Not Receiving Events

Solutions:
  1. Verify webhook endpoint is publicly accessible
  2. Check webhook secret matches Stripe configuration
  3. Test webhook endpoint in Stripe dashboard
  4. Review webhook logs for errors
  5. Ensure HTTPS is enabled (required by Stripe)

Best Practices

  1. Monitor Seat Utilization: Keep utilization at 80-90% for cost efficiency
  2. Use Annual Billing: Save ~8% with annual vs monthly (typically)
  3. Enable Trial Periods: Let users experience full platform before payment
  4. Set Up Webhooks: Ensure reliable payment event handling
  5. Track Usage: Monitor booking usage to optimize seat allocation
  6. Regular Audits: Review active users and remove inactive seats
  7. Test in Staging: Always test billing flow in Stripe test mode first

API Reference

OrganizationPaymentService

Source: packages/features/ee/organizations/lib/OrganizationPaymentService.ts:77-417