You open your GoHighLevel booking widget or test link, click a date, and hit a completely blank column or a grayed-out calendar with zero slots. In almost every case, this comes down to overlapping constraints: user profiles, external calendar sync traps, or overly aggressive buffer settings.
I spent three hours debugging a round-robin calendar last month that suddenly wiped availability across an entire sales team. We didn’t need to rebuild the funnel or swap widgets. Here is the diagnostic workflow I use to pinpoint why GHL is dropping your slots and get them showing again.

1. Check User Profile Hours vs Calendar Working Hours
GoHighLevel tracks working hours in two separate places: the User Profile and the Calendar Settings. GHL doesn’t merge these as a union; it treats them as a strict logical AND intersection. If your user profile allows Monday 9:00 AM to 1:00 PM, but the calendar settings allow Monday 1:00 PM to 5:00 PM, HighLevel calculates zero overlapping minutes and serves an empty screen.
To align them:
- Head to Settings > My Staff and click Edit on the assigned team member.
- Scroll to User Availability. Check the active days, hours, and timezone assigned directly to that user.
- Go to Settings > Calendars, click the three dots on your calendar, and hit Edit.
- Open the Availability tab and verify your calendar hours actually overlap with the user’s working hours.
On Team or Round-Robin calendars, every assigned rep needs active hours. If HighLevel can’t route a slot to at least one eligible staff member during that window, it hides the entire time block from visitors.
2. Catch Google or Outlook Sync Conflicts
When you sync a Google Calendar or Outlook 365 account via the integrations tab, GoHighLevel checks that external schedule before serving any slot. A single misplaced event on an external calendar can wipe out days of availability.
The classic trap here is an All-Day Event in Google Calendar. If someone adds an all-day reminder like “Team Offsite” or “Follow up with leads”, Google Calendar usually defaults the event status to Busy instead of Free. HighLevel treats that entire 24-hour block as booked solid and kills all slots for that day.
Here is what to look for:
- Open the connected Google or Outlook calendar for the blank days.
- Click any all-day banners or reminders across the top.
- Edit the event and check the Show as setting. Switch it from Busy to Free.
- Check your secondary synced calendars under Settings > Profile > Calendar Integrations. If you check multiple sub-calendars under “Check for Conflicts”, an event on a personal calendar will quietly knock out your work slots.
If you’re not sure, disconnect the Google or Outlook integration in GHL, reload the direct booking link in incognito, and see if the slots return. If they do, an external event is blocking the calendar.
3. Audit Minimum Notice and Buffer Durations
HighLevel has several scheduling rules that will quietly suppress slots if set too aggressively. You’ll find these under Calendar Settings > Availability > Advanced Settings.
Check these four fields:
- Minimum Scheduling Notice: Set this to
48 hours, and a lead looking at your calendar Monday at 2:00 PM won’t see anything before Wednesday at 2:00 PM. HighLevel will render today and tomorrow completely blank. - Buffer Time: Pre-buffer and post-buffer settings pad around every single existing appointment. If you book 30-minute meetings with a 30-minute pre-buffer and 30-minute post-buffer, one call locks out 90 full minutes of calendar capacity.
- Date Range: If set to “Book within next 7 days”, any prospect clicking into next week sees disabled dates.
- Max Bookings Per Day / Per Slot: Once hit, HighLevel shuts down remaining intervals immediately.
To verify if buffers are killing your slots, temporarily set Minimum Scheduling Notice to 0 hours and Buffer Duration to 0 mins, then check the booking URL in a fresh incognito window.
4. Fix Timezone Discrepancies Across Account, Calendar, and User
Timezone mismatches create weird bugs where slots shift to the wrong days or disappear after mid-afternoon. HighLevel handles timezones in three independent locations:
- Sub-account Level: Settings > Business Profile > Timezone
- Calendar Level: Settings > Calendars > Edit > Form & Payment tab (or Availability tab depending on UI version)
- User Profile Level: Settings > My Staff > Edit User > User Availability > Timezone
If your Sub-account is set to America/New_York (EST), but your individual User Profile is set to UTC or Asia/Kolkata, a 9:00 AM to 5:00 PM shift translates into overnight hours in New York. When the calendar enforces “Account Timezone”, HighLevel looks for daylight slots in New York, realizes the rep is only working during New York’s night, and serves zero slots.
Align all three spots to the correct IANA timezone string to fix the calculation.
5. Inspect Availability via the HighLevel Free Slots API
When you can’t figure out which setting is killing your availability, check the raw slot calculation HighLevel returns over the wire. Open DevTools (F12 or Cmd + Option + I) and head to the Network tab.
Reload your direct calendar URL. In the filter bar, search for free-slots. You’ll see a request matching this format:
GET https://services.leadconnectorhq.com/calendars/ {calendarId}/free-slots?startDate=1710115200000&endDate=1710720000000&timezone=America%2FNew_YorkCheck the JSON response payload. If the server returns an empty array or an error code, you know it’s a backend availability rule and not a frontend CSS glitch:
{ "slots": [], "message": "No available slots for the selected date range", "traceId": "req_9a4f21bc90"
}If you build custom booking flows with the HighLevel API v2, you can query this endpoint directly from a backend script to debug availability issues. Here’s a Node.js snippet using an access token:
import axios from 'axios'; async function checkCalendarSlots(calendarId, token, startDate, endDate, timezone) { try { const response = await axios.get( `https://services.leadconnectorhq.com/calendars/${calendarId}/free-slots`, { params: { startDate, endDate, timezone }, headers: { Authorization: `Bearer ${token}`, Version: '2021-07-28' } } ); console.log('Available Slots Response:', JSON.stringify(response.data, null, 2)); return response.data; } catch (error) { console.error('Failed to fetch slots:', error.response?.data || error.message); }
} // Timestamps in milliseconds (e.g. 7 days range)
const start = Date.now();
const end = start + (7 * 24 * 60 * 60 * 1000); checkCalendarSlots( 'CALENDAR_ID_HERE', 'YOUR_ACCESS_TOKEN', start, end, 'America/New_York'
);If you run automated background requests, check our guide on GoHighLevel API v2 OAuth token refresh in Node.js to keep your auth headers valid during testing.
6. Fix Round-Robin and Team Calendar Allocation
Team calendars add distribution logic on top of base availability. If your round-robin calendar shows no slots, check these four areas:
- Inactive Users: Go to Settings > My Staff and ensure all assigned users are marked Active. Inactive accounts get dropped from the booking pool instantly.
- Calendar Assignment: Open the calendar settings under Settings > Calendars and check the Team Members tab. Verify at least one user is assigned with a weight above 0.
- Distribution Logic: With “Optimize for Availability”, GHL checks every rep. With “Optimize for Equal Distribution”, GHL might prioritize a rep who is completely booked out today, hiding slots that other available reps could have taken.
- Resource Conflicts: If your calendar uses Resource Booking (like meeting rooms), make sure the assigned resource isn’t booked by a different calendar in the sub-account.
If you route leads via webhooks or automated triggers, broken calendars break your entire pipeline. If downstream automations aren’t running after a test booking, read our guide on how to fix GoHighLevel webhooks not firing.
7. Fix Widget Embedding and Script Conflicts
Sometimes the backend returns valid slots, but the embedded widget on your GHL Funnel, WordPress page, or custom site fails to render. This happens when page CSS or JS libraries conflict with HighLevel’s iframe loader.
Check your browser Console tab for errors like this:
// Blocked script execution or CSP violation
Refused to frame 'https://api.leadconnectorhq.com/' because it violates the following Content Security Policy directive...How to troubleshoot embedded widgets:
- Test the direct GHL link: Open the URL directly (e.g.,
https://api.leadconnectorhq.com/widget/booking/YOUR_ID). If slots load on the direct link but not your page, your site theme or container is hiding the iframe. - Check for CSS Collapsing: Look for theme rules forcing
iframe { display: none; }or zero height. Give the container an explicit minimum height likemin-height: 700px;. - Re-add the Element: Inside GHL Funnels, delete the Calendar element, save, drop a new Calendar element in, and republish.
If you’re using an AI assistant to book meetings over SMS or chat, broken calendar widgets will cause the bot to fail silently. See our troubleshooting steps on fixing GoHighLevel AI employee response issues if your assistant stops offering times.
Pre-Launch Sanity Checklist
Before driving traffic back to your booking page, run through this quick checklist in an incognito window:
- Direct calendar URL shows at least 5 business days of clickable slots.
- Widget timezone matches the intended client location.
- All assigned users have their all-day Google/Outlook events set to “Free”.
- Sub-account, User profile, and Calendar timezones match.
- Test booking completes and creates an entry under Calendars > Appointments.
- Lead capture and appointment triggers fire properly in your Workflows.
Frequently Asked Questions
Why does my calendar show slots for some days but completely blank for others?
This is almost always caused by an all-day event marked as “Busy” on the user’s synced Google or Outlook calendar, or a date-specific override configured under the calendar’s Availability tab.
Why does the direct link work, but the embedded funnel shows no slots?
Usually caused by cached widget scripts, a Content Security Policy (CSP) blocking the frame, or container CSS collapsing the iframe height to 0px. Re-insert the calendar element in the funnel builder and test in incognito.
How do I enable same-day bookings on my calendar?
Go to Settings > Calendars, edit your calendar, open Availability, and drop Minimum Scheduling Notice down to 0 hours or 0 mins. Anything higher (like 24 hours) hides all same-day slots.
Can multiple team members share the same booking slot?
Yes. On a Round-Robin or Team calendar, as long as multiple reps are assigned and available, GHL will keep that time slot open until all assigned reps are booked for that specific window.
Next Steps for Your Booking Setup
Once your slots are showing reliably, you can wire up automated lead tracking. If you need to sync appointments with external spreadsheets or tools, check our guide on how to push Google Sheets contacts to the GoHighLevel API with Apps Script.

