Your Google Ads campaign drove the click. Someone filled in your contact form. Three days later, they became a paying client. Google Ads has no idea. Without GCLID capture, that lead is invisible to your campaigns — and your bidding strategy is flying blind.
GCLID (Google Click Identifier) is a unique parameter Google appends to every ad click URL. It looks like ?gclid=Cj0KCQjw.... When a visitor lands on your site from an ad and fills out your contact form, their GCLID links that ad click to the eventual conversion. No GCLID, no attribution. No attribution, no closed-loop optimisation.
Step 1: Enable Auto-Tagging in Google Ads
Before anything else, check this setting. Auto-tagging must be enabled in your Google Ads account settings before GCLID is appended to any landing page URL. If it’s off, no GCLID is generated — and no amount of form configuration will help.
Go to Google Ads → Settings → Account Settings → Auto-tagging → Enable. That’s it. One toggle. Most accounts have it on by default, but verify yours before proceeding.
Step 2: Add a Hidden GCLID Field to Your WordPress Form
The traditional approach captures GCLID by storing it in a hidden form field using a small JavaScript snippet. Here’s how to do it across the most common WordPress form plugins.
Contact Form 7
In your CF7 form, add this hidden field tag anywhere in the form:
[hidden gclid id:gclid_field]
Then add this JavaScript to your theme’s functions.php or via a plugin like Code Snippets:
function seresa_capture_gclid() {
?>
<script>
document.addEventListener('DOMContentLoaded', function() {
var gclid = new URLSearchParams(window.location.search).get('gclid') ||
localStorage.getItem('gclid');
if (gclid) {
localStorage.setItem('gclid', gclid);
var field = document.getElementById('gclid_field');
if (field) field.value = gclid;
}
});
</script>
<?php
}
add_action('wp_footer', 'seresa_capture_gclid');
Gravity Forms
Add a Hidden field to your form. Set the Default Value to {get:gclid} — Gravity Forms reads URL parameters natively. Store it in localStorage via the same JavaScript snippet above to handle multi-page journeys where the GCLID may no longer be in the URL.
WPForms
Use a Hidden Field. Under Advanced → Default Value, use the dynamic population option with parameter name gclid. Enable dynamic population in WPForms settings if not already active.
You may be interested in: Why Your WordPress Contact Form Is Already a First-Party Data Asset
Step 3: Store GCLID for Multi-Page Journeys
Here’s the problem: most contact forms aren’t on the landing page. A visitor clicks your Google Ad, lands on a service page, browses your case studies, then submits a form on a different page. By then, ?gclid=... is gone from the URL.
The localStorage approach in the code above solves this. When a visitor first lands with a GCLID, your script stores it in the browser’s localStorage. When they submit the form later — even on a different page — the script retrieves it and populates the hidden field.
This works across pages within the same session. It does not survive cleared browser data or new sessions.
Why Hidden Fields Fail (And What Replaces Them)
The hidden field method works well in ideal conditions. Conditions are rarely ideal.
GCLID is silently stripped by Safari ITP, misconfigured redirects, or form handlers that do not preserve URL parameters — making server-side capture the most reliable approach. (Conversios)
Safari’s Intelligent Tracking Prevention specifically limits or blocks certain URL parameters. Redirects between pages or through tracking middleware often drop query strings. And some WordPress caching and security plugins strip unrecognised URL parameters before they ever reach your JavaScript.
The result: a significant portion of your GCLID data is silently lost before it reaches the form. Your offline conversion import looks complete. Your attribution is not.
You may be interested in: Server-Side Lead Capture: Why Browser Tracking Fails Quote-Based Services
Step 4: Send GCLID to Google Ads as an Offline Conversion
Once your form is capturing GCLID, you need to send it back to Google Ads when the lead converts — or better still, when they become a client.
The Google Ads offline conversion import process works like this:
- Capture: Store GCLID + timestamp when the form is submitted
- Track: Record when the lead progresses to a paying client (your CRM, your booking system, your spreadsheet)
- Upload: Import a CSV to Google Ads (or use the API) with GCLID, conversion name, value, and date
Google Ads matches the GCLID to the original click and attributes the conversion. Your campaign now knows which ads drive actual revenue — not just form fills.
The Server-Side Alternative: Skip the Hidden Field Entirely
The hidden field approach puts the burden of GCLID capture on the browser — the very environment where Safari, ad blockers, and redirects conspire against you. Server-side capture flips this.
The Transmute Engine™ captures GCLID at the server level — no hidden form fields, no GTM dependency, no exposure to browser-side stripping.
When a visitor lands on your site from a Google Ad, the Transmute Engine’s inPIPE™ plugin records the GCLID server-side and associates it with the session. When the contact form fires, the GCLID is already stored — independently of whether the JavaScript ran, whether the user changed pages, or whether Safari decided to clean house.
The result is cleaner GCLID data, more complete offline conversion imports, and Google Ads campaigns that actually know what’s working. At $89–$259/month, it’s the only solution that handles GCLID capture, server-side event tracking, and multi-platform attribution in a single WordPress-native stack.
Key Takeaways
- Auto-tagging must be enabled in Google Ads before any GCLID is generated
- Hidden fields work for simple single-page journeys but break on redirects and Safari
- localStorage bridges multi-page journeys but is still browser-dependent
- Server-side capture is the only reliable method when browser-side conditions vary
- GCLID without offline conversion import is half the job — attribution is only complete when the lead outcome is sent back to Google Ads
No. Contact Form 7 does not capture GCLID automatically. You need to add a hidden field to your form and use JavaScript to read the GCLID from the URL and populate it. Alternatively, a server-side tracking solution like the Transmute Engine handles this without any form configuration.
The most common cause is that the visitor arrived on a page without the GCLID in the URL — either because the ad click redirected through another URL, because a caching plugin stripped the parameter, or because Safari ITP removed it. Using localStorage helps with multi-page journeys, but server-side capture is the only fix for browser-based stripping.
Google Ads accepts offline conversions up to 90 days after the original click. The GCLID itself does not expire, but if you upload after the 90-day window, the conversion will not be attributed to the campaign. Keep your upload schedule regular — ideally weekly or triggered by CRM stage changes.
No. GTM is one way to inject JavaScript that reads GCLID from the URL, but it’s not required. You can add the JavaScript directly to your theme or via a code snippets plugin. Server-side solutions like the Transmute Engine capture GCLID without any JavaScript dependency at all.
GCLID capture is the difference between Google Ads that learns and Google Ads that guesses. The hidden field method gets you started. Server-side capture keeps it working.


