Redirect a GoHighLevel Calendar to a Custom Confirmation Page

by Fahim

The default calendar confirmation screen in GoHighLevel is fine for basic setups, but it completely breaks real post-booking workflows. You can’t fire clean conversion pixels, you can’t show a prep video, and you miss the chance to qualify or onboard the lead before your call.

Worse, if you’re embedding calendars on external sites or relying on URL query parameters to personalize the next step, the default inline thank-you message traps everything inside an iframe. Here is how I configure custom thank-you redirects, pass appointment parameters cleanly, and fix the iframe trapping bug once and for all.

GoHighLevel calendar redirect setup code on a dark mode screen
GoHighLevel calendar redirect setup code on a dark mode screen

Why the Default Confirmation Breaks Analytics

By default, HighLevel swaps out the booking widget with an inline “Thank You” card without updating the browser URL. If you care about accurate attribution, this causes immediate headaches:

  • Zero PageView triggers: Any conversion tag set to fire on paths like /booking-confirmed never runs because the browser never actually navigates.
  • No URL parameters: You can’t pass the contact’s name, email, or appointment date to personalize the confirmation page.
  • Iframe trapping: When embedding the calendar widget on WordPress or Webflow, basic redirects often reload inside the tiny 400px iframe container instead of breaking out to the parent tab.

Fixing this takes about five minutes once you know where HighLevel hides the routing options and how the funnel builder handles calendar elements.

Method 1: Configuring Redirects Inside Calendar Settings

If you’re using standalone scheduling links (like direct api.leadconnectorhq.com URLs), configure the redirect right inside the calendar settings:

  1. Head to Settings > Calendars in your sub-account.
  2. Click the three dots next to your calendar and hit Edit.
  3. Open the Forms & Payment tab (or the Confirmation step, depending on your calendar view).
  4. Scroll down to the Confirmation Page section.
  5. Switch the toggle from Display thank you message to Redirect to an external URL.
  6. Enter your full destination URL, including the protocol (e.g., https://yourdomain.com/confirmed).
  7. Hit Save.

If you’re managing a sales team with multiple reps, check out our guide on how to set up a round robin calendar in GoHighLevel to make sure each rep’s availability maps cleanly to this same confirmation structure.

Method 2: Funnel Step Calendar Element Redirection

When your calendar lives on a native HighLevel funnel page, the page-level builder settings can override the calendar’s native redirect. I ran into this exact conflict on a client build where the calendar stubbornly ignored its own redirect URL.

In the Funnel Builder, HighLevel gives you two distinct redirect choices for calendar elements: Go to next step or Go to website URL.

Here’s how to set it up properly inside the editor:

  1. Open your booking page inside Sites > Funnels.
  2. Click directly on the Calendar element in the canvas.
  3. Look at the left-hand panel under General Settings.
  4. Under Redirect Action, select Go to next step if your thank-you page is the very next step in the funnel order.
  5. Otherwise, select Go to website URL and paste your custom destination URL.
  6. Save and publish your page.

If you hit broken routes after renaming your funnel steps, cross-check your setup with our guide on how to set up 301 URL redirects in GoHighLevel.

Passing Contact and Appointment Data in URL Parameters

Don’t send users to a generic, static thank-you page. You can pass booking details straight through the query string to personalize the page and feed your tracking tags dynamic data.

HighLevel supports merge fields inside the calendar redirect field. Here’s the URL query string structure I use across our client sub-accounts:

Add this URL format into your calendar redirect field:

https://app.yourdomain.com/booking-confirmed?first_name= { {contact.first_name}
}
&email= { {contact.email}
}
&phone= { {contact.phone}
}
&appointment_time= { {appointment.start_time}
}
&calendar_id= { {calendar.id}
}

Once the contact lands on your thank-you page, parse those parameters with vanilla JavaScript and drop their first name right into a headline.

Drop this script into the Tracking Code > Footer Code box on your confirmation page:

document.addEventListener('DOMContentLoaded', function() { const urlParams = new URLSearchParams(window.location.search); const firstName = urlParams.get('first_name'); const apptTime = urlParams.get('appointment_time'); if (firstName) { const greetingEl = document.getElementById('user-greeting'); if (greetingEl) { greetingEl.textContent = `Thanks for booking, ${firstName}!`; } } if (apptTime) { const timeEl = document.getElementById('booking-time-display'); if (timeEl) { const formattedDate = new Date(apptTime).toLocaleString(); timeEl.textContent = `Your call is confirmed for ${formattedDate}.`; } }
});

For more advanced data mapping in workflows and pages, take a look at our breakdown on how to create and use custom values in GoHighLevel.

Method 3: Escaping iFrames on External Websites (WordPress / Webflow)

If you embed a HighLevel calendar on an external site using an , setting an internal redirect URL often just reloads that tiny iframe window, leaving the parent page completely stuck.

HighLevel actually sends a native postMessage event to the parent window whenever someone books. We can listen for that event on the host page and force the entire browser window to redirect.

Add this snippet to your external site’s header or footer scripts (like Webflow Custom Code or WP Code Snippets):

window.addEventListener('message', function(event) { // Verify the event originates from HighLevel calendar booking completion if (event.data && (event.data.action === 'booking_success' || event.data.type === 'calendar_booked')) { const targetUrl = 'https://yourdomain.com/booking-confirmed'; // Check if appointment details were passed in message payload if (event.data.contact) { const email = encodeURIComponent(event.data.contact.email || ''); const name = encodeURIComponent(event.data.contact.first_name || ''); window.top.location.href = `${targetUrl}?email=${email}&first_name=${name}`; } else { window.top.location.href = targetUrl; } }
});

Targeting window.top.location.href ensures the main browser tab navigates to your confirmation URL instead of reloading inside the embed container.

Tracking Meta Pixel and Google Ads Conversions on the Redirect Page

The single biggest reason I switch to redirect pages is conversion tracking reliability. Scripts running inside iframes constantly run into browser privacy blocks (like Safari’s ITP).

Once visitors hit your custom confirmation page, you can fire tracking events in a clean first-party context. Per the Meta Pixel Standard Events documentation, you should trigger the Schedule event when a booking completes.

Here’s the snippet to place on your confirmation page:

 // Meta Pixel Schedule Event if (typeof fbq === 'function') { fbq('track', 'Schedule', { content_name: 'Discovery Call', status: 'confirmed' }); } // Google Tag Manager / GA4 Data Layer Event window.dataLayer = window.dataLayer || []; window.dataLayer.push({ event: 'appointment_scheduled', calendar_type: 'Sales Consultation' });

Check the Google Tag Manager Developer Guide if you’re routing these parameters into server-side containers or GA4 conversions.

Gotchas and Common Breakpoints I Fixed

Whenever a calendar redirect fails during testing, it’s usually due to one of these three issues:

  • Custom Form Conflicts: If your calendar uses a custom form selected under Form Settings, check that form’s submit action. While the calendar redirect usually wins, mismatched settings in older sub-accounts can cause the widget to hang on submission.
  • Sticky Contact Parameters: If you pre-fill calendar forms via query strings on the landing page (like ?email=test@example.com), make sure your redirect URL doesn’t generate duplicate query keys.
  • Timezone Rendering Glitches: If the calendar won’t even load open slots, see our guide on how to fix HighLevel calendar not showing available slots.

For official details on calendar forms and widget options, refer to the HighLevel Help Center Calendar Configuration Guide.

Frequently Asked Questions

Can I redirect to different pages based on form answers?

Not directly inside the single calendar redirect field. The workaround: attach a Custom Form to the calendar, set up an Automation Workflow triggered by Appointment Status: Confirmed, and use conditional branching to send tailored links via SMS or email.

Will the redirect work if I charge for appointments?

Yes. If Stripe is connected to your calendar, the redirect fires right after the payment intent succeeds.

Why does my calendar reload the same page instead of redirecting?

You probably forgot the https:// prefix. Without a protocol scheme, HighLevel treats the redirect string as a relative path and appends it to your current page URL.

Next Steps

With custom redirects and clean tracking set up, make sure your automated follow-ups are working just as reliably. If you need to capture leads who book after a missed call, check out our guide on replacing the default missed call text back with a custom GoHighLevel workflow.

all_in_one_marketing_tool