Why Offline Conversion Upload?

Many businesses — especially B2B, real estate, and high-consideration purchases — generate leads online but close deals offline (via phone calls, in-person meetings, or CRM-tracked sales). Standard Google Ads conversion tracking only captures the initial online action (form submission, call), not the actual revenue.

Offline conversion upload bridges this gap by sending CRM-tracked conversion data back to Google Ads using the GCLID (Google Click ID). This enables:

  • Bidding based on actual sales, not just leads
  • Target ROAS (tROAS) bidding using real revenue data
  • Smarter algorithm optimization toward high-value conversions

Setup Overview

The process has three main components:

  1. Enable auto-tagging to capture GCLID on every ad click
  2. Pass GCLID to your CRM alongside lead data
  3. Upload conversion data back to Google Ads with the GCLID

Step 1: Enable Auto-Tagging to Capture GCLID

Auto-tagging automatically appends a GCLID parameter to every ad click URL. Without it, you cannot link offline conversions back to specific ad clicks.

  1. In Google Ads, go to Settings → Account settings
  2. Check "Auto-tagging" → toggle to Enabled
  3. Save changes

Important: UTM parameters alone are not sufficient for offline conversion upload. UTM can track keyword-level data, but only GCLID can uniquely identify each click and link it to a conversion event. You must use auto-tagging + GCLID.

Step 2: Capture GCLID in Your Lead Forms

When a user clicks your ad and lands on your site, the GCLID is in the URL. You need to capture it and store it with the lead data:

  1. Add a hidden field to your lead forms to store the GCLID
  2. Use JavaScript to extract the GCLID from the URL and populate the hidden field
// Extract GCLID from URL and populate hidden form field
function getGclid() {
  var w = window.location.search.substring(1);
  var params = w.split('&');
  for (var i = 0; i < params.length; i++) {
    var pair = params[i].split('=');
    if (pair[0] === 'gclid') {
      return decodeURIComponent(pair[1]);
    }
  }
  return '';
}
// Set on page load
document.addEventListener('DOMContentLoaded', function() {
  var gclidField = document.getElementById('gclid_field');
  if (gclidField) {
    gclidField.value = getGclid();
  }
});

Store the GCLID in your CRM alongside the lead record (e.g., as a custom field on the lead/contact object in Salesforce, HubSpot, etc.)

Step 3: Create Conversion Actions in Google Ads

  1. Go to Tools → Conversions → New conversion action
  2. Select "Import → Other data sources or CRMs"
  3. Choose "Track conversions from clicks" (uses GCLID)
  4. Name your conversion (e.g., "Qualified Lead," "Closed Deal")
  5. Set category, value, and count settings
  6. Repeat for each conversion stage you want to track (lead → qualified → closed)

Step 4: Upload Conversion Data

There are two methods for uploading offline conversions:

Method A: Manual CSV Upload

For small volumes or testing:

  1. Prepare a CSV with columns: Google Click ID, Conversion Name, Conversion Time, Conversion Value, Conversion Currency
  2. Go to Tools → Conversions → Uploads
  3. Click "Upload" and select your CSV file
  4. Review the upload status for errors

Method B: Google Ads API (Automated)

For production use, automate uploads via the Google Ads API:

# Pseudocode for Google Ads API offline conversion upload
from google.ads.googleads.client import GoogleAdsClient

client = GoogleAdsClient.load_from_storage()
conversion_upload_service = client.get_service("ConversionUploadService")

conversion_action = client.get_service("ConversionActionService")
conversion_action_resource = conversion_action.conversion_action_path(
    customer_id, conversion_action_id
)

click_conversion = client.get_type("ClickConversion")
click_conversion.gclid = "EAIaIQobChMI..."
click_conversion.conversion_action = conversion_action_resource
click_conversion.conversion_date_time = "2024-09-20 14:32:05+08:00"
click_conversion.conversion_value = 1500.0
click_conversion.currency_code = "USD"

request = client.get_type("UploadClickConversionsRequest")
request.customer_id = customer_id
request.conversions = [click_conversion]

response = conversion_upload_service.upload_click_conversions(request=request)

Best Practices

  • Upload within 90 days: Google only accepts GCLID conversions within 90 days of the click
  • Use consistent naming: Match your CRM stage names with Google Ads conversion action names for easy mapping
  • Track multiple stages: Create separate conversion actions for "Lead," "Qualified," "Opportunity," and "Closed" to give the algorithm rich signal
  • Include conversion value: Revenue data enables tROAS bidding, which is far more effective than tCPA for revenue-focused campaigns
  • Upload frequently: Daily uploads provide the freshest signal. Weekly is the minimum for effective optimization

Common Issues

  • "GCLID not found" errors: The GCLID may be expired (90-day limit exceeded) or malformed. Check your CRM data quality.
  • Conversions not appearing in reports: Allow 3-12 hours for uploaded conversions to appear in Google Ads reports. Attribution lag settings may also delay reporting.
  • Low match rate: If many leads have empty GCLID fields, review your form implementation — ensure the hidden field is populated before form submission.

Conclusion

Offline conversion upload transforms Google Ads from a lead-generation tool into a revenue-optimization platform. By feeding real business outcomes back to the algorithm, you enable smarter bidding that focuses on quality — not just quantity. The setup requires coordination between marketing and CRM teams, but the performance gains are well worth the effort.


← Back to Home