Skip to main content
Teams in Cal.com allow multiple users to collaborate on scheduling, share event types, and manage bookings together. Teams support various scheduling modes including round robin, collective (group) meetings, and managed event types.

Overview

A team is a collection of members who can:
  • Share event types (team meetings)
  • Use round robin or collective scheduling
  • Collaborate on bookings and workflows
  • Have unified branding and settings
Teams are also the foundation for Organizations in Cal.com.
// From schema.prisma:569
model Team {
  id          Int       @id
  name        String    // Team display name
  slug        String?   // URL slug (e.g., acme-sales)
  members     Membership[]
  eventTypes  EventType[]
  isOrganization Boolean @default(false)  // Teams vs Organizations
  parentId    Int?      // For sub-teams within organizations
}
Organizations are special teams with isOrganization: true. They can contain sub-teams and have additional features.

Creating a Team

1

Navigate to Teams

Go to Settings → Teams from your dashboard
2

Create New Team

Click “Create Team” and enter team name and URL slug
3

Invite Members

Add team members by email address
4

Set Roles

Assign roles: Owner, Admin, or Member
5

Create Team Event Types

Add event types that belong to the team

Team Membership

// From schema.prisma:760
model Membership {
  id       Int            @id
  teamId   Int
  userId   Int
  accepted Boolean        @default(false)
  role     MembershipRole
}

enum MembershipRole {
  MEMBER  // Can view team settings and bookings
  ADMIN   // Can manage team settings and members
  OWNER   // Full control over team
}

Member

View team bookings and participate in team events

Admin

Manage team settings, event types, and workflows

Owner

Full control including billing and deletion

Inviting Team Members

1

Go to Team Settings

Navigate to your team’s settings page
2

Click 'Invite Member'

Enter the email address of the person to invite
3

Set Role

Choose Member, Admin, or Owner
4

Send Invitation

Member receives email invitation and must accept
// Membership starts as not accepted
{
  accepted: false,  // True after invitation is accepted
  role: "MEMBER"
}

Team Event Types

Team event types belong to the team rather than an individual:
// From EventType schema.prisma:180-181
eventType: {
  teamId: 1,        // Owned by team
  userId: null,     // Not owned by individual
  team: Team
}

Scheduling Types

Distributes bookings among team members based on availability and weights.
// From EventType schema.prisma:231
eventType: {
  schedulingType: "ROUND_ROBIN",
  isRRWeightsEnabled: true,
  hosts: [
    { userId: 1, weight: 100, priority: 1 },
    { userId: 2, weight: 50, priority: 2 }  // Gets 50% as many bookings
  ]
}
Features:
  • Weight-based distribution
  • Priority ordering
  • Host-specific schedules and locations
  • No-show tracking integration

Round Robin Configuration

Host Settings

// From Host schema.prisma:61
model Host {
  userId     Int
  eventTypeId Int
  isFixed    Boolean  @default(false)  // Must be in every booking
  priority   Int?     // Lower number = higher priority
  weight     Int?     // Distribution weight (100 = standard)
  scheduleId Int?     // Host-specific schedule
}
Hosts with isFixed: true must be available for a slot to be shown. Non-fixed hosts are optional and assigned based on weight and priority.

Weights and Priority

// Example round robin configuration
hosts: [
  {
    userId: 1,
    priority: 1,      // Checked first
    weight: 100,      // Standard distribution
    isFixed: false
  },
  {
    userId: 2,
    priority: 2,      // Checked second
    weight: 150,      // Gets 50% more bookings
    isFixed: false
  },
  {
    userId: 3,
    priority: 1,      // Same priority as user 1
    weight: 50,       // Gets 50% fewer bookings
    isFixed: true     // Must be in every booking
  }
]

Round Robin Features

// From EventType schema.prisma:257-267
eventType: {
  assignAllTeamMembers: true,              // Auto-assign all team members as hosts
  assignRRMembersUsingSegment: true,       // Filter hosts by attributes
  rrSegmentQueryValue: {/* filter rules */},
  isRRWeightsEnabled: true,                // Enable weight-based distribution
  includeNoShowInRRCalculation: true,      // Adjust for no-shows
  rescheduleWithSameRoundRobinHost: true,  // Keep same host on reschedule
  rrHostSubsetEnabled: true                // Allow subset of hosts
}

Host Groups

Group hosts together for more complex routing:
// From HostGroup schema.prisma:87
model HostGroup {
  id          String @id
  name        String
  hosts       Host[]
  eventTypeId Int
}

