Overview
The platform supports two video meeting providers:| Provider | Auth method | Use case |
|---|---|---|
| Zoom | OAuth 2.0 (tutor connects their account) | Primary video solution |
| Daily.co | API key | Alternative / fallback |
Zoom
Configuration
OAuth flow
Files:app/Http/Controllers/Integrations/ZoomIntegrationController.php
- Tutor initiates connection from frontend
- Redirected to Zoom OAuth consent screen
- Zoom redirects back to
ZOOM_REDIRECT_URIwith auth code - Backend exchanges code for access/refresh tokens
- Tokens stored in
oauth_service_tokenstable
Token validation
TheValidateZoomTokens scheduled job runs daily at 08:30 UTC (production only):
- Fetches all Zoom OAuth tokens
- Validates each by calling the Zoom API
- If invalid: sends
ReconnectZoomemail to the tutor - Tracks reconnection attempts via
updateReconnectionAttempts() - If
hasReachedMaxReconnectionAttempts(): deletes the token
Meeting creation
When an online lesson is booked, a Zoom meeting is created via the tutor’s connected account. The meeting details are stored in themeetings table.
Checking connection
Daily.co
File:app/Models/Services/DailyMeetingService.php
Configuration
How it works
Daily.co is used via a simpler API-key-based integration (no OAuth flow per user).Creating a meeting
- Emoji reactions enabled
- Hand raising enabled
- Room name based on lesson ID
- Expiry dates based on lesson times
Generating join URLs
Other operations
Meeting model
File:app/Models/v1/Meeting.php
Meeting::createOrUpdateMeeting() — upsert logic that creates or updates meeting details. Used by both Zoom and Daily.co integrations.
Meeting details are included in LessonBooked confirmation emails with direct join links for both tutor and student.