Video visits in MindFlow use Zoom as the underlying video platform, launched directly from the appointment record. Session lifecycle (join, leave, recording status) is tracked via the Zoom webhook. A recording-and-transcription pipeline is built in for clinics that need a session record.
includes/zoom.php handles JWT-based and Server-to-Server OAuth authentication with the Zoom API. Credentials are stored in app_settings (not hardcoded). The includes/helpers.php layer loads them via getSetting() with cache.
zoom_sessions table tracks meeting ID, passcode, join URL (host and patient variants), start time, end time, and status. api/video_sessions.php handles create/start/end. api/zoom_webhook.php receives real-time events from Zoom (participant joined, left, recording completed) and updates the session record.
The patient receives their join URL via the notification pipeline (email / WhatsApp) when the appointment is confirmed. The URL is also visible in their portal. No Zoom account is needed for the patient — they join as a guest.
Patients can join from a browser (Zoom Web SDK) without installing anything. The clinic admin can configure whether the Zoom Web SDK or the native Zoom app link is offered.
Recording cannot begin until the patient's consent is logged in ai_consent_log. The session recorder UI enforces this in the browser; the server-side api/recording_upload.php also validates that a consent record exists before accepting an upload.
Audio is captured via MediaRecorder, split into chunks, and uploaded to api/transcribe_chunk.php in parallel with the session. Final upload to api/recording_upload.php stitches chunks and triggers transcription via Sarvam AI.
Zoom cloud recording can be used as an alternative capture method. The zoom_webhook.php handler detects a recording.completed event, downloads the file to local storage, and triggers the same transcription pipeline.
The demo has real sample data — appointments, patients, prescriptions — so you can explore freely.