Articles on: Integrations

Tracking Ad Conversions from Appointment Bookings

Tracking Ad Conversions from Appointment Bookings


Track when customers book appointments so you can measure the effectiveness of your advertising campaigns in platforms like Meta (Facebook/Instagram), Google Ads, or Google Analytics.


Note: There are two ways to set this up. The post-booking redirect just needs a thank-you page on your website with your ad platform's standard tracking tag—no coding required. The postMessage event approach is more flexible but requires embedding the scheduler and editing your website's code, so you'll likely need to involve your web designer or developer. Feel free to share this article with them directly—the technical details they need are included below.


Overview


What This Enables


When a customer books an appointment through the CloudBridal scheduler, your advertising platforms can be notified that a conversion occurred. This allows you to:


  • See which ads are driving actual bookings (not just clicks)
  • Optimize your ad campaigns based on real results
  • Calculate your true return on ad spend


Two Ways to Track


  1. Post-booking redirect (simplest). Configure a redirect URL on the appointment type, and CloudBridal sends customers to a page on your website (e.g. a thank-you page) after they book. Your normal page-based conversion tracking fires there—no custom event code needed. This is the only option that also works for direct go.cloudbridal.com booking links. See Post-Booking Redirect below.
  2. The appointment-booked postMessage event (most flexible). Your booking page listens for a JavaScript event from the embedded scheduler and fires conversion tracking without navigating away. Requires the scheduler to be embedded on a page you control, plus custom listener code.


What's Required (for the postMessage approach)


  1. A page on your website with the scheduler embedded. The event-based approach only works when the scheduler is embedded on your own website, because it requires adding code to the page where bookings happen. (For direct go.cloudbridal.com links, use the post-booking redirect instead.)
  2. The Advanced embed code. You can find this in CloudBridal under Settings → Appointments → Appointment Scheduler Links → Option 3 (Advanced).
  3. Your advertising platform's tracking code. This is separate from CloudBridal. You'll get this from Meta, Google, or whichever platform you're using.


Do I Need a Developer?


For the post-booking redirect: no. If you can create a page in your website builder and add your ad platform's standard tracking tag to it, you can set this up yourself—see Post-Booking Redirect below.


For the postMessage approach: probably yes, unless you're comfortable editing HTML and JavaScript. The good news is that this is a relatively straightforward task for most web developers or designers who work with code. Here's what to tell them:


"I need to embed our appointment scheduler on a booking page and add conversion tracking. The scheduler sends a JavaScript postMessage event when someone books. I have documentation that explains the event format and includes code examples."


Then share this article with them.



Technical Implementation Guide (postMessage Approach)


The following sections are written for developers and contain the technical details needed to implement event-based tracking. If you're using the post-booking redirect instead, skip to Post-Booking Redirect.


How It Works


When a customer completes a booking through the embedded scheduler, CloudBridal dispatches an event using the browser's postMessage API. Your page listens for this event and triggers conversion tracking in response.


Event Data Structure


The appointment-booked event includes the following properties:


Property

Type

Description

type

string

Always "appointment-booked" for completed bookings

appointmentGuid

string

Unique identifier for the booked appointment

appointmentType

string

Name of the appointment type (e.g., "Bridal")

status

string

Appointment status: "Pending" or "Confirmed"

value

number

Appointment fee if applicable, otherwise 0

forWaitlist

boolean

true if this is a waitlist request rather than a confirmed booking

referrer

string

(Optional) The referrer URL if available from the booking source


Example event data:


{
"type": "appointment-booked",
"appointmentGuid": "3u30xPWTbEqy44ahFfGRgg",
"appointmentType": "Bridal",
"status": "Pending",
"value": 0,
"forWaitlist": false
}


Step 1: Embed the CloudBridal scheduler in your booking page


Add the iframe code available in CloudBridal under Settings → Appointments → Appointment Scheduler Links → Option 3 (Advanced).


Step 2: Add Conversion Tracking


Add an event listener that fires conversion tracking code when a booking is completed. The basic pattern looks like this:


<script>
window.addEventListener(
'message',
function (event) {
// Ignore events that aren't appointment bookings
if (!event.data || event.data.type !== 'appointment-booked') return;

// Optional: Skip waitlist requests
if (event.data.forWaitlist) return;

// {Conversion tracking code goes here}
},
false
);
</script>



Alternative: Post-Booking Redirect (No Event Code Required)


If you'd rather not write postMessage listener code, configure a Post-Booking Redirect URL on the appointment type in CloudBridal under Settings → Appointments → Appointment Types → (edit a type) → Advanced. After a customer completes a booking, the scheduler navigates to that URL instead of showing the booking success message.


Point it at a thank-you page on your website that includes your ad platform's standard page-view or event tracking, and conversions are attributed the same way as any other landing-page conversion.


Requirements and behavior:


  • Embedded schedulers need the current Advanced embed script (re-copy it from Appointment Scheduler Links if your embed predates this feature). Older embed scripts will show the booking success message instead of redirecting.
  • Direct go.cloudbridal.com links redirect without any additional setup—this is the recommended way to track conversions for direct links.
  • The redirect fires only for new bookings—not for edits, cancellations, or reschedules. Waitlist joins never redirect: no appointment slot was actually reserved, so the customer sees CloudBridal's waitlist message (which explains they'll be contacted if a slot opens) instead of your thank-you page. This also means waitlist joins never inflate your conversion counts.


