Fix GoHighLevel Team Calendar Sync and Availability Conflicts

by Fahim

A lead books a demo through your team calendar, but two sales reps get double-booked for the exact same 2:00 PM slot. Or worse, the calendar widget suddenly shows zero available times across an entire week even though your reps have wide-open schedules.

I ran headfirst into this while scaling an appointment funnel for a 12-person sales team. HighLevel’s team calendars rely on a multi-layer availability model. If there’s a single mismatched setting between user profiles, external Google/Outlook accounts, and team round-robin rules, the scheduling engine fails silently. Here is how to track down the root cause and fix your team calendar sync conflicts for good.

Fix GoHighLevel Team Calendar Sync and Availability Conflicts
Fix GoHighLevel Team Calendar Sync and Availability Conflicts

Where GoHighLevel Calendar Sync Actually Breaks

When availability breaks, most people jump straight into Settings > Calendars. That’s usually the wrong place to look first. HighLevel calculates team availability by evaluating three distinct layers in order:

  1. The User Profile Layer: Working hours, connected Google or Outlook accounts, sync direction, and designated conflict calendars.
  2. The Team Calendar Layer: Team assignments, round-robin distribution rules (Optimize for Availability vs. Equal Distribution), buffers, and minimum notice.
  3. The Sub-Account Layer: Location timezone, business hours, and global blackout dates.

If a rep connects their Google account under Settings > My Profile but forgets to check their personal sub-calendars under “Check for Conflicts”, HighLevel assumes they’re free 24/7. On the flip side, if a rep has an “All-Day” event marked as “Busy” in Google Calendar, HighLevel blacks out their entire workday. If your widget shows nothing at all, start with our guide on fixing GoHighLevel calendar showing no available times for basic sanity checks.

Step 1: Audit User Profile Integrations and Conflict Calendars

Every team member on a round-robin or collective calendar needs their external calendar configured properly at the individual user level. Don’t try fixing this from the agency dashboard—log into the sub-account or have the rep update their own profile.

  1. Head to Settings > My Profile (or Settings > My Staff and edit the team member).
  2. Scroll to User Calendar Configuration.
  3. Make sure their Google or Outlook account is connected under Calendar Integrations.
  4. Click Edit next to Primary Calendar. Ensure the right external calendar is selected as the primary write destination (where new GHL bookings land).
  5. Set the Sync Option to Two-way. Leave “One-way” or “Disable” alone unless you have a very specific outbound-only flow where HighLevel should never touch their external calendar.
  6. Under Check for Conflicts, select every single sub-calendar that holds appointments, personal events, or team meetings.

The “Check for Conflicts” step causes most sync issues. If a sales rep tracks internal calls on a secondary Google Calendar (like “Team Syncs” or “Personal”) and that calendar is unchecked, HighLevel ignores those events and lets leads double-book over them.

Step 2: Fix the Google Calendar and Outlook “Busy” Status Glitch

HighLevel queries external calendars using provider endpoints like the Google Calendar FreeBusy API and Microsoft Graph. These APIs return availability based on an event’s Transparency setting, not just whether an event exists.

This creates two common false-positive sync traps:

  • All-Day Events: Outlook and Google Calendar often default all-day reminders (like “Submit Expenses” or “Quarterly Review”) to Show As: Busy. HighLevel interprets that as a hard 24-hour block and wipes out the rep’s entire day.
  • Free/Busy Transparency: If a rep adds a placeholder block and leaves it as “Busy”, HighLevel blocks it. If they add an actual call but accidentally mark it “Free”, HighLevel ignores it and lets someone book over it.

Make this a rule for your team: any all-day event, note, or reminder that shouldn’t block physical appointment time must be set to Show As: Free (or “Available” in Outlook).

Step 3: Configure Round-Robin Logic (Availability vs. Equal Distribution)

HighLevel offers two distribution modes under Calendar Settings > Edit Calendar > Team Members. Picking the wrong one can look like a sync glitch when the system is just following your rules.

Optimize for Availability

With Optimize for Availability, HighLevel scans the calendars of every assigned rep. If Rep A is booked from 2:00 PM to 2:30 PM, but Rep B is open, the calendar shows the 2:00 PM slot and assigns the booking to Rep B. If both reps are open, it uses your user priority weights.

Use this option whenever your main goal is showing maximum open slots to leads.

Equal Distribution

With Equal Distribution, HighLevel enforces strict quota balancing over a rolling window (e.g., 24 hours, 7 days). If Rep A has fewer leads than Rep B, HighLevel tries to send the next booking to Rep A.

Here’s the catch: if Rep A is busy at 3:00 PM and Equal Distribution decides it’s Rep A’s turn for a lead, HighLevel may hide the 3:00 PM slot entirely instead of offering it to Rep B. If you’re missing open slots across a sales team, switch to Optimize for Availability first to see if equal distribution throttling is the culprit. For more on slot rendering bugs, see our walkthrough on fixing HighLevel calendar slot availability.

Step 4: Resolve Timezone Drift Across Three Layers

A classic issue is the “1-hour offset” conflict, where a demo booked for 10:00 AM lands at 9:00 AM on the rep’s Google Calendar. This happens when there’s a mismatch across the sub-account, the user profile, and the external calendar timezone.

