Collaborate with team members and create shared event types for group scheduling
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.
Teams are also the foundation for Organizations in Cal.com.
// From schema.prisma:569model 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.
// From schema.prisma:760model 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}
// From Host schema.prisma:61model 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.
// Example round robin configurationhosts: [ { 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 }]
// From EventType schema.prisma:257-267eventType: { 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}
// From EventType schema.prisma:292eventType: { enablePerHostLocations: true}// From HostLocation schema.prisma:100model 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.
// From Team schema.prisma:627team: { activeOrgWorkflows: WorkflowsOnTeams[]}// Workflows apply to all team event typesmodel WorkflowsOnTeams { workflowId Int teamId Int workflow Workflow team Team}
// From Team schema.prisma:642-643team: { bookingLimits: { day: 10, // Max bookings per day for team week: 50 }, includeManagedEventsInLimits: true // Count managed events in limits}
Organizations are teams with additional capabilities:
// From Team schema.prisma:613team: { isOrganization: true, parentId: null, // Organizations have no parent children: Team[], // Sub-teams organizationSettings: OrganizationSettings}