Written by: Aaron Rovner, Founder, Saas Hero

Key Takeaways

  • Connecting paid media to your CRM pipeline means capturing click IDs and UTMs on landing pages, carrying them through forms into CRM properties, and sending qualified lifecycle events back to ad platforms so bidding focuses on pipeline, not just form fills.
  • The 2026 platform changes, including Enhanced Conversions for Leads and the Data Manager migration, require many existing offline conversion setups to be rebuilt against the new specification.
  • The five-step implementation process covers mapping CRM lifecycle stages to conversion events, capturing click IDs and UTMs, passing them through forms, sending qualified lead events to Google Ads, and sending offline events to Meta and LinkedIn.
  • Qualified Lead is the primary optimization target for Smart Bidding, while Closed Won works best as a secondary action for reporting, with native integrations or middleware moving data between your CRM and ad platforms.
  • SaaSHero builds and maintains this measurement layer end to end for B2B SaaS companies as a Google Premier Partner with over $60M in lifetime ad spend managed.

See How SaaSHero Connects Your CRM To Ad Platforms

What Changed In Google Ads Offline Conversions In 2026

Enhanced Conversions for Leads: In 2026, Google combined its previously separate web and lead conversion tools into one streamlined enhanced conversions product, consolidating all hashed customer data management into a single module. From April 2026, Google Ads accepts user-provided data from website tags, Data Manager, and API connections at the same time.

Data Manager Migration: Google Ads Data Manager is the modern interface for connecting conversion data sources and uploading offline conversions, supporting both CSV file uploads and scheduled Google Sheets imports. Native HubSpot and Salesforce connectors in Data Manager automate offline conversion uploads by mapping CRM lifecycle stages to Google Ads conversion actions.

June 15, 2026 Phase-Out: Google moved offline conversion import and Enhanced Conversions for Leads uploads to the Data Manager API and blocked them in the legacy Google Ads API. Native CRM connectors and middleware approaches like Zapier or manual CSV uploads continue to work, while custom integrations using the old UploadClickConversions endpoint require migration.

Validation check: Confirm your Google Ads account uses Data Manager for offline conversion uploads. If you rely on a custom API integration, confirm it now calls the Data Manager API. Check the Uploads page to confirm conversions are accepted.

Step 1: Map Your CRM Lifecycle Stages To Ad Platform Conversion Events

Decide which CRM lifecycle stages become conversion events in Google Ads, Meta, and LinkedIn before you configure any tracking. This choice sets the optimization target for the life of the account.

Actions by system:

  • HubSpot: Navigate to Settings → Properties → Contact properties. Confirm lifecycle stage values: Lead, Marketing Qualified Lead, Sales Qualified Lead, Opportunity, Customer.
  • Salesforce: Navigate to Setup → Object Manager → Lead → Fields & Relationships. Confirm Lead Status picklist values and Opportunity Stage picklist values that represent qualified lead, opportunity created, and closed won.
  • Google Ads: Navigate to Goals → Conversions → Create conversion action. Create separate conversion actions for Qualified Lead and Closed Won. Set the source to “Import from CRMs, files, or other data sources.”
  • Meta Events Manager: Navigate to Data Sources → Your Pixel → Settings. Confirm Conversions API is connected.
  • LinkedIn Campaign Manager: Navigate to Measure → Conversion tracking. Create conversion rules for Qualified Lead and Closed Won using the QUALIFIED_LEAD and SALES_QUALIFIED_LEAD conversion types, available in LinkedIn’s Conversions API schema from API version 202608 and later.

Qualified Lead is the correct primary optimization target. Lead volume is too high and too noisy for Smart Bidding to learn from, while Closed Won is typically too sparse and too delayed. Google’s help center now recommends starting with Enhanced Conversions for Leads for advertisers who have never set up offline conversion import. As noted in the Key Takeaways, treat Closed Won as a secondary action for reporting only so bidding focuses on qualified pipeline.

Validation check: Confirm each conversion action appears in Google Ads under Goals → Conversions with the correct source and counting method. Confirm the conversion action name matches exactly what will be sent in the upload payload, because name mismatches are among the most common causes of rejected rows.

