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:
- Enable auto-tagging to capture GCLID on every ad click
- Pass GCLID to your CRM alongside lead data
- 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.
- In Google Ads, go to Settings → Account settings
- Check "Auto-tagging" → toggle to Enabled
- 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:
- Add a hidden field to your lead forms to store the GCLID
- 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
- Go to Tools → Conversions → New conversion action
- Select "Import → Other data sources or CRMs"
- Choose "Track conversions from clicks" (uses GCLID)
- Name your conversion (e.g., "Qualified Lead," "Closed Deal")
- Set category, value, and count settings
- 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:
- Prepare a CSV with columns:
Google Click ID,Conversion Name,Conversion Time,Conversion Value,Conversion Currency - Go to Tools → Conversions → Uploads
- Click "Upload" and select your CSV file
- 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.