Offline conversion tracking for SaaS ads
Send closed-won revenue back to Google, LinkedIn and Meta. Click ID capture, CRM field mapping, enhanced conversions, and the consent gaps that break it.
On this page 10 sections
- Why this beats every other measurement project on your list
- Which click identifiers to capture, and where each one comes from
- Where the click ID has to live in your CRM object model
- Scheduled uploads, native connectors, or a warehouse pipeline
- Enhanced conversions for leads, and when hashed email is enough
- LinkedIn and Meta conversions API, and where they differ from Google
- What consent mode and ad blockers take out of the feed
- Which conversion stage to send, and what value to attach
- Five tests that catch a silent failure
- What to do in the next two weeks
- Frequently asked questions
The short answer
Offline conversion tracking sends CRM outcomes back to the ad platform so bidding optimises toward revenue instead of form fills. You capture the click identifier (GCLID, WBRAID, GBRAID, li_fat_id or fbclid) in a hidden form field, persist it on the lead, contact and opportunity records, then upload the qualified-lead or closed-won event with its value. Expect 10 to 30 percent of clicks to arrive with no usable identifier, which is what hashed-email enhanced conversions are for.
Key points before you start
A Google Ads account that optimises toward form fills will find you more form fills. That’s the whole problem. Push closed-won revenue back into the platform and the model starts buying the accounts your AEs actually want, which normally raises cost per lead and lowers cost per opportunity at the same time. What follows is the build order I use, in sequence, including the four places it fails quietly for months before anyone thinks to check.
Why this beats every other measurement project on your list
It changes what the algorithm buys. A better attribution model, a tidier dashboard, a self-reported source field on the demo form: each of those improves your description of what already happened. Offline conversion import changes what happens next, because Google, LinkedIn and Meta bid against the conversion events you feed them and against nothing else.
Picture a mid-market account spending $40,000 a month on Google Search at roughly $190 a lead. Call it 210 leads a month. If 60 of those are students, consultants and people at competitors, Smart Bidding has been told they’re worth exactly what the RevOps director at a 400-person logistics company is worth. So it goes and finds more of them. That’s the target it was handed.
Change the conversion action to qualified lead and the same budget usually returns 130 to 160 leads at a higher cost per lead, with meaningfully more opportunities behind them. CPL rising is not a fault. Say so to your CFO before you flip it, because the next two weekly reports will look worse. Our PPC lead quality guide covers how to define the qualified event; this page covers the plumbing that carries it home.
The sequence people get wrong
Which click identifiers to capture, and where each one comes from
Six identifiers matter and you want every one of them in hidden fields on every form. Google alone uses three, because iOS privacy rules mean a click sometimes arrives with wbraid or gbraid in place of the familiar gclid. Teams that only capture gclid quietly lose a slice of their iOS traffic and never see a warning.
| Identifier | Platform | Where it appears | Notes |
|---|---|---|---|
gclid | Google Ads | URL parameter, requires auto-tagging on | The default for the vast majority of clicks |
wbraid | Google Ads | Web clicks from iOS app surfaces | Aggregated, no user-level detail |
gbraid | Google Ads | App to web clicks on iOS | Same upload endpoint as GCLID |
li_fat_id | URL parameter when auto-tagging is enabled in Campaign Manager | Easy to miss, off by default in older accounts | |
fbclid | Meta | URL parameter, also written to the _fbc cookie | Send _fbp alongside it |
msclkid | Microsoft Ads | URL parameter | Cheap to add while you are in the form anyway |
Read the identifier from the URL on landing, write it to a first-party cookie with a 90-day life, then read the cookie at form submit. Reading straight from the URL at submit time only works when the visitor lands and converts on the same page in the same session, which describes maybe a third of real B2B journeys. Everyone else clicks through to pricing, reads a case study, comes back a week later and submits from a clean URL.
90 days
Maximum age of a click when you import its offline conversion to Google Ads
Google Ads Help
Store two fields, not one. First-touch click ID (write once, never overwrite) and last-touch click ID (overwrite every time). Otherwise a prospect who downloads a report in March and books a demo in May overwrites the acquiring click with a branded one, and your non-brand campaigns look worthless. The paid ads conversion tracking setup checklist has the field list in a form you can hand to a developer.
One structural warning. LinkedIn lead gen forms never touch your website, so there’s no URL to read and no cookie to write; you get the member data LinkedIn passes through its integration and nothing else. That measurement cost belongs in the lead gen forms versus landing pages decision, not in a footnote after you’ve committed.
Where the click ID has to live in your CRM object model
Three objects, three copies, and the handoffs between them are where this breaks. In Salesforce you need a custom text field on Lead, the same field on Contact, and the same field on Opportunity, because the native Google Ads integration reads the identifier from the Opportunity record when it reports a conversion.
The lead conversion mapping is the classic silent failure. A field that exists on both Lead and Contact still won’t carry across unless someone has added it to the conversion field map in Object Manager. Nobody gets an error. The field just arrives empty on every converted record, and six weeks later the uploads are running at a 20 percent match rate with no explanation.
Record merges are the second trap. Most dedupe tooling keeps the master record’s value for each field, including when the master’s value is blank and the duplicate’s is populated. Set the merge rule to take the most recent non-null value for click ID fields specifically, then test it by merging two records on purpose and checking the survivor.
HubSpot is simpler and I’d steer smaller teams there. Capture into a contact property, then run a workflow that copies contact-level click IDs onto the deal at creation. HubSpot’s native ads integration handles Google and LinkedIn upload without a line of code as long as you’re using HubSpot forms and the tracking script, which is the least breakable path for a company with no RevOps engineer. It’s also the path that gives you the least control over what counts as a conversion, so plan to outgrow it.
Check this before you build anything else
Editable working copy
Get this checklist as a working file
Save the checks on this page as a working copy and assign an owner, status and evidence for each action.
Scheduled uploads, native connectors, or a warehouse pipeline
Four delivery options, and the right one depends far more on who maintains it than on what it costs. A pipeline nobody owns is worse than a weekly CSV somebody actually runs.
| Method | Setup effort | Latency | Usual failure mode | Best for |
|---|---|---|---|---|
| Native CRM connector (Salesforce, HubSpot) | Half a day | Hourly to daily | A field mapping changes and nobody is told | Most SaaS teams under $20M ARR |
| Scheduled sheet or CSV upload | An hour | Weekly | The person who owned the sheet leaves | Accounts under $10k a month in spend |
| Zapier or Make | Two hours | Near real time | Task limits hit mid-month and events drop | Small teams with one CRM and one platform |
| Warehouse to platform (Hightouch, Census, custom) | One to three weeks | Hourly | Model logic drifts from CRM reality | Teams with a data engineer and three or more ad platforms |
My default recommendation for a Series A or Series B SaaS company is the native connector, plus a monthly manual reconciliation. It covers Google and LinkedIn, it survives staff turnover better than a Zap, and it doesn’t require a data team you don’t have. The warehouse route earns its keep once you’re running Google, LinkedIn, Meta, Reddit and a review site, and you want one definition of qualified lead feeding all of them. The PPC tools roundup covers what each of those vendors charges.
Whatever you pick, keep the upload logic somewhere a marketer can read. The most common version of this project I find in audits is a Python script written by a contractor in 2024, running on a laptop in a cupboard, uploading a definition of qualified lead the sales team stopped using last year.
Enhanced conversions for leads, and when hashed email is enough
Enhanced conversions for leads match a conversion on hashed first-party data rather than a click identifier. You upload a SHA-256 hash of the email address, lowercased and trimmed, and Google matches it against signed-in user data. It’s the recovery layer for every click that lost its GCLID.
Match rates vary enormously by audience. Work email addresses on company domains match well. Personal Gmail addresses on a form filled at work, role inboxes like info@ or procurement@, and aliased addresses from privacy-focused browsers all match poorly or not at all. A developer-tools company selling to engineers should expect a materially worse match rate than a company selling to sales leaders, because engineers are the people most likely to be using an alias.
Run both, but don't double count
Two rules save you grief here. Hash client-side or in your own infrastructure so raw emails never leave your environment, and exclude anything that isn’t a real person before upload. Test submissions, internal domains, and the QA lead your team creates every Tuesday all count as conversions if you let them.
LinkedIn and Meta conversions API, and where they differ from Google
Both platforms now expect server-side events, and both behave differently enough that a copy-paste of your Google setup will underperform. LinkedIn’s Conversions API accepts hashed email, li_fat_id and other user identifiers through native Salesforce, HubSpot and Dynamics integrations, through Zapier, or through direct API calls. The native CRM route is the one most teams should take.
LinkedIn’s attribution window matters more than the API mechanics. Default windows run 30 days for click and 7 days for view, and a B2B SaaS deal that takes four months to close will never be attributed by the platform itself. That doesn’t make the channel worthless, it makes the platform’s own reporting an incomplete scorecard, which is the argument running through our LinkedIn ABM advertising playbook.
Meta’s Conversions API is keyed on fbclid, the _fbc and _fbp cookies and hashed contact data. Its useful feature is the event match quality score in Events Manager, scored out of ten, which tells you how well your identifiers are landing before you spend a quarter wondering. Send more parameters (email, phone, first name, city, IP, user agent) and the score climbs. Anything below about six means the feed is thin enough to distrust.
For a B2B SaaS advertiser running both Google and LinkedIn, build Google first. It has more volume, a tighter feedback loop and a bidding system that reacts fastest to a better signal. The Google Ads versus LinkedIn Ads comparison lays out why the channels deserve different conversion definitions rather than one shared event.
Editable CSV worksheet
SaaS PPC and Paid Ads planning worksheet
A practical paid planning worksheet: decisions, owners, evidence and next actions.
What consent mode and ad blockers take out of the feed
Somewhere between 10 and 30 percent of your clicks will arrive with no usable identifier, and the variation is mostly geographic. An account selling into Germany and France loses far more than one selling into Texas. Consent refusals, tracking-prevention browsers, corporate network filters and plain ad blockers all contribute.
Consent mode v2 is the mechanism in the EU and UK. When a visitor declines, ad_user_data and ad_personalization signals are withheld, the click identifier isn’t stored, and Google models the gap instead. Modelled conversions are better than nothing for reporting and useless for offline import, because you can’t upload a conversion for a click you can’t name.
Size the hole rather than guessing at it. Count distinct click IDs stored in your database for a given month and divide by the clicks the platform reports for the same campaigns and dates. Ratios above 85 percent are healthy. Below 70 percent means something structural is broken, usually a landing page that redirects and strips parameters, not privacy behaviour.
A real diagnosis
Which conversion stage to send, and what value to attach
Send the earliest stage that still correlates with revenue and clears roughly 30 conversions a month. Volume is the constraint that decides this, not purity. A bidding model fed four closed-won deals a month has nothing to learn from.
| Stage | Typical monthly volume | Lag from click | Value to send |
|---|---|---|---|
| Form fill | 200+ | Minutes | None, keep as secondary |
| Qualified lead | 60 to 90 | 1 to 5 days | Modelled: pipeline value multiplied by historic SQL-to-won rate |
| Opportunity created | 20 to 35 | 10 to 30 days | Expected ACV multiplied by stage win rate |
| Closed won | 5 to 12 | 60 to 120 days | Actual first-year contract value |
For most SaaS accounts under $100k a month in spend, the qualified lead with a modelled value is the right primary signal, with opportunity created uploaded as a secondary action you watch but don’t bid on. Companies above roughly $50k ACV with sub-60-day cycles can bid on opportunity value directly, and that’s where value-based bidding starts to earn its reputation. Our smart bidding guide works through the strategy choice once the feed exists.
One honest limitation. Value-based bidding on modelled numbers inherits every bias in your model. If enterprise deals get a higher modelled value and your enterprise close rate is really driven by outbound rather than paid, the algorithm will chase expensive clicks that never convert. Recheck the model quarterly against actual closed revenue, and be ready to flatten the values back to a single number if the correlation is weak.
Five tests that catch a silent failure
None of these failures produce an error message. That’s the point. Each one shows up as a gradual decline that gets blamed on the market, a Google update, or the new landing page.
The monthly QA routine
- Push a test lead end to end
Click a live ad, fill the form with a tagged test email, then confirm the click ID appears on the lead, the converted contact and the opportunity. It worked if all three records carry the same identifier.
- Audit the field mapping
Open the lead conversion mapping and the CRM connector configuration side by side. Every click ID field should appear in both. Any field renamed in the last quarter is your prime suspect.
- Reconcile row counts
Compare conversions uploaded against qualified leads created for the same period. A gap above 10 percent means records are being filtered out somewhere in the pipeline.
- Check the lag window
Plot days from click to upload. Anything clustering near 90 days is about to be rejected by Google. If the median is past 45 days, move to an earlier conversion stage.
- Hunt duplicates
Group uploads by click ID. The same identifier uploaded twice for the same conversion action inflates your conversion count and depresses reported CPA, which reads as success until pipeline disagrees.
Run these on a calendar reminder, not when something looks wrong. By the time a performance drop is visible in the account, the bidding model has been training on bad data for a month and will need another month to recover.
Sign-off before you call this project done
0 of 8 done
What to do in the next two weeks
Start with the capture layer, because everything downstream is worthless without it. Day one, turn on auto-tagging everywhere and ship the cookie script. Day three, add the hidden fields and push a test lead through to an opportunity. Week two, connect the native CRM integration and upload one backfill batch of historic qualified leads inside the 90-day window so bidding has something to learn from immediately.
Leave bidding alone for the first three weeks after the feed goes live. Let conversion volume stabilise, confirm the reconciliation holds, and only then change the conversion action Smart Bidding optimises toward. If you want the benchmark numbers to sanity-check what comes out the other side, the SaaS PPC benchmark data sets the ranges, and the paid ads cluster hub sequences the rest of the account work around it.
Editable CSV worksheet
SaaS PPC and Paid Ads planning worksheet
A practical paid planning worksheet: decisions, owners, evidence and next actions.
Frequently asked questions
What is offline conversion tracking in Google Ads?
It is the process of sending conversions that happen outside the website, such as a sales-qualified lead or a closed-won deal, back to Google Ads. The click that produced the lead is matched using its GCLID or a hashed email, so Smart Bidding can optimise toward the outcome that made money rather than the form submission that preceded it.
How do I capture the GCLID and store it in my CRM?
Turn on auto-tagging in Google Ads, write the GCLID from the landing page URL into a first-party cookie with a 90-day life, then read that cookie into a hidden form field on submit. Map the field to a custom text field on the lead, include it in your lead conversion mapping, and copy it onto the opportunity record.
How long do I have to upload an offline conversion to Google Ads?
Google accepts offline conversion imports up to 90 days after the click that generated them. Deals that close in month five will be rejected, which is why most SaaS accounts upload a qualified-lead or opportunity-created event with a modelled value instead of waiting for closed-won on a long sales cycle.
What are enhanced conversions for leads?
Enhanced conversions for leads match a conversion using hashed first-party data, normally a SHA-256 hash of the lowercased email address, instead of a click identifier. It recovers conversions where the GCLID was lost to consent choices, ad blockers or a broken form. Match quality drops sharply on personal email addresses and aliased inboxes.
Does offline conversion tracking work for LinkedIn and Meta?
Yes. LinkedIn has a Conversions API that accepts hashed email and li_fat_id through native CRM integrations, Zapier or direct API calls. Meta has its own Conversions API keyed on fbclid, the _fbc cookie and hashed contact data, and reports an event match quality score in Events Manager that tells you how well the identifiers are landing.
Will my cost per lead go up after I switch to offline conversions?
Almost always, and that is the point. Once the model stops counting unqualified form fills, it bids down the cheap traffic that produced them. In accounts I have seen make the switch, cost per lead rises 20 to 50 percent while opportunities per thousand dollars of spend improve. Warn finance before the first weekly report lands.
How much of my click data will be missing?
Between 10 and 30 percent of clicks typically arrive without a usable identifier, driven by consent refusals, ad blockers, privacy browsers and multi-device journeys. The share is far higher in the EU and lower in North America. Measure it by comparing click IDs stored in your database against clicks reported in the ad platform for the same period.
The saas-marketing.net editorial team Research and editorial
We research, write and maintain every page on this site. The library explains marketing decisions through practical frameworks, explicit assumptions and references. Corrections can be requested through the contact page.
Published September 11, 2026. Last updated .