Skip to main content
Organizations in Cal.com enable you to easily and effectively manage multiple teams under a unified structure. An organization lives above the teams layer, providing centralized management, billing, and branding.

Overview

Organizations allow you to:
  • Manage multiple teams from a single interface
  • Apply consistent branding across all teams
  • Centralize billing and seat management
  • Control member access with organization-level permissions
  • Use custom subdomains for your organization

Setup Requirements

1. License Configuration

Organizations is an Enterprise Edition feature requiring a valid license key:
CALCOM_LICENSE_KEY=your_license_key
To obtain a license key, contact Cal.com sales.

2. Environment Variables

Configure the following environment variables:
.env
# Required: Enable organizations feature
ORGANIZATIONS_ENABLED=1

# Required: Set webapp URL to handle subdomains
NEXT_PUBLIC_WEBAPP_URL=http://app.cal.local:3000
NEXTAUTH_URL=http://app.cal.local:3000

# Required: Cookie domain for subdomain authentication
NEXTAUTH_COOKIE_DOMAIN=.cal.local

# Required: Stripe pricing for organization billing
STRIPE_ORG_MONTHLY_PRICE_ID=price_xxx
STRIPE_ORG_ANNUAL_PRICE_ID=price_xxx
STRIPE_ORG_PRODUCT_ID=prod_xxx

# Optional: Enable auto-linking users by email domain
ORGANIZATIONS_AUTOLINK=1

# Optional: Minimum self-serve seats (default: 30)
NEXT_PUBLIC_ORGANIZATIONS_MIN_SELF_SERVE_SEATS=30

# Optional: Price per seat (default: $37)
NEXT_PUBLIC_ORGANIZATIONS_SELF_SERVE_PRICE_NEW=37

# Optional: Trial period in days
STRIPE_ORG_TRIAL_DAYS=14

3. DNS Configuration

Local Development

For local development, add entries to your hosts file:
# Add main app domain
sudo npx hostile set localhost app.cal.local

# Add organization subdomain (replace 'acme' with your org slug)
sudo npx hostile set localhost acme.cal.local

Production

When an organization is created in production, DNS setup is required: Vercel DNS (Automatic):
.env
# Vercel configuration for automatic subdomain creation
PROJECT_ID_VERCEL=your_project_id
TEAM_ID_VERCEL=your_team_id
AUTH_BEARER_TOKEN_VERCEL=your_auth_token
Cloudflare DNS (Automatic):
.env
# Enable Cloudflare DNS management
CLOUDFLARE_DNS=1
AUTH_BEARER_TOKEN_CLOUDFLARE=your_cloudflare_token
CLOUDFLARE_ZONE_ID=your_zone_id
CLOUDFLARE_VERCEL_CNAME=cname.vercel-dns.com

Creating an Organization

Step 1: Enable Feature Flag

  1. Log in as an admin user
  2. Navigate to Settings → Features
  3. Enable the “Organizations” feature flag

Step 2: Create Organization

  1. Visit /settings/organizations/new
  2. Fill in organization details:
    • Name: Organization display name
    • Slug: URL-safe identifier (e.g., acmeacme.cal.com)
    • Owner Email: Primary organization administrator
    • Billing Period: Monthly or Annual
    • Seats: Number of user licenses
  3. Complete the setup flow

Step 3: Admin Approval

  1. Log in as an admin
  2. Navigate to Settings → Organizations
  3. Review and approve the pending organization
  4. Verify DNS setup status

Organization Structure

Organizations follow a hierarchical structure:
Organization (acme.cal.com)
├── Team A (team-a.acme.cal.com)
│   ├── Member 1
│   └── Member 2
├── Team B (team-b.acme.cal.com)
│   ├── Member 3
│   └── Member 4
└── Direct Members
    └── Organization Admins

Permissions

Organization permissions are hierarchical:
RolePermissions
OwnerFull access to organization settings, billing, members, and teams
AdminManage members and teams, configure organization settings
MemberAccess to assigned teams only
Source: packages/features/ee/organizations/lib/OrganizationPermissionService.ts

Auto-linking Members

When ORGANIZATIONS_AUTOLINK=1 is enabled, users signing up with external providers (like Google) are automatically added to organizations matching their email domain. Requirements:
  • Organization must have verified the domain
  • User email domain must match organization’s domain
  • Works with SAML and social login providers
Source: packages/features/ee/sso/lib/sso.ts:26-54

Branding

Organizations can customize their branding:
  • Logo: Organization logo displayed across all pages
  • Brand Color: Primary color for UI elements
  • Banner: Hero image for public-facing pages
  • Bio: Organization description
Branding is applied to:
  • Organization subdomain pages
  • Team booking pages
  • Email notifications
  • Public profiles
Source: packages/features/ee/organizations/lib/getBrand.ts

Billing

See Billing for detailed information on organization billing, seat management, and payment processing.

Subdomain Management

Each organization gets its own subdomain: Format: {organization-slug}.cal.com Features:
  • Isolated authentication per organization
  • Custom branding and styling
  • Team pages under organization domain
  • Secure cookie handling across subdomains
Source: packages/features/ee/organizations/lib/getBookerBaseUrlSync.ts

Migrating Teams to Organizations

Existing teams can be migrated to an organization:
  1. Create organization onboarding with team selection
  2. Mark teams as isBeingMigrated: true
  3. Complete organization creation
  4. Teams maintain their existing members and settings
  5. Teams now operate under organization subdomain
Source: packages/features/ee/organizations/lib/OrganizationPaymentService.ts:320-323

API Access

Organizations can be managed programmatically via the tRPC API:
// Example: Get organization repository
import { getOrganizationRepository } from "@calcom/features/ee/organizations/di/OrganizationRepository.container";

const organizationRepository = getOrganizationRepository();
const org = await organizationRepository.getVerifiedOrganizationByAutoAcceptEmailDomain(domain);
Source: packages/features/ee/organizations/repositories/OrganizationRepository.ts

Troubleshooting

Local Development Issues

Camera/Microphone Access: Browsers block media access on non-HTTPS hosts except localhost. For video meetings:
  • Replace app.cal.local with localhost in meeting URLs
  • Or use tunneling tools: ngrok, tunnelmole
  • Or generate local SSL certificates with mkcert
Example:
# Install tunnelmole
curl -O https://install.tunnelmole.com/8dPBw/install && sudo bash install

# Run tunnel
tmole 3000

DNS Not Configured

If you see “DNS setup pending” badge:
  1. Verify Vercel or Cloudflare credentials are correct
  2. Check organization slug doesn’t conflict with reserved subdomains
  3. Review admin email for DNS setup instructions
  4. Manually verify subdomain resolves correctly
Reserved subdomains: app, auth, docs, api, saml, www, admin, status Source: .env.example:65

Best Practices

  1. Use meaningful slugs: Choose organization slugs that are professional and represent your brand
  2. Verify domains early: Complete domain verification before inviting members
  3. Plan seat allocation: Calculate required seats including future growth
  4. Test subdomains: Verify all subdomains work before going live
  5. Configure SSO first: Set up SAML/SSO before onboarding users for seamless authentication

Build docs developers (and LLMs) love