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

# Event Management

> Create, manage, and promote events with comprehensive configuration options

Create and manage events of all types - live, online, and webinar - with full control over details, speakers, sponsors, and scheduling.

## Capabilities

| Action          | ROLE\_CLIENT\_ADMIN | ROLE\_CLIENT\_USER |
| --------------- | ------------------- | ------------------ |
| View events     | ✅                   | ✅                  |
| Create events   | ✅                   | ❌                  |
| Edit events     | ✅                   | ❌                  |
| Delete events   | ✅                   | ❌                  |
| Clone events    | ✅                   | ❌                  |
| Manage speakers | ✅                   | ❌                  |

## Features

### Event Types

<CardGroup cols={3}>
  <Card title="Live Events" icon="users">
    In-person events at physical venues
  </Card>

  <Card title="Online Events" icon="video">
    Virtual events via video conferencing
  </Card>

  <Card title="Webinars" icon="presentation">
    Broadcast-style online presentations
  </Card>
</CardGroup>

#### Acceptance Criteria

##### Frontend

* [ ] Event list with status and date filters
* [ ] Clone event functionality
* [ ] Preview event as member would see it
* [ ] Rich text editor for descriptions
* [ ] Image upload with cropping
* [ ] Date/time picker with timezone
* [ ] Drag-and-drop schedule builder
* [ ] Speaker management interface

##### Backend / API

* [ ] Backend behavior supports this feature as documented.

##### Permissions

* [ ] Access is restricted per the Capabilities matrix on this page (or equivalent role rules).

##### Business Rules

* [ ] Event title is required
* [ ] Start date must be in the future (for new events)
* [ ] Live events require location details
* [ ] Online events require meeting link (manual URL or auto-generated via Zoom integration)
* [ ] Published events visible based on visibility setting
* [ ] Cancelled events hidden from public, registrations notified
* [ ] End date must be after start date

##### Error Handling

* [ ] Error states return clear messages and appropriate HTTP status codes.

### Create Event

<Steps>
  <Step title="Basic Details">
    * Event title and description
    * Event type (live, online, webinar)
    * Featured image upload
    * CPD points allocation
  </Step>

  <Step title="Date & Time">
    * Start date and time
    * End date and time
    * Timezone selection
    * Multi-day event configuration
  </Step>

  <Step title="Location">
    **For live events:**

    * Venue name and address
    * City, state, country
    * Map integration

    **For online events:**

    * Meeting provider (Zoom recommended)
    * Meeting link (auto-generated via Zoom integration, or manual URL)
    * Access instructions (passwords, dial-in, etc.)
  </Step>

  <Step title="Visibility">
    * Public (visible to all)
    * Member-only (requires login)
    * Draft (not visible)
  </Step>

  <Step title="Schedule (Optional)">
    Add multiple sessions with:

    * Session name and description
    * Start/end times
    * Assigned speakers
    * Room/location
  </Step>
</Steps>

#### Acceptance Criteria

##### Frontend

* [ ] Create event wizard with multi-step form

##### Backend / API

* [ ] Backend behavior supports this feature as documented.

##### Permissions

* [ ] Access is restricted per the Capabilities matrix on this page (or equivalent role rules).

##### Business Rules

* [ ] All business rules for this feature are enforced.

##### Error Handling

* [ ] Error states return clear messages and appropriate HTTP status codes.

#### UI Spec (from supplied spreadsheet)

The following field inventory is sourced from `workspace/sources/entity-registry.csv` ("Events").

> This is a UI/requirements inventory (not the ERD). Some rows (e.g. datatables) describe UI elements rather than stored fields.

##### Core event fields

