
GoHighLevel + Google Calendar Two-Way Sync: Eliminating Double-Bookings (2026)
GoHighLevel + Google Calendar Two-Way Sync: Eliminating Double-Bookings (2026)
If you run your bookings through GoHighLevel but still keep appointments, school pick-ups or client calls in a personal Google Calendar, you have almost certainly been double-booked at some point. A prospect grabs a 2pm slot on your GHL booking widget while you are already sitting in a dentist appointment that only lives in your phone calendar. The two systems do not talk to each other, so neither one knows the other is busy. The fix is not more discipline or a second screen open all day. It is a properly configured two-way sync between Google Calendar and GoHighLevel.
I set this up regularly for Australian service businesses, coaches and clinics, and the same handful of mistakes come up every time. Most people connect the calendar but only get one-way sync, or they link the wrong Google calendar to the wrong GHL calendar, then wonder why availability is still showing slots they cannot take. This guide walks through exactly where to connect the calendars, how to confirm you actually have two-way sync, how to handle team and round-robin setups, and the sync gotchas to watch for, including time zone behaviour for those of us juggling AEST and AEDT.
Where the calendar connection actually lives
The connection between a user and their Google Calendar happens at the user level, not the calendar level. Go to My Profile > Calendar Settings (sometimes shown as Calendar Connections) inside your sub-account. This is where each individual team member links their own Google or Outlook account. It is a per-user connection, so every person whose availability matters needs to do this in their own profile.
Once you click to connect Google Calendar, you authorise GHL via Google's OAuth screen. After it connects, you will see your Google calendars listed and you can choose which calendar to read availability from and which calendar to write GHL bookings into. This distinction is the whole game, and it is where most people stop too early.
Primary calendar vs conflict calendars
In your calendar connection settings you will set two things. The primary calendar is the Google calendar that GHL writes new appointments into when someone books through your widget. The conflict calendars (also called check-for-conflicts) are the calendars GHL reads to decide whether you are already busy. You can tick multiple conflict calendars, which is useful if you keep, say, a personal calendar and a shared family calendar that both need to block your work availability.
The rule I give clients is simple: write to one calendar, but check every calendar that contains a real commitment. If an event lives in a calendar that is not ticked as a conflict calendar, GHL will happily offer that time as available.
One-way sync vs two-way sync
This is the part worth slowing down on. Two-way sync means events flow in both directions. Externally booked Google events block your GHL availability, and GHL bookings push out to your Google Calendar. One-way sync only does half of that, and which half depends on your configuration. The table below lays out the practical difference.
| Aspect | One-way sync | Two-way sync |
|---|---|---|
| Behaviour | Events move in a single direction only (usually GHL to Google) | Events flow both ways between Google and GHL |
| Blocks GHL availability? | No — external Google events are ignored | Yes — external Google events mark you busy in GHL |
| Pushes GHL bookings to Google? | Yes — GHL appointments appear in Google | Yes — GHL appointments appear in Google |
| Best for | Display-only use where Google is never booked manually | Anyone who books events directly in Google or Outlook |
| Double-booking risk | High — manual Google events still get offered in GHL | Low — both systems respect each other's bookings |
To confirm you have genuine two-way sync, you need both halves switched on: a primary calendar selected for writing, and at least one conflict calendar ticked for reading. Then test it. Create a manual event in your Google Calendar for tomorrow at 10am, wait a few minutes, and open your GHL booking widget. That 10am slot should disappear. If it does not, your conflict calendar is not configured, full stop.
Linking the right Google calendar to each GHL calendar
People often confuse two separate objects. The calendar connection in My Profile links your Google account to your GHL user. Your actual booking calendars (the things clients book on) live under Calendars > Calendar Settings in the sub-account. Each GHL calendar pulls its availability from the connected user's settings, so the conflict checking you configured at the user level applies to every booking calendar that user is assigned to.
For a solo operator this is straightforward. Where it gets fiddly is when one person owns multiple GHL calendars, for example a Discovery Call calendar and a separate Strategy Session calendar. Both will respect the same Google conflict calendars, which is usually what you want. Just be deliberate about which Google calendar receives the bookings, because if you split bookings across different Google calendars you must remember to add each of them as a conflict calendar too, or they will not block one another.
Team and round-robin calendars
Team calendars and round-robin distribution are where two-way sync earns its keep. In a round-robin calendar, GHL rotates new bookings across multiple team members based on availability. If even one of those team members has not connected their Google Calendar with conflict checking on, GHL will route bookings to them during times they are actually unavailable, and you get a double-booking that looks like the system's fault but is really a setup gap.
The non-negotiable for any team setup: every user in the round-robin pool must individually complete their own Google connection in My Profile, with their conflict calendars ticked. Only then does GHL have an accurate picture of who is genuinely free. This is the same discipline that makes other automations reliable — if you are also moving data between tools, a clean GoHighLevel and Zapier integration depends on calendar data being trustworthy in the first place.
Reminder workflows that cut no-shows
Sync stops double-bookings; reminders stop no-shows. Once a booking lands, build a Workflow with the Appointment trigger (or Customer Booked Appointment) and send a sequence of reminders through LeadConnector SMS via your connected Twilio number, plus email. A typical cadence for Australian clients is a confirmation immediately, a reminder 24 hours out, and a final SMS 1–2 hours before the appointment.
Inside the Workflow you can reference appointment custom values so the message includes the date, time and a reschedule link. I also tag contacts (for example booked-strategy-call) so you can segment them later, and add the appointment to a pipeline if you track opportunities. If you want bookings handled conversationally, GHL's Conversation AI booking can read the same calendar availability and offer real open slots over SMS — which only works correctly if your two-way sync is already accurate. There is a broader picture on what these tools can and cannot do in this overview of the GoHighLevel AI Employee.
Time zones: AEST, AEDT and the daylight saving trap
Set the time zone in three places consistently: your sub-account settings, your individual user profile, and each calendar's settings. The classic Australian failure mode is daylight saving. Most of the country shifts between AEST and AEDT in October and April, while Queensland, the Northern Territory and Western Australia do not. Google Calendar handles the shift automatically; GHL respects the time zone set on the calendar. If a client's profile time zone and the calendar time zone disagree, reminders and availability can drift by an hour around the changeover. Confirm every layer reads the correct zone, especially if you book across state lines.
Common sync delays and gotchas
Two-way sync is near real-time but not instant. Expect a short lag — usually under a few minutes — between an event appearing in Google and GHL reflecting it. Do not test by booking and refreshing within seconds and assuming it is broken. Give it a moment. If sync seems genuinely stuck, the most common fix is to disconnect and reconnect the Google account in My Profile, which refreshes the OAuth token. Tokens occasionally expire after a password change or Google security event, silently breaking the sync until you reconnect.
Common mistakes to avoid
- Connecting Google but never ticking a conflict calendar, so external events never block GHL availability — this is the number one cause of double-bookings.
- Assuming the connection is two-way when it is only pushing GHL bookings out to Google and not reading Google events back in.
- Writing GHL bookings into one Google calendar but forgetting to also list it as a conflict calendar, so your own GHL appointments do not block each other.
- Setting up a round-robin or team calendar where one member has not connected their own Google Calendar in My Profile.
- Mismatched time zones across sub-account, user profile and calendar, causing availability and reminders to drift by an hour, especially around AEST/AEDT daylight saving.
- Treating a few minutes of sync delay as a fault and tearing down a working configuration before giving it time to update.
Get these right and your booking widget becomes genuinely trustworthy — the same reliability principle that makes a database reactivation campaign for cold leads worth running, because every appointment it generates lands in a calendar that will not double-book.
If you want your GoHighLevel calendars, two-way sync and reminder workflows configured correctly the first time, book a strategy call with the HL Growth Partner team.
Frequently asked questions
Where exactly do I connect Google Calendar in GoHighLevel?
Go to My Profile > Calendar Settings (also shown as Calendar Connections) inside your sub-account and authorise your Google account through Google's OAuth screen. The connection is per user, so each team member whose availability matters must complete it in their own profile, then choose a primary calendar to write bookings into and one or more conflict calendars to check for existing events.
How do I know if I have one-way or two-way sync?
Two-way sync requires both a primary calendar selected for writing GHL bookings and at least one conflict calendar ticked for reading external events. The quickest test is to create a manual event in Google Calendar for tomorrow, wait a few minutes, then check your GHL booking widget. If that time slot disappears, two-way sync is working. If the slot is still offered, your conflict calendar is not configured.
What is the difference between a primary calendar and a conflict calendar?
The primary calendar is the single Google calendar GHL writes new appointments into. Conflict calendars are the calendars GHL reads to decide whether you are already busy. You can select multiple conflict calendars, which is how you make personal, family or shared calendars block your GHL availability. Write to one, but check every calendar that holds a real commitment.
Why is GHL still double-booking my round-robin team calendar?
Almost always because one team member in the round-robin pool has not connected their own Google Calendar with conflict checking enabled in My Profile. GHL routes bookings based on each user's individual calendar connection, so a single unconnected or misconfigured user makes the whole pool unreliable. Have every member complete their connection and tick their conflict calendars.
How long does the sync take, and what do I do if it stops working?
Sync is near real-time but can lag by a few minutes, so allow time before assuming a fault. If sync genuinely stalls, the usual fix is to disconnect and reconnect the Google account in My Profile, which refreshes the OAuth token. Tokens can expire after a password change or Google security event, which quietly breaks the sync until you reconnect.
