HubSpot → Google Ads

Send closed deals back to Google with their real value, so your campaigns optimize for revenue instead of form fills.

Why this exists

Google optimizes for whatever you tell it is a conversion. If the only thing you send is "someone filled in a form", it will get very good at finding people who fill in forms — including the ones your sales team never hears from again.

Your CRM already knows which of those leads became customers, and for how much. This connector sends that back. When a deal is marked Closed Won in HubSpot, ZeroConfig uploads an offline conversion to Google Ads carrying the actual deal value, attached to the ad click that produced the lead in the first place.

Once Google can see that clicks on one campaign turn into $40,000 of signed business while another only produces tyre-kickers, it can bid accordingly.

Why we install a webhook

A deal is closed by a person inside HubSpot. There is no web page involved, no browser, and no tracking script running — so the edge worker that handles your website traffic never sees it happen. Something has to tell us.

A webhook is HubSpot calling us the moment a deal changes stage. We subscribe to one thing: deal stage changes. When the stage becomes one you've marked as Closed Won, we look up that deal and send the conversion.

The alternative would be polling — asking every customer's CRM every few minutes whether anything changed. That is slower, hits HubSpot's rate limits, and still misses the exact moment. Google also attributes conversions better the sooner they arrive. A webhook gets us there in seconds, and only when something has actually happened.

It's read-only and one-directional: HubSpot tells us a deal closed, and we never write anything back into your CRM.

What we read

When a deal closes, we read only what the conversion needs:

  • From the deal: amount, currency, close date and stage.
  • From the associated contact: the gclid (the Google click ID captured when they first landed) and their email address.

The email is hashed with SHA-256 before it leaves our server, so Google receives a fingerprint rather than the address itself. Deal names, notes, call recordings and everything else in HubSpot are never read.

Why we need write access

ZeroConfig asks for permission to write to your HubSpot account, and we'd rather explain that plainly than bury it in a permissions screen.

A closed deal can only be credited to an ad if the click ID travelled with the lead into your CRM. HubSpot has nowhere to put that value by default, so two things have to exist:

  • A contact property called gclid — a new field on the contact record, to store the click ID.
  • A hidden gclid field on your lead forms — so the value our script captures gets submitted with the form.

We create both for you when you connect, because making you add a property and then edit every form by hand is exactly the kind of setup this product exists to remove.

That is the entire extent of it. We add one new field and place it, hidden, on your forms. We never change the values on your contacts or deals, never create or delete records, and never touch anything a person typed.

Setting it up

Two clicks from you, and we handle the plumbing.

  1. Connect HubSpot. On the Tracking Matrix page, switch on the HubSpot card and click Connect, then approve access. We immediately create the gclid contact property and add it as a hidden field to your lead forms, so click IDs start being captured straight away.
  2. Tell us what winning looks like. Load your pipelines and select which stages mean Closed Won. Stages HubSpot already treats as won are marked with a star and pre-selected.
  3. Pick a Google Ads conversion. Use a separate conversion from your web leads — click "Create a revenue conversion" and we'll make one configured to accept the deal value. Sending closed deals to your existing lead conversion would count the same click twice and throw away the revenue figure.

Forms that aren't hosted by HubSpot are the one exception. If you collect leads through a custom form, add a hidden input named gclid to it and our script will fill that in too.

Checking that it works

You don't have to wait for a real deal. On the HubSpot card, paste the ID of any existing deal (it's the long number in the deal's URL) and click Send test. We replay that deal as though it had just been marked Closed Won, and the result appears on the Server Logs page within a few seconds.

In Google Ads, uploaded conversions show up under Goals → Conversions → your conversion → uploads. Errors appear there within about half an hour; attribution can take a few hours longer.

If a deal doesn't match

The Server Logs page shows a reason for every skipped deal. The usual causes:

  • The contact has no gclid. The lead arrived before you connected HubSpot, or didn't come from a Google ad at all. Our script fills forms embedded in your page; older HubSpot forms that render inside an iframe can't be filled from outside, so use the standard embed code for those.
  • The click is too old. Google only accepts offline conversions for clicks within its lookback window (90 days by default). Long sales cycles can outrun it.
  • The stage isn't selected. Only the stages you marked as Closed Won are sent. Deals moving into other stages are ignored on purpose.

Go to the Tracking Matrix to connect HubSpot