Attribution

Short answer: Enhanced conversions for leads lets Google Ads match CRM outcomes to ad clicks using hashed email or phone captured on your form, not only the gclid. With HubSpot, you connect Google Ads, create lifecycle-stage conversion events such as SQL or Customer, and HubSpot sends the hashed match keys when the stage changes. Zoho needs a scheduled upload instead.

Enhanced conversions for leads with HubSpot and Zoho: sending qualified and closed stages back to Google Ads, cover

Most B2B Google Ads accounts I audit still optimise for a form submission. That teaches Smart Bidding to find people who fill in forms, which includes students, job seekers and competitors. The fix is to tell Google which leads became qualified and which became revenue. Classic offline conversion import does this with the gclid, and I have covered that route for WhatsApp leads and IndiaMART leads separately. Enhanced conversions for leads is the newer route: Google matches the CRM outcome to the click using hashed customer data from the form. This piece is about setting it up when the CRM is HubSpot, with notes on how the same idea works for Zoho.

What enhanced conversions for leads actually changes

With gclid-based import, you have to capture the click ID on the landing page, store it on the CRM record and send it back later. If the gclid is lost, because of a redirect, a cross-domain form, a consent choice or a lead that was edited manually, the conversion cannot be matched. Enhanced conversions for leads adds a second matching key. When the lead submits a form, the Google tag reads the email (and optionally phone) from the form, hashes it with SHA-256 in the browser and sends it to Google alongside the click. Later, when the lead becomes qualified in your CRM, you upload a conversion carrying the same hashed email. Google joins the two and credits the click. Google's API documentation describes the flow as uploading click conversions that contain normalised, hashed user identifiers. In practice I still capture the gclid as well, because sending both gives Google two chances to match. The important part is that the lead form step must be tagged first. If Google never saw the hashed email at the time of the click, there is nothing to join to later.

Prerequisites inside Google Ads

Before touching the CRM, three things need to be true in Google Ads. First, enhanced conversions for leads must be turned on in the account's conversion settings, and the customer data terms accepted. Second, the website needs the Google tag or a GTM setup that fires on the lead form submission with user-provided data enabled, so the hashed email is collected at the moment of conversion. I prefer to pass the email from a data layer push on a successful submit, rather than letting Google scrape the form automatically, because automatic detection breaks quietly when a developer renames a field. Third, you need conversion actions for the stages you plan to send, set to the import source rather than the website source. I create one per stage: Qualified lead, Opportunity, Closed won. Only one of them should be a primary goal for bidding at a time. The others stay secondary so you can see them in reporting without confusing the algorithm. If you are not sure your tag fires cleanly, fix that first; the pieces on GA4 event taxonomy and UTM discipline cover the hygiene side.

Setting it up in HubSpot

HubSpot has a native path. HubSpot's knowledge base article on creating ad conversion events describes connecting the Google Ads account under Marketing, Ads, then creating conversion events tied to contact lifecycle stages, which HubSpot syncs to Google using enhanced conversions for leads. The article lists a few conditions that catch people out. Only lifecycle stage changes that happen after you create the event are sent; it does not backfill. Each ad event needs the Included in account-level goals setting set to Yes for contact data to sync. And the contact needs to carry the click ID property or shareable contact data such as email. My usual mapping is Marketing qualified lead as a secondary signal, Sales qualified lead or Opportunity as the primary bidding event, and Customer as a secondary value check. Some vendors point out that the native sync works on contact lifecycle stages rather than deal stages, so if your real signal lives on the deal pipeline, I set a workflow that moves the contact's lifecycle stage when the deal reaches the stage you care about. Check which Marketing Hub tiers include the feature in your own portal, because HubSpot changes packaging.

Doing the same thing from Zoho CRM

Zoho CRM's built-in Google Ads integration is gclid based. Zoho's help documentation describes pushing conversions back when a lead is qualified or a deal is won within 90 days of the ad click, using the click ID captured by the web form. That works well when the gclid survives. For enhanced conversions for leads on Zoho, I have not found a native toggle that sends hashed email, so I treat it as an upload job. The pattern is a scheduled export or a Deluge function that pulls records which changed to the target stage, normalises the email (trim, lowercase), hashes it with SHA-256, and sends it with the conversion action name, time and value through the Google Ads API or a scheduled file upload. If you would rather not write code, tools such as Zapier or Make can do the hashing and upload, though I check carefully what data they store on their side. The full gclid workflow for Zoho, including stage mapping, is in the companion piece on Google Ads offline conversion import for Zoho.

Timing, values and the 63-day limit

Timing matters more than most teams expect. Google's offline conversion imports FAQ states that conversions carrying personally identifiable information for enhanced conversions are limited to no longer than 63 days, while a plain gclid is kept for 90 days. So if your sales cycle runs longer than about two months, a closed-won event matched only by hashed email may arrive too late. That is one reason I pick Opportunity or SQL as the primary bidding signal and treat Closed won as a reporting check. For values, I send a fixed expected value for each stage rather than leaving it blank, for example a modelled value for an SQL based on historical close rates and average deal size from your own CRM. When the deal closes, the Closed won conversion carries the real amount. Upload frequently, daily if you can, because Smart Bidding learns from fresh conversions and because late uploads shrink the time window you have left.

How I check it is working

After launch I look in three places. In Google Ads, the conversion action diagnostics show whether uploads are being received and what share are matched. A low match rate usually means the hashed email at form time and the hashed email at upload time do not agree, often because one side lowercased it and the other did not, or the CRM stores a different email from the one typed on the form. In HubSpot, I check that contacts moving into the target stage carry an email and, where available, the click ID property. And in the CRM itself, I compare the count of leads that reached the stage from paid search with the count Google reports. They will never match exactly, because not every lead came from an ad click and not every click is matchable, but a gap that keeps widening is a signal to investigate. Only after a few weeks of stable data do I switch the primary bidding goal from form submission to the qualified stage.

Sources

Google Ads Help, Offline conversion imports FAQs: https://support.google.com/google-ads/answer/10029210 . Google Ads API, Enhanced conversions for leads: https://developers.google.com/google-ads/api/docs/conversions/enhanced-conversions/leads . HubSpot Knowledge Base, Create and sync ad conversion events with your Google Ads account: https://knowledge.hubspot.com/ads/create-and-sync-ad-conversion-events-with-your-google-ads-account . Zoho CRM Help, Pushing data to Google Ads: https://help.zoho.com/portal/en/kb/crm/integrations/google/google-ads/articles/push-data-to-google-ads

FAQ

It is not strictly required, because Google can match on the hashed email, but I still capture it. Sending both gives Google two ways to match the conversion and keeps the setup working if one key is missing.

HubSpot's native ad conversion events are built on contact lifecycle stages. If your key signal is a deal stage, use a workflow that updates the contact's lifecycle stage when the deal reaches it, or send deal stages through a separate upload.

Google's offline conversion FAQ says gclids are kept for 90 days and enhanced conversions using personal data are limited to 63 days. Upload as often as you can and choose a primary stage that usually happens well inside that window.

Hashing protects the data in transit, but you still need a lawful basis and a clear privacy notice for sharing it with Google. Check your consent setup against the rules that apply to your users, such as the DPDP Act in India.

Read this article on your favourite platform

Ready to build the system?

If this describes your funnel, a 30-minute call will find where the constraint sits in your own numbers and what it would take to fix it.

It starts with a 30-minute call. Pick a time below.

Choose a time

Prefer email?