# 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.

Source: https://saas-marketing.net/guides/offline-conversion-tracking-for-saas-ads/
Topic: SaaS PPC and Paid Ads
Type: guide
Published: 2026-09-11
Last updated: 2026-09-11
Publisher: SaaS Marketing (saas-marketing.net)
License: CC BY 4.0. Quote or republish with attribution and a link to https://saas-marketing.net/guides/offline-conversion-tracking-for-saas-ads/

## 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 takeaways

- Offline import changes what the bidding model buys, while a better dashboard only changes how you describe what it already bought.
- Capture GCLID, WBRAID, GBRAID, li_fat_id and fbclid into a first-party cookie, then read the cookie at form submit.
- The click ID must survive lead conversion, record merges and a second form fill, so store first-touch and last-touch separately.
- Google accepts offline conversions up to 90 days after the click, which rules out closed-won as your only signal on long cycles.
- Send the earliest stage that clears roughly 30 conversions a month and still correlates with revenue, usually the qualified lead.
- Run the five QA tests monthly, because a broken field mapping shows up as a slow decline, not an error message.

---

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](/guides/ppc-lead-quality-for-saas/) covers how to define the qualified event; this page covers the plumbing that carries it home.

Switching on Target CPA first and building offline import six months later. Smart bidding spends its first eight weeks learning the wrong target, and you pay for that education twice.

## 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` | LinkedIn | 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

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](/checklists/paid-ads-conversion-tracking-setup/) 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](/comparisons/lead-gen-forms-vs-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.

Embedded forms from a third-party builder often strip unknown hidden fields on render. Submit one test lead and look at the raw record, not the confirmation page.

## 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.

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](/guides/ppc-tools-for-saas/) 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.

Keep GCLID-based import and enhanced conversions as separate conversion actions, with only one of them set to primary for bidding. Marking both primary inflates conversion counts and quietly halves your reported CPA.

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](/playbooks/linkedin-abm-advertising/).

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](/comparisons/google-ads-vs-linkedin-ads/) lays out why the channels deserve different conversion definitions rather than one shared event.

## 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 Series B security vendor was capturing 41 percent of clicks. The cause wasn't consent. Their marketing site redirected every URL with a trailing slash mismatch, dropping query parameters on the way. One rewrite rule fixed it in an afternoon and match rate went to 88 percent.

## 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](/guides/smart-bidding-for-b2b-saas/) 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**

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**

## 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](/research/saas-ppc-benchmarks/) sets the ranges, and the [paid ads cluster hub](/saas-ppc/) sequences the rest of the account work around it.

## 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.
