Fix GoHighLevel Calendar Not Showing Available Times

by Fahim

A client visits your booking page ready to grab a demo, but they’re hit with a completely blank grid or a warning that no slots are available for the entire month. You check your calendar settings, see Monday through Friday set to 9 AM – 5 PM, and wonder why on earth nothing is rendering.

I hit this exact bug last week on a client’s sub-account. Everything looked fine on paper, but every date was greyed out. Here is the exact audit checklist I use to track down and fix empty booking widgets in GoHighLevel.

Close-up of a tablet displaying a calendar booking interface
Close-up of a tablet displaying a calendar booking interface

The 5 Core Reasons GoHighLevel Calendars Show No Available Slots

GoHighLevel evaluates multiple layers of logic before generating a booking slot. If a single layer hits a conflict or an invalid state, the widget drops all availability for that day.

  • External Calendar Busy Blocks: An all-day “busy” event in Google Calendar, Outlook, or iCloud silently blocks all working hours.
  • Mismatched Staff Working Hours: Custom working hours on the user profile override calendar-level availability settings.
  • Look-Ahead and Minimum Scheduling Notice: Short look-ahead periods or overly aggressive buffer notices push all valid slots past the visible date range.
  • Location vs. User Timezone Drift: A mismatch between the sub-account timezone, user profile timezone, and browser will render slots outside allowable booking windows.
  • Unassigned Group Calendar Logic: Round-robin calendars without active users or with misconfigured distribution priorities drop time slots entirely.

If you’re dealing with multi-staff setups, check our guide on fixing GoHighLevel team calendar availability sync conflicts for team-specific routing rules.

Step 1: Check Google or Outlook External Sync Settings

The most common culprit is an external calendar sync set to “Busy” for background tasks or all-day events. If you connect Google Calendar via OAuth, GHL checks your linked calendars to prevent double-booking.

Head to Settings > My Staff, edit the assigned user, and scroll to User Calendar Configuration. Review the “Check for Conflicts” list.

If you have an all-day event like “Vacation Reminder” or “Public Holiday” marked as Busy instead of Free in Google Calendar, GHL wipes out the entire 24-hour block. Go to Google Calendar, click the event, and toggle its status from Busy to Free.

Also, verify which sub-calendars are selected under conflict checking. If you accidentally checked a shared company holiday calendar, every company-wide entry will block your personal booking link.

Step 2: Inspect User Working Hours vs. Calendar Hours

GoHighLevel uses a two-tier availability model: User Profile Availability and Calendar Availability. User settings always take precedence over calendar settings.

To inspect your user availability, head to Settings > My Staff, click Edit on the assigned user, and open the User Availability tab. Make sure the working hours here match or exceed the hours defined on the calendar itself.

If the user is set to 9:00 AM – 1:00 PM on their profile, but your calendar is configured for 1:00 PM – 5:00 PM, GHL calculates the mathematical intersection of those two ranges—which is zero minutes. The booking widget renders completely empty.

If your calendar doesn’t assign specific users (an unassigned Simple Calendar), check the hours directly under Settings > Calendars by clicking the three dots on the calendar and selecting Edit > Availability.

Step 3: Fix Minimum Scheduling Notice and Look-Ahead Settings

Under the calendar’s Availability or Forms & Payment tab (depending on whether you’re on the classic or new builder), two numeric fields frequently break availability:

  1. Minimum Scheduling Notice: Prevents last-minute bookings. If set to “48 Hours” and you only allow bookings for the next 2 days, your calendar shows zero slots today and tomorrow.
  2. Date Range (Look-Ahead): If set to “Over the next 1 day” and your minimum notice is “24 Hours”, your effective booking window shrinks down to a couple of hours or nothing at all.

Set Minimum Scheduling Notice to something realistic like 2 Hours or 4 Hours, and bump the Date Range to at least 14 Days or 30 Days to test if future slots reappear.

Step 4: Resolve Location and Profile Timezone Mismatches

Timezone drift between your sub-account company profile and user settings can silently hide available hours. You can inspect your sub-account location configuration under Settings > Business Profile.

If your sub-account location ID has timezone settings set to UTC while your assigned user is set to America/New_York (UTC-5), an 8:00 AM booking slot in local time translates to 1:00 PM UTC. You can query your location timezone settings directly via the GoHighLevel API v2 using your sub-account access token.

Here is a curl request to inspect your sub-account location details, including timezone:

curl --request GET  --url 'https://services.leadconnectorhq.com/locations/YOUR_LOCATION_ID'  --header 'Authorization: Bearer YOUR_ACCESS_TOKEN'  --header 'Version: 2021-07-28'

