Skip to main content

Your ads drove the lead. The lead became a client. But Google Ads is showing zero conversions.

This is the offline conversion problem. And it is one of the most expensive attribution gaps in digital marketing.

When someone clicks your ad, fills out a form, gets a follow-up call, and signs a contract three weeks later, your ad platform never sees that sale. It only saw the click. So it optimizes for clicks. Not revenue.

Offline conversion tracking fixes that. It closes the loop between what happens in your CRM or sales process and what your ad platforms actually report and optimize on.
This guide covers what offline conversion tracking is, how it works, how to set it up across Google Ads and Meta, and what mistakes to avoid along the way.

What Is Offline Conversion Tracking?

Offline conversion tracking is the process of importing real-world conversion events back into your ad platforms after they happen outside the browser.

“Offline” does not necessarily mean in-person. It means the conversion happened outside the ad platform’s native tracking environment. That includes:

➔ A phone call that leads to a sale
➔ A form submission that gets qualified and closed by a sales rep
➔ An in-store purchase from someone who clicked an ad
➔ A contract signed after a two-week sales cycle
➔ A demo request that converts to a paid account weeks later

In all of these cases, the ad platform fired its standard tracking pixel when the form was submitted or the click happened. But it never knew whether that lead actually became revenue.

Offline conversion tracking gives the platform that information. You tell it: “This click, from this campaign, turned into a real sale on this date for this value.” The platform uses that data to understand which campaigns, ad groups, and keywords are actually driving revenue, and optimizes accordingly.

Graphic novel illustration of two pipeline sections bridging a gap, with a neon green signal beam connecting them across a glowing red divide, representing the closing of the attribution gap in offline conversion tracking.
Graphic novel illustration showing four offline conversion scenarios: a phone call leading to a sale, a signed contract, an in-store purchase, and a closed deal — representing real-world conversions that happen outside the ad platform.

Why Offline Conversion Tracking Matters

Most people focus on lead volume. The better question is lead quality.

If you are running Google Ads and optimizing for form submissions, the algorithm is trying to get you more form submissions. It does not know that 80% of those leads never convert. It does not know that the ones from a specific keyword actually close at three times the rate.

Without offline conversion data, you are flying blind on the metrics that actually matter.
The algorithm optimizes for what you measure. If you measure form fills, you get more form fills. If you measure closed deals, you get more closed deals. Offline conversion tracking is how you tell the algorithm to optimize for the latter.

Here is what changes when you do it right:

➔ Smarter bidding. Smart Bidding strategies (Target CPA, Target ROAS, Maximize Conversions) rely on conversion signals. Feed them real revenue data, and they get dramatically better at finding the users who actually convert.

➔ Better budget allocation. You will likely find that some campaigns driving high lead volume are generating almost no revenue. And some lower-volume campaigns are driving most of your closed deals. You cannot see that without offline data.

➔ Accurate reporting. Your actual cost per acquisition becomes visible. Not cost per lead, cost per sale. That changes how you evaluate performance and justify the budget.
Audience signals. Platforms use conversion data to build lookalike and in-market audiences. Real conversion data builds better audiences than proxy signals.

How Offline Conversion Tracking Works: The Core Mechanics

The core mechanism is simple, even if the implementation takes some setup.

Step ①

Capture the Click Identifier

When someone clicks your Google Ad, Google appends a unique parameter to the landing page URL called a GCLID (Google Click Identifier). It looks something like this:

https://yoursite.com/contact?gclid=CjwKCAjw…

This GCLID is the key. It ties the eventual conversion back to the specific ad click that drove it.

For Meta, the equivalent is the FBCLID or the Meta Pixel event ID when using the Conversions API.

Step ③

Track the Offline Event

When the offline conversion happens, a deal closes, a call converts, a contract is signed, you record that in your CRM with the date, value, and ideally a conversion category.

Step ②

Store the Identifier

Your website needs to capture that GCLID and store it somewhere you can reference later. The most common approach is to pull it from the URL and pass it through your lead form as a hidden field. When the form is submitted, the GCLID is saved alongside the lead record in your CRM.

This is the step most setups get wrong. If your CRM does not store the GCLID at the point of lead creation, there is nothing to send back later.

Step ④

Import the Data Back

You send Google Ads (or Meta) a file or API call that says: “The click with GCLID [X] converted on [date] for [value].”

The platform matches the import back to the original click, attributes the conversion to the correct campaign and keyword, and uses that data for reporting and bidding optimization.

Setting Up Google Ads Offline Conversion Tracking

Google Ads offers several methods for importing offline conversions. The right one depends on your sales process and tech stack.