| Field                   | Input Type         | Required     | Notes                                            |
| ----------------------- | ------------------ | ------------ | ------------------------------------------------ |
| Event ID                | Number             | Required     | System generated, locked                         |
| Event Name              | Text               | Required     | model: `name`                                    |
| Event Short Description | Text               | Required     | Used for tile                                    |
| Event Description       | WYSIWYG (Textarea) | Required     | model: `description`                             |
| Event Location          | Text               | Required     | Google Maps selection; model: `location`         |
| Event Start Date / Time | Date + Text        | Required     | model: `eventStart`                              |
| Event End Date / Time   | Date + Text        | Required     | model: `eventEnd`                                |
| Event Topic             | Select             | Required     | From event settings                              |
| Event Category          | Select             | Required     | model: `eventCategories`                         |
| Event Series            | Select             | Required     | model: `eventSeries`                             |
| Event Branches          | Select             | Required     | model: `eventBranches`                           |
| CPD Category            | Selector           | Required     | model: `cpdCategories`                           |
| Event Type              | Select             | Required     | model: `eventType`                               |
| Is Online               | -                  | -            | model: `isOnline`                                |
| Zoom Link               | Checkbox           | Not Required | model: `zoomLink`                                |
| Event Featured Image    | File               | Not Required | model: `featuredImage`                           |
| Schedule for later      | Yes / No           | -            | model: `scheduleForLater`                        |
| Publish Date / Time     | Date + Time        | -            | model: `publishDateTime`                         |
| Free Event              | True / False       | Required     | model: `isFreeEvent`                             |
| List of Participants    | Datatable          | -            | Columns: Full name, Email, Ticket Type Purchased |

##### Speakers & sponsors

| Field                   | Input Type         | Required     | Notes                                  |
| ----------------------- | ------------------ | ------------ | -------------------------------------- |
| Speaker Name            | Text               | Required     | model: `speakerName`                   |
| Speaker Bio             | Text               | Required     | model: `speakerBio`                    |
| Speaker Website URL     | URL                | Required     | model: `speakerWebsite`                |
| Speaker Image           | File               | Required     | model: `speakerImageName`              |
| Is Main Speaker         | True / False       | Required     | model: `isMainSpeaker`                 |
| Request Sponsors        | True / False       | Required     | Adds sponsorship request workflow      |
| Sponsorship Type        | Text               | Required     | Repeater when request sponsors enabled |
| Sponsorship Cost        | Number             | Required     | -                                      |
| Sponsorship Description | WYSIWYG (Textarea) | Required     | -                                      |
| Sponsor Name            | Text               | Not Required | model: `sponsorName`                   |
| Sponsor URL             | URL                | Not Required | model: `sponsorUrl`                    |
| Sponsor Logo            | File               | Not Required | model: `sponsorLogoName`               |

#### Data Model Cross‑Reference (Entities)

* Event record: [`Event`](/entities/core/event)
* Ticketing + registration/check-in state: [`Event Ticket`](/entities/core/event-ticket)
* Sponsorships: [`Sponsorship`](/entities/core/sponsorship)
* CPD: [`CPD Record`](/entities/core/cpd-record) and [`CPD Category`](/entities/core/cpd-category)

### Online Events: Zoom Integration (auto meeting link)

For Zoom-hosted online events, the platform can create the Zoom meeting/webinar automatically and store the meeting link on the event.

Expected behavior:

* When the event is saved/published with **Zoom enabled**, the backend creates (or updates) the Zoom meeting
* The generated join URL is stored as the event’s meeting link
* The meeting link is shown to registered members (and optionally sent in confirmation emails)

#### Acceptance Criteria

##### Frontend

* [ ] Event form supports selecting Zoom as the meeting provider.
* [ ] Meeting link field is read-only when Zoom auto-generation is enabled.

##### Backend / API

* [ ] Zoom meetings/webinars are created/updated automatically based on event start/end time.

##### Permissions

* [ ] Only `ROLE_CLIENT_ADMIN` can connect/configure Zoom and enable auto meeting creation.

##### Business Rules

* [ ] Zoom join links are only visible to users who are allowed to access the event.

##### Error Handling

* [ ] If Zoom meeting creation fails, the UI shows an actionable error and allows retry.

### CRM tags (pre/post)

