This document provides comprehensive information about the video meeting integration in MentorMinds Backend.
The MentorMinds platform automatically generates video meeting links when session bookings are confirmed. This feature:
- ✅ Creates unique meeting rooms for each confirmed session
- ✅ Attaches meeting URLs to session records
- ✅ Sends notifications to both mentor and learner
- ✅ Supports multiple meeting providers
- ✅ Handles meeting room expiry (30 minutes after session end)
- ✅ Gracefully handles provider API failures
Best for: Professional, production-ready video rooms
Pros:
- Simple REST API
- No SDK required
- Reliable and scalable
- Built-in chat and screen sharing
- Custom branding options
Cons:
- Requires API key
- Paid service (free tier available)
Setup:
- Sign up at Daily.co
- Get your API key from dashboard
- Set
MEETING_PROVIDER=dailyin.env - Set
MEETING_API_KEY=your_daily_api_key
Best for: Simple embedded video rooms
Pros:
- Easy integration
- No downloads required for participants
- Good free tier
Cons:
- Limited customization
- API access requires paid plan
Setup:
- Sign up at Whereby.com
- Get API key from developer settings
- Set
MEETING_PROVIDER=wherebyin.env - Set
MEETING_API_KEY=your_whereby_api_key
Best for: Enterprise environments already using Zoom
Pros:
- Familiar interface for users
- Enterprise-grade features
- Robust and reliable
Cons:
- More complex OAuth setup
- Requires Zoom app creation
- Rate limits on free accounts
Setup:
- Create Zoom app at Zoom Marketplace
- Use Server-to-Server OAuth
- Get API key and secret
- Set
MEETING_PROVIDER=zoomin.env - Set
MEETING_API_KEY=your_zoom_api_key
Best for: Free, open-source solution
Pros:
- Completely free
- Self-hosted option
- No API key required
- Open source
Cons:
- Less polished than commercial options
- Self-hosting requires maintenance
- Public Jitsi servers may be unreliable
Setup:
- Set
MEETING_PROVIDER=jitsiin.env - Optionally set
JITSI_BASE_URL=https://meet.jit.si(or your self-hosted URL) - No API key needed!
Add these to your .env file:
# Meeting Provider Configuration
MEETING_PROVIDER=daily # Options: daily, whereby, zoom, jitsi
MEETING_API_KEY=your_api_key # Required for Daily, Whereby, Zoom
MEETING_API_SECRET= # Optional: Additional secret for some providers
MEETING_ROOM_EXPIRY_MINUTES=30 # Meeting rooms expire 30 min after session end
MEETING_RETRY_ATTEMPTS=1 # Retry attempts if provider API fails
# Jitsi specific (only if using Jitsi)
JITSI_BASE_URL=https://meet.jit.siTo switch meeting providers:
- Update
MEETING_PROVIDERin.env - Update
MEETING_API_KEYif required - Restart the server
Example: Switch from Daily to Jitsi
# Before
MEETING_PROVIDER=daily
MEETING_API_KEY=daily_api_key_123
# After
MEETING_PROVIDER=jitsi
# No API key needed- User confirms booking →
POST /api/v1/bookings/:id/confirm - System generates meeting URL via selected provider
- Meeting URL attached to session in database
- Notifications sent to mentor and mentee via email
- Meeting room expires 30 minutes after session end
The migration adds these columns to the sessions table:
meeting_url VARCHAR(500) -- The meeting room URL
meeting_provider VARCHAR(50) -- Provider name (daily, whereby, etc.)
meeting_room_id VARCHAR(255) -- Provider-specific room ID
meeting_expires_at TIMESTAMP -- When the room expires
needs_manual_intervention BOOLEAN -- Flag for failed meeting creationsIf the meeting provider API fails:
- System retries once (configurable via
MEETING_RETRY_ATTEMPTS) - If retry fails, session is marked with
needs_manual_intervention = TRUE - Booking is still confirmed
- Warning returned in API response
- Admin can manually set up meeting room
Admin endpoint to find problematic sessions:
GET /api/v1/bookings/manual-intervention
Authorization: Bearer <admin_token>POST /api/v1/bookings/:id/confirm
Authorization: Bearer <token>Success Response (200):
{
"status": "success",
"message": "Booking confirmed and meeting room created successfully",
"data": {
"session": {
"id": "uuid",
"status": "confirmed",
"meeting_url": "https://daily.co/room/xyz",
"meeting_provider": "daily",
"meeting_expires_at": "2026-03-24T12:30:00Z"
}
}
}Warning Response (if meeting creation failed):
{
"status": "success",
"message": "Booking confirmed but meeting URL could not be generated",
"data": {
"session": { ... },
"warning": "Meeting room creation failed. Manual intervention required.",
"details": "Error message here"
}
}GET /api/v1/bookings/:id
Authorization: Bearer <token>Meeting URL only visible if session status is confirmed.
GET /api/v1/bookings
Authorization: Bearer <token>
Query: upcoming=true (optional)Returns all sessions for authenticated user with filtered meeting URLs.
npm test -- bookings.test.ts✅ Meeting URL generation on booking confirmation
✅ Meeting URL expiry calculation
✅ Provider API failure graceful handling
✅ Notification delivery on meeting URL generation
✅ Meeting URL visibility based on confirmation status
✅ Manual intervention flagging
- Test with Jitsi (no API key needed):
# In .env.test
MEETING_PROVIDER=jitsi
npm test- Test with Daily.co:
# In .env.test
MEETING_PROVIDER=daily
MEETING_API_KEY=your_test_key
npm testCheck:
- Is
MEETING_PROVIDERset correctly? - Is
MEETING_API_KEYvalid (if required)? - Check server logs for API errors
- Verify network connectivity to provider API
Common issues:
- Invalid API key → Check credentials
- Rate limiting → Reduce booking frequency or upgrade plan
- Network timeout → Check firewall/proxy settings
When needs_manual_intervention = TRUE:
- Admin receives alert (coming soon)
- Admin manually creates meeting room
- Admin updates session record:
UPDATE sessions
SET meeting_url = 'manual_url',
needs_manual_intervention = FALSE
WHERE id = 'session_id';- Use Daily.co or Whereby for reliability
- Monitor meeting creation failures via admin dashboard
- Set up alerts for manual intervention flags
- Configure proper email notifications (integrate SendGrid/AWS SES)
- Test failover process regularly
- Use Jitsi to avoid API costs during development
- Mock notification service to avoid sending real emails
- Log meeting URLs for testing purposes
- Test error scenarios by using invalid API keys
- Never commit API keys to version control
- Use environment variables for all secrets
- Validate meeting URLs before storing
- Expire meetings appropriately
- Restrict manual intervention to admins only
If you have existing sessions without meeting URLs:
-- Find sessions needing meeting URLs
SELECT id, scheduled_at, status
FROM sessions
WHERE meeting_url IS NULL
AND status = 'confirmed';
-- Manually add meeting URLs
UPDATE sessions
SET meeting_url = 'https://your-meeting-url.com/room'
WHERE id = 'session-id';The migration (database/migrations/012_add_meeting_url_to_sessions.sql) handles:
- Adding new columns safely
- Preserving old
meeting_linkdata - Creating appropriate indexes
Planned improvements:
- Email provider integration (SendGrid, AWS SES)
- Automated expiry cleanup job
- Meeting room health monitoring
- Support for recurring sessions
- Custom meeting room branding
- Meeting analytics and tracking
- Webhook notifications for meeting events
For issues or questions:
- Check provider documentation (Daily, Whereby, Zoom, Jitsi)
- Review server logs for error details
- Test with Jitsi first (simplest setup)
- Create GitHub issue with error details
Last Updated: March 24, 2026
Version: 1.0.0