Step 2: Capture Click IDs And UTMs On The Landing Page

Capture gclid, fbclid, li_fat_id, and core UTMs from the landing page URL and persist them for form submission. The documented persistence pattern is to capture the identifier from the landing URL, store it in a first-party cookie, and carry it into the CRM or offline conversion record.

Actions by system:

  • Google Ads: Navigate to Admin → Account settings → Auto-tagging. Confirm “Tag the URL that people click through from my ad” is checked. Auto-tagging is the first requirement for importing offline conversions.
  • LinkedIn Campaign Manager: Navigate to Account Assets → Insight Tag. Confirm enhanced conversion tracking is enabled so li_fat_id appends to landing URLs. LinkedIn’s Conversions API documentation confirms li_fat_id can be captured by parsing it from landing page URLs or reading it from cookies.
  • Google Tag Manager: Create a Custom HTML tag that fires on All Pages. The tag reads gclid, fbclid, li_fat_id, utm_source, utm_medium, utm_campaign, utm_content, and utm_term from the URL query string and stores them in a first-party cookie with a 90-day expiry.
  • HubSpot: Navigate to Settings → Properties → Create property. Create single-line text properties for each identifier: hs_google_click_id, hs_facebook_click_id, hs_linkedin_click_id, utm_source, utm_medium, utm_campaign, utm_content, utm_term.
  • Salesforce: Navigate to Setup → Object Manager → Lead → Fields & Relationships → New. Create custom text fields: GCLID__c, FBCLID__c, LI_FAT_ID__c, UTM_Source__c, UTM_Medium__c, UTM_Campaign__c, UTM_Content__c, UTM_Term__c.

Use the 90-day first-party cookie described in this step. Google click IDs are case-sensitive and must be stored and uploaded exactly as received. Lowercasing or normalizing the URL can break the match.

Validation check: Open browser developer tools → Application → Cookies. Confirm the tracking cookie exists and contains the expected values after clicking your own ad with a test gclid.

Step 3: Pass Click IDs Through Forms Into CRM Properties

Preserve click IDs and UTMs through form submission so they land on the correct CRM record.

Actions by system:

  • HubSpot: Navigate to Marketing → Forms. Edit each form used on paid landing pages. Add hidden fields for each property created in Step 2. Map each hidden field to the corresponding HubSpot property. HubSpot’s form editor provides a “Make this field hidden” option that keeps a field off the form while still passing a value to a contact property.
  • Salesforce: Add hidden input fields for each custom field created in Step 2. Map each hidden field to the corresponding Salesforce field API name.
  • Google Tag Manager: Create a Form Submission trigger that fires when the form is submitted. Create a tag that reads the cookie values and populates the hidden fields before submission.

When Salesforce converts a Lead to a Contact, the GCLID__c field on the Lead object does not automatically copy to the Contact object. The most common Lead-conversion problem is losing the original GCLID at this step. Create a Salesforce Flow that copies GCLID__c, FBCLID__c, LI_FAT_ID__c, and the UTM fields from the Lead to the Contact on conversion. Add a second step that copies them again to the Opportunity so the click ID is available when the deal reaches Closed Won.

Validation check: Submit a test form with a known gclid. Navigate to the CRM record. Confirm the click ID and UTMs appear on the correct properties. In Salesforce, convert the Lead to a Contact and confirm the fields copy forward.

The Click-ID-To-CRM Field Map

Before moving to the send-back configuration in Step 4, use this reference to confirm that every click ID and UTM parameter captured in Steps 2 and 3 maps to the correct CRM field. At least one current SERP result publishes a field-level mapping table showing which click IDs and UTM parameters map to named CRM fields for HubSpot, Salesforce, and Marketo. The table below is the implementation reference:

