Google Calendar Sync
Updated Oct 18, 2026
Slotara provides two-way Google Calendar synchronisation. New bookings create calendar events for the provider; when providers block time on their Google Calendar, those slots are automatically blocked in Slotara's booking engine.
As of v1.5.0, virtual services can also auto-generate a Google Meet link for each booking — delivered in the confirmation email, iCal file, and booking detail view.
Outbound sync (Slotara → Google)
When a booking is confirmed, rescheduled, or cancelled:
SyncBookingToGoogleCalendarjob is dispatched (if calendar sync is enabled for that provider)- Creates, updates, or deletes the Google Calendar event via the Calendar API v3
- Stores
google_calendar_event_idon the booking record for future updates
Inbound sync (Google → Slotara)
php artisan calendar:sync-busy
- Fetches all calendar events for each connected provider from the Google Calendar Events API
- Writes busy blocks to
provider_slot_overrides(typeblocked) - The slot availability engine excludes these blocks when generating bookable slots
- Runs hourly via Laravel scheduler
Setup
1. Super Admin — configure Google OAuth
- Create a project at console.cloud.google.com → APIs & Services → Credentials
- Enable the Google Calendar API
- Create an OAuth 2.0 Client ID (Web application type)
- Add your domain's callback URL:
https://yourdomain.com/manage/calendar/oauth/callback - Copy the Client ID and Client Secret to your
.env:
GOOGLE_CALENDAR_CLIENT_ID=your-client-id
GOOGLE_CALENDAR_CLIENT_SECRET=your-client-secret
2. Tenant — enable calendar sync
- Go to Manage → Integrations → Calendar Sync
- Enable Google Calendar sync
- Each provider clicks Connect Google and authorises their own account
3. Cron — schedule inbound sync
Ensure the Laravel scheduler is running (the calendar:sync-busy command is scheduled hourly):
* * * * * cd /path-to-project && php artisan schedule:run >> /dev/null 2>&1
OAuth flow
Provider clicks "Connect Google"
└─► GET /manage/calendar/oauth?provider_id={id}
└─► Google OAuth consent screen
└─► GET /manage/calendar/oauth/callback
└─► Stores access_token + refresh_token on provider record
(encrypted; tokens refreshed automatically before API calls)
Disconnect
From Manage → Communication → Calendar Sync, click Disconnect next to a provider to revoke the integration. The provider's tokens are cleared from the database. Future bookings will not sync until the provider reconnects.
Google Meet auto-generation
v1.5.0
When a provider has Calendar sync connected and a service has Is Virtual enabled with Auto-generate Google Meet link on, Slotara requests a Meet link from the Calendar API at booking time.
How it works
Client books virtual service
└─► BookingWizard calls GoogleCalendarSyncService synchronously
└─► POST /calendar/v3/calendars/{id}/events?conferenceDataVersion=1
└─► Google returns hangoutLink (or entryPoints fallback)
└─► meet_link stored on booking
└─► Confirmation email fires with "Join Video Call" button
Requirements
| Requirement | Details |
|---|---|
| Provider connected | Provider must have Google Calendar sync authorised (Manage → Integrations → Calendar Sync) |
| Google account | The connected account must support Google Meet — Google Workspace or a personal Gmail with Meet enabled |
| Service is virtual | is_virtual = true and generate_meet_link = true on the service |
Choosing Zoom / Teams instead
To use a custom room link instead of auto-generating Meet:
- Edit the service → Virtual Session
- Set Auto-generate Google Meet link → OFF
- Paste your Zoom or Teams URL in Custom Video Call URL
The custom URL will appear in emails and iCal for all bookings of that service.
Disabling Meet for one service only
generate_meet_link is a per-service setting. You can have some services use Google Meet and others use a static Zoom room — each service is configured independently.
Warning: If Meet generation fails (provider not connected, or Google account does not support conferencing), a warning is logged and
meet_linkis left null. The email will fall back toservice.video_linkif set, or omit the video button entirely.
Key files
| File | Purpose |
|---|---|
app/Support/TenantCalendarSettings.php |
Settings accessor |
app/Services/GoogleCalendarSyncService.php |
Google Calendar API wrapper |
app/Jobs/SyncBookingToGoogleCalendar.php |
Outbound create/update job |
app/Jobs/DeleteBookingFromGoogleCalendar.php |
Outbound delete job |
app/Console/Commands/SyncGoogleCalendarBusy.php |
Inbound busy-block command |
app/Filament/Tenant/Pages/CalendarSettings.php |
Tenant settings page |
app/Http/Controllers/GoogleCalendarController.php |
OAuth redirect + callback |
tests/Feature/GoogleCalendarSyncTest.php |
Feature test suite |