Offline Conversion Tracking: How to Feed Qualified Leads and Closed Sales Back Into Paid Search

Offline conversion tracking step by step: send qualified leads and closed sales from your CRM to Google Ads, fix failed uploads and reconcile weekly.

Offline Conversion Tracking: A Step-by-Step Setup Guide

Most lead-gen search accounts bid toward the form fill, because the form fill is the last thing Google Ads can see. The deal that pays for the campaign closes three, six or ten weeks later inside a CRM, out of the platform's view.

Google's own data shows what closing that gap is worth: advertisers who sent first-party data alongside click IDs in offline imports saw a median 10% increase in conversions over standard imports.

The plumbing changed in 2026, too. Since June 15, the Google Ads API no longer accepts new adopters of offline conversion imports, and new builds go through the Data Manager API.

This guide walks through the full setup in ten steps, with labeled examples for lead stages, identifiers, timing, failed uploads, reconciliation and ownership.

P.S. If you'd rather hand the plumbing and the bidding to one team, our media buying group runs paid search on CRM outcomes for lead-gen brands.

TL;DR

  • Offline conversion tracking sends qualified leads and closed sales from your CRM back to Google Ads, matched to the original click.

  • Bid on the deepest lead stage that usually happens within 63 days of the click. Keep later stages as secondary actions that carry value.

  • Capture GCLID, GBRAID, WBRAID, MSCLKID and hashed email or phone on every lead, then copy them to the opportunity.

  • Upload daily, check offline data diagnostics after every change, and reconcile CRM counts against Google Ads every week.

  • Give each part of the pipeline a named owner, especially the CRM fields that sales ops can rename without warning.

Before we begin: bidding algorithms are only as good as the outcome you let them see. We build media, analytics and the client's sales operations side by side, because a qualified-lead signal is a contract between three teams. Sales decides what qualified means, RevOps keeps the fields clean, and paid search decides what the bid optimizes toward. Media buying is the lab where that contract gets tested every day, and a conversion import is how the lab gets its results. When one of the three changes a definition alone, the algorithm learns the wrong lesson quietly, and it keeps learning it until someone checks.

What Is Offline Conversion Tracking?

Offline conversion tracking sends outcomes recorded outside your website back to an ad platform, matched to the ad click that started them. Those outcomes are usually a qualified lead, an opportunity or a closed sale. Google Ads calls its version "offline conversion import." In this guide, "CRM conversion import" means the pipeline that moves those outcomes from your CRM into the platform.

Two kinds of match keys make the connection:

  • Click identifiers. Google adds a GCLID to the landing page URL when auto-tagging is on, and Microsoft Advertising adds an MSCLKID. You store the ID with the lead and return it with the outcome.

  • Hashed user data. Enhanced conversions for leads matches SHA-256 hashed email addresses and phone numbers to the same data captured at form submit and to signed-in Google accounts. Google now recommends that new adopters start with enhanced conversions for leads over GCLID-only imports.

Offline conversion tracking sits next to server-side tracking without replacing it.

  • Server-side tagging recovers web events that browsers block.

  • CRM conversion imports add events that never happen on the web at all, like a sales call that moves a deal forward.

Our guide to server-side tracking for paid media teams covers the first job. This one covers the second, for Google Ads and Microsoft Advertising search campaigns.

Loop diagram: click identifiers pass through the form and CRM, and each uploaded stage returns to Google Ads conversions

The loop closes when the stage your sales team records travels back to the click, so the next auction bids on what closed.

Why Paid Search Needs Qualified Lead and Closed Sale Data

Paid search needs CRM outcomes because bidding toward form fills gives Google no signal about which leads turn into customers. Maximize Conversions and Target CPA chase conversion volume; Maximize Conversion Value and Target ROAS use the values you send.

When the only primary conversion is a form fill, the algorithm buys the cheapest form fills it can find, and it has no way to see that some of them never answer a phone call.

The measurement gap is getting wider. In IAB's 2024 State of Data survey of 500+ ad and data leaders, 95% expected continued legislation and signal loss, and more than half expected trouble tracking and attributing conversions. CRM data is first-party, so signal loss doesn't erode it the way it erodes browser data.

Let’s take this example, with hypothetical numbers. Two search campaigns each spend $5,400 in a month. Here's what each system records:

Metric

Campaign 1: broad match, generic terms

Campaign 2: exact match, solution terms

Form fills (what Google Ads sees)

120

49

Cost per form fill

