Setting up Google Ads conversion tracking with the Dodo booking widget
Last updated: June 4, 2026
Step 1: Confirm the Dodo embed snippet is installed
The clinic website should use Dodo’s standard embed.js snippet for either the floating launcher or inline embed.
If the website is using a raw iframe or a direct portal link, ask Dodo for the current embed snippet before setting up GTM conversion tracking.
Step 2: Create a GTM Custom Event trigger
In Google Tag Manager:
Go to Triggers.
Click New.
Choose Custom Event.
Set the event name to:
dodo_widget_booking_completed
Save the trigger.
Step 3: Create the Google Ads conversion tag
In GTM:
Go to Tags.
Click New.
Choose Google Ads Conversion Tracking.
Enter the clinic’s Google Ads Conversion ID and Conversion Label.
Attach the dodo_widget_booking_completed trigger.
Save and publish.
By default, leave Transaction ID blank. Dodo does not expose booking IDs to the clinic website because those are sensitive operational identifiers.
Step 4: Optional dataLayer variables
If you want to segment or debug conversions, create Data Layer Variables for:
dodo_widget_agent_id
dodo_widget_display_mode
dodo_widget_appointment_count
For example, dodo_widget_display_mode can help distinguish inline embeds from launcher embeds.
Optional: fixed conversion value
If the clinic wants to send a fixed value per completed booking, set the value directly in the Google Ads Conversion Tracking tag.
Example:
Field | Value |
|---|---|
Value | 75 |
Currency | USD |
If the clinic wants to calculate value based on appointment count, use dodo_widget_appointment_count as a GTM Data Layer Variable and configure a GTM variable or tag value accordingly.
If you are not using GTM
GTM is the recommended setup.
If the clinic uses only gtag.js, the safest path is still to use the Dodo dataLayer event rather than listening directly to iframe postMessage events.
Use this only if GTM is not installed, and do not also configure a GTM conversion tag for the same conversion or the booking may be counted twice.
<script> (function () { window.dataLayer = window.dataLayer || []; function handleDodoDataLayerEvent(item) { if (!item || item.event !== "dodo_widget_booking_completed") { return; } if (typeof gtag !== "function") { return; } gtag("event", "conversion", { send_to: "AW-XXXXXXXXXX/YYYYYYYYY" }); } window.dataLayer.forEach(handleDodoDataLayerEvent); var originalPush = window.dataLayer.push; window.dataLayer.push = function () { for (var i = 0; i < arguments.length; i++) { handleDodoDataLayerEvent(arguments[i]); } return originalPush.apply(window.dataLayer, arguments); }; })();</script>
Replace AW-XXXXXXXXXX/YYYYYYYYY with the clinic’s Google Ads Conversion ID and Conversion Label.
Direct portal URL
If visitors are sent directly to portal.dodo.ai/<your-widget-id>, there is no clinic website parent page listening for widget events. That means client-side conversion tracking on the clinic’s domain is not available through dataLayer.
For paid acquisition, use an embedded mode instead:
Floating launcher
Inline embed
This keeps visitors on the clinic website and allows GTM to receive the booking-complete event.
How to verify it is working
After publishing the GTM setup:
Open GTM Preview mode.
Visit the clinic landing page with the Dodo widget installed.
Complete a test booking.
Confirm that dodo_widget_booking_completed appears in the GTM event stream.
Confirm that the Google Ads conversion tag fired on that event.
Check Google Ads under Goals → Conversions → Diagnostics.
Google Ads diagnostics may take some time to show new activity.
Common troubleshooting
If the conversion is not firing, check:
The website is using Dodo’s standard embed.js snippet, not a raw iframe.
The visitor is booking inside the embedded widget, not on a direct portal.dodo.ai link.
The GTM Custom Event name is exactly dodo_widget_booking_completed.
GTM is installed on the same page as the Dodo widget.
The Google Ads Conversion ID and Conversion Label are correct.
The test browser is not blocking Google tags.
Consent settings allow advertising conversions to be sent.
Privacy and HIPAA guardrails
Dodo’s parent-page dataLayer events are intentionally limited.
The booking-complete event does not expose:
Client name
Phone number
Email
Pet name
Free-text reason or symptom text
Appointment date or time
Doctor ID
Booking ID
Appointment type name or ID
Google ad click IDs such as gclid, gbraid, or wbraid
This prevents arbitrary scripts on the clinic website from reading sensitive booking details.
Dodo may still record backend web-session analytics for reporting and support, subject to Dodo’s normal security and privacy controls.
FAQ
Can this be used for Meta Pixel or other ad platforms?
Yes. The GTM event is platform-agnostic. Instead of firing a Google Ads conversion tag, the clinic can fire a Meta Pixel, LinkedIn Insight Tag, or another conversion tag from the same dodo_widget_booking_completed trigger.
Does the event include a transaction ID?
No. Dodo does not expose booking IDs to the parent website by default.
If transaction-level deduplication is required, contact Dodo support to discuss an approved server-side conversion setup.
Does the event include GCLID, GBRAID, or WBRAID?
No. Dodo may forward ad click identifiers into the widget session when present, but the default parent-page dataLayer event does not export those identifiers.
Google Ads attribution should rely on the Google tag and consent setup on the clinic website.
Will the event still fire if the website has a consent banner?
The Dodo dataLayer event can still be pushed, but whether Google receives the conversion depends on the clinic’s consent management setup, including Google Consent Mode.
If a visitor denies advertising consent, the Google Ads tag may not send the conversion. That is expected behavior.
Can Dodo support Enhanced Conversions?
Enhanced Conversions or server-side conversion uploads require additional legal, privacy, and implementation review. They are not enabled by default and are not added to the browser dataLayer payload by default.
Contact Dodo support if the clinic wants to scope this.