How to Track Leads From Google Ads All the Way to Closed-Won
Most accounts stop measuring at 'form submitted', so the bidding learns to buy cheap rubbish. Closing the loop to the CRM changes what the algorithm optimises for.

To track leads from Google Ads all the way to closed-won, you need three things the average account does not have: the Google click identifier captured on the landing page, that identifier stored on the lead record in your CRM, and a scheduled import that sends stage changes — qualified, opportunity, closed-won — back into Google Ads against the original click. Everything else is reporting. Those three things are what change how the auction bids on your behalf.
Most accounts stop measuring at "form submitted". That is the honest reason so many of them fill up with cheap, useless leads. Smart Bidding is very good at finding more of whatever you tell it is good, and if the only thing you tell it is good is a form submission, it will go and find the people most willing to fill in forms. Those people are not the same people as your customers.
Why "form submitted" is the wrong finish line
A form submission is a proxy. It stands in for a customer because it is easy to measure, it fires instantly, and it needs no cooperation from anyone in sales. Every one of those properties is also a reason to distrust it.
The gap shows up as a pattern I see in almost every account I audit. Cost per lead looks fine, sometimes excellent. The sales team says the leads are rubbish. Both statements are true at once, because the two teams are measuring different objects. The account is optimising a number nobody outside the account cares about.
It is worse than neutral. Bidding does not merely fail to improve lead quality, it degrades it over time, because the cheapest form fills are systematically the least qualified ones. Every week you run on a form-fill target, the algorithm gets better at the wrong job. The fix in those accounts is rarely a new structure or better copy. It is changing the conversion the account optimises towards, and then leaving it alone long enough to learn.
If your account also has spend going somewhere nobody has looked at recently, work through the one-hour audit for wasted Google Ads budget first. There is no point feeding better signal into a campaign that is buying the wrong queries.

The GCLID is the whole trick
The Google click identifier, or GCLID, is a parameter Google appends to your destination URL when auto-tagging is enabled on the account. It identifies one click. It is not a user ID, it is not a session ID, and it carries no meaning outside Google's systems.
That narrowness is exactly why it works. If you hold the GCLID against a lead record, you can later tell Google that this specific click produced a signed contract. Without it you can say "this lead came from paid search", which is a reporting fact and an operationally useless one, because the bidding cannot act on it.
Check auto-tagging is on before anything else. If somebody switched it off years ago to keep URLs tidy, or your landing pages strip query parameters on redirect, nothing downstream works and you will spend a week debugging the CRM instead of the two minutes it takes to find the real cause.
Capturing and storing the click ID
The mechanics are unglamorous and take an afternoon.
On the landing page, read the gclid parameter from the URL and write it to a first-party cookie with a lifetime that covers your sales cycle. Read the cookie back when the form renders, put the value in a hidden field, and post it with the rest of the submission.
const params = new URLSearchParams(window.location.search)
const gclid = params.get("gclid")
if (gclid) {
document.cookie = "gclid=" + gclid + "; path=/; max-age=7776000; SameSite=Lax"
}
Three details decide whether this survives contact with a real site.
Never overwrite a stored click ID with an empty one. A visitor clicks the ad, browses, leaves, comes back a week later by typing your domain, and submits. If the script clears the cookie on every page load, the click is lost at the last step.
Decide what happens on a second click. Someone who clicks two ads before converting has two click IDs. Last click is the default and the one the import expects, but make it a decision rather than an accident of code order.
Store it somewhere the CRM can query. A hidden field whose value lands in a free-text notes box is not storage. It needs to be a real field on the contact or deal record, because a scheduled export has to read it back later.
Capture campaign, ad group and keyword or asset group alongside it if you can. Google reconciles everything from the click ID on its side, but your own sales team cannot, and someone will eventually ask which campaign produced this quarter's pipeline without wanting to open the ads interface to find out.
The events before the lead still matter
Closing the loop to revenue does not mean you stop measuring the site. It means the on-site events change job. They stop being the optimisation target and become the diagnostic layer.
This site runs a first-party GA4 event layer in src/lib/analytics.ts that does exactly that. form_start fires on the first real interaction with the contact form. select_item records which service was chosen in the dropdown, which is the cleanest read we have on which offering pulls demand. form_submit fires on the attempt, generate_lead on success, and form_error on anything that stopped a submission, tagged with whether it was validation, the server or the network.
That last one earns its place. A spike of validation errors on one field tells you the form is losing people, not that demand fell. Without it, a broken field and a bad week look identical.
export const trackFormError = (reason: "validation" | "server" | "network", detail?: string) =>
track("form_error", { form_id: "contact", reason, detail })
generate_lead stays the conversion action campaigns import for volume. What changes is that it stops being the only thing the bidding hears.
Lead stages worth sending back
Sales teams invent stages endlessly. For the purpose of feeding an ad auction, four matter, and only two of them usually get imported.
| Stage | What it proves | Import it? |
|---|---|---|
| Contactable | The number or address is real and a human answered | Rarely, but track it — it exposes fake-lead problems fast |
| Qualified | A person decided this is a real prospect with a real need | Yes, this is the workhorse signal |
| Opportunity | A scoped conversation with a number attached to it | Sometimes, when qualified volume is thin |
| Closed-won | Money | Yes, with a value |
Contactable is the underrated one. You will rarely import it, but measuring it tells you within days whether a campaign is producing fictional leads: throwaway addresses, dead numbers, form-filler traffic. That is a targeting or placement problem, and it is completely invisible in a cost-per-lead report.
Qualified is the stage most accounts should optimise towards. It arrives within days rather than months, it reflects a human judgement rather than a click, and there is usually enough of it for the bidding to learn from. Closed-won is the honest target, but it arrives late and in small numbers, and on a long sales cycle it can be too sparse to train on by itself.
The rule I use: import the earliest stage a person has to make a judgement about, plus the stage where money moves.
Sending the stages back to Google
The mechanism is offline conversion import. You define a conversion action in Google Ads for each stage you intend to send, then upload rows containing the stored click ID, the conversion action name, the time the stage change happened, and a value where one exists. Google's documentation covers the accepted file formats, the required time format and the window within which a click stays eligible. Read it there rather than trusting a blog, including this one, because those details have changed more than once.
Where the click ID is missing, enhanced conversions for leads is the fallback. You upload hashed contact details instead of a click ID and let Google do the matching. It is a genuinely useful safety net for phone leads and for forms that predate your tracking work. It is not a replacement for capturing the click ID properly, because matching is never complete and you get no visibility into which records failed.
On cadence, a scheduled weekly upload beats a heroic monthly one. Stage changes should reach Google while the click is still eligible, and a weekly rhythm makes a broken export obvious in days rather than at the end of a quarter.
On values, send real ones. If you have a signed contract value, use it. If the deal is recurring, decide once whether you are sending first-year value or something closer to lifetime value, write that decision down, and never change it quietly — the bidding is learning a scale, and moving the scale mid-flight produces weeks of nonsense. A flat placeholder value on every won deal is better than nothing, because it at least separates won from lost, but it teaches the system nothing about which customers are worth more than others.

What changes once bidding learns from revenue
Expect three things, in this order.
Cost per lead goes up. Almost always. The system stops buying the cheapest submissions and starts buying clicks that resemble the ones that became customers. If your internal reporting still leads with cost per form fill, this looks like failure for several weeks. Agree the new headline metric with whoever reads the report before you make the change, not afterwards.
Volume dips, then recovers. Any change to the conversion action a campaign optimises towards restarts learning. Do not touch budgets, bids or targeting during that window, because nothing that happens will be attributable to anything.
The mix shifts, sometimes uncomfortably. Keywords and audiences that looked excellent on form fills can collapse once qualification is the target. That is the system telling you something the cost-per-lead report was hiding from you. Let it run before you intervene.
Then a quieter change. The conversations with sales get shorter, because both teams are finally looking at the same number and the argument about lead quality stops being a matter of opinion.
Where this usually breaks
Four failure modes account for most of it.
The CRM has no field for the click ID, so it lands in a notes box and nobody can export it. Fix the data model first. It is the cheapest step and everything else depends on it.
Nobody updates the stage. An import is only as good as the discipline behind it, and if deals sit in "new" for six weeks the signal never arrives at all. This is a sales process problem wearing a tracking costume, and no amount of engineering solves it.
Duplicate counting. The same person generates an on-site generate_lead, an imported qualified conversion and an imported closed-won, all three set as primary conversion actions, and the account triple-counts one lead. Decide deliberately which actions are primary and which are secondary, observation only.
Consent. If a visitor has not consented to advertising cookies, the click ID may not be available to store, and that is correct behaviour rather than a bug to engineer around. Measure your match rate honestly and plan around the gap instead of pretending it does not exist.
If there is no CRM to close the loop into
Then the tracking project is a systems project first, which is not a bad thing to find out early. A spreadsheet with a click ID column, a stage column and a date column is a legitimate starting point, and it will outperform an expensive CRM that nobody updates.
If the process is genuinely yours and no product fits it, that is one of the few honest reasons to commission custom software built around an existing workflow rather than bending the workflow around a product. We built HisaabKar, a multi-tenant invoicing platform, for a business whose payment allocation rules no off-the-shelf tool handled. The same test applies here: buy something unless the process is the thing that makes you money.
Do this in order
Confirm auto-tagging is on. Capture the click ID into a cookie, then into a hidden field, then into a real CRM field. Agree the two stages you will import and who is responsible for moving records into them. Create the conversion actions. Schedule the upload weekly. Leave the bidding alone for a full learning period. Then judge the account on cost per qualified lead and on closed revenue, and never again on cost per form fill.
If you run paid social alongside search, the same logic applies with different plumbing, and the trade-offs between the two channels are covered in Google Ads versus Facebook Ads for lead generation. The work is the same on Meta campaigns and on the search campaigns we manage: a platform can only optimise towards what you are willing to tell it.
The uncomfortable part of closing the loop is that it makes your account's real performance legible, possibly for the first time. That is the point. A campaign that looked good on form fills and produces no revenue is not one you want to keep funding, and until the money goes back into the system, you have no way of knowing which kind you have.
Frequently asked questions
- How do I track leads from Google Ads in my CRM?
- Turn on auto-tagging so Google appends a GCLID to every ad click, read that parameter on the landing page, store it in a first-party cookie, and write it into a hidden field on your contact form. The CRM then holds the click ID against the lead record, which is what lets you send stage changes back to Google later.
- What is a GCLID and why does it matter?
- The GCLID is the click identifier Google appends to a destination URL when auto-tagging is on. It is the only reliable key that ties a specific ad click to a specific person in your CRM. Without it stored on the record, you can report that a lead arrived from paid search, but you cannot tell Google which click became revenue.
- What is offline conversion import in Google Ads?
- It is the mechanism for sending a conversion that happened outside the website, such as a lead becoming a qualified opportunity or a signed deal, back into Google Ads against the original click. You upload the stored GCLID, a conversion action name, a timestamp and optionally a value. Google's documentation covers the accepted formats and the eligible time window.
- Which lead stages should I send back to Google Ads?
- Send the first stage that reflects a human judgement rather than a form submission, and the stage that reflects money. In most accounts that means qualified and closed-won. Sending every stage gives Smart Bidding overlapping signals about the same lead, and sending only closed-won often starves the campaign of volume while deals are still in progress.
- Will importing offline conversions change my cost per lead?
- Usually it rises, and that is the point. Once bidding optimises towards qualified leads or revenue instead of form fills, it stops chasing the cheapest submissions and starts paying more for clicks that become customers. Judge the change on cost per qualified lead and on pipeline, not on the raw cost per form submission.
About the author

Burhan Tahir
Founder & CEO
Founder of Devfinix, ten years in development, project delivery and client acquisition. Writes about what software projects really cost and why estimates miss.
Work with us
Want this done properly?
We build and market the things we write about. Tell us what you're working on and we'll give you a straight answer on how we'd approach it.
Start a ProjectRelated reading

Google Ads vs Facebook Ads for Lead Generation: How to Choose
Google captures demand that already exists. Meta creates demand for something nobody was searching for. Choose by which one your offer actually needs.

Wasted Ad Spend in Google Ads: A One-Hour Audit
Most wasted Google Ads budget is not exotic. It sits in seven places you can check before lunch, plus one nobody looks at: your own conversion tracking.

The Cost to Maintain a Website Per Year, Over Three Years
A site is not a purchase, it is a subscription to its own continued existence. Here is every line that shows up between launch and year three.
Newsletter
One useful email a month
What we learned shipping client work — the fixes that moved numbers and the ones that didn't. No pitches, and we stop the moment you ask.