Check and align these three places:

  1. Sub-Account Level: Go to Settings > Business Profile > General Info > Time Zone. This should match your main market or agency timezone.
  2. User Profile Level: Go to Settings > My Staff, edit the user, and open the User Availability tab. The timezone here overrides the sub-account timezone for this rep’s working blocks.
  3. Google/Outlook Level: In Google Calendar, check Settings > Time zone. If the rep traveled or changed device settings, their calendar might be set to UTC or a different region.

If a rep’s working hours in HighLevel are 9:00 AM – 5:00 PM Eastern (UTC-5), but their connected Google Calendar sits on Central (UTC-6), every synced slot will be displaced by 60 minutes, causing immediate overlap errors.

Step 5: Verifying Availability via the HighLevel API v2

When you’re debugging multi-user calendars, you don’t need to guess which rep is blocking a slot. You can query the HighLevel API v2 calendar free/busy endpoint directly to see the raw timestamps HighLevel evaluates.

You’ll need your sub-account API token and Calendar ID. Grab your IDs using our guide to locate HighLevel sub-account IDs. If you build custom backend services, check out our guide on automating HighLevel OAuth token refresh in Node.js.

Here is a quick Node.js script I use to pull raw free/busy slots across a date range:

import axios from 'axios'; const LOCATION_ID = 'YOUR_LOCATION_ID';
const CALENDAR_ID = 'YOUR_CALENDAR_ID';
const API_KEY = 'Bearer YOUR_V2_ACCESS_TOKEN'; async function checkCalendarFreeSlots(startDate, endDate) { const url = `https://services.leadconnectorhq.com/calendars/${CALENDAR_ID}/free-slots`; try { const response = await axios.get(url, { headers: { 'Authorization': API_KEY, 'Version': '2021-07-28', 'Accept': 'application/json' }, params: { startDate: startDate, // Unix timestamp in milliseconds endDate: endDate, // Unix timestamp in milliseconds timezone: 'America/New_York' } }); console.log('Available slots returned by HighLevel engine:'); console.log(JSON.stringify(response.data, null, 2)); } catch (error) { console.error('API Error:', error.response?.data || error.message); }
} // Check availability for a specific day (timestamps in ms)
const startOfDay = new Date('2026-03-30T00:00:00Z').getTime();
const endOfDay = new Date('2026-03-30T23:59:59Z').getTime(); checkCalendarFreeSlots(startOfDay, endOfDay);

If the API returns an empty array for a day where your reps look open, HighLevel is seeing a “Busy” response from an external sync calendar, or your calendar buffer rules are wiping out the remaining window.

Step 6: Audit Meeting Buffers and Notice Settings

Sometimes calendar sync is working fine, but your calendar rules eliminate available slots. In the calendar editor, open the Availability tab and check these three settings:

  • Slot Duration vs. Slot Interval: If you set Slot Duration to 45 minutes and Slot Interval to 60 minutes, appointments only start at the top of the hour. If a rep has a quick 15-minute sync from 9:00 AM to 9:15 AM, that whole 9:00 AM – 10:00 AM block is killed.
  • Buffer Time (Before & After): A 15-minute buffer before and after a 30-minute meeting requires a full 60-minute clear window. If a rep has scattered 30-minute calls across the day, the buffer constraints will reject nearly every slot.
  • Minimum Scheduling Notice: If set to 24 hours, leads won’t see anything for today or tomorrow morning—which reps often mistake for a broken Google sync.

5-Minute Checklist for Adding New Team Members

To prevent sync issues whenever you onboard a new rep, run this checklist before adding them to a live round-robin calendar:

  1. Create the user under Settings > My Staff with the right Sub-Account permissions.
  2. Have them log in and connect their Google Workspace or Microsoft 365 account under Settings > My Profile.
  3. Verify Two-way sync is active on their primary calendar.
  4. Under Check for Conflicts, select every personal, team, and project sub-calendar they use.
  5. Make sure working hours in User Availability match their actual shift and timezone.
  6. Assign the user in the team calendar and set their Priority (High, Medium, Low).
  7. Book a test slot via an incognito window and verify the event lands in both HighLevel and their external calendar.

Frequently Asked Questions

Why did HighLevel delete an event from a user’s Google Calendar?

With Two-way sync enabled, canceling, rescheduling, or marking an appointment as “Invalid” inside HighLevel sends a delete command to the Google Calendar API. If an admin edits or deletes calendar slots in HighLevel, it syncs those removals back to the external calendar.

Why does an external meeting not show up inside HighLevel’s calendar view?

HighLevel doesn’t pull in full external meeting titles or descriptions for privacy reasons. Instead, it places a “Blocked” placeholder over that slot to prevent double bookings. If the slot is grayed out and unavailable for new leads, sync is working properly.

Can a single rep be assigned to multiple team calendars with different availability?

Yes. The hours under My Profile > User Availability act as their master limit. However, individual team calendars can set their own operating hours under the Availability tab. HighLevel finds the intersection: the rep is only offered when both their user profile hours and the specific calendar’s hours are open.

How long does it take for Google Calendar changes to reflect in HighLevel?

Sync via Google and Microsoft webhooks usually reflects in 5 to 15 seconds. If API rate limits hit or the OAuth token expires, sync can stall. If updates stop syncing entirely, have the user disconnect and re-authenticate their calendar under Settings > My Profile.

Official resources

all_in_one_marketing_tool