Method 1: Enhanced Conversions for Leads

Enhanced lead conversions are the easiest starting point. It does not require GCLID capture. Instead, it hashes contact information (email address, phone number, name) collected in your lead form, stores it securely, and later matches it to Google sign-in data when a conversion happens.

This works well for B2C and simpler sales cycles where you can match lead data to purchase data. It requires less infrastructure than GCLID-based importing.

To set it up:

  1. In Google Ads, go to Goals > Conversions > Settings
  2. Enable enhanced conversions for leads
  3. Use the Google tag or GTM to pass hashed lead data when a form is submitted
  4. In your CRM or sales system, record conversions with the same contact data
  5. Import conversions via the Google Ads API or the Google Sheets connector

Method 2: Manual CSV Upload

This is the most direct method and the best starting point if you want to understand the process before automating it.

Step 1: Create a conversion action

In Google Ads, go to Goals > Conversions > New conversion action. Select “Import” and then choose “CRMs, files, or other data sources.” Name your conversion (e.g., “Closed Deal”) and set the conversion window, value, and count settings.

Step 2: Set up GCLID capture on your site

Add the GCLID to your form as a hidden field. The simplest approach using JavaScript:

javascript
// Pull GCLID from URL and store in hidden form field
function getParam(name) {
  var match = RegExp('[?&]' + name + '=([^&]*)').exec(window.location.search);
  return match && decodeURIComponent(match[1].replace(/\+/g, ' '));
}
document.querySelector('input[name="gclid"]').value = getParam('gclid') || '';

You also need to enable auto-tagging in Google Ads (this is what appends the GCLID to your URLs). Go to Account Settings > Auto-tagging and confirm it is turned on.

Step 3: Store GCLIDs in your CRM

Map your hidden form field to a custom field in your CRM. Every lead created from a Google Ads click should have a GCLID attached.

Step 4: Format and upload the import file

When a conversion happens, export a CSV with these required columns:

Google Click ID | Conversion Name | Conversion Time | Conversion Value | Conversion Currency

The time format must follow ISO 8601: 2024-03-15 14:30:00+00:00

In Google Ads, go to Goals > Conversions > Uploads and upload the file. Google will confirm how many rows were matched and imported.

Step 5: Allow time for processing

It can take up to 48 hours for imported conversions to appear in your reports. Imported conversions are attributed back to the original click date, not the import date.

Method 3: CRM Integrations

Google Ads has native connectors for Salesforce and HubSpot. These automate the import process based on deal stage changes in your CRM.

Salesforce connector:

Go to Goals > Conversions > New conversion action > Import > Salesforce. Google walks you through the OAuth connection process. You then map conversion actions to Salesforce opportunity stages. When a deal moves to “Closed Won,” Google automatically imports it.

HubSpot connector:

The setup is similar. Connect via OAuth, map deal stages to conversion actions, and Google handles the rest. Note that the native HubSpot connector is less flexible than building a custom workflow. Some teams prefer using the Google Ads API directly or a middleware tool like Zapier.

Method 4: API-Based Imports

For more flexibility, you can trigger conversion imports automatically when specific events happen in your CRM.

Using Zapier:

  1. Trigger: Deal stage changes to “Closed Won” in your CRM
  2. Action: Google Ads — Upload offline conversion
  3. Map the GCLID, conversion name, date, and value fields

This gives you real-time imports rather than batch uploads, and works with any CRM that has a Zapier integration.

Using the Google Ads API directly:

If you have development resources, the Google Ads API gives you full control. You post conversion imports via the OfflineUserDataJobService or ConversionUploadService endpoints. This is the most scalable option for high-volume or complex conversion schemas.

Setting Up Meta Offline Conversions

Meta’s approach to offline conversion tracking has shifted significantly with the Conversions API or CAPI. Legacy offline event sets still exist, but CAPI is now the recommended path.

Using the Meta Conversions API for Offline Events

The Meta Conversions API lets you send conversion events directly from your server, bypassing the browser entirely. This includes offline events.

How it works:

  1. You send a server-side event to Meta’s /events endpoint when a conversion happens
  2. Meta uses event matching to tie the conversion to the right ad and user
  3. The event is attributed to the correct campaign

Event matching quality matters. The more identifiers you include (email, phone, name, city, zip, country), the better Meta can match the conversion to a user. Always hash personal data with SHA-256 before sending.

Setting up CAPI for offline events:

  1. In Meta Events Manager, go to your pixel and select “Conversions API”
  2. Choose your integration method (direct API, partner integration, or Meta’s gateway)
  3. Send the Purchase, Lead, or custom event with the event_time set to when the offline conversion actually happened
  4. Include as many match keys as you have: em (email), ph (phone), fn (first name), ln (last name), ct (city), zp (zip)