When CRM sync is enabled, events apply predefined tags:

* `event.registered.pre` when a member registers
* `event.attended.post` when a member attends (check-in or Zoom import)
* `event.no_show.post` when a member is marked as a no-show

See: [`CRM Tag`](/entities/integration/crm-tag)

### Clone Event

Save time by duplicating existing events:

1. Select event to clone
2. All details copied to new draft
3. Modify as needed (dates, speakers, etc.)
4. Publish when ready

#### Acceptance Criteria

##### Frontend

* [ ] Clone Event workflow is implemented in the UI as described.

##### Backend / API

* [ ] Backend behavior supports Clone Event as documented.

##### Permissions

* [ ] Access is restricted per the Capabilities matrix on this page (or equivalent role rules).

##### Business Rules

* [ ] All business rules for this feature are enforced.

##### Error Handling

* [ ] Error states return clear messages and appropriate HTTP status codes.

### Speaker Management

<Tabs>
  <Tab title="Add Speaker">
    * Name and bio
    * Photo upload
    * Contact details
    * Social links
    * Designate as main speaker
  </Tab>

  <Tab title="Speaker Library">
    * Reuse speakers across events
    * Update speaker info centrally
    * View speaker's event history
  </Tab>
</Tabs>

#### Acceptance Criteria

##### Frontend

* [ ] Speaker Management workflow is implemented in the UI as described.

##### Backend / API

* [ ] Backend behavior supports Speaker Management as documented.

##### Permissions

* [ ] Access is restricted per the Capabilities matrix on this page (or equivalent role rules).

##### Business Rules

* [ ] All business rules for this feature are enforced.

##### Error Handling

* [ ] Error states return clear messages and appropriate HTTP status codes.

### Sponsorship Assignment

This enables the association/client to attach one or more sponsors to an event, including sponsor logos and sponsor CTA links.

* Add sponsors to event
* Set sponsorship tier per sponsor
* Display sponsor logos on event page
* Track sponsor visibility metrics

#### Acceptance Criteria

##### Frontend

* [ ] Sponsorship Assignment workflow is implemented in the UI as described.

##### Backend / API

* [ ] Backend behavior supports Sponsorship Assignment as documented.

##### Permissions

* [ ] Access is restricted per the Capabilities matrix on this page (or equivalent role rules).

##### Business Rules

* [ ] All business rules for this feature are enforced.

##### Error Handling

* [ ] Error states return clear messages and appropriate HTTP status codes.

## Implementation Contracts

### Backend (API)

```
GET    /api/events                           # List events
POST   /api/events                           # Create event
GET    /api/events/{id}                      # Get event details
PUT    /api/events/{id}                      # Update event
DELETE /api/events/{id}                      # Delete event

POST   /api/events/{id}/clone                # Clone event
PUT    /api/events/{id}/publish              # Publish draft
PUT    /api/events/{id}/cancel               # Cancel event

GET    /api/events/{id}/sessions             # Get sessions
POST   /api/events/{id}/sessions             # Add session
PUT    /api/events/{id}/sessions/{sessionId} # Update session

GET    /api/speakers                         # Speaker library
POST   /api/speakers                         # Create speaker
PUT    /api/speakers/{id}                    # Update speaker
```

### Data Model

```typescript theme={null}
interface Event {
  id: string;
  title: string;
  description: string;
  featuredImage?: string;
  cpdPoints: number;
  
  // Type & Visibility
  eventType: 'live' | 'online' | 'webinar';
  visibility: 'public' | 'member_only';
  status: 'draft' | 'published' | 'completed' | 'cancelled';
  
  // Date/Time
  startDateTime: string;
  endDateTime: string;
  timezone: string;
  
  // Location (live events)
  venueName?: string;
  venueAddress?: string;
  city?: string;
  state?: string;
  country?: string;
  
  // Online (virtual events)
  meetingLink?: string;
  accessInstructions?: string;
  
  // Relationships
  speakers: Speaker[];
  sessions: Session[];
  sponsors: EventSponsor[];
  
  // CRM
  crmTag?: string;
  
  createdAt: string;
  updatedAt: string;
}
```

