> ## Documentation Index
> Fetch the complete documentation index at: https://mintlify.com/calcom/cal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Organizations

> Manage multiple teams with Cal.com Organizations

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:

```bash theme={null}
CALCOM_LICENSE_KEY=your_license_key
```

To obtain a license key, [contact Cal.com sales](https://cal.com/sales).

### 2. Environment Variables

Configure the following environment variables:

```bash .env theme={null}
# 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:

```bash theme={null}
# 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):**

```bash .env theme={null}
# 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):**

```bash .env theme={null}
# 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., `acme` → `acme.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:

| Role       | Permissions                                                       |
| ---------- | ----------------------------------------------------------------- |
| **Owner**  | Full access to organization settings, billing, members, and teams |
| **Admin**  | Manage members and teams, configure organization settings         |
| **Member** | Access 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](/enterprise/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:

```typescript theme={null}
// 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:**

```bash theme={null}
# 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

## Related Documentation

* [SSO Configuration](/enterprise/sso)
* [SAML Setup](/enterprise/saml)
* [SCIM Provisioning](/enterprise/scim)
* [Billing & Licensing](/enterprise/billing)
