Home/Insights
Insights / Measurement

Offline conversion tracking for B2B SaaS: send your CRM stages back to Google Ads and GA4.

Your ad platforms only learn from what you tell them. If the last thing they hear is “a form was filled in”, they will find you more people who fill in forms. This is the working architecture we use to send sales-qualified leads, opportunities and won deals back from the CRM, with the field map, the consent rules, the places it breaks and a QA checklist.

01 / FIELD NOTES

The short answer.

Offline conversion tracking for B2B SaaS means capturing the ad click ID and campaign tags on every form, storing them on the CRM contact, and sending each later sales stage, such as sales-qualified lead, opportunity and closed-won, back to Google Ads and GA4 with that ID. The ad platform can then bid for buyers instead of form fills.

Most B2B teams already have half of this: something captured on the form, and stages in the CRM. What is missing is the connection, a written rule for each stage, and someone checking the numbers. For the basics of getting a first visit into the CRM cleanly, start with our guide on website lead tracking from first visit to CRM; this article picks up where that one ends.

02 / FIELD NOTES

Why the form fill is the wrong signal.

Smart bidding in Google Ads optimises towards the conversion actions you set as primary. If your only primary action is “form submitted”, the system treats a student downloading a template and a VP of Operations asking for a demo as the same win. It will happily buy more of whichever is cheaper.

In B2B SaaS the sales cycle is long. A demo request in March may become a contract in July, and unless the CRM tells the ad platform, it never learns which clicks were worth paying for. Google’s own guidance on upgrading offline imports suggests using a “Qualified lead” or “Converted lead” goal for exactly this reason.

We have seen the same pattern on our own forms. Between 15 September and 5 November 2026, all 30 submissions to prolinkage.com turned out, when read by hand, to be our own tests, spam, vendor pitches or impersonation attempts. A platform optimising to “form submitted” would have been learning from noise. Our article on cost per lead versus cost per qualified opportunity explains the reporting side of that problem. This one fixes the data side.

03 / FIELD NOTES

The architecture in one picture.

Every working setup we have built or audited has the same six parts. The tools change; the order does not. If one part is missing, every part after it produces numbers you cannot trust.

From ad click to closed deal, and back again
  1. 01 · CLICKAuto-tagging adds gclid, gbraid or wbraid to the landing URL
  2. 02 · FORMHidden fields capture click IDs, UTMs, referrer and GA client ID
  3. 03 · CRMValues are written once to the contact and copied to the deal
  4. 04 · STAGESLead → MQL → SQL → opportunity → won, each with a timestamp
  5. 05 · SENDStage changes go to Google Ads, GA4 and LinkedIn
  6. 06 · CHECKMonthly: CRM count vs platform count, gaps explained

The six parts of an offline conversion setup. Steps 01 to 03 happen in seconds; steps 04 to 06 run for the length of your sales cycle.

Two design choices matter more than any tool. The CRM is the source of truth for stages. And identifiers are captured once, at the first form, and never overwritten: a contact who arrived from a Google ad and later returned through a newsletter is still a Google Ads contact.

04 / FIELD NOTES

Capture every identifier on the form.

When auto-tagging is on in Google Ads, Google adds a click ID to the landing page URL. Usually that is gclid. Since Apple’s App Tracking Transparency changes, Google says it no longer sends the gclid for iOS traffic from ads on a handful of its own apps, and adds two other parameters instead: wbraid to attribute web conversions and gbraid to measure app conversions. Your form needs to catch whichever one arrives.

Google’s setup article for click-ID imports describes the mechanics plainly: add a hidden field for the click ID to each lead form, add a script that reads it from the URL and stores it in a cookie or local storage, and put that script on every page, not just landing pages. The visitor often reads two or three pages before enquiring, and the click ID is only in the first URL. Google’s sample script keeps the value for 90 days. The ID is case sensitive, so nothing between the form and the CRM may change its case.

On 6 November 2026 we added seven hidden fields to every form on prolinkage.com: the five UTM tags, the Google click ID and the referring page. The buyer sees nothing. Every entry now records its route. Our forms capture gclid today; if a large share of your paid traffic is on iPhones, capture gbraid and wbraid as well.

Field map: from the landing URL to the CRM record
Hidden form fieldWhere the value comes fromCRM property (contact, copied to deal)Used by
gclidURL parameter, kept in a first-party cookieGoogle click ID (write once)Google Ads import
gbraid / wbraidURL parameter on some iOS clicksGoogle iOS click ID (write once)Google Ads import
utm_source, utm_medium, utm_campaign, utm_term, utm_contentURL parameters, kept from the first tagged visitOriginal campaign fieldsCRM reporting, LinkedIn and other platforms
referrerThe page the visitor came fromOriginal referrerCRM reporting when no tags exist
landing_pageFirst page of the visitOriginal landing pageContent reporting
ga_client_idThe GA4 client ID from the _ga cookieGA client IDGA4 Measurement Protocol
consent_stateThe visitor’s choice on your consent bannerAd data consent (granted / denied)Every upload

The last two rows are the ones most setups miss. Without the GA4 client ID you cannot attach a later CRM stage to the right GA4 user. Without the consent state you cannot tell, months later, whether you were allowed to send a contact’s data to an ad platform at all.

05 / FIELD NOTES

Define stages a machine can read.

An ad platform cannot learn from a stage that means different things to different people. Before you connect anything, write one sentence for each stage that says exactly what moves a record into it, who moves it, and when. If a sales rep and a marketer would classify the same contact differently, the definition is not ready.

HubSpot’s default lifecycle stages are a sensible base: subscriber, lead, marketing qualified lead, sales qualified lead, opportunity, customer and evangelist. HubSpot defines an opportunity as a contact or company associated with a deal, and a customer as one with at least one closed deal. Its knowledge base also notes that automatic updates only move a stage forward. That is useful: a contact who becomes an SQL will not quietly slide back and send a confusing signal.

GA4 has a matching set of recommended lead events, which saves you inventing names. Google documents generate_lead, qualify_lead, working_lead, close_convert_lead, disqualify_lead and close_unconvert_lead, each with optional value and currency parameters.

One stage, one rule, one event in each system
CRM stageEntry rule (write yours)GA4 eventGoogle Ads conversion action
LeadA form was accepted by the servergenerate_leadSecondary (observe only)
MQLFits your ideal customer profile, checked by marketingqualify_leadSecondary
SQLSales has spoken to them and accepted the opportunity as realworking_leadPrimary, with a fixed value
OpportunityA deal record exists with an amount and close date(custom, or use working_lead with a status)Secondary, or primary once volume allows
WonContract signedclose_convert_leadSecondary at first, with the deal value
Disqualified / lostA reason is recorded from a fixed listdisqualify_lead / close_unconvert_leadNot sent

Which stage is primary is a volume question. Bidding needs enough conversions to learn from, and a company signing four contracts a month cannot bid on “won” alone. SQL is usually the earliest stage sales would call real that still happens often enough. Keep the rest secondary, visible but not steering bids.

06 / FIELD NOTES

Send stages back to Google Ads.

Google offers two ways in, and the naming has shifted. The older route is offline conversion import using the click ID. The newer one is enhanced conversions for leads, which Google describes as an upgraded version of offline conversion import that also uses hashed user-provided data such as an email address. Google’s help centre now calls click-ID import “a legacy feature” and recommends that teams who have not adopted offline import yet start with enhanced conversions for leads.

What enhanced conversions for leads needs

Your Google tag, or Google Tag Manager, must capture hashed user-provided data such as the email address when the form is sent. Later, when the contact reaches a stage, you upload that stage with the same hashed data. Google still asks you to include the gclid whenever you have it, and says it is required if you are not using a tag to collect user-provided data. So the hidden fields from chapter 04 are not replaced; they are the backup.

How the data gets there

  • Native CRM connections. Google’s Data Manager lists Salesforce and HubSpot among its sources, alongside Sheets, BigQuery, SFTP and others. For Salesforce and HubSpot, the first successful run imports the last 14 days of data.
  • HubSpot’s own sync. HubSpot can send lifecycle stage changes to Google Ads using enhanced conversions, matching on the click ID or on contact data it hashes with SHA-256. Its native events use a fixed value per stage, not the real deal amount, and HubSpot notes this sync does not work through a Google Ads manager (MCC) account.
  • The API. Since 15 June 2026, Google has been moving offline conversion and enhanced-conversions-for-leads uploads to the Data Manager API. If a developer built your upload on the Google Ads API, check that it has moved.

Three details catch most first attempts. Google asks you to wait four to six hours after creating a conversion action before uploading to it. Each conversion time must include a time-zone offset and come after the click. And the click-to-conversion window is 14 or 90 days depending on the data source, so a deal that closes in month seven may fall outside it. That is another reason to send SQL, which happens sooner, as the primary signal.

07 / FIELD NOTES

Send stages to GA4, and know its limits.

GA4 receives offline stages through the Measurement Protocol, a way of sending events from your server straight to Google Analytics. Google is clear that it is meant “to augment automatic collection” through the tag, not replace it. Each event must carry a client_id that matches the one the GA4 tag created in the visitor’s browser. That is why chapter 04 stores the client ID on the CRM record at the moment of the first form.

The limit that surprises people is time. Google’s documentation says events can be backdated by up to 72 hours. A contact who becomes an SQL three weeks after their first visit will appear in GA4 on the day you send the event, not the day of their visit. To tie an event to a specific session’s device and location, Google says it must arrive within 24 hours of that session starting.

So use them for different jobs. Google Ads gets the stages for bidding, because its import is built around the original click. GA4 gets them for audiences and for seeing which content and channels produce SQLs over a quarter. Do not expect matching daily numbers. Our article on why Google Ads leads don’t convert covers what to do once the stages show you which campaigns produce poor leads.

08 / FIELD NOTES

LinkedIn and other platforms.

LinkedIn documents a Conversions API that, in its own words, “creates a direct connection between marketing data from an advertiser’s server and LinkedIn”, so that online and offline conversions can be attributed to campaigns in Campaign Manager. Advertisers can generate an access token from their Campaign Manager account without building a developer application. LinkedIn’s documentation also carries version sunset notices, such as the November 2025 marketing version ending on 16 November 2026, so whoever maintains your connection needs to watch them.

The same rules apply: one stage definition, sent from the CRM, with identifiers and consent captured at the first form. Check LinkedIn’s current documentation for the identifiers it accepts. If you are still deciding where B2B budget should go, our comparison of Google Ads and LinkedIn Ads for B2B sets out how each platform tends to perform for different sales motions.

09 / FIELD NOTES

Consent comes first, not last.

Offline conversion tracking sends information about real people to ad platforms. The consent decision has to be captured when the data is collected and travel with the record. Google’s consent mode uses four signals: ad_storage, analytics_storage, ad_user_data and ad_personalization. In basic consent mode, tags do not load until the visitor responds to the banner. In advanced mode, tags load with defaults set to denied and send cookieless pings that Google uses to model the gaps.

For visitors in the European Economic Area, Google’s EU user consent policy says advertisers must collect consent for the use of personal data and pass those consent signals to Google. The Google Ads API documentation also strongly recommends setting the consent field on each uploaded conversion, and warns that conversions without it may not be attributable.

  • Store the visitor’s ad_user_data choice on the CRM contact at the first form.
  • Only include hashed email or phone in an upload when that choice allows it.
  • Pass the consent value with every upload, granted or denied.
  • Make sure the enquiry itself still works when every analytics cookie is declined.

This is a technical summary, not legal advice. Your lawyer decides what you may collect; the setup should prove you followed that decision.

10 / FIELD NOTES

Where it breaks.

These are the failure points we look for first. Most cost nothing to fix once found; all are invisible from a dashboard.

Common failure points in offline conversion tracking
WhereWhat goes wrongHow to spot it
Landing pageA redirect, a cookie banner or a caching rule strips the click ID before the script reads itClick your own ad, then check the URL and the cookie on the second page
FormThe script runs only on landing pages, so a visitor who browses first arrives at the form with no IDLand, visit two other pages, then submit a test
Third-party form or booking toolThe form sits in an iframe or on another domain and never sees the hidden valuesSubmit through it and look for the ID on the CRM record
CRM importA repeat visit overwrites the original click ID or source with a newer oneMake the fields write-once and test with a second submission
CRM dataAn integration lowercases text and corrupts the case-sensitive click IDCompare the ID in the URL with the one stored
StagesReps skip stages or move contacts by hand without a timestampCount records that jumped straight from lead to won
UploadUploads start before the action is ready, lack a time-zone offset, or fall outside the windowRead the upload diagnostics in Google Ads after each run
AccountThe connection was made through a manager account the sync does not supportCheck which account owns the conversion action

One more is not technical: nobody owns the monthly check. Setups drift after a form, plugin or CRM workflow changes. Put a name next to the check.

11 / THE CHECK

The readiness checker.

Tick each statement that is true for your business today, in order. The checker tells you which stage you are at and the one thing to do next. Nothing you tick is sent anywhere.

Stage 0 of 8: not started

Tick what is true today, starting from the top.

Most B2B teams we audit land at stage two or three: the identifiers exist on the form, but the CRM either loses them or has no agreed stage rules. Fix that before you buy a connector.

12 / FIELD NOTES

The QA checklist before you trust the numbers.

Run this at launch and after any change to a form, the CRM or the tags. It takes about an hour, spread over a few days because uploads are not instant.

  1. Click your own ad from a phone and a laptop. Confirm a click ID is in the landing URL.
  2. Browse two pages, then submit the form with an address you control and a clear test name.
  3. Open the CRM record. Check every hidden value arrived, the click ID matches the URL exactly, including case, and the consent state is set.
  4. Submit again from the same browser with different UTM tags. The original values must not change.
  5. Move the test contact to SQL by hand, following the written rule.
  6. Wait for the next upload and read the diagnostics for that conversion action in Google Ads.
  7. Look for the matching event in GA4 DebugView or Realtime if you send stages there.
  8. Repeat with consent declined. The enquiry must still arrive; the upload should carry the denied state.
  9. Remove the test data or mark it, so it never enters a report.
  10. Write down the configuration you tested: conversion action names, which is primary, the field names and the date.

If your GA4 counts already disagree with your inbox before any of this, fix that first: a duplicate key event or a reloading thank-you page will be copied into every stage after it.

13 / QUESTIONS

Questions owners ask.

What is offline conversion tracking in B2B SaaS?

It is sending sales outcomes that happen after the website visit, such as a qualified lead, an opportunity or a signed contract, from your CRM back to the ad platforms and analytics. Each outcome is matched to the original ad click or the contact’s hashed details, so the platform learns which clicks produce buyers rather than form fills.

Should I use enhanced conversions for leads or gclid import?

Google now describes click-ID offline conversion import as a legacy feature and recommends that new setups start with enhanced conversions for leads. Keep capturing the gclid anyway. Google asks you to include it whenever possible, and it is required if you are not using a tag to collect user-provided data.

Which CRM stage should I send to Google Ads as the primary conversion?

Usually the sales-qualified lead, because it is the earliest stage your sales team would call real that still happens often enough for bidding to learn from. Send opportunity and won as secondary actions so you can see them. Move a later stage to primary only once its monthly volume is steady.

Can I track SQLs in GA4?

Yes, by sending an event such as qualify_lead or working_lead from your server with the Measurement Protocol, using the GA4 client ID stored on the contact. Google allows events to be backdated by only 72 hours, so the event appears on the day you send it, not the day of the original visit.

Do I need consent to send CRM data to Google Ads?

For visitors in the European Economic Area, Google’s EU user consent policy requires you to collect consent for personal data use and pass consent signals to Google. Store each visitor’s choice on the CRM record and send it with every upload. Your privacy notice and legal adviser decide the rest.

How long does it take to set up?

The form and CRM capture can be done in days. The stage rules usually take longer, because sales and marketing have to agree them. Allow a full sales cycle of uploads before judging the effect on bidding, and Google suggests running old and new actions side by side for one to two conversion cycles or four weeks.

Sources: Prolinkage’s own forms and analytics, audited and changed 6 November 2026; form submissions classified 15 Sep–5 Nov 2026. External, all accessed 7 Nov 2026: Google Ads Help and Google Ads API docs (enhanced conversions for leads, offline import, iOS measurement, click uploads); Google Analytics developer docs (Measurement Protocol, recommended events); Google consent mode and EU user consent policy docs; HubSpot Knowledge Base (lifecycle stages, Google Ads events); LinkedIn Conversions API on Microsoft Learn (updated 12 Aug 2026).

Read next.

Keep the whole journey connected.

Your next step

Teach your ad platforms what a buyer looks like.

Tell us which CRM you use and what your ads are optimising for today. We will show you where the loop breaks.

More than a decade of experience, across businesses and markets.

Explore our work first