The Google Calendar integration auto-creates a calendar event for every booking customers make on your booking site. Configure once with a Google Cloud Service Account, share the calendar with the service account, and bookings flow into your team's shared calendar with customizable event details.
Getting started
Navigate to Settings > Company groups, open the group, switch to the Integrations tab, and click Configure integration on the Google Calendar card.
How it works
Google's API requires a service account to talk to a calendar on your behalf. The setup has six phases: create a service account in Google Cloud, enable the Calendar API, generate a JSON key for the service account, share your calendar with the service account email, paste the credentials into the integration, and configure the event title and description templates.
Once active, every new booking on your booking site creates a calendar event automatically, and edits to bookings update the corresponding event.
Step-by-step guide
Phase 1: Create a service account
| Step | Action |
|---|---|
| 1 | Open the Google Cloud Console |
| 2 | Pick or create the project you want to use |
| 3 | Navigate to IAM & Admin > Service Accounts |
| 4 | Click Create Service Account |
| 5 | Name the account (e.g., "otc-calendar-sync") |
| 6 | Assign the Owner role |
| 7 | Finish the creation flow |
Phase 2: Enable the Calendar API
| Step | Action |
|---|---|
| 1 | In Google Cloud Console, go to APIs & Services > Library |
| 2 | Search for Google Calendar API |
| 3 | Click Enable |
Phase 3: Generate a key file
| Step | Action |
|---|---|
| 1 | Back in Service Accounts, click the service account you created |
| 2 | Open the Keys tab |
| 3 | Click Add Key > Create New Key |
| 4 | Pick JSON format |
| 5 | Save the downloaded file. Keep it secure — anyone with this file has full access |
Phase 4: Share your calendar with the service account
| Step | Action |
|---|---|
| 1 | Open Google Calendar |
| 2 | In My calendars on the left, hover over the target calendar and click the three-dot menu |
| 3 | Pick Settings and sharing |
| 4 | Scroll to Share with specific people or groups |
| 5 | Click Add people and groups |
| 6 | Paste the service account email (looks like name@project-id.iam.gserviceaccount.com) |
| 7 | Set the permission to Make changes to events |
| 8 | Click Send |
Phase 5: Paste credentials into the integration
Open the downloaded JSON file in a text editor.
| Field | Where to find it |
|---|---|
| Service account email (client email) | The client_email value in the JSON. Paste into the Service account email field |
| Calendar ID | In Google Calendar settings, scroll to Integrate calendar and copy the Calendar ID (looks like name@group.calendar.google.com or your own email) |
| Private key | The private_key value in the JSON. Includes -----BEGIN PRIVATE KEY----- and -----END PRIVATE KEY----- markers and several lines of base64. Paste the entire value into the 7-row textarea |
Click Save at the bottom of the integration view, then toggle Active on.
Phase 6: Configure event title and description
| Field | What it controls |
|---|---|
| Calendar event summary | The event title in Google Calendar. Supports dynamic variables |
| Calendar event description | The event body in Google Calendar. Supports dynamic variables. 3-row textarea |
The supported dynamic variables get interpolated per-booking. Click the down-arrow icon under Supported dynamic variables to expand the list with copy buttons next to each variable.
| Variable | What it inserts |
|---|---|
[Booking Id] | The booking's internal id |
[Game Name] | The event the customer booked |
[Group Size] | Participant count |
[Customer First Name] | First name on the order |
[Customer Last Name] | Last name on the order |
[Customer Phone] | Phone number on the order |
[Customer Email] | Email on the order |
[Transaction Id] | Order number |
[Transaction Link] | Direct link back to the transaction in the console |
[Amount Paid] | Amount collected so far |
[Amount Due] | Outstanding balance |
A typical event summary template might be [Game Name] – [Customer First Name] [Customer Last Name] (x[Group Size]). A typical description might combine [Customer Phone], [Customer Email], [Amount Paid], [Amount Due], and [Transaction Link].
Update or rotate credentials
Once credentials are saved, the configuration view shows the Service account email and Calendar ID as read-only values. To replace them (e.g., after rotating the key), click Change credentials at the top right of the credential block. The form re-opens with all three fields editable.
Reference
Configuration view layout
| Section | Content |
|---|---|
| Setup guide | 6-phase walkthrough with links to Google Cloud Console and Google Calendar |
| Supported dynamic variables | Collapsible list (toggled by an arrow icon) with copy button per variable |
| Credential block | Service account email, Calendar ID, Private key. Switches between read-only display and edit form via Change credentials |
| Event templates | Calendar event summary, Calendar event description |
| Active toggle | Enable or disable calendar sync |
| Cancel / Save | Footer buttons |
Credential fields
| Field | Type | Source |
|---|---|---|
| Service account email (client email) | Text input | client_email in the JSON key file |
| Calendar ID | Text input | Google Calendar settings → Integrate calendar |
| Private key | Textarea (7 rows) | private_key in the JSON key file (entire value including BEGIN/END markers) |
Event template fields
| Field | Type | Notes |
|---|---|---|
| Calendar event summary | Text input | Event title shown in Google Calendar |
| Calendar event description | Textarea (3 rows) | Event body shown when the event is opened |
Dynamic variables
| Variable | Description |
|---|---|
| [Booking Id] | Booking reference number |
| [Game Name] | Name of the booked event |
| [Group Size] | Number of participants |
| [Customer First Name] | Customer's first name |
| [Customer Last Name] | Customer's last name |
| [Customer Phone] | Customer's phone number |
| [Customer Email] | Customer's email address |
| [Transaction Id] | Order number |
| [Transaction Link] | Link to the transaction in the console |
| [Amount Paid] | Amount collected |
| [Amount Due] | Remaining balance |
Save / cancel
| Button | Effect |
|---|---|
| Cancel | Discards changes and returns to the integration list |
| Save | Commits credentials, templates, and active toggle |
| Change credentials | Re-opens the credential form when credentials are already saved |
Good to know
- Calendar events are created automatically for new bookings only. Bookings made before the integration was activated are not retroactively synced. Manually re-save them to trigger a sync if you need backfill.
- The service account needs "Make changes to events" permission, not just view access. Without it, the calendar API rejects writes and events never appear.
- The private key is multi-line. Copy the entire
private_keyvalue from the JSON, including the-----BEGIN PRIVATE KEY-----and-----END PRIVATE KEY-----markers and every line in between. Missing one line breaks the signature. - One calendar per group. If you have multiple groups, configure each with its own service account (or share calendars across groups using the same service account email).
- Cancellations update the calendar event — typically the event is updated to reflect the cancellation rather than deleted, so your team's history stays intact.
- The Calendar ID isn't your email unless you're syncing to your personal calendar. For shared/team calendars, the ID looks like
team-bookings@group.calendar.google.comand is found in Calendar settings > Integrate calendar. - Rotate the service account key every so often for security. Generate a new key in Google Cloud, download the JSON, and use Change credentials in the integration to swap them out.
- The dynamic variables use square brackets, not curly braces.
[Customer First Name]is correct;{{Customer First Name}}will not interpolate.
FAQ
Q: Can I sync to multiple calendars?
A: One calendar per group. If you have multiple groups (locations), each can sync to its own calendar. For multi-calendar sync within a single group, you'd need to extend the integration outside this UI.
Q: Will changes to bookings update the calendar event?
A: Yes. Booking edits and cancellations update the corresponding calendar event automatically. Manual edits made directly in Google Calendar may be overwritten by the next sync, so make changes in the booking, not the calendar.
Q: Why are calendar events not appearing?
A: 1) Confirm Active is on. 2) Confirm the service account email has Make changes to events permission on the target calendar. 3) Confirm Google Calendar API is enabled in your Google Cloud project. 4) Confirm the Calendar ID is correct (it's not your email unless syncing to a personal calendar). 5) Confirm the private key was pasted in full, including BEGIN/END markers. 6) Try a fresh test booking — past bookings don't backfill.
Q: Can I use a personal Gmail calendar?
A: Yes. The Calendar ID is your Gmail address (the email you use to log into Google). Share that calendar with the service account email, and bookings sync to it.
Q: How do I revoke the integration?
A: Two options: 1) toggle Active off in the integration view (preserves credentials, just stops syncing), or 2) revoke the service account in Google Cloud Console (cuts off API access entirely). For full security on key rotation, do both: revoke the key in Google Cloud, then re-add a new one.
Q: My events have the wrong title format. How do I fix it?
A: Update the Calendar event summary template in the integration view. The change applies to new bookings going forward; existing calendar events keep their old title until the booking is edited.
Q: Can I include a Zoom link or custom URL in the event description?
A: Yes. Type any custom text or URL into the Calendar event description field; it renders verbatim. Combine with dynamic variables for personalized event bodies.
Q: The integration shows my service account email as read-only. How do I change it?
A: Click Change credentials at the top right of the credential block. The form re-opens for all three fields.
Q: I see events being created but with empty titles. Why?
A: Likely the Calendar event summary template is empty or only contains an unsupported variable. Confirm at least one valid variable or static text is in the template.