Redirect GoHighLevel Calendars to Custom Confirmation Pages

by Fahim

By default, GoHighLevel dumps leads onto a generic inline widget message right after they book a time slot. That default confirmation kills ad conversion tracking, blocks post-booking upsells, and makes your onboarding flow feel cheap.

Redirecting to a dedicated confirmation page fixes this immediately. Here is how I set up native calendar redirects, pass dynamic contact data through URL query parameters, bust out of embedded iframe traps on external sites like WordPress or Webflow, and avoid the nasty form-override race condition that burned me on a recent launch.

Configuring GoHighLevel calendar custom confirmation redirect and URL parameters
Configuring GoHighLevel calendar custom confirmation redirect and URL parameters

Method 1: Native Calendar Settings Redirect

The cleanest way to route a user to a custom confirmation page is right inside the calendar settings. If you share direct calendar links or use standard booking widgets, start here.

  1. Head to Settings > Calendars in your GoHighLevel sub-account.
  2. Click the three dots next to your calendar and hit Edit.
  3. Jump to the Confirmation (or Forms & Payment) tab.
  4. Scroll down to the Post-Booking Action section.
  5. Select Redirect to an external URL instead of Display thank you message.
  6. Paste your target URL (like https://app.yourdomain.com/booking-confirmed).
  7. Hit Save in the bottom right corner.

Once saved, any direct booking hit through the calendar URL (https://api.leadconnectorhq.com/widget/booking/...) will fire a redirect within roughly 400ms of booking confirmation.

Method 2: Funnel Step Calendar Redirection

If your calendar sits inside a GoHighLevel funnel page, you can either rely on the funnel’s built-in step progression or defer to the calendar’s native redirect. Managing this at the funnel level is usually cleaner when testing multi-step campaigns on a custom domain or subdomain.

Open your funnel step in the builder, click the Calendar element, and check the settings panel on the left:

  • Redirect Action: Set this to Go to Next Step if your custom thank-you page is simply the next step in the same funnel.
  • Custom URL: Use this if you need to punt users to a separate funnel, another sub-account, or an external web app.

If you leave the funnel element action unset or set to “Use Calendar Settings”, HighLevel just falls back to whatever redirect URL you configured in the calendar’s backend settings.

Passing Dynamic Lead and Appointment Data via URL Parameters

A static thank-you page is fine, but passing dynamic data lets you push clean dataLayer events to Google Tag Manager, personalize welcome screens, or pass user IDs down the funnel. You can append standard HighLevel contact merge fields right onto your redirect URL.

Here is what an expanded redirect URL looks like with HighLevel merge tags appended:

https://app.yourdomain.com/booking-confirmed?contact_id= { {contact.id}
}
&email= { {contact.email}
}
&name= { {contact.name}
}
&appointment_time= { {appointment.start_time}
}

When the lead submits the booking, GoHighLevel populates these merge tags on the fly. You can combine these parameters with custom values in GoHighLevel funnels to keep your redirect links consistent across multiple client accounts without hardcoding domain names.

For more complex tag combinations and fallback values, check out our guide on GoHighLevel merge fields and fallback configurations.

Handling the Embedded Iframe Trap (WordPress, Webflow, Custom Sites)

Here is a classic gotcha: if you embed a GoHighLevel calendar on an external site using an , the native redirect reloads your thank-you page inside the tiny iframe container. It looks broken, frustrates users, and breaks analytics pixels on the parent page.

To fix this, drop an event listener on the parent hosting page (Webflow, WordPress, Shopify, or plain HTML). GoHighLevel broadcasts a postMessage event to the window whenever an appointment completes.

Add this snippet right below your calendar embed code or inside your site’s header/footer scripts:

window.addEventListener("message", function(event) { // Validate origin if needed or inspect event payload if (event.data && (event.data.action === "appointment_booked" || event.data.type === "ghl-calendar-booked")) { const targetUrl = "https://yourdomain.com/thank-you"; // Optional: Extract params if passed in event data if (event.data.contactId) { window.top.location.href = `${targetUrl}?contact_id=${encodeURIComponent(event.data.contactId)}`; } else { window.top.location.href = targetUrl; } }
});

Using window.top.location.href forces the parent browser tab to break out of the iframe and navigate directly to your custom page.

Reading Parameters on Your Custom Confirmation Page

Once the lead lands on your confirmation page, you will probably want to grab their name or appointment time off the URL and fire conversion events. You do not need any heavy libraries for this—just use the standard MDN URLSearchParams API.

Here is a lightweight script you can drop into your confirmation page’s custom code block:

document.addEventListener("DOMContentLoaded", function() { const params = new URLSearchParams(window.location.search); const leadName = params.get("name") || "there"; const appointmentTime = params.get("appointment_time"); const email = params.get("email"); // Personalize a headline on the page if the element exists const headlineElement = document.getElementById("greeting"); if (headlineElement) { headlineElement.textContent = `Thanks, ${leadName}! Your spot is locked in.`; } // Push event to Google Tag Manager dataLayer window.dataLayer = window.dataLayer || []; window.dataLayer.push({ event: "ghl_booking_confirmed", lead_email: email, appointment_time: appointmentTime });
});

This script updates the page text immediately and packages the parameters for GA4, Meta Pixel, or whatever tracking stack you run.

The Form vs. Calendar Conflict (The Bug I Hit)

Here is a subtle bug that tripped me up for hours: when you link a custom Form to a Calendar under Calendar Settings > Forms & Payment, both elements can have conflicting redirect instructions.

If that custom form has its own On Submit redirect configured in the Form Builder, HighLevel hits a race condition. In my tests, the form redirect fired before the calendar finished writing the appointment record to the database. The result? A newly created contact record with zero appointment attached.

Here is how to avoid this bug entirely:

  • Inside Form Builder > Options, always keep the submission action set to Stay on page or Default message.
  • Let the Calendar Settings handle 100% of the post-booking redirect logic.
  • If you run into weird slot offset issues while testing across different locations, check our guide on how to fix GoHighLevel calendar timezone mismatches.

Validating Conversion Tracking and Pixel Fires

Before throwing live ad spend at your booking funnel, make sure your redirect does not cut off tracking beacons before they reach the server. An instantaneous redirect can abort pending network requests in Chromium browsers.

Here is how I verify tracking hits during QA:

  1. Open Chrome DevTools and switch to the Network tab.
  2. Check Preserve log so your requests do not wipe when the page redirects.
  3. Run a live test booking through your funnel.
  4. Filter the network log by collect (for GA4) or tr/ (for Meta Pixel).
  5. Verify the tracking request returned an HTTP 200 or 204 status before or during the thank-you page load.

For more details on native platform behavior, check the GoHighLevel Knowledge Base and the HighLevel API v2 Reference if you sync appointment payloads with external endpoints.

Frequently Asked Questions

Can I pass custom fields in the calendar redirect URL?

Yes. You can use any custom field key defined in your sub-account. If your custom field key is {{contact.company_size}}, just add ?company_size={{contact.company_size}} to the redirect URL string in your calendar settings.

Why is my redirect URL opening inside the embedded iframe box?

Standard calendar redirects do not break out of iframe boundaries on their own. You need to attach the window.addEventListener("message", ...) snippet shown above on the parent page so it can catch the booking message and trigger window.top.location.href.

Does the redirect action still send native GoHighLevel appointment confirmation emails?

Yes. Redirecting the front-end browser has zero impact on server-side workflows, email notifications, or SMS sequences. The booking trigger completes on HighLevel servers regardless of where the visitor gets redirected.

Can I redirect to different URLs based on the answers in the booking form?

Not natively within the calendar builder—it only accepts one static redirect URL. If you need conditional routing (like routing qualified vs unqualified leads to separate pages), inspect the URL parameters on your confirmation page with JavaScript to route them dynamically, or trigger an automated follow-up workflow based on custom field values.

Next Steps

Now that your calendar redirects cleanly and passes lead parameters, you can build out bulletproof automation flows. Check out our step-by-step tutorial on setting up GoHighLevel round robin calendars with two-way Google sync to manage multi-user team routing.

all_in_one_marketing_tool