@company-manager/docs

Booking Flow

Event booking, confirmation, and check-in process diagrams

Event Booking Flow

This page covers the complete event booking process from discovery to check-in.

Booking Sequence

sequenceDiagram
    participant User
    participant UI as Booking UI
    participant API as TRPC Router
    participant Service as Booking Service
    participant DB as Database
    participant Payment as Payment Service
    participant Email as Email Service

    User->>UI: Browse events
    UI->>API: listEvents(filters)
    API->>Service: getAvailableEvents(ctx, filters)
    Service->>DB: Query events with availability
    DB-->>Service: Events list
    Service-->>API: Events
    API-->>UI: Display events

    User->>UI: Select event & time
    UI->>API: checkAvailability(eventId, occurrenceId)
    API->>Service: checkSpots(eventId, occurrenceId)
    Service->>DB: Get current bookings
    DB-->>Service: Booking count
    Service-->>API: Available spots
    API-->>UI: Show availability

    User->>UI: Book event
    UI->>API: createBooking(eventId, occurrenceId, data)
    API->>Service: createBooking(ctx, input)

    Service->>DB: Get event details
    DB-->>Service: Event (price, approval required)

    alt Requires payment
        Service->>Payment: createPaymentIntent(amount)
        Payment-->>Service: Payment intent
        Service-->>API: {booking, paymentIntent}
        API-->>UI: Show payment form

        User->>UI: Complete payment
        UI->>Payment: Confirm payment
        Payment-->>UI: Payment success

        UI->>API: confirmBooking(bookingId, paymentId)
        API->>Service: confirmBooking(bookingId)
    else Free event
        Service->>DB: Create booking (PENDING)
    end

    alt Requires approval
        Service->>DB: Update booking (AWAITING_APPROVAL)
        Service->>Email: notifyAdminForApproval(booking)
    else Auto-confirm
        Service->>DB: Update booking (CONFIRMED)
        Service->>DB: Decrement available spots
    end

    Service->>Email: sendBookingConfirmation(booking)
    Email->>User: Confirmation email

    Service-->>API: Booking result
    API-->>UI: Show confirmation

Waitlist Flow

flowchart TD
    FULL[Event Full] --> JOIN[Join Waitlist]
    JOIN --> POSITION[Assign Position]
    POSITION --> NOTIFY[Confirm Waitlist Position]

    subgraph "When Spot Opens"
        CANCEL[Booking Cancelled] --> CHECK[Check Waitlist]
        CHECK --> FIRST[Get First in Line]
        FIRST --> OFFER[Offer Spot]

        OFFER --> RESPONSE{Response in 24h?}
        RESPONSE -->|Accept| BOOK[Create Booking]
        RESPONSE -->|Decline| NEXT[Move to Next]
        RESPONSE -->|No Response| NEXT

        NEXT --> CHECK
    end

    BOOK --> CONFIRM[Confirm Booking]
    CONFIRM --> REMOVE[Remove from Waitlist]

    style CONFIRM fill:#e8f5e9

Waitlist Sequence

sequenceDiagram
    participant User as Waitlisted User
    participant System as Booking System
    participant DB as Database
    participant Email as Email Service
    participant User2 as Original Booker

    User2->>System: Cancel booking
    System->>DB: Update booking (CANCELLED)
    System->>DB: Increment available spots

    System->>DB: Check waitlist for event
    DB-->>System: Waitlist entries

    alt Waitlist has entries
        System->>DB: Get first waitlist entry
        DB-->>System: Waitlisted user

        System->>Email: Send spot available notification
        Email->>User: "Spot available - claim now"

        System->>DB: Set claim deadline (24h)

        alt User claims spot
            User->>System: Claim spot
            System->>DB: Create booking
            System->>DB: Remove from waitlist
            System->>Email: Send confirmation
        else Deadline passes
            System->>System: Move to next in waitlist
        end
    end

Approval Workflow