Identifier HubSpot Property Salesforce Field Notes
gclid hs_google_click_id GCLID__c Case-sensitive; never lowercase
fbclid hs_facebook_click_id FBCLID__c Convert to _fbc format for CAPI
li_fat_id hs_linkedin_click_id LI_FAT_ID__c LinkedIn first-party ads tracking UUID
utm_source utm_source UTM_Source__c Standard UTM property
utm_medium utm_medium UTM_Medium__c Standard UTM property
utm_campaign utm_campaign UTM_Campaign__c Standard UTM property

Hidden form fields populated by the GTM cookie-read tag preserve these values through form submission. In Salesforce, a record-triggered Flow copies the fields forward at Lead conversion so the click ID survives into the Contact and Opportunity objects where deal-stage workflows can read them.

SaaSHero builds and maintains this measurement layer end to end for B2B SaaS companies. As a Google Premier Partner, a G2 High Performer in digital marketing for over two years ranked #20 of roughly 6,000 agencies, and with more than $60M in lifetime ad spend managed across 100+ B2B companies, SaaSHero configures conversion tracking, separates primary from secondary conversions, pushes lifecycle stage events back into the ad platforms, and reports inside the client’s CRM with Looker Studio dashboards. Because SaaSHero owns landing pages and creative in-house, the same team that runs the media also builds click-ID capture.

Talk To SaaSHero About Your Measurement Layer

Step 4: Send Qualified Lead And Closed-Won Events Back To Google Ads

Configure the send-back mechanism so Google Ads receives qualified lifecycle events and optimizes toward pipeline.

Actions by system:

  • Google Ads: Navigate to Goals → Conversions. Select the Qualified Lead conversion action. Click “Turn on enhanced conversions for leads.” Accept Google’s Customer Data Terms.
  • Google Ads Data Manager: Navigate to Tools → Data Manager → Connect data source. Select HubSpot or Salesforce. Authenticate and map the CRM lifecycle stage to the Google Ads conversion action. For HubSpot, map “SQL” to the Qualified Lead conversion action. For Salesforce, map “Qualified” Lead Status to the Qualified Lead conversion action.
  • Upload schedule: For Salesforce and HubSpot connections, Data Manager imports the last 14 days of data on the first run, then imports all changes since the last successful run. For file-based sources such as Google Sheets or SFTP, Data Manager imports conversions from 90 days ago.
  • HubSpot: Navigate to Automation → Workflows. Create a workflow that triggers when lifecycle stage changes to SQL. Add an action that sends the contact’s hashed email, gclid, conversion name, and conversion time to Google Ads via the native integration or a webhook.
  • Salesforce: Create a record-triggered Flow that fires when Lead Status changes to Qualified. The Flow sends the Lead’s hashed email, GCLID__c, conversion name, and conversion time to Google Ads via Data Manager or a middleware webhook.

Enhanced Conversions for Leads uses a hashed email or phone number captured by the Google tag on the lead form as the primary match key, with the GCLID sent alongside when available. Standard offline conversion import relies on GCLID alone. Advertisers who sent first-party data such as email addresses alongside GCLIDs saw a median 10% increase in conversions compared with standard offline conversion imports. Enhanced Conversions for Leads recovers leads whose GCLID was lost to redirects, missing hidden fields, or cookie limits.

Validation check: Navigate to Google Ads → Goals → Conversions → Diagnostics. Confirm the conversion action shows “Receiving conversions” and that enhanced conversions diagnostics show data is being received. Check the Uploads page for accepted and rejected rows.

Step 5: Send Offline Events To Meta And LinkedIn

Configure the send-back mechanism for Meta and LinkedIn so both platforms receive qualified lifecycle events.