The JSON response returns your official location settings. If you need your sub-account ID, follow our tutorial on how to find your sub-account location ID in GoHighLevel.

{ "location": { "id": "ve9Aq8yTRdfg90JkL", "name": "Marketing Agency Main", "timezone": "America/New_York", "businessType": "Agency" }
}

Make sure the timezone field in the response matches what the assigned user has configured under Settings > My Staff > User Profile. If the user profile is set to a European timezone while the location is configured for US Eastern, early morning slots can get pushed outside calendar boundaries.

Step 5: Audit Meeting Buffers and Slot Duration

Meeting duration and buffer combinations are notorious for breaking slot math. Here’s how GoHighLevel calculates valid intervals:

// Slot availability calculation logic
const slotDurationMinutes = 45;
const bufferDurationMinutes = 30;
const totalBlockTime = slotDurationMinutes + bufferDurationMinutes; // 75 mins const windowStartMinutes = 9 * 60; // 09:00 AM = 540 min
const windowEndMinutes = 12 * 60; // 12:00 PM = 720 min
const availableWindow = windowEndMinutes - windowStartMinutes; // 180 min const possibleSlots = Math.floor(availableWindow / totalBlockTime);
console.log(`Available slots in window: ${possibleSlots}`); // 2 slots

If you have an available working window of 60 minutes (say, 11:00 AM to 12:00 PM) but your slot duration is 45 minutes with a 20-minute buffer, the required block is 65 minutes. GHL will not display any slot for that 1-hour window because the combined duration exceeds the available time.

Open your calendar settings, go to Availability, and verify:

  • Slot Duration: The actual length of the meeting (e.g., 30 mins).
  • Slot Interval: How frequently slots start (e.g., every 15 mins or 30 mins).
  • Buffer Duration: Pre-service and post-service buffer time.

If you’re embedding the calendar inside a high-traffic funnel, see our troubleshooting guide on fixing GoHighLevel calendar slots not showing for embedded widget edge cases.

Step 6: Diagnose Round-Robin and Team Calendar Assignments

If you’re using a Round Robin or Collective Booking calendar, slots only appear if active users are assigned and eligible to take calls.

Review these settings under Settings > Calendars > Edit Calendar:

  1. Assigned Users: Check that at least one user is toggled on under the Team Members tab.
  2. User Meeting Weight / Priority: If one user has a priority of “High” but their external calendar is full or disconnected, and “Optimize for Availability” is not enabled, the system can fail to route to backup users.
  3. Deleted or Deactivated Users: If a team member was deactivated from GoHighLevel but remains assigned to the calendar, the round-robin distributor can hang. Remove inactive users from the team calendar list completely.

For official HighLevel calendar documentation and updates, refer to the HighLevel Help Portal.

Quick Diagnostic Checklist

When an empty calendar issue pops up, run through this 60-second diagnostic checklist:

  • External Sync: Open the assigned user’s Google/Outlook calendar and check for all-day events marked as “Busy”.
  • User Hours: Verify the user’s availability under My Staff isn’t blank or conflicting with calendar hours.
  • Notice Limits: Confirm Minimum Scheduling Notice isn’t longer than your allowable Date Range.
  • Timezone: Confirm location timezone matches the user profile timezone.
  • Duration Math: Ensure Slot Duration + Buffer Time fits inside your daily working blocks.
  • Embed Cache: Test the direct booking link in an Incognito window to rule out browser cache issues.

Frequently Asked Questions

Why does my calendar work on the preview link but not inside my funnel page?

If the standalone calendar preview URL (e.g., api.leadconnectorhq.com/widget/booking/...) displays available times but the funnel page is blank, check your custom domain configuration and script tags. An outdated custom code element or CSS hiding iframe containers on custom subdomains can break widget rendering. Learn how to verify your funnel domain in our guide on connecting custom domains and subdomains to GoHighLevel funnels.

Does a recurring Google Calendar event block every single day in GoHighLevel?

Yes, if the recurring event is marked as “Busy”. Many people set daily repeating events like “Gym” or “Focus Time” without realizing that Google defaults new events to Busy. Change the event availability to “Free” in your Google Calendar settings to allow bookings during those windows.

How do I allow same-day bookings on my HighLevel calendar?

To allow same-day appointments, set your Minimum Scheduling Notice to 0 Hours or 1 Hour. If this is set to 24 Hours, clients will never see slots available for today.

Next Steps

Once your calendar slots are showing properly, make sure your downstream automation runs reliably when appointments get booked. Check out our step-by-step tutorial on fixing GoHighLevel webhooks that are not firing to make sure booking notifications and lead data flow cleanly into your CRM workflows.

all_in_one_marketing_tool