Embedded forms are hard to see
HubSpot forms are rendered by HubSpot's script, sometimes inside an iframe. GTM's built-in form trigger usually doesn't see them, so submissions go untracked or are tracked on button clicks.
This is for B2B and service businesses that capture leads with HubSpot forms and run Google or Meta ads to them. Form fills are only half the story: what matters is which leads become qualified and which become customers, and that lives in the HubSpot CRM. I track forms properly on your site and send lifecycle stages and deals back to Google Ads and Meta.
Proper HubSpot tracking means firing a lead event when a HubSpot form actually submits, saving click IDs and UTMs on the contact, and sending CRM milestones such as MQL, SQL and closed won back to Google Ads and Meta as offline or Conversions API events. Ad platforms then optimise for leads that turn into revenue, not just form fills.
The events I set up on HubSpot, and where each one is sent.
HubSpot forms are rendered by HubSpot's script, sometimes inside an iframe. GTM's built-in form trigger usually doesn't see them, so submissions go untracked or are tracked on button clicks.
HubSpot records original source, but the gclid or fbclid from the ad click often isn't saved on the contact. Without it, you can't upload offline conversions that Google Ads can match.
If the only conversion is a form submission, Google Ads and Meta chase volume. Spam and unqualified leads count the same as real buyers.
HubSpot's ads tool can sync events to Google Ads and Meta, and GTM may send the same form fill from the browser. Without a plan, leads are counted twice.
Meeting scheduler bookings and chat conversations don't behave like normal forms, so they're often left out of ad conversions altogether.
| Event | When it fires | Sent to |
|---|---|---|
generate_lead / Lead | HubSpot form reports a successful submission | GA4, Google Ads, Meta Pixel + CAPI |
book_appointment / Schedule | Meeting booked through the HubSpot scheduler | GA4, Google Ads, Meta |
contact_click | Click on a tel:, mailto: or WhatsApp link | GA4, Google Ads |
marketing_qualified_lead | Contact's lifecycle stage changes to MQL | Google Ads (offline), Meta CAPI |
sales_qualified_lead | Contact's lifecycle stage changes to SQL or an opportunity is created | Google Ads (offline), Meta CAPI |
closed_won / Purchase | Deal moves to closed won, with deal amount | Google Ads (offline), Meta CAPI, GA4 |
I review your forms, HubSpot tracking code, ads tool connections and lifecycle stages, and check what Google Ads and Meta currently count.
With your sales team we define which stages count as qualified and which deals count as won, and what each is worth.
I set up GTM, form success tracking and click ID capture, so every new contact carries the data needed for offline conversions.
I set up the stage-based events through HubSpot's ads tool or a custom workflow and server pipeline, then test with real contacts.
Once qualified-lead conversions are flowing, we decide when to make them the primary goal in Google Ads and Meta.
HubSpot forms tell the page when they've been submitted successfully. I listen for that signal and push a generate_lead event to the dataLayer with the form ID, which GTM sends to GA4, Google Ads and Meta. It works the same on HubSpot CMS pages and on a WordPress or custom site with embedded HubSpot forms, and it ignores submissions that fail validation.
At the same time, hidden fields or a small script save the gclid, fbclid and UTMs on the contact. That's what makes the offline step possible later.
HubSpot's ads tool can send CRM events, such as a contact becoming an MQL or a deal closing, back to connected Google Ads and Meta accounts. For many accounts that's enough, and it's the simplest route.
When you need more control, such as custom values, extra platforms or stages based on deal properties, I use HubSpot workflows to send stage changes to server-side GTM or the ad platforms' APIs. Either way, Google Ads matches the stored click ID and hashed email, and Meta matches the hashed customer data, so bidding can learn from leads that turned into revenue.
Listen for HubSpot's form submission success event in GTM and push a lead event to the dataLayer. Then fire GA4 and the Google Ads conversion from that event. GTM's built-in form trigger usually doesn't detect HubSpot forms.
Yes. HubSpot's ads tool can sync lifecycle stage events to Google Ads, and workflows or a custom pipeline can do the same with more control. The contact needs a stored click ID or hashed email for Google Ads to match it.
Yes, either through HubSpot's Meta connection or a custom server pipeline. Meta matches on hashed email, phone and other customer data, and the events can be used to optimise for qualified leads.
Start with form fills while the offline data builds up, then move to qualified leads or deals once there's enough volume. That keeps bidding stable while you shift it toward leads that actually buy.
HubSpot adds its own tracking code, but GTM is still the easiest way to manage GA4, Google Ads and Meta tags together. It goes in the site header HTML in HubSpot's website settings.
How to capture GCLID, store it in your CRM and send qualified leads and closed sales back to Google Ads so Smart Bidding optimises for real revenue.

How enhanced conversions use hashed email and phone data to recover conversions Google Ads would otherwise miss, with setup steps for GTM and leads.

Step-by-step GTM setups for tracking WhatsApp clicks, phone taps and form submissions in GA4, with event names, triggers and a testing checklist.
Get a free audit of your tracking and ad account. Usually replies within 1–2 hours.