flowchart TD
    BOOKING[Booking Created] --> CHECK{Requires Approval?}

    CHECK -->|No| AUTO[Auto-Confirm]
    CHECK -->|Yes| PENDING[Set Pending Approval]

    PENDING --> NOTIFY_ADMIN[Notify Admin]
    NOTIFY_ADMIN --> REVIEW[Admin Reviews]

    REVIEW --> DECISION{Decision}
    DECISION -->|Approve| APPROVE[Approve Booking]
    DECISION -->|Reject| REJECT[Reject Booking]
    DECISION -->|Request Info| REQUEST[Request Information]

    REQUEST --> USER_RESPOND[User Responds]
    USER_RESPOND --> REVIEW

    APPROVE --> CONFIRM[Confirm Booking]
    REJECT --> REFUND{Payment Made?}
    REFUND -->|Yes| PROCESS_REFUND[Process Refund]
    REFUND -->|No| NOTIFY_REJECT[Notify User]

    PROCESS_REFUND --> NOTIFY_REJECT

    AUTO --> CONFIRM

    style CONFIRM fill:#e8f5e9
    style NOTIFY_REJECT fill:#ffebee

Check-In Process

flowchart TD
    EVENT_DAY[Event Day] --> ARRIVE[Attendee Arrives]

    ARRIVE --> METHOD{Check-In Method}
    METHOD --> SCAN[QR Code Scan]
    METHOD --> MANUAL[Manual Search]
    METHOD --> SELF[Self Check-In Kiosk]

    SCAN --> VALIDATE[Validate Booking]
    MANUAL --> SEARCH[Search by Name/Email]
    SEARCH --> SELECT[Select Booking]
    SELECT --> VALIDATE
    SELF --> CODE[Enter Code]
    CODE --> VALIDATE

    VALIDATE --> VALID{Valid Booking?}
    VALID -->|Yes| CHECKIN[Mark Checked In]
    VALID -->|No| ERROR[Show Error]

    CHECKIN --> UPDATE[Update Attendance]
    UPDATE --> CONFIRM_CHECKIN[Confirm Check-In]

    ERROR --> OPTIONS{Options}
    OPTIONS --> WALKIN[Walk-In Registration]
    OPTIONS --> CONTACT[Contact Organizer]

    style CHECKIN fill:#e8f5e9

Check-In Sequence

sequenceDiagram
    participant Staff
    participant App as Check-In App
    participant API as TRPC Router
    participant Service as Booking Service
    participant DB as Database

    Staff->>App: Scan QR code
    App->>API: validateCheckin(bookingCode)
    API->>Service: validateAndCheckin(code)

    Service->>DB: Find booking by code
    DB-->>Service: Booking data

    Service->>Service: Validate booking
    Note over Service: Check: status, event date, not already checked in

    alt Valid
        Service->>DB: Update booking (checkedIn = true)
        Service->>DB: Set checkedInAt timestamp
        Service-->>API: {success: true, attendee: data}
        API-->>App: Show success
    else Invalid
        Service-->>API: {success: false, reason: "..."}
        API-->>App: Show error
    end

    App-->>Staff: Display result

Cancellation Policy

flowchart TD
    CANCEL_REQUEST[Cancellation Request] --> POLICY[Check Cancellation Policy]

    POLICY --> WINDOW{Within Window?}

    WINDOW -->|Full Refund| FULL[Process Full Refund]
    WINDOW -->|Partial Refund| PARTIAL[Process Partial Refund]
    WINDOW -->|No Refund| NONE[No Refund]

    FULL --> PROCESS[Process Cancellation]
    PARTIAL --> PROCESS
    NONE --> CONFIRM{Confirm Cancel?}

    CONFIRM -->|Yes| PROCESS
    CONFIRM -->|No| KEEP[Keep Booking]

    PROCESS --> RELEASE[Release Spot]
    RELEASE --> WAITLIST[Check Waitlist]
    PROCESS --> NOTIFY[Notify User]

    subgraph "Policy Example"
        P1["> 48h: Full refund"]
        P2["24-48h: 50% refund"]
        P3["< 24h: No refund"]
    end

    style FULL fill:#e8f5e9
    style NONE fill:#ffebee

Booking Confirmation Email

flowchart TD
    CONFIRM[Booking Confirmed] --> GENERATE[Generate Confirmation]

    GENERATE --> CONTENT[Email Content]
    CONTENT --> DETAILS[Event Details]
    CONTENT --> QR[QR Code for Check-In]
    CONTENT --> CALENDAR[Calendar File (.ics)]
    CONTENT --> DIRECTIONS[Location/Directions]

    DETAILS --> SEND[Send Email]
    QR --> SEND
    CALENDAR --> SEND
    DIRECTIONS --> SEND

    SEND --> REMINDERS[Schedule Reminders]
    REMINDERS --> R1[24h Before]
    REMINDERS --> R2[1h Before]