Actions by system:

  • Meta Events Manager: Navigate to Data Sources → Your Pixel → Settings. Confirm Conversions API is connected. Navigate to the Conversions API tab and generate a server access token.
  • HubSpot (Meta): Create a workflow that triggers when lifecycle stage changes to SQL. Add a webhook action that sends the contact’s hashed email, _fbc value formatted from fbclid, event name “QualifiedLead,” event time, and event_id to Meta’s Conversions API endpoint.
  • Salesforce (Meta): Create a Flow that fires when Lead Status changes to Qualified. The Flow sends the Lead’s hashed email, _fbc value, event name, event time, and event_id to Meta’s Conversions API via middleware.
  • LinkedIn Campaign Manager: Navigate to Measure → Conversion tracking. Create a conversion rule with type QUALIFIED_LEAD. Set the conversion method to CONVERSIONS_API.
  • HubSpot (LinkedIn): Create a workflow that triggers when lifecycle stage changes to SQL. Add a webhook action that sends the contact’s hashed email, li_fat_id, conversion URN, and conversion time to LinkedIn’s Conversions API endpoint.
  • Salesforce (LinkedIn): Create a Flow that fires when Lead Status changes to Qualified. The Flow sends the Lead’s hashed email, LI_FAT_ID__c, conversion URN, and conversion time to LinkedIn’s Conversions API via middleware.

The correct _fbc format for Meta is a four-part string: fb.{subdomainIndex}.{creationTime}.{fbclid}. Meta explicitly requires that fbc and fbp remain unhashed. The creationTime must represent the moment of the click. Building it at form submit stamps the wrong time and attributes the conversion incorrectly. Meta specifies a subdomainIndex of 1 when a server generates the value without saving a cookie.

For LinkedIn, LinkedIn recommends sending both SHA256_EMAIL and LINKEDIN_FIRST_PARTY_ADS_TRACKING_UUID together for the best identity match rates. The li_fat_id-to-LinkedIn-member mapping is stored for 365 days, so it remains usable as a match identifier even after the browser cookie expires.

Validation check: Navigate to Meta Events Manager → Data Sources → Your Pixel → Diagnostics. Confirm the event appears with a match quality score. Navigate to LinkedIn Campaign Manager → Measure → Conversion tracking. Confirm the conversion rule shows “Active” status and is receiving events.

Native Integration Vs. Middleware: When Each Breaks

Attribute Native Integration Middleware
Supported CRMs HubSpot, Salesforce Any CRM with webhook support
Click-ID pass-through Fails on non-HubSpot forms Configurable
Multi-object support One object per connection Configurable
Latency Low Variable; Meta rejects events with event_time more than seven days in the past
Maintenance Low Higher; requires monitoring

Use native integration when Google Ads is the only destination and the conversion lives in a supported object. Use middleware when identity spans the website and CRM, related-object handling is required, or the same event must go to multiple platforms.

What Breaks In Practice

Even with the right integration approach, several common failure modes can silently break the connection. The following issues account for most of the tracking gaps seen in audits.

Click-ID loss on cross-domain and consent-gated forms: When a visitor navigates from a landing page on one domain to a form on another domain, the first-party cookie does not transfer. This is the fault found most often when auditing lead-gen accounts: a GCLID captured on the landing page and lost before the form. To fix it, use a single domain for landing pages and forms, or pass the click ID via URL parameter and re-capture it on the form page. Audits frequently show visitors browsing to another page and submitting a form that never saw the URL parameter.

UTM overwrites on redirects: When a link shortener or marketing automation wrapper redirects the visitor, UTM parameters can be stripped. Fix this by using a tracking template that preserves the parameters, or by capturing the UTMs on the first landing page before any redirect. Google Ads campaigns commonly show as (direct)/(none) in GA4 when gclid is stripped before reaching the landing page. Documented culprits include link-shortener redirects and marketing-automation wrappers.

Lifecycle-stage drift between the marketing automation platform and the CRM: When HubSpot and Salesforce have different lifecycle stage definitions, the event sent back to the ad platform does not match the CRM record. Fix this by documenting the lifecycle stage definitions in both systems and creating a mapping table. Audit the mapping quarterly.

Validation check: Run a monthly reconciliation report comparing closed-won deals in the CRM for the prior 7 days by source against offline conversions received in Google Ads and Meta for the same 7 days by conversion action. Target under 5% mismatch.

Validation Checklist: Confirm The Connection Works