// Example: Create pools of hosts
eventType: {
  hostGroups: [
    { name: "Senior Consultants", hosts: [user1, user2] },
    { name: "Junior Consultants", hosts: [user3, user4] }
  ]
}

Per-Host Locations

Each host can have different meeting locations:
// From EventType schema.prisma:292
eventType: {
  enablePerHostLocations: true
}

// From HostLocation schema.prisma:100
model HostLocation {
  userId       Int
  eventTypeId  Int
  type         String      // "zoom", "phone", "inPerson"
  link         String?     // For custom links
  address      String?     // For in-person
  phoneNumber  String?     // For phone calls
  credentialId Int?        // For app integrations
}
Per-host locations require enablePerHostLocations: true on the event type. Each host’s location is used when they’re assigned to a booking.

Team Workflows

Workflows can be activated at the team level:
// From Team schema.prisma:627
team: {
  activeOrgWorkflows: WorkflowsOnTeams[]
}

// Workflows apply to all team event types
model WorkflowsOnTeams {
  workflowId Int
  teamId     Int
  workflow   Workflow
  team       Team
}
See Workflows for automation details.

Team Settings

Branding

// From Team schema.prisma:577-580
team: {
  logoUrl: "https://example.com/logo.png",
  brandColor: "#0066FF",
  darkBrandColor: "#0052CC",
  bannerUrl: "https://example.com/banner.jpg"
}

Scheduling Defaults

// From Team schema.prisma:606-608
team: {
  timeFormat: 12,           // 12 or 24 hour
  timeZone: "America/New_York",
  weekStart: "Monday"       // Default week start day
}

Booking Limits

// From Team schema.prisma:642-643
team: {
  bookingLimits: {
    day: 10,   // Max bookings per day for team
    week: 50
  },
  includeManagedEventsInLimits: true  // Count managed events in limits
}

Organizations

Organizations are teams with additional capabilities:
// From Team schema.prisma:613
team: {
  isOrganization: true,
  parentId: null,           // Organizations have no parent
  children: Team[],         // Sub-teams
  organizationSettings: OrganizationSettings
}

Sub-Teams

// Sub-teams belong to an organization
subTeam: {
  parentId: 1,  // Parent organization ID
  parent: Team  // Reference to organization
}
Sub-teams inherit certain settings from their parent organization but can have their own event types and members.

Organization Settings

// From OrganizationSettings schema.prisma:720
model OrganizationSettings {
  organizationId: 1,
  isOrganizationConfigured: true,
  isOrganizationVerified: true,
  orgAutoAcceptEmail: "@company.com",  // Auto-accept emails from domain
  lockEventTypeCreationForUsers: false,
  adminGetsNoSlotsNotification: true,
  isAdminAPIEnabled: true
}

Team API Keys

Teams can have their own API keys:
// From Team schema.prisma:610
team: {
  apiKeys: ApiKey[]
}

// Team API keys access team resources

Best Practices

Use Round Robin for Fair Distribution

Distribute bookings evenly across team members with weights and priorities

Set Host-Specific Schedules

Each team member can have different availability for team events

Enable Per-Host Locations

Let each host use their preferred meeting platform

Use Managed Events for Templates

Create consistent event types across the organization

Common Team Workflows

Sales Team Round Robin

{
  title: "Sales Call",
  teamId: 1,
  schedulingType: "ROUND_ROBIN",
  isRRWeightsEnabled: true,
  hosts: [
    { userId: 1, weight: 100, priority: 1 },  // Senior rep
    { userId: 2, weight: 100, priority: 1 },  // Senior rep
    { userId: 3, weight: 50, priority: 2 }    // Junior rep, fewer bookings
  ],
  rescheduleWithSameRoundRobinHost: true,
  includeNoShowInRRCalculation: true
}

Interview Panel (Collective)

{
  title: "Final Interview",
  teamId: 2,
  schedulingType: "COLLECTIVE",
  length: 60,
  hosts: [
    { userId: 5, isFixed: true },  // Hiring manager (required)
    { userId: 6, isFixed: true },  // Team lead (required)
    { userId: 7, isFixed: true }   // Engineer (required)
  ],
  requiresConfirmation: true,
  minimumBookingNotice: 2880  // 48 hours
}

Organization-Wide Template

{
  title: "1-on-1 Meeting",
  teamId: 1,  // Organization ID
  schedulingType: "MANAGED",
  length: 30,
  // Creates individual event types for each member
  assignAllTeamMembers: true
}

Build docs developers (and LLMs) love