$45

$110

Sales-qualified leads (CRM)

9

22

Closed-won deals (CRM)

3

9

Cost per closed deal

$1,800

$600

With form fills as the goal, Smart Bidding shifts budget toward Campaign 1. With SQLs or closed deals as the goal, it shifts budget toward Campaign 2, which produces three times the revenue per dollar. Platform-reported conversions overstating weak traffic is the same pattern we cover in why last-click attribution over-credits the wrong campaigns.

How to Set Up Offline Conversion Tracking for Google Ads, Step by Step

Setting up offline conversion tracking takes ten steps: assign owners, map lead stages, pick one stage to bid on, value each stage, capture identifiers, create conversion actions, connect the CRM, set timing rules, test the first upload and reconcile every week. Steps 1 to 4 are decisions on paper. Steps 5 to 10 are build and maintenance work.

Assign one named owner per task before anyone touches a setting, because offline imports cross three teams and fail at the handoffs. In the accounts we audit, the most common break is a CRM field renamed by sales ops for an unrelated reason, which silently empties the identifier column.

Task

Responsible

Accountable

Consulted

Lead stage definitions

RevOps

Head of sales

Paid search lead

Identifier fields on forms and CRM objects

Web developer

RevOps

Analytics

Data source connection and field mapping

Analytics or marketing ops

Head of marketing

RevOps

Conversion action settings and values

Paid search lead

Head of marketing

Analytics

Daily upload monitoring

Analytics or marketing ops

Paid search lead

RevOps

Weekly reconciliation

Analytics

Head of marketing

Sales, paid search

Conversion adjustments

Analytics

Paid search lead

Sales

Consent and customer data review

Legal or privacy

Head of marketing

Analytics

Add one change-control rule to the table: no CRM stage, field name or picklist value changes until the paid search lead signs off. Our paid media RACI guide has the full tracking and measurement rows if you need the wider version.

Step 2: Map Lead Stages to Offline Conversion Actions

Write each lead stage as a CRM trigger, a typical lag and a send rule, and create one offline conversion action per stage. A stage name that sales and marketing read differently produces a conversion action sales won't trust.

Stage

CRM trigger (example)

Typical lag from click

Send as

Primary or secondary

Form submit

Web form completed

Same session

Google tag

Secondary once imports run

Marketing-qualified lead

Lead score ≥ threshold

0 to 3 days

Offline conversion

Secondary

Sales-qualified lead

Lead status = Sales accepted

3 to 21 days

Offline conversion

Primary for most B2B accounts

Opportunity created

Opportunity record opened

14 to 45 days

Offline conversion

Secondary

Closed-won

Opportunity stage = Closed won

30 to 180 days

Offline conversion with revenue

Secondary

Closed-lost or disqualified

Status = Disqualified

Any

No upload; triggers retraction rules

Not uploaded

The lags above are typical ranges from B2B and high-ticket service accounts, so replace them with medians from your own CRM.

If several Google Ads accounts import the same stage without cross-account conversion tracking, Google requires the exact same spelling and capitalization of each conversion name in every account.

For mapping where leads drop between these stages on the site itself, see our funnel leak analysis.

Step 3: Choose One Primary Conversion Action for Bidding

Choose the deepest stage that most deals reach within 63 days of the click and that still produces steady weekly volume, then mark it primary. Primary actions feed bidding, while secondary actions are observation only, so the choice decides what Smart Bidding and Performance Max chase.

The 63-day mark matters because enhanced conversions for leads only imports conversions uploaded up to 63 days after the click. A closed-won stage that lands at day 110 can't train the bid for most deals, however valuable it is.

Your situation

Primary action

Secondary actions

Short cycle (under 30 days), low lead volume

Closed-won with revenue

MQL, SQL

Mid cycle (30 to 90 days), healthy SQL volume

SQL with expected value

Opportunity, closed-won

Long cycle (90+ days), enterprise deals

SQL or opportunity with expected value

Closed-won, kept for reporting

Very low volume at every stage

MQL with expected value

SQL, closed-won

Pro tip: keep the form-fill action live as secondary for at least one full sales cycle after you switch. It gives you a clean before-and-after view of cost per SQL when someone asks whether the change worked.

Step 4: Assign an Expected Value to Each Lead Stage

Give each stage a value equal to your average closed-won deal value multiplied by that stage's close rate. Values let value-based bidding tell a promising SQL apart from a weak one, and they keep upper-stage actions from looking as valuable as revenue.

Stage value = Average closed-won value × Stage-to-close rate

Now let’s take another example. Say a software company closes deals at an average of $12,000 in first-year revenue. Its CRM shows these close rates:

  • SQL to closed-won: 25%, so each SQL is worth $3,000.

  • Opportunity to closed-won: 40%, so each opportunity is worth $4,800.

  • Closed-won: 100%, sent with the actual deal value.

Refresh close rates every quarter from at least two quarters of CRM data, and restate closed-won values when the signed amount changes (Step 10 covers adjustments). If retention varies a lot by segment, use first-year revenue for the bid and track lifetime value separately, as we outline in using LTV data for customer acquisition.

Step 5: Capture Click Identifiers and Hashed User Data in the CRM

Capture every available identifier at form submit, store it on the lead and copy it to the contact and opportunity, because the stage you upload often lives on a different CRM object than the form. A missing identifier at capture can't be recovered later.

  1. Turn on auto-tagging in Google Ads and Microsoft Advertising.

  2. Add hidden form fields for GCLID, GBRAID, WBRAID and MSCLKID, filled by a script or a Google Tag Manager tag that reads the URL and a first-party cookie.

  3. Create matching custom fields on the lead, contact and opportunity objects, plus a mapping rule that copies them on conversion.

  4. Write the first identifier the lead arrived with, and don't overwrite it when the same person submits a second form.

  5. Store a unique order ID for each stage event, such as the opportunity ID plus the stage name.

Each identifier fails in its own way, so it's worth knowing all of them:

Identifier

Platform

Captured where

Upload limit

Breaks when

GCLID

Google Ads

Landing page URL

90 days after click

