Overview
A calendar and meeting invite service lets users create events, invite attendees, track RSVPs, and synchronize with external calendar clients. The core design challenges are recurring event expansion, timezone-aware storage, conflict detection, and bidirectional sync via CalDAV.
Event Schema
The central entity is the Event. Key fields:
- id — UUID primary key
- organizer_id — foreign key to users
- title — short display name
- description — optional long-form text
- location — free text or structured address
- start_utc / end_utc — datetimes stored in UTC
- original_timezone — IANA timezone string (e.g. America/New_York) for display
- recurrence_rule — RFC 5545 RRULE string (e.g. FREQ=WEEKLY;BYDAY=MO,WE,FR)
- recurrence_exceptions — array of UTC dates excluded from expansion
- status — ENUM('active','cancelled')
- created_at / updated_at — audit timestamps
A separate EventAttendee table links events to users: event_id, user_id, invite_status, responded_at.
Invite Attendee State Machine
Each attendee entry moves through a simple state machine:
- pending — invite sent, no response yet
- accepted — attendee confirmed
- declined — attendee rejected
- tentative — attendee is unsure
Transitions: pending → accepted, pending → declined, pending → tentative. Accepted and tentative can transition back to declined, and declined can be re-accepted. Every state change triggers a notification to the organizer and optionally to other attendees.
Recurring Event Expansion
Rather than storing every occurrence, recurring events store a single master record with an RRULE. Expansion is computed on read:
- Parse the RRULE using a library (e.g. python-dateutil or rrule.js)
- Generate occurrences within the requested date window
- Filter out any dates listed in recurrence_exceptions
- Apply the original_timezone for display, keeping all internal computation in UTC
When an attendee modifies a single occurrence (e.g. reschedules one Monday), store an EventOverride record with the master event_id, the original occurrence date, and the new start/end. This is the standard iCalendar RECURRENCE-ID pattern.
Conflict Detection
Before confirming an invite or creating an event, check the attendee calendar for overlapping events. Two events conflict when:
new.start_utc < existing.end_utc AND new.end_utc > existing.start_utc
Run this query against accepted and tentative events for the user. Return conflicts as warnings (soft block) rather than hard errors so users can override. For recurring events, expand the relevant window before checking.
Timezone-Aware Storage
Always store datetimes in UTC. Store the original_timezone separately so the UI can render events correctly in the creator’s and each attendee’s local time. When exporting to ICS, emit DTSTART with a TZID parameter to preserve intent. Never store local time as a naive datetime — this causes bugs around DST transitions.
ICS Export and CalDAV Sync
ICS export produces a static .ics file for one-time import into Apple Calendar, Outlook, or Google Calendar. Include VEVENT components with UID, DTSTART, DTEND, RRULE, SUMMARY, DESCRIPTION, ORGANIZER, and ATTENDEE fields. The UID maps to the event id.
CalDAV enables bidirectional sync. Expose a CalDAV endpoint per user calendar. Clients (e.g. Apple Calendar) issue REPORT requests to fetch changed events and PUT requests to push local changes. Use ETags and a sync-token (CTag) to minimize data transfer. Conflict resolution uses last-write-wins on updated_at, with a merge UI fallback for concurrent edits.
Notification Triggers
Emit notifications asynchronously via a message queue on these events:
- Invite sent — email to each attendee with accept/decline links
- RSVP change — notify organizer; optionally notify other attendees
- Event updated — notify all accepted/tentative attendees
- Event cancelled — notify all attendees regardless of status
- Reminder — configurable lead time (e.g. 15 min, 1 day) per attendee
Reminder scheduling: store a reminders table with event_id, user_id, remind_at (UTC). A worker polls for due reminders and dispatches push/email notifications, then deletes the row.
FAQ: Calendar and Meeting Invite Service
What is a calendar and meeting invite service in system design?
A calendar and meeting invite service manages event creation, scheduling, attendee invitations, conflict detection, and reminders across users and organizations. Core components include an event store, attendee availability service, notification pipeline, recurrence engine, and external calendar integration layer. The system must handle timezone conversions, RSVP state machines, recurring event series, and real-time updates when participants accept or decline invitations.
How do recurring events work with RRULE?
RRULE (Recurrence Rule) is a standard defined in RFC 5545 (iCalendar) for specifying recurring event patterns. A rule like FREQ=WEEKLY;BYDAY=MO,WE;COUNT=10 defines a bi-weekly recurrence on Mondays and Wednesdays for ten occurrences. The server stores a single master event record with its RRULE rather than materializing every occurrence. Occurrences are generated on read by expanding the rule within a queried date range. Individual occurrence overrides (e.g., moving a single instance) are stored as exception records that shadow the computed occurrence.
How do you detect scheduling conflicts across attendees?
For each proposed event time window, the system queries the busy/free intervals for all invited attendees. Busy intervals are stored as indexed time ranges per user and can be fetched with a range scan. Conflict detection checks whether the proposed window overlaps any existing accepted event for any attendee. For large organizations, a free/busy aggregation service pre-computes availability in configurable time slots. The organizer is shown conflicting attendees and alternative time suggestions ranked by aggregate availability.
How does ICS/CalDAV enable external calendar integration?
ICS (iCalendar format, .ics files) is a plain-text standard for representing calendar events that any compliant client can import or subscribe to. A public subscription URL allows external clients to poll for updates. CalDAV is a protocol built on WebDAV that allows calendar clients to create, read, update, and delete events directly on the server over HTTP. Supporting CalDAV lets third-party apps like Apple Calendar or Thunderbird sync bidirectionally with the service. Together they provide interoperability with the broader calendar ecosystem without requiring a proprietary SDK.
See also: Atlassian Interview Guide
See also: Airbnb Interview Guide 2026: Search Systems, Trust and Safety, and Full-Stack Engineering