### Error Handling

| Error            | HTTP Status | Message                                  |
| ---------------- | ----------- | ---------------------------------------- |
| Past start date  | 400         | "Event start date must be in the future" |
| Invalid dates    | 400         | "End date must be after start date"      |
| Missing location | 400         | "Live events require venue details"      |
| Missing link     | 400         | "Online events require meeting link"     |

## AI-Powered Webinar Processing

For webinars with recordings, the system automatically processes the video/recording to generate chapters and transcription.

### Recording Extraction

When a webinar ends, the system:

<Steps>
  <Step title="Retrieve Recording">
    Automatically fetch the recording from the webinar provider (e.g., Zoom)
  </Step>

  <Step title="Process Video">
    Extract audio and video streams for AI processing
  </Step>

  <Step title="Generate Transcription">
    AI-powered speech-to-text converts the recording to a searchable transcript
  </Step>

  <Step title="Create Chapters">
    AI analyzes the content to create meaningful chapter markers with timestamps
  </Step>
</Steps>

### AI-Generated Chapters

The system analyzes webinar content and automatically creates chapters:

* **Topic Detection**: Identifies major topic shifts and key discussion points
* **Timestamp Markers**: Precise timestamps for each chapter
* **Chapter Titles**: AI-generated descriptive titles for each section
* **Summary Text**: Brief description of what each chapter covers

### Transcription Features

<Tabs>
  <Tab title="Full Transcript">
    * Complete word-for-word transcription
    * Speaker identification (when available)
    * Timestamp markers throughout
    * Searchable text content
  </Tab>

  <Tab title="Member Experience">
    * Members can search within the transcript
    * Click-to-jump to specific timestamps
    * Download transcript as PDF or text
    * Highlights and key takeaways
  </Tab>
</Tabs>

#### Acceptance Criteria

##### Frontend

* [ ] Recording processing status indicator on event detail page
* [ ] Chapter navigation sidebar in video player
* [ ] Searchable transcript panel alongside video
* [ ] Click-to-jump functionality from transcript to video timestamp
* [ ] Download options for transcript (PDF, TXT)
* [ ] Edit interface for admin to modify AI-generated chapters and transcript

##### Backend / API

* [ ] Automatic recording retrieval from Zoom after webinar ends
* [ ] AI transcription service integration
* [ ] AI chapter generation service integration
* [ ] Storage of processed transcripts and chapters

##### Permissions

* [ ] Only `ROLE_CLIENT_ADMIN` can edit AI-generated chapters and transcripts
* [ ] Members can only view/download if they have access to the event

##### Business Rules

* [ ] Processing begins automatically when recording is available
* [ ] Admin notified when processing is complete
* [ ] Failed processing attempts are retried up to 3 times
* [ ] Transcript and chapters can be manually edited by admin
* [ ] Original recording preserved alongside processed content

##### Error Handling

* [ ] If recording retrieval fails, admin is notified to manually upload
* [ ] If transcription fails, event displays recording without transcript
* [ ] Processing errors logged with detailed diagnostics

### Implementation Contracts (Webinar AI)

```
POST   /api/events/{id}/process-recording    # Trigger recording processing
GET    /api/events/{id}/transcript           # Get transcript
PUT    /api/events/{id}/transcript           # Update transcript
GET    /api/events/{id}/chapters             # Get chapters
PUT    /api/events/{id}/chapters             # Update chapters
GET    /api/events/{id}/processing-status    # Check processing status
```

**Chapter Data Model:**

```typescript theme={null}
interface WebinarChapter {
  id: string;
  eventId: string;
  title: string;
  description: string;
  startTimestamp: number;  // seconds
  endTimestamp: number;    // seconds
  order: number;
  aiGenerated: boolean;
  createdAt: string;
  updatedAt: string;
}
```