Auto-tagging off, redirects strip the parameter, or casing changes (it's case sensitive)

GBRAID / WBRAID

Google Ads, iOS traffic

Landing page URL

90 days after click

Form only has a GCLID field

Hashed email or phone

Google Ads enhanced conversions for leads

Form fields, hashed in the tag or at upload

63 days after click

Normalization differs between tag and upload

MSCLKID

Microsoft Advertising

Landing page URL

90 days

Auto-tagging off; optional when hashed email or phone is sent

Order ID

Google Ads; internal CRM tracking for both platforms

CRM stage-event ID

Subject to the conversion's upload window

Reused for separate events within the same conversion action

Hashing has one rule that catches most teams. Google asks you to trim whitespace, lowercase and format phone numbers to E.164 before SHA-256 hashing, and for gmail.com and googlemail.com addresses it also asks you to remove periods and plus suffixes from the username.

Skip that step and Gmail leads hash to values Google never matches. On Microsoft, the MSCLKID becomes optional when you send a hashed email or phone for enhanced conversions.

Collect consent before any of this runs, and pass the user's consent choice through to the upload.

Pro tip: Regulated categories carry extra limits on what user data may leave the site, which we cover in our healthcare PPC compliance questions.

Step 6: Create Offline Conversion Actions and Turn On Enhanced Conversions

Create one offline conversion action per stage from Step 2, set primary or secondary from Step 3, and add the value rule from Step 4.

  • Use "One" for lead-stage actions where the import method supports it

  • "Every" for closed-won when one click can produce several deals.

  • For Google Ads API uploads containing GBRAID or WBRAID, use an action configured as "Every"; "One" isn't supported.

Deduplicate stage events with stable order IDs.

Then turn on enhanced conversions. Google merged enhanced conversions for web and for leads into a single on/off setting, and since April 2026 the account accepts user-provided data from the tag, Data Manager and API connections at once. You'll confirm the Google Ads customer data terms when you switch it on.

Wait before the first upload. Google advises waiting 4 to 6 hours after creating a conversion action, and conversions uploaded earlier can take 2 days to appear in reports.

Step 7: Connect the CRM Through Google Ads Data Manager

Connect the CRM in Google Ads Data Manager (Tools, then Data manager) when a native connector exists, and use the Data Manager API for custom builds. The old routes are closing: Google ended support for the legacy Salesforce integration on May 31, 2025, and the Data Manager connector now imports from Salesforce's Lead, Opportunity and Order objects.

HubSpot users can also sync lifecycle stages from HubSpot's own ads tool. HubSpot sends a separate conversion for each lifecycle stage a contact passes, so a contact who moves from lead to customer triggers two events.

Import method

Best for

Refresh

Main watch-out

Data Manager CRM connector (Salesforce, HubSpot)

Teams on a supported CRM

Scheduled, at least daily

14-day lookback on the first run, then changes only

Scheduled file (Google Sheets, SFTP, CSV in cloud storage)

Lower volume or custom CRMs

Daily schedule

Manual exports go stale on weekends and holidays

Data Manager API

High volume, custom stack, several platforms

Near real time

Engineering time to build and maintain

Middleware (Zapier, Make)

Small teams with no developer

Per trigger

Silent failures when a step errors or hits a rate limit

Map six fields whatever the method: identifiers, conversion action name, conversion time, value, currency and order ID. If you want the conversion action design and the bidding handled together, our Google Ads management team builds this setup as part of onboarding.

Then mirror the same stages in Microsoft Advertising as offline conversion goals. Set each goal's conversion window to the maximum of 90 days, and keep the stage names identical so reports line up.

Step 8: Set Conversion Times and a Daily Upload Schedule

Set the conversion time to the moment the CRM stage changed, with an explicit timezone, and upload at least once a day. Google asks advertisers to upload conversions at least daily, and every day of delay is a day the bid learns from stale data.

Three timing limits shape the whole setup:

  • Click identifier window. Google won't import offline conversions uploaded more than 90 days after the last click, and the limit is 63 days for enhanced conversions for leads. Microsoft's offline goals cap at 90 days.

  • Connector lookback. Data Manager imports the last 14 days on the first Salesforce or HubSpot run and only changes after that, while warehouse connectors import the last 14 days on every run, per Google's setup guide. A stage change older than the lookback never gets picked up.

  • Reporting lag. Imported conversions take about 3 hours to appear, and they're reported against the date of the click. Monday's numbers keep climbing all week as Monday's leads progress.

For example, an IT services firm has a 110-day median from click to closed-won. Its SQLs land at a median of day 21 and opportunities at day 38, so both fit inside the 63-day window. Closed-won at day 110 misses even the 90-day GCLID limit for most deals. The firm bids on SQL with a $3,000 expected value, sends opportunities as secondary, and uses closed-won for quarterly reporting in the CRM.

Timeline of days from click: SQL on day 21, opportunity on day 38, closed-won on day 110, past the day-90 GCLID limit

The timeline shows why the primary action is a timing decision as much as a value decision.

Step 9: Test the First Upload and Fix Failed Conversions

Upload a small test batch first, then open the offline data diagnostics page in Google Ads before you schedule anything. Google lists upload errors there, and file imports also show row-level detail on the Uploads page, as Google's troubleshooting guide explains.

Most failures fall into a short list. Google's API reference covers the full set of conversion upload errors, including a limit of 2,000 events per request:

Error

What it means

Usual cause

Fix

Identifiers too old

Click is past the import window

Uploading a late stage, or a backlog

Upload daily; bid on an earlier stage

Click too recent

Click is still processing

Real-time sends right after the click

Delay uploads by at least six hours

Conversion action just created

Action is under 4 to 6 hours old

Upload ran right after setup

Wait, then re-upload

Conversion action not active

Action is removed or not an import action

Renamed or deleted action

Re-map to an active "Import from clicks" action

Duplicate conversion

Same click and conversion time already exist

Re-running a file

Use order IDs; skip rows already accepted

Invalid conversion time

Time is before the click or unparseable

Wrong timezone or date format

Send ISO dates with an explicit timezone

User data not hashed

Email or phone arrived in plain text

Upload skipped hashing

Normalize and hash before sending

Tracking not enabled at click

No conversion tracking when the click happened

New account or new conversion account

Upload only clicks after tracking began

The more dangerous failures are silent. An upload can succeed and still attribute nothing. Google reports an email or phone it can’t match to a click as a warning that’s often safe to ignore, because the lead may not have come from Google Ads, so a rising share of those warnings is easy to miss. Only Step 10 catches these.

For instance, imagine that a CRM admin renames the field "GCLID" to "Google Click ID" during a cleanup. The connector keeps running, and for nine days it sends SQLs with an empty identifier and no hashed data. Google rejects those rows, but the scheduled job still shows as completed and nobody opens diagnostics. The weekly reconciliation shows 31 SQLs in the CRM and 4 attributed in Google Ads.

The fix is to re-map the field, then re-upload the nine days of SQLs with their order IDs while they’re still inside the 63-day window.

Step 10: Reconcile Imported Conversions Against the CRM Every Week

Reconcile weekly by comparing CRM stage counts with what Google Ads accepted and attributed for the same week, and write the result in a shared ledger. A reconciliation is the only check that catches silent failures, field renames and connector lookback gaps.

Put it on the agenda of the performance review you already run, the way our weekly marketing cadence guide suggests, so a dropped rate gets an owner within days.

  1. Pull the count of records that reached each uploaded stage last week, by stage-change date.

  2. Count how many of those records carry at least one identifier or hashed email.

  3. Count rows uploaded and rows accepted, from the Uploads page or diagnostics.

  4. Count conversions attributed in Google Ads for each action, using the "All conversions" column by conversion time.

  5. Log the three rates below and flag any that moved more than 10 points week over week.

The three rates each point to a different owner:

  • Identifier coverage = records with an identifier ÷ CRM records at that stage. Low coverage points to forms and field mapping.

  • Acceptance rate = rows accepted ÷ rows uploaded. A drop points to formatting or timing errors.

  • Attribution rate = conversions attributed ÷ rows accepted. A drop points to hashing or identifier quality.

Let’s use this example of one week in a B2B account:

Stage

CRM records

With identifier

Uploaded

Accepted

Attributed in Google Ads

SQL

64

52

52

50

41

Opportunity

28

22

22

22

17

Closed-won

9

7

7

7

5

Identifier coverage for SQLs is 81% (52 ÷ 64). The 12 missing records came mostly from a partner referral form with no hidden fields, which explains the gap without any Google Ads change. Leads from organic or direct traffic also lack identifiers, so 100% coverage isn't the goal; a stable rate is.

Pro tip: When a team can't staff this review every week, our analytics team builds the ledger and runs it.

Use conversion adjustments to keep the bid honest after the fact:

  • Retract an SQL that sales later disqualifies.

  • Restate a closed-won value when the signed amount changes.

Google counts adjustments for automated bidding only within 7 days of the original conversion, and you must wait at least 24 hours after the conversion before adjusting it. Batch adjustments into the daily upload and use the order ID as the key, falling back to the identifier plus the original conversion time only when no order ID exists.

Warning: Expect platform and CRM totals to differ every week, even with clean data.

Google Ads counts conversions by click date and its own attribution model, while the CRM counts by stage-change date. The reasons overlap with the self-attribution gaps in our attribution model audit, so read the three rates as trends over several weeks.

Build a Closed-Loop Paid Search Program with 9AM

Offline conversion tracking works when the stage definitions, the identifiers, the uploads and the weekly reconciliation all have an owner and a schedule. The setup itself takes a few weeks. Keeping it accurate is a permanent job, because CRMs, forms and Google's own APIs keep changing, as the 2026 Data Manager move showed.

9AM runs paid search and analytics as one team. We map lead stages with your sales ops, rebuild identifier capture, connect the CRM through Data Manager, set values that reflect real close rates, and then manage bidding against those outcomes with a reconciliation ledger reviewed every week.

Book a strategy call and we'll review your current conversion actions, your CRM fields and your last 90 days of imports, and show where the signal Google Ads learns from is leaking.

FAQs

Should the form-fill conversion stay primary while qualified-lead data builds up?

Keep it primary only until the qualified stage has a few weeks of accepted uploads, then switch the form fill to secondary. With Maximize Conversions or Target CPA, both actions count toward the conversion total. With value-based bidding, the values you assign tell Google which outcome matters more. If you need a transition, give the form fill a low value and the SQL its expected value, so bidding already prefers the deeper stage.

Can you upload offline conversions for leads that didn't come from Google Ads?

Yes. For enhanced conversions for leads through the API, Google asks you to upload all available offline conversions, including ones that may not have come from Google Ads, because matching happens on Google's side. Leads with no Google touchpoint simply won't attribute. Keep this in mind when reading acceptance and attribution rates in your ledger.

How do you count a lead that reaches the same stage twice?

Count it once by giving each stage event a stable order ID, such as the opportunity ID plus the stage name. Then set lead-stage actions to count "One" conversion per click. A recycled lead that requalifies months later should get a new order ID only if sales treats it as a new opportunity in the CRM.

What changes when several Google Ads accounts share one CRM?

Either create the import conversion actions once in the manager account with cross-account conversion tracking, or create them in every account with identical names and capitalization. Uploads for accounts not linked to the manager fail with a "not authorized" error. HubSpot's form-submission enhanced conversions can't sync through a manager account, so check your CRM's limits before choosing.

About 9AM

More from 9AM

Keep exploring.