Data Appended to the Redirect URL


CloudBridal appends the booking details to your redirect URL as query parameters:


Parameter

Description

cb_status

Appointment status: Pending or Confirmed

cb_value

Appointment fee if applicable, otherwise 0

cb_appointment_type

Name of the appointment type (e.g., "Bridal")

cb_appointment_guid

Unique identifier for the booked appointment


For example, a redirect to https://yoursite.com/thank-you might arrive as:


https://yoursite.com/thank-you?cb_status=Confirmed&cb_value=25&cb_appointment_type=Bridal&cb_appointment_guid=3u30xPWTbEqy44ahFfGRgg


Your thank-you page can read these to filter conversions (e.g., only count cb_status=Confirmed) or pass the value and transaction id to your ad platform.



When customers reach the scheduler through a direct link that carries ad platform parameters (e.g. go.cloudbridal.com/...?gclid=...&utm_source=...), CloudBridal forwards those parameters onto the redirect URL: utm_* parameters and common click ids (gclid, gbraid, wbraid, dclid, fbclid, msclkid, ttclid, li_fat_id, epik). This lets your thank-you page's tracking tags attribute the conversion to the original ad click even though the booking itself happened on the CloudBridal domain.



Platform-Specific Examples (postMessage Approach)


Below are examples for common tracking platforms using the appointment-booked event. Replace placeholder values (like AW-XXXXXXXXXX) with actual account and conversion IDs from the client's advertising accounts.


Meta Pixel (Facebook/Instagram)


<script>
window.addEventListener(
'message',
function (event) {
if (!event.data || event.data.type !== 'appointment-booked') return;
if (event.data.forWaitlist) return;

if (typeof fbq !== 'undefined') {
fbq('track', 'Schedule', {
content_name: event.data.appointmentType || 'Appointment',
value: event.data.value || 0,
currency: 'USD',
});
}
},
false
);
</script>


Google Ads


<script>
window.addEventListener(
'message',
function (event) {
if (!event.data || event.data.type !== 'appointment-booked') return;
if (event.data.forWaitlist) return;

if (typeof gtag !== 'undefined') {
gtag('event', 'conversion', {
send_to: 'AW-XXXXXXXXXX/YYYYYYYYYY',
value: event.data.value || 0,
currency: 'USD',
transaction_id: event.data.appointmentGuid,
});
}
},
false
);
</script>


Google Analytics 4 (GA4)


<script>
window.addEventListener(
'message',
function (event) {
if (!event.data || event.data.type !== 'appointment-booked') return;
if (event.data.forWaitlist) return;

if (typeof gtag !== 'undefined') {
gtag('event', 'appointment_booked', {
appointment_type: event.data.appointmentType,
appointment_id: event.data.appointmentGuid,
status: event.data.status,
value: event.data.value || 0,
currency: 'USD',
});
}
},
false
);
</script>


Combined Example (Multiple Platforms)


For tracking across multiple platforms simultaneously:


<script>
window.addEventListener(
'message',
function (event) {
if (!event.data || event.data.type !== 'appointment-booked') return;
if (event.data.forWaitlist) return;

// Meta Pixel
if (typeof fbq !== 'undefined') {
fbq('track', 'Schedule', {
content_name: event.data.appointmentType || 'Appointment',
value: event.data.value || 0,
currency: 'USD',
});
}

// Google Ads
if (typeof gtag !== 'undefined') {
gtag('event', 'conversion', {
send_to: 'AW-XXXXXXXXXX/YYYYYYYYYY',
value: event.data.value || 0,
currency: 'USD',
transaction_id: event.data.appointmentGuid,
});
}

// Google Analytics 4
if (typeof gtag !== 'undefined') {
gtag('event', 'appointment_booked', {
appointment_type: event.data.appointmentType,
appointment_id: event.data.appointmentGuid,
status: event.data.status,
value: event.data.value || 0,
currency: 'USD',
});
}
},
false
);
</script>



Tips & Best Practices


Create a dedicated booking page. A dedicated page like yoursite.com/book-appointment lets you add helpful context around the scheduler—such as a map, parking instructions, cancellation policy, or what to expect. It also keeps customers on your website for a more seamless experience.


Test before launching campaigns. Verify that events are firing correctly using browser developer tools or platform debugging tools (Meta Pixel Helper, Google Tag Assistant) before spending money on ads.


Consider filtering by status. To track only confirmed appointments (not pending), add a status check:


if (event.data.status !== 'Confirmed') return;


Handle waitlist requests appropriately. Waitlist requests also trigger the appointment-booked event with forWaitlist: true. Decide whether these should count as conversions for your campaigns.



Troubleshooting


Events aren't firing: Ensure the tracking platform's base code (Meta Pixel, Google tag, etc.) is installed and loads before the booking completes. Check the browser console for errors.


Iframe not displaying: Verify the clientGuid is correct and that ad blockers or browser security extensions aren't interfering.


Conversions not appearing in reports: Reporting dashboards often have a delay of several hours or more. Also confirm that the conversion action is properly configured in the platform's settings.

Updated on: 02/07/2026

Was this article helpful?

Share your feedback

Cancel

Thank you!