Interview Scheduling System Low-Level Design
An interview scheduling system matches candidate time preferences against interviewer availability, handles calendar integration, prevents double-booking, and drives an automated reminder pipeline. This LLD covers the core data model and algorithms.
Slot Model
Interviewer availability is stored as discrete slots:
availability_slots:
id, interviewer_id, start_time (UTC), end_time (UTC),
timezone, status: AVAILABLE|BOOKED|BLOCKED,
candidate_id (nullable), interview_id (nullable)
Slots are generated in advance from recurring availability rules (e.g., every Tuesday/Thursday 10am-5pm in 30-min increments). Interviewers can also add or remove individual slots.
Candidate Preferences
When a candidate is invited to schedule, they submit a preference object: preferred date range, list of acceptable time windows per weekday, and their IANA timezone. The system stores these and uses them in the matching algorithm.
Matching Algorithm
- Convert candidate's preferred windows to UTC ranges for the date range.
- Query
availability_slotswhereinterviewer_id IN (panel_ids),status = AVAILABLE, andstart_timefalls within the UTC ranges. - For panel interviews: compute set intersection — only slots where all required interviewers are simultaneously available.
- Score each candidate slot by alignment with the candidate's stated preference (morning preference, specific days) and interviewer preference weight.
- Return top 3 scored options to the candidate for selection.
Calendar Integration
Each interviewer connects their calendar via OAuth2 (Google Calendar or Outlook). The system stores the access_token and refresh_token encrypted in the DB. On slot generation and conflict detection, the system calls the calendar API to read the interviewer's existing events. On booking, it writes the interview as a calendar event for all participants. Calendar webhooks or periodic polling keep the system aware of events added outside the tool.
Conflict Detection
When the candidate selects a slot, before confirming:
- Fetch all calendar events for each interviewer in the selected time window.
- Check for any overlap with the proposed interview time.
- If conflict detected, invalidate that slot and re-run matching to find an alternative.
Double-Booking Prevention
The slot is atomically claimed using a conditional SQL update:
UPDATE availability_slots
SET status = 'BOOKED', candidate_id = ?, interview_id = ?
WHERE id = ? AND status = 'AVAILABLE';
If the affected row count is 0, another candidate claimed the slot concurrently. The UI presents the next available option. This is a compare-and-swap without a separate lock, avoiding deadlocks.
Timezone Handling
All start_time and end_time values are stored in UTC. Display converts to the user's timezone using the IANA timezone database (e.g., America/New_York). The system never stores local times — only UTC plus an IANA timezone label for human display and recurring rule expansion.
Reminder Pipeline
A scheduler job runs every minute and checks upcoming interviews. Reminders are sent at T-24h, T-1h, and T-15min. Before sending each reminder, the system checks the interview's current status — if cancelled or rescheduled, the reminder is skipped. Reminder delivery uses an async queue (SQS/Kafka) feeding an email/SMS service to decouple scheduling from delivery.
Rescheduling Flow
- Candidate or interviewer requests reschedule via link in confirmation email.
- Current slot is released:
status → AVAILABLE,candidate_id → NULL. - Booked calendar event is deleted via calendar API.
- Matching algorithm re-runs with the same panel and candidate preferences.
- Candidate selects a new slot; booking and calendar write repeat.
Cancellation Handling
On cancellation: slot is released, all parties receive a cancellation email, the calendar event is deleted, and a reschedule prompt is sent to the recruiter. Cancellations within 1 hour of the interview are flagged for reporting (interviewer reliability metrics).
Interviewer Panel Coordination
For a panel interview with N interviewers, the available slots are computed as a set intersection of each interviewer's available slots for the given time window. This is implemented as a SQL query with N JOINs or as an in-memory intersection of slot ID sets, depending on panel size. Typically panels are 2-4 people, making the in-memory approach practical.
Feedback Reminder
After end_time passes, a scheduler job detects completed interviews and sends a feedback form link to each interviewer. Feedback submission deadline is 24 hours post-interview. Non-submission triggers a follow-up reminder at T+24h and escalates to the recruiter at T+48h.
See also: Atlassian Interview Guide