I once looked at a closed-won report for a $100K deal and saw "utm_term: (not set)" on the winning touch.
Nine months of a sales cycle. Six figures of closed revenue. Completely unattributed because auto-tagging dropped and nobody had UTM fallback.
That deal existed in Salesforce. It did not exist in Google Ads reporting. Bidding optimization was making decisions without it.
What GCLID actually is
When Google auto-tags a click, it appends a GCLID parameter to the URL. That GCLID is an encrypted string only Google can read. It maps the click to a specific keyword, ad, match type, and auction.
When you upload offline conversions back to Google, you reference the GCLID. Google matches it to the click and credits the conversion.
This works fine in simple environments. One person, one device, converts within 90 days.
In B2B it breaks constantly:
- User clicks on desktop, continues research on mobile
- 180-day sales cycle exceeds GCLID's storage window
- User clears cookies between first touch and form fill
- Corporate proxy strips URL parameters on the way through
When GCLID drops, Google gets no credit. The keyword that drove the pipeline is invisible.
What UTMs do instead
UTMs are plain-text parameters you control. They're not encrypted. Any tool in your stack can read them.
When you capture UTMs in a hidden form field at the moment of conversion, you own that data forever. It lives in Salesforce. It's in your BigQuery tables. It doesn't expire.
Yes, UTMs are less precise than GCLIDs. They don't capture match type or specific auction data the way GCLID does. But they survive:
- Device switches (if you're tracking by session or cookie across devices)
- Long sales cycles
- Cookie clears (because you captured them at form fill)
- Corporate proxy stripping (if you rebuild them server-side)
Run both
This isn't an either/or.
Keep auto-tagging on. Try to capture GCLID in a hidden field when possible. Upload offline conversions when you have GCLIDs.
But also: capture utm_source, utm_medium, utm_campaign, utm_content, and utm_term in separate hidden form fields on every contact form, demo request, and quote page you run.
When GCLID is present, use it. When it's not, use UTM data to reconstruct the source. You'll recover attribution on 20-30% of conversions that would otherwise show up as direct or untracked.
The setup
Hidden form fields. Five of them. Fire on page load. Grab from URL parameters.
If your forms are in HubSpot, Salesforce Web-to-Lead, or Pardot, they all support hidden field capture natively. It's a 30-minute implementation.
The fallback logic in BigQuery is also straightforward: when GCLID is null, join on UTM campaign + domain + time window.
Not perfect. Better than nothing. And "better than nothing" for a $100K deal is worth the 30 minutes.
Alex Langton
Senior B2B paid media manager · ~$650K/mo industrial spend
12+ years running B2B Google Ads accounts in industrial, manufacturing, and B2B e-commerce. Builds Langton Tools because generic PPC SaaS was never designed for the multi-MCC, complex- pacing, B2B-vocabulary reality of the accounts that actually drive industrial revenue.