> ## 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.

# Bookings

> Manage scheduled meetings, handle cancellations, and track booking lifecycle

Bookings represent scheduled meetings created through your Cal.com event types. They contain all the information about the meeting, attendees, location, and status.

## Overview

A booking is created when someone successfully schedules time through your booking page. Each booking includes:

* **Attendees**: Guest information and contact details
* **Meeting details**: Time, duration, location, and description
* **Status**: Accepted, pending, cancelled, or rejected
* **References**: Calendar events, video conferencing links
* **Metadata**: Custom data and responses to booking questions

```typescript theme={null}
// Core booking structure from schema.prisma:870
model Booking {
  id           Int           @id @default(autoincrement())
  uid          String        @unique
  title        String
  description  String?
  startTime    DateTime
  endTime      DateTime
  status       BookingStatus @default(ACCEPTED)
  attendees    Attendee[]
  location     String?
  responses    Json?         // Booking form responses
  metadata     Json?         // Additional data
}
```

## Booking Status

```typescript theme={null}
// From schema.prisma:862
enum BookingStatus {
  CANCELLED     // Booking was cancelled
  ACCEPTED      // Booking is confirmed
  REJECTED      // Booking was declined
  PENDING       // Awaiting confirmation
  AWAITING_HOST // Host needs to respond
}
```

<Tabs>
  <Tab title="Accepted">
    Default status for instant bookings. Meeting is confirmed and calendar events are created.
  </Tab>

  <Tab title="Pending">
    Requires host confirmation. Slot may or may not be blocked depending on `requiresConfirmationWillBlockSlot` setting.
  </Tab>

  <Tab title="Awaiting Host">
    Special status when host action is required.
  </Tab>

  <Tab title="Rejected">
    Host declined the booking request. Attendees are notified.
  </Tab>

  <Tab title="Cancelled">
    Either host or attendee cancelled the meeting.
  </Tab>
</Tabs>

## Managing Bookings

### View Bookings

Access your bookings from the main dashboard:

<Steps>
  <Step title="Navigate to Bookings">
    Click "Bookings" in the sidebar to view all upcoming and past meetings
  </Step>

  <Step title="Filter by Status">
    Use filters to view specific booking types: upcoming, pending, cancelled, or past
  </Step>

  <Step title="View Details">
    Click any booking to see full details, attendee information, and actions
  </Step>
</Steps>

### Confirming Bookings

For event types with `requiresConfirmation: true`:

<CodeGroup>
  ```typescript Event Type Config theme={null}
  {
    requiresConfirmation: true,
    requiresConfirmationWillBlockSlot: true  // Prevent double-booking
  }
  ```

  ```typescript Confirmation Flow theme={null}
  // Booking starts as PENDING
  // Host reviews and either:
  // 1. Accepts → Status changes to ACCEPTED
  // 2. Rejects → Status changes to REJECTED
  ```
</CodeGroup>

### Cancelling Bookings

```typescript theme={null}
// From schema.prisma:899-901
{
  cancellationReason: "Schedule conflict",
  cancelledBy: "user@example.com",
  status: "CANCELLED"
}
```

<Note>
  Cancellation reasons can be required based on event type settings. See `requiresCancellationReason` in Event Types.
</Note>

### Rescheduling

```typescript theme={null}
// From schema.prisma:906-908
{
  rescheduled: true,
  fromReschedule: "original_booking_uid",
  rescheduledBy: "attendee@example.com"
}
```

Rescheduling creates a new booking and marks the original as cancelled. The original booking UID is stored in `fromReschedule`.

<Warning>
  For Round Robin events with `rescheduleWithSameRoundRobinHost: true`, the same host is automatically assigned to rescheduled bookings.
</Warning>

## Booking Properties

### Attendee Information

```typescript theme={null}
// From schema.prisma:845
model Attendee {
  id          Int     @id
  email       String
  name        String
  timeZone    String
  phoneNumber String?
  locale      String?  @default("en")
  noShow      Boolean? @default(false)
}
```

### Payment Status

```typescript theme={null}
// From schema.prisma:895-896
{
  paid: false,
  payment: [{
    amount: 5000,      // in cents
    currency: "usd",
    success: true,
    externalId: "pi_abc123"  // Stripe payment ID
  }]
}
```

### Recurring Bookings

```typescript theme={null}
// From schema.prisma:908
{
  recurringEventId: "rec_abc123",  // Links recurring instances
  // Multiple bookings share the same recurringEventId
}
```

### Seats (Group Bookings)

```typescript theme={null}
// From schema.prisma:912
seatsReferences: BookingSeat[]

// Each seat represents one attendee in a group booking
model BookingSeat {
  id         Int
  bookingId  Int
  attendeeId Int
  referenceUid String  // Unique per seat
}
```

## Booking References

Booking references link to external calendar events and video conferencing:

```typescript theme={null}
// From schema.prisma:818
model BookingReference {
  type          String  // "google_calendar", "zoom", etc.
  uid           String  // External event ID
  meetingId     String? // Video meeting ID
  meetingUrl    String? // Join URL
  meetingPassword String?
  credentialId  Int     // Which credential was used
}
```

<CardGroup cols={2}>
  <Card title="Calendar Sync" icon="calendar">
    Events are created in your connected calendars (Google, Outlook, etc.)
  </Card>

  <Card title="Video Conferencing" icon="video">
    Zoom, Google Meet, or MS Teams links are automatically generated
  </Card>
</CardGroup>

## Booking Metadata

```typescript theme={null}
// From schema.prisma:914
metadata: {
  // Video call settings
  videoCallUrl?: string;
  
  // App-specific data
  apps?: {
    stripe?: { paymentIntentId: string };
    salesforce?: { leadId: string };
  };
  
  // Custom tracking
  utm_source?: string;
  utm_campaign?: string;
}
```

## Workflow Integration

Bookings trigger workflow automations:

```typescript theme={null}
// From schema.prisma:910
workflowReminders: WorkflowReminder[]

// Scheduled reminders for this booking
model WorkflowReminder {
  id         Int
  bookingUid String
  method     String  // EMAIL, SMS, WHATSAPP
  scheduled  Boolean
  scheduledDate DateTime
}
```

See [Workflows](/features/workflows) for automation details.

## No-Show Tracking

```typescript theme={null}
// From schema.prisma:855, 921
{
  noShowHost: false,     // Host didn't attend
  attendees: [{
    noShow: false        // Attendee didn't attend
  }]
}
```

No-show data can be used in Round Robin weight calculations when `includeNoShowInRRCalculation: true`.

## Booking Limits

Event types can limit bookings per user:

```typescript theme={null}
// From EventType schema.prisma:271-272
{
  maxActiveBookingsPerBooker: 3,  // Max concurrent bookings
  maxActiveBookingPerBookerOfferReschedule: true  // Allow reschedule when limit reached
}
```

## Internal Notes

```typescript theme={null}
// From schema.prisma:931
internalNote: BookingInternalNote[]

// Private notes visible only to hosts
model BookingInternalNote {
  id        Int
  bookingId Int
  note      String
  createdBy Int  // User who created the note
}
```

<Note>
  Internal notes are never visible to attendees and can be used for team coordination.
</Note>

## Booking Creation Sources

```typescript theme={null}
// From schema.prisma:932
enum CreationSource {
  API_V1  // Created via v1 API
  API_V2  // Created via v2 API
  WEBAPP  // Created through web interface
}
```

## Common Workflows

### Confirming Pending Bookings

<Steps>
  <Step title="Navigate to Pending">
    Filter bookings by "Pending" status
  </Step>

  <Step title="Review Details">
    Check attendee information and booking form responses
  </Step>

  <Step title="Accept or Reject">
    Click "Accept" to confirm or "Reject" with a reason
  </Step>

  <Step title="Attendee Notification">
    Attendees automatically receive email confirmation or rejection notice
  </Step>
</Steps>

### Handling Cancellations

<Steps>
  <Step title="Open Booking">
    Click the booking from your list
  </Step>

  <Step title="Cancel Booking">
    Click "Cancel" and optionally provide a reason
  </Step>

  <Step title="Notifications Sent">
    All attendees receive cancellation emails automatically
  </Step>

  <Step title="Calendar Updated">
    Events are removed from all connected calendars
  </Step>
</Steps>

### Rescheduling a Meeting

<Steps>
  <Step title="Attendee Initiates">
    Attendee clicks reschedule link in confirmation email
  </Step>

  <Step title="Select New Time">
    Attendee picks a new time from available slots
  </Step>

  <Step title="New Booking Created">
    Original booking is cancelled, new booking is created with `fromReschedule` reference
  </Step>
</Steps>

## Best Practices

<CardGroup cols={2}>
  <Card title="Use Internal Notes" icon="note">
    Add context for team members about specific bookings
  </Card>

  <Card title="Track No-Shows" icon="user-xmark">
    Mark no-shows to improve Round Robin distribution
  </Card>

  <Card title="Require Cancellation Reasons" icon="message">
    Collect feedback to improve your booking process
  </Card>

  <Card title="Set Booking Limits" icon="gauge">
    Prevent over-booking with per-user limits
  </Card>
</CardGroup>

## Related Features

* [Event Types](/features/event-types) - Configure bookable meeting types
* [Workflows](/features/workflows) - Automate booking notifications
* [Calendars](/features/calendars) - Sync with external calendars