Deduplication: If you are also firing a browser pixel event when the form submits, you must deduplicate to avoid double-counting. Use the same event_id in both the pixel event and the CAPI event so Meta can recognize they represent the same action.

Meta Offline Event Sets (Legacy Method)

For teams not yet on CAPI, Meta still supports uploading CSV files through Offline Event Sets in Events Manager. The process is similar to Google’s CSV upload: format a file with transaction time, event name, match keys, and value, then upload manually or via API.

The downside of this method is the manual effort and the delay between conversion and import. CAPI is real-time by comparison.

What About Other Platforms?

Microsoft Advertising (Bing): Supports offline conversion imports very similarly to Google Ads. You capture a MSCLKID (Microsoft Click ID), store it in your CRM, and upload a CSV or use the API. Setup lives under Conversion Goals > Import Conversions.

LinkedIn Ads: LinkedIn uses a Conversion API for server-side events. For offline conversions tied to LinkedIn campaigns, you match using email address or LinkedIn user ID. The LinkedIn Insight Tag still handles browser-side tracking, but the Conversions API handles server and offline events.

Google SA360 / DV360: If you are running campaigns through Search Ads 360, offline conversion imports flow through the SA360 interface rather than directly through Google Ads. The mechanics are the same, but the upload location and API endpoint differ.

Common Mistakes That Break Offline Conversion Tracking

Getting the setup right is only half the battle. These are the mistakes that silently break it after it is live.

Not enabling auto-tagging. If Google’s auto-tagging is off, no GCLIDs are appended to your URLs and there is nothing to import. This is the most common reason imports fail.

GCLIDs not passing through forms. Your landing page might capture the GCLID in a cookie or session, but if it is not being written into the form submission, your CRM never receives it. Always verify this end-to-end before going live.

Importing outside the conversion window. Google Ads has a default conversion window of 90 days for imported conversions. If your sales cycle is longer than that, you need to extend the window in your conversion action settings. Conversions imported after the window closes are not attributed.

Using the wrong time format. Google is strict about time formatting in CSV imports. Invalid timestamps cause import failures with vague error messages. Use ISO 8601 with timezone offset.

Importing duplicates. If you are importing via both an automated integration and manual CSV uploads, you can end up double-counting conversions. Audit your import sources and confirm deduplication is working.

Not testing the GCLID flow before launch. Click one of your ads, complete a test form submission, and check that the GCLID appeared in your CRM. Do this before you consider the setup live.

Sending all leads as conversions. Importing every form submission as an offline conversion defeats the purpose. The power of offline conversion tracking is importing only the ones that became real revenue. Keep your primary conversion action tied to the actual sales outcome.

Best Practices for Offline Conversion Tracking

➔ Store GCLIDs server-side, not just in cookies. Browser cookies can be cleared or blocked. If your site only captures the GCLID in a cookie and passes it on form submit, you will lose GCLIDs when cookies are unavailable. Server-side capture (stored immediately in your database when the form submits) is more reliable.

➔ Use conversion values. Most setups import conversions without values, which limits Smart Bidding. If your deals have varying sizes, pass the actual deal value with each import. Even an average deal value is better than nothing.

➔ Segment your conversion actions. Create separate offline conversion actions for different deal types or revenue tiers. This gives you visibility into which campaigns drive high-value deals versus low-value ones.

➔ Set up regular import scheduling. Manual CSV imports work for testing but are unsustainable at scale. Automate the process as soon as possible. Whether that is a CRM connector, a Zapier workflow, or a custom script, it needs to run without manual intervention.

➔ Audit import success rates. After uploads, check the diagnostics tab in Google Ads. It shows how many rows were matched, how many failed, and why. A 100% match rate is rare. GCLIDs expire after 90 days, and some leads will have incomplete data, but consistently low match rates signal a problem in your capture or import logic.

➔ Align with your sales team. Offline conversion tracking only works if the CRM data is accurate. If sales reps are not logging deal stages consistently or updating close dates, your import data will be unreliable. The marketing and sales data quality conversation is as important as the technical setup.

Offline Conversion Tracking: Platform Comparison

Platform Primary Method Click Identifier CRM Integration CSV Upload API Support Conversion Window (default) Smart Bidding Impact
Google Ads GCLID import / Enhanced Conversions GCLID Salesforce, HubSpot (native) ✓ (ConversionUploadService) 90 days High — feeds Target CPA / ROAS
Meta Ads Conversions API (CAPI) FBCLID / event ID Via CAPI partner integrations ✓ (legacy Offline Event Sets) ✓ (CAPI /events endpoint) 28 days (click) / 1 day (view) High — improves audience matching
Microsoft Ads MSCLKID import MSCLKID Limited (via API) 90 days Medium — supports enhanced CPC
LinkedIn Ads Conversions API LinkedIn User ID / email hash Via CAPI (limited native) 30 days Medium — improves lead scoring

Conversion windows and integrations are subject to change. Verify current settings in each platform's documentation.

Wrapping Up

Offline conversion tracking is not optional anymore if you are running campaigns for businesses with real sales cycles.

The attribution gap between a click and a closed deal is where most ad platforms waste budget. Without offline data, your bidding algorithm is working on incomplete information and making bad decisions at scale.

The setup requires coordination between your marketing stack, CRM, and (often) your sales team. But once it is running, you get something most advertisers do not have: a clear line between ad spend and actual revenue.

Start with GCLIDs. Get them storing in your CRM. Run a manual CSV upload to test the flow. Then automate.

If you need help setting up offline conversion tracking or auditing an existing setup, reach out to the team at Voxxy Creative Lab. This is exactly the kind of tracking architecture work we do.

FAQ

Common Questions

Offline Conversion Tracking FAQ

Questions that come up most during setup and audits.

Typically 24 to 48 hours after upload. The important thing to understand is that imported conversions are backdated to the original click date, not the import date. So your historical reports will update retroactively, which can look surprising the first time you see it.

If conversions are not showing after 48 hours, check the diagnostics tab under Goals > Conversions > Uploads. It will show exactly how many rows matched, how many failed, and why.

Yes. Enhanced conversions for leads does not require GCLIDs. Instead, it hashes contact data collected at form submission (email, phone, name) and uses that to match conversions to users via Google sign-in data. It is less precise than GCLID matching but significantly better than no offline data at all.

For Meta, the Conversions API also does not need a click identifier in the traditional sense — it matches using hashed email, phone, and other identity signals.

If you cannot get GCLID capture working immediately, enhanced conversions for leads is a solid starting point that you can run in parallel while you fix the GCLID flow.

The conversion will not be attributed to any campaign. Google processes the import, confirms it received the row, but does not match it to the original click. You will see a Conversion window expired status on affected rows in the diagnostics report.

The default conversion window for imported conversions is 90 days. If your sales cycle is longer, you need to extend this in your conversion action settings before you start importing. You cannot retroactively change the window and recover expired attributions.

If you are in a B2B or enterprise sales environment with 6+ month cycles, review your conversion window setting immediately. 90 days will silently miss a significant portion of your actual revenue signals.

Yes, and this is the primary reason to implement them. Smart Bidding strategies like Target CPA and Target ROAS use every available conversion signal to make bid decisions. When your only conversion action is a form submission, the algorithm optimizes for form submissions. Feed it closed revenue and it starts optimizing for that instead.

The impact is most dramatic when you also pass conversion values. Even if your deals vary in size, including actual deal value with each import lets the algorithm find users who are more likely to produce high-value revenue — not just any revenue.

Yes. Most call tracking platforms — CallRail, CallTrackingMetrics, and others — support GCLID capture and have built-in Google Ads integrations that send qualified call data directly as offline conversions.

The key is configuring the integration to send only calls that meet your qualified criteria, not every call. Setting a minimum call duration is the most common filter. Sending every 10-second call as a conversion will pollute your bidding signals the same way sending every unqualified lead does.

GCLID-based import depends on a GCLID being stored, and storing a GCLID requires cookie consent at the time of the click. In environments where consent is denied, no GCLID is saved and there is nothing to import later.

Enhanced conversions for leads and Meta CAPI are more resilient in these scenarios because they use hashed contact data rather than browser-stored identifiers. If you are operating in a high-consent-friction environment like the EU, these methods should be part of your tracking architecture alongside — or instead of — GCLID-based importing.

For a deeper look at how consent mode affects your tracking coverage, see our post on Google Consent Mode v2 and cookieless pings.

Three fields are required: Google Click ID, Conversion Name, and Conversion Time. That is the bare minimum for Google to process and match the import.

Conversion Value and Conversion Currency are optional but strongly recommended. Without values, Smart Bidding treats every conversion as equal weight, which limits how well it can differentiate high-value signals from low-value ones.

The time field must follow ISO 8601 format with a timezone offset: 2024-03-15 14:30:00+00:00. This is the most common cause of import failures.

Think your tracking has gaps?

Get a free audit. We'll tell you exactly what's broken.

Related Posts

Privacy Preference Center