A client books fifteen calls a month through the Calendly embed on their landing page. Google Ads reports zero conversions. Nothing is broken in the way anybody is looking for: the tag is published, the conversion action is active, the campaign is spending, and the bookings are genuinely arriving. The form simply lives inside a frame that your tracking is not permitted to see into, and nothing on the page ever announces that a submission happened.
This is one of the most common tracking failures in lead generation, because embedded forms are everywhere. Calendly and HubSpot on service-business landing pages. Typeform and Jotform on anything built quickly. Scheduling widgets, quote calculators, application forms, insurance quoters, finance pre-qualification tools. Any time a marketer can paste a snippet instead of waiting for a developer, somebody does, and the tracking consequences arrive silently.
What an embedded form actually is
When you paste an embed snippet, you are not adding a form to your page. You are adding a window onto somebody else’s page. The frame loads a document from the provider’s domain, and that document contains the form, the submit button, the validation and the confirmation screen.
Browsers enforce a hard boundary between documents from different origins. Your page cannot read the contents of that frame, cannot attach event listeners to anything inside it, and cannot find out what the user typed or clicked. This is not a limitation of your tag manager. It is the security model the whole web rests on, and it is doing exactly what it should.
So when somebody submits the embedded form, every mechanism you normally rely on is blind to it.
Every usual trigger fails, for a different reason
- The URL never changes. The frame navigates to its own confirmation screen. The address bar of the parent page is untouched. Any conversion trigger that watches for a thank you URL is waiting for something that will not happen.
- Form submission triggers see nothing.Tag Manager’s form submission trigger listens for submit events in the document it was loaded into. The form is in a different document. There is no event to catch.
- Click triggers catch the wrong thing. You can detect a click that lands in the general area of the frame, but you cannot tell whether it hit the submit button, a date, a dropdown, or empty space. A click trigger here fires on curiosity, not on conversion.
- Element visibility triggers cannot find the element. The confirmation message exists, but it exists inside the frame, where your selector cannot reach it.
The result is a conversion action that is correctly built and permanently empty, which is the single hardest state to diagnose, because every tool you would normally reach for reports that everything is fine.
The workarounds people reach for, and what each one costs
Faced with this, most accounts end up with one of four improvisations. It is worth knowing what each one actually measures, because three of them quietly poison your bidding data.
- A click anywhere on the frame. Now your conversion count includes everyone who opened the widget, looked at the calendar, and left. On a scheduling embed this can be five to ten times the real booking volume, and Smart Bidding will faithfully optimise toward people who browse availability and do not book.
- A time-on-page threshold. Counts readers. Correlates with interest, not with submission. It is the least defensible number you can put in a client report.
- A scroll depth or engagement proxy. Same problem, dressed better.
- A redirect to your own thank you page. This one actually works, and it is covered below.
If you inherit an account where the only lead conversion is a click on an embed, treat the entire conversion history as unreliable rather than as a baseline. It is measuring a different thing from the one everybody has been reporting on.
The real fix: the provider is already announcing it
Here is the part that gets missed. The browser stops you reading into the frame, but it does not stop the frame talking to you. There is a sanctioned channel for exactly this, and the serious embed providers all use it: the frame posts a message to the parent window when something notable happens, and your page listens for it.
The shape of the fix is the same everywhere. Add a listener for the provider’s event, check the message really came from the provider, and push an event into the data layer. Then fire your conversion tag from a custom event trigger matching that event name. Tag Manager’s own documentation for the custom event trigger shows this pattern, including passing a conversion value along in the same push, which is useful when different form types are worth different amounts.
Calendly
Calendly publishes four events, and the one you want is the scheduled event, named calendly.event_scheduled. The others cover the profile page being viewed, an event type being viewed, and a date and time being selected, which are genuinely useful as funnel steps if you want to see where bookings stall.
There is a critical catch in Calendly’s own documentation, and it is the reason this fails for so many people who think they have implemented it. A plain iframe embed does not support event tracking through postMessage. If the snippet on the page is a raw iframe tag, there are no events to listen for, no matter how correct your listener is. You have to use their JavaScript embed instead. Check which one is on the page before you write a line of tracking code, because the two look interchangeable and are not.
HubSpot
HubSpot forms built in the updated editor emit global form events that you attach to with a standard window event listener. The one that matters is hs-form-event:on-submission:success, which fires on a successful submission. There is a matching failure event, and a ready event for when the form has loaded.
One timing detail from their documentation is worth respecting: listeners for the ready event need to be defined on the page before the embed code runs, or you miss them. More generally, if your listener is installed by a tag that fires late, you can miss early events entirely, which produces the worst kind of bug, the intermittent one.
Everything else
Typeform, Jotform, Chili Piper, Acuity, Paperform and the rest all publish embed documentation with their own event names and their own JavaScript library. Do not guess at the event name and do not copy it from a blog post. Open the provider’s current developer documentation, find the submission or completion event, and implement that. These names change between major versions of an embed library, which is its own silent breakage: the provider ships a new widget, your listener matches an event name that no longer exists, and conversions go to zero with nothing else changing.
The redirect option, and when to prefer it
Most embed providers can redirect to a URL of your choice after a successful submission. If you point that at a thank you page on your own domain, the entire problem disappears. There is a real document load, on your own site, with your own tags on it. Everything works the ordinary way.
This is the right choice when you do not have development help, when the embed is the only conversion on the account, or when several people will maintain the site over time. It is more robust than a listener because it does not depend on an event name staying stable.
Two things to watch. Keep the thank you page out of search results and confirm it does not get bookmarked and revisited, or you will start counting reloads as conversions. And make sure the redirect is not stripped the next time somebody re-pastes the embed snippet from the provider’s interface, which is how this quietly reverts.
Testing it the way a user does
The failure mode here is particularly good at surviving a casual test, so be deliberate.
- Load the landing page fresh, as a visitor would, with your debug tooling open.
- Complete a genuine submission end to end inside the embed. Book the call. Submit the form. Do not stop at the last step.
- Confirm your data layer event appeared, and that the conversion tag fired once, on that event and not on the click before it.
- Submit a second time and confirm you get exactly one more conversion, not three.
- Check the provider’s own record. If the booking is in Calendly or the submission is in HubSpot but no conversion was recorded, your listener is not firing, whatever the preview told you.
That last step is the one people skip, and it is the only one that compares the two systems that are supposed to agree.
Why nobody notices
Because the business is working. Calls are being booked. The client is busy. Nobody files a complaint about tracking when the phone is ringing, and the marketing report shows a cost per conversion that is either absurdly good or absurdly bad in a way that gets blamed on the channel rather than on measurement.
It is also a problem that arrives with a small, innocent change. A client swaps their old form for a scheduling embed because booking straight into the calendar converts better, which it usually does. The business improves and the measurement collapses in the same afternoon, and the two events are never connected because one was a marketing decision and the other was a technical consequence nobody mentioned.
Our free tracking scan reads the public source of a page and the published container in about thirty seconds, so it will show you the embed and the tags alongside it, including a conversion tag wired to a URL that no longer corresponds to anything. What it cannot do is submit the form for you, so whether the conversion fires for a real booking is still the live test above.
And when an embed provider ships a new widget version, the break looks like nothing at all. Taglert rechecks every connected account every thirty minutes and emails you when conversion tracking changes, so a conversion action that has quietly stopped recording does not get discovered in a quarterly review.
Our page on Google Ads conversion tracking monitoring covers how that check runs across every account you manage.
Sources
Stop finding out about broken tracking from your client.
Taglert monitors your pixels and conversion tracking 24/7 and alerts you the moment something breaks.
Start your free trial- First scan in ~5 minutes
- 30-day money-back guarantee
- No credit card