Run through these checks in order to confirm the full connection is working:

  1. Submit a test lead with a known gclid. Click your own Google Ads ad with a test gclid appended to the URL. Submit the form on the landing page. Navigate to the CRM record. Confirm the gclid appears on the correct property.
  2. Trace the click ID to the CRM record. In HubSpot, navigate to Contacts → [Test Contact]. Confirm hs_google_click_id contains the test gclid. In Salesforce, navigate to Leads → [Test Lead]. Confirm GCLID__c contains the test gclid.
  3. Trigger the lifecycle event. In HubSpot, manually change the contact’s lifecycle stage to SQL. In Salesforce, manually change the Lead Status to Qualified.
  4. Confirm the event reached the platform. In Google Ads, navigate to Goals → Conversions → Diagnostics. Confirm the conversion action shows “Receiving conversions.” In Meta Events Manager, navigate to Data Sources → Your Pixel → Diagnostics. Confirm the event appears with a match quality score. In LinkedIn Campaign Manager, navigate to Measure → Conversion tracking. Confirm the conversion rule shows “Active” status.
  5. Confirm the event is attributed to the correct click. In Google Ads, navigate to Goals → Conversions → Uploads. Confirm the upload shows accepted rows. In Meta Events Manager, confirm the event shows the correct _fbc value. In LinkedIn Campaign Manager, confirm the conversion shows the correct li_fat_id.

Common errors include unrecognized GCLID (check case sensitivity), conversion time before the click (check time zone), conversion action name mismatch (check exact spelling), and low match rate (check hashing and normalization).

How To Evaluate Whether The Connection Works

Track a short list of outcome metrics to confirm the connection improves pipeline quality, not just conversion counts.

  • Qualified lead volume by source
  • Pipeline created by source
  • Cost per qualified lead by source
  • CAC payback by source

Google’s Smart Bidding algorithms powered 88% of campaigns as of Q1 2026, so the quality of conversion signals fed to the algorithm shapes results more than bid strategy or keyword selection. Smart Bidding volume thresholds vary by source: Target CPA requires at least 15 conversions in the last 30 days, while exiting the learning phase commonly requires at least 30 conversions per 30 days. If qualified lead volume sits below this threshold, optimize on an earlier stage such as Lead and import Closed Won as a secondary action.

SaaSHero holds clients to an LTV:CAC of 3:1, generally considered healthy for SaaS, and CAC payback under 12 months. Long sales cycles, where deals close months after the click, fall outside the 90-day import window. Import the earlier qualified stage that lands inside the window and report closed won separately.

Review Your Paid Media-To-CRM Setup With SaaSHero

Advanced Variations For Mature Teams

Multi-touch attribution across channels: When a buyer interacts with multiple channels before converting, last-click attribution credits the final touch. HubSpot supports first-touch, last-touch, linear, U-shaped, and W-shaped attribution models. For B2B with multiple touchpoints, U-shaped or W-shaped often provides the most accurate picture for long sales cycles.

Pushing lifecycle events for multiple products or segments: When the company sells multiple products or serves multiple segments, create separate conversion actions for each product or segment. Map each CRM lifecycle stage to the correct conversion action based on the product or segment.

Connecting the CRM layer to a BI surface: Connect the CRM to Looker Studio. Build dashboards that show pipeline created by source, cost per qualified lead by source, and CAC payback by source, the vocabulary a CFO and board use to evaluate a channel.

For more on the strategic context behind these decisions, see B2B SaaS Paid Media: Drive Pipeline, Not Just Leads, How To Connect Paid Media Spend To Qualified Pipeline, How To Move B2B Paid Media From Form Fills To Pipeline, and How to Measure Paid Media ROI for B2B SaaS Teams.

Frequently Asked Questions

How Long Does It Take To Set Up The Connection?

Setup time depends on the CRM and the number of ad platforms. A basic HubSpot-to-Google-Ads connection with Enhanced Conversions for Leads can be configured in 2–4 hours for a team that already has auto-tagging enabled and the correct CRM properties in place, though the Enhanced Conversions setting in Google Ads may take up to 48 hours to activate after the first event sync. A full multi-platform setup with HubSpot or Salesforce, Google Ads, Meta, and LinkedIn, including custom fields, Flows or workflows, and middleware configuration, takes longer and often benefits from specialist support.

Read Next