Smart bidding does exactly what you tell it to, and that’s the problem. In almost every B2B account I’m handed, the thing it has been told to maximize is a form fill, and form fills in B2B vary in value by orders of magnitude. A demo request from a four-thousand-seat enterprise and a whitepaper download from a student writing a dissertation arrive in the same column, carrying the same weight.
So the algorithm goes and finds more of the cheapest ones. That isn’t a malfunction. The system’s working correctly against a badly specified objective. A target cost per acquisition is a constraint, and the cheapest route to satisfying it runs through the queries and placements that produce low-intent volume (job seekers, competitors, students, four-person companies in markets you don’t sell to). The account gets more efficient every month by its own reporting and less valuable by the CRM. That gap shows up in pipeline eventually, and pipeline is the number the c-suite reads.
Offline conversion import is how you stop it. You tell the platform which form fills became pipeline, so the bidder learns to buy the leads sales wants rather than the cheapest ones to acquire.
How offline conversion import works in Google Ads
When somebody clicks a Google Ads ad with auto-tagging on, Google appends a GCLID to the landing page URL. That string is the identity of that click, and everything downstream depends on capturing it and keeping it attached to the right person.
- Capture the GCLID on landing. Read it from the query string and persist it in a first-party cookie with a lifetime covering the gap between click and form. Store a first-touch and a last-touch value.
- Write it into every form. A hidden field on submission, mapped to a custom field on the lead or contact record. Every form. That’s where it usually breaks.
- Fire the upload at a stage that means something. Sales accepted, opportunity created, closed won. The payload carries the identifier, the conversion action name, the timestamp, a value and a currency.
- Deliver it by integration or by schedule. Salesforce and HubSpot both have native Google Ads connections, and otherwise it’s a scheduled job through the API or a file through Google Ads Data Manager. What matters is that somebody’s monitoring it.
- Configure the receiving conversion action. Create it as an import conversion and decide deliberately whether it counts toward the Conversions column bidding uses. Don’t let that default happen to you.
The same pattern exists elsewhere with different plumbing. Microsoft Advertising uses MSCLKID. LinkedIn uses li_fat_id, which its own documentation describes as a first-party click ID appended to landing page URLs once enhanced conversion tracking is on, persisting for 30 days from the last ad click and usable as a match identifier in the Conversions API. That window matters, because LinkedIn Ads is often where the expensive, high-intent leads come from and where a bad signal costs most. Meta works from fbclid, or from the lead ID for lead ads.
One wrinkle on iOS traffic. Google sometimes supplies gbraid or wbraid in place of a GCLID, and gbraid, in Google’s own words, measures conversions in a non-unique fashion (like a campaign ID) without linking them to individual users or events. It’s case sensitive too, so anything in your pipeline that tidies strings into upper case destroys the match. You can upload with it. You can’t join it to one lead record the way you can a GCLID.
Why you should send conversion values rather than counts
The first version most teams ship imports a binary event: this lead qualified, that one didn’t. Better than nothing, but not the ideal.
A staged value model is the ideal. Give each funnel stage an expected value equal to its historical probability of reaching closed won multiplied by average contract value. With round illustrative figures rather than anybody’s real ones: if one in eight sales-accepted leads closes and first-year contract value averages 30,000, a sales-accepted lead is worth 3,750 as a bidding signal.
Staged values beat a binary flag twice over. The signal arrives earlier, because you import at the first meaningful stage instead of waiting for revenue, and it’s continuous, so the bidder can tell a good lead from an excellent one.
Send a value for the bad leads too. A disqualified lead uploaded at zero is information, and one never uploaded at all is indistinguishable from an integration failure.
The bidding algorithm isn’t optimizing your pipeline. It’s optimizing the definition of success you handed it, and in most B2B accounts that definition is a form.
Lookback windows and sales cycles longer than the window
Google only accepts an imported conversion if the originating click sits inside the window it allows, and the window depends on the method. Google’s import guidelines say conversions uploaded more than 90 days after the associated last click won’t be imported, and that for enhanced conversions for leads the limit is 63 days. Check both against current documentation rather than numbers somebody wrote in an article.
B2B sales cycles routinely outlast either. Six to nine months from first touch to closed won is unremarkable in enterprise software, so importing closed won and watching most rows bounce isn’t a plan.
Import the earliest milestone that’s both reliably inside the window and correlated with revenue (sales-accepted lead, first meeting held, opportunity created), valued by its historical conversion rate to revenue. You’re deliberately handing the bidder a proxy it can receive in time to learn from. Then revalidate it, because when sales raises its qualification bar the value you’re feeding the bidder goes wrong and nothing in either system mentions it.
The conversion volume threshold nobody mentions in the setup guide
Smart bidding learns from density of signal as much as quality of signal. Google’s own guidance on Target CPA is softer than the folklore around it. Google recommends measuring performance over a period containing at least 30 conversions, and says plainly that advertisers can start with no conversion history. So treat 30 conversions in 30 days as the point where you can evaluate the thing rather than a hard learning floor. The direction of the problem doesn’t change either way.
Illustrative arithmetic. Filter a hundred monthly form fills down to eleven sales-accepted leads and you’ve improved the signal’s quality while destroying its density. The account can get worse.
The mitigations, in the order I’d try them:
- Consolidate campaigns so signal pools instead of scattering across fourteen thin ad groups.
- Use a portfolio bid strategy so campaigns share a learning pool.
- Import the mid-funnel milestone rather than the late one.
- Keep the raw form fill as a secondary, non-bidding conversion for diagnostics.
If none of that reaches workable density, the honest conclusion is that the account isn’t big enough for value-based bidding yet, and you shape demand with targeting and negatives instead. That comes out of audits more often than the vendor documentation implies.
Enhanced conversions for leads as a fallback when GCLID capture fails
GCLID capture fails more often than anyone expects, and that failure often goes unnoticed. Enhanced conversions for leads is the alternative. Rather than a click ID, you send hashed customer data collected at form submission, which Google matches against signed-in Google Accounts that engaged with your ad.
The advantage is that it removes your dependency on URL plumbing surviving a marketing site, a CMS, a modal, a chat widget and two redirects. The trade is a dependency on people giving you a real address and on Google achieving a match, so ask to see the match rate rather than assuming one. Google’s own guidance is to include GCLIDs with uploaded events wherever possible, which is the same conclusion from the other direction. Where possible I build both, with the click ID as the primary key and the hashed address as the fallback.
Consent mode and the number that will never reconcile
In the EEA and UK, consent mode governs whether you may pass advertising identifiers at all. Google defines ad_user_data as consent for sending user data to Google for advertising purposes, and advertisers have to collect that consent from end users in the EEA and share the signal. Where it’s denied there’s no identifier to store, and you shouldn’t be uploading a hashed address for advertising purposes either.
Google models part of the gap, and the modelling has its own floor: consent mode modelling needs 700 ad clicks over a seven day period per country and domain grouping. Below that, the unconsented conversions aren’t there.
So imported conversion counts sit permanently below CRM counts, and nobody should be reconciling the two to zero. Decide early which system is the record for the board, then put the gap on the dashboard where people see it rather than discover it later.
The offline conversion tracking failures I actually find
Most accounts I open have already built this. It’s usually broken one of these ways, and nobody knows.
- The GCLID is captured on one form. The main demo request works perfectly. The gated report on the resources subdomain, the third-party webinar registration and the pricing modal all drop it. Half the pipeline never gets credited, and the bidder learns confidently from the other half.
- Lead records get overwritten on re-submission. Somebody downloads three assets over two months, the field updates each time, and the credited click ends up being the last one before the form rather than the one that started anything. Worse, deduplication merges two records and the field comes out empty.
- Sales stages get renamed. SQL becomes Sales Accepted in a CRM tidy-up and the integration filter still looks for SQL. Uploads keep running, match nothing, and the conversion column flattens quietly. Campaign reports still show form fills, so a quarter can pass before anybody notices.
- Nobody agrees with the value model. Marketing assigned 4,000 to an MQL. Sales thinks an MQL is worth a phone call. The first time the bidder moves real budget on that number, the argument you avoided in a spreadsheet gets had in a board meeting.
There’s a fifth, and it’s the cheapest to fix. Google Ads reports upload errors and match rates, and in most accounts nobody has opened that screen since the integration went live.
How to sequence an offline conversion tracking build
Agree on stage definitions and values with sales in writing, before anybody touches a tag. That’s the step people skip, and the one that decides whether the project survives its first bad quarter.
Audit every form on every domain and subdomain for identifier capture. Fix capture before building the upload, because partial capture teaches the bidder something false with total confidence.
Import as a secondary conversion first and watch it for a full sales cycle without letting it touch bidding. You’re checking match rates, not chasing a result.
Only then switch the bidding conversion. Expect reported volume to fall and cost per conversion to rise sharply. That’s the intended effect, and somebody senior needs warning in writing beforehand, because a chart that halves with no explanation attached is how programs get cancelled.
Put match rate and upload error count on the same dashboard as spend, so a silent break becomes visible.
If you generate fifteen form fills a month, none of this helps. There isn’t enough signal for any algorithm to learn from, and you’re better served by tighter targeting and reading the CRM yourself. The threshold is signal density rather than budget, and whether your account clears it is one of the first things a paid media strategy engagement should tell you.
