TL;DR
Google Ads optimization stops at the form submission or phone call — but your business cares about what happens after that. Offline conversions let you upload closed deals from your CRM back to Google Ads (via GCLID), and Enhanced Conversions for Leads lets Google match leads by hashed email/phone even without GCLID. This closes the loop: Google's algorithm learns which keywords, ads, and audiences drive revenue, not just leads. Result: 20–40% better ROI by optimizing for customers, not clicks.
You're running Google Ads. You're tracking conversions (form fills, phone calls). Google's Smart Bidding optimizes your campaigns to get more conversions.
But here's the problem:
Google doesn't know what happens after the lead converts. Did they:
- Answer your call?
- Become a qualified prospect?
- Close into a customer?
- Spend $500 or $50,000?
To Google, all leads are equal. A lead that hung up is the same as a lead that spent $10,000.
You're optimizing for lead volume when you should be optimizing for customer acquisition and revenue.
The fix: Feed your CRM data back into Google Ads using offline conversions and Enhanced Conversions for Leads.
What Are Offline Conversions?
Offline conversions = Uploading closed deals from your CRM back to Google Ads so the algorithm knows which ad clicks led to revenue, not just leads.
How it works:
- User clicks your Google Ad
- Google assigns a unique GCLID (Google Click ID) to that click
- User fills out a form on your website
- You capture the GCLID in your form and store it in your CRM alongside the lead's info
- Sales team works the lead
- Lead closes → CRM marks as "Closed-Won" with revenue amount
- You upload a file to Google Ads:
[GCLID, Conversion Time, Conversion Value] - Google matches the GCLID back to the original ad click and says: "Aha! This keyword generated $8,000 in revenue."
Now Google's algorithm optimizes for revenue-generating keywords, not just lead-generating keywords.
What Are Enhanced Conversions for Leads?
Enhanced Conversions for Leads = A way to match leads back to ad clicks using hashed email or phone number (instead of GCLID).
Why this matters:
GCLID tracking breaks in several scenarios:
- User clicks ad on mobile, converts on desktop (different devices)
- User clears cookies
- Lead comes in via phone call (no web form to capture GCLID)
- Multi-session journeys (user visits 3 times before converting)
Enhanced Conversions fixes this by sending hashed user data (email, phone, name, address) to Google. Google matches it against signed-in Google accounts and attributes the conversion even without GCLID.
Result: 20–30% more conversions attributed correctly (especially for phone leads and multi-device journeys).
Step-by-Step: Setting Up Offline Conversions
Step 1: Capture GCLID on Form Submissions
Add a hidden field to your form. Most form builders (Unbounce, Typeform, Gravity Forms) support hidden fields that auto-populate from URL parameters.
Add this hidden field:
- Field name:
gclid - Value:
{gclid}(dynamic parameter)
Google automatically appends ?gclid=ABC123XYZ to your landing page URL when someone clicks your ad. Your form captures it and stores it alongside the lead's contact info.
Step 2: Store GCLID in Your CRM
When leads flow into your CRM, make sure the GCLID is stored in a dedicated field:
- HubSpot: Create a custom property called "GCLID" (single-line text field)
- Salesforce: Create a custom field "GCLID__c"
- Airtable / Google Sheets: Add a column "GCLID"
Step 3: Track Which Leads Close
Your sales team marks leads as "Closed-Won" or "Closed-Lost" in your CRM. Track:
- Lead closed? (Yes/No)
- Close date (when they became a customer)
- Revenue (deal size)
Step 4: Upload Offline Conversions to Google Ads
Go to: Google Ads → Tools & Settings → Conversions → Uploads → "+ Upload" → "Track conversions from clicks"
Prepare a CSV file with these columns:
| Column Name | Description | Example |
|---|---|---|
| Google Click ID | The GCLID you captured | ABC123XYZ456 |
| Conversion Name | Name of your conversion action | "Closed Deal" |
| Conversion Time | When the lead closed | 2025-01-15 14:30:00-07:00 |
| Conversion Value | Revenue from the deal | 8500 |
| Conversion Currency | Currency code | USD |
Example CSV:
Google Click ID,Conversion Name,Conversion Time,Conversion Value,Conversion Currency
ABC123XYZ456,Closed Deal,2025-01-15 14:30:00-07:00,8500,USD
DEF789GHI012,Closed Deal,2025-01-16 10:15:00-07:00,12000,USD
Google will match the GCLID back to the original ad click, attribute revenue to that keyword/ad/campaign, and use this data to optimize future bids.
Step-by-Step: Setting Up Enhanced Conversions for Leads
Step 1: Enable Enhanced Conversions in Google Ads
Go to: Google Ads → Goals → Conversions → Select your conversion action → Settings → "Enhanced conversions" → Turn it ON
Choose your implementation method:
- Google Tag Manager (recommended for most)
- Google tag (gtag.js) (manual tracking code)
- Google Ads API (advanced integrations)
Step 2: Send Hashed User Data on Conversion
When a user converts, send their contact info to Google in hashed format (SHA-256).
Data you can send (all optional, but more = better matching):
- Email address, phone number
- First name, last name
- Street address, city, region, postal code, country
Example (Google Tag Manager setup):
dataLayer.push({
'email': 'user@example.com',
'phone_number': '+14805551234',
'address': {
'first_name': 'John',
'last_name': 'Smith',
'city': 'Phoenix',
'region': 'AZ',
'postal_code': '85001',
'country': 'US'
}
});
Google Tag Manager automatically hashes the data (SHA-256) before sending to Google Ads. Google then matches the hashed email/phone to a Google account and attributes the conversion.
Why This Matters: The ROI Impact
Without Offline Conversions
Google's view:
- Keyword "roof repair Phoenix" → 100 clicks → 10 form fills → Success!
- Keyword "emergency roof repair" → 50 clicks → 8 form fills → Also success!
Reality:
- "Roof repair Phoenix" → 10 form fills → 2 closed customers → $16,000 revenue
- "Emergency roof repair" → 8 form fills → 6 closed customers → $48,000 revenue
Google doesn't know this. It thinks "roof repair Phoenix" is better. It bids higher on the wrong keyword.
With Offline Conversions
Google now sees:
- "Roof repair Phoenix" → 2 closed → $16,000 revenue → Meh.
- "Emergency roof repair" → 6 closed → $48,000 revenue → Great! Bid higher.
Google shifts budget to "emergency roof repair" because it drives 3x more revenue per lead.
Result: 20–40% ROI improvement just by optimizing for the right thing.
Real-World Example: HVAC Company
Before offline conversions:
- Ad spend: $8,000 | Leads: 120 | Closed: 18 (15% close rate)
- Revenue: $90,000 | ROAS: 11.25:1
- Google optimization: maximize leads (quantity over quality)
After offline conversions + Target ROAS 800%:
- Ad spend: $8,000 | Leads: 100 (fewer, but higher quality)
- Closed: 25 (25% close rate — better targeting)
- Revenue: $125,000 | ROAS: 15.6:1
Revenue increased 39% with the same ad spend. Google stopped bidding on low-intent keywords and shifted budget to high-intent keywords that drove actual revenue.
How to Automate Offline Conversion Uploads
Uploading CSV files manually every week is tedious. Automate it.
Option A: Zapier + Google Ads
- Trigger: CRM record updated (status = "Closed-Won")
- Action: Google Ads → Upload offline conversion (GCLID, close date, deal amount)
Zapier's Google Ads integration supports offline conversion uploads natively.
Option B: Google Ads API (Custom Script)
from google.ads.googleads.client import GoogleAdsClient
client = GoogleAdsClient.load_from_storage()
conversion_upload_service = client.get_service("ConversionUploadService")
click_conversion = client.get_type("ClickConversion")
click_conversion.gclid = "ABC123XYZ456"
click_conversion.conversion_date_time = "2025-01-15 14:30:00-07:00"
click_conversion.conversion_value = 8500.0
click_conversion.currency_code = "USD"
request = client.get_type("UploadClickConversionsRequest")
request.customer_id = "1234567890"
request.conversions = [click_conversion]
response = conversion_upload_service.upload_click_conversions(request=request)
Common Mistakes
Mistake #1: Not capturing GCLID on forms
❌ You track form fills but don't capture GCLID — can't upload offline conversions
✅ Add a hidden field gclid={gclid} to every lead form
Mistake #2: Wrong timezone in conversion upload
❌ Upload conversion time without timezone offset
✅ Always include timezone: 2025-01-15 14:30:00-07:00 (ISO 8601)
Mistake #3: Waiting too long to upload conversions ❌ Wait 90 days to upload — Google's algorithm can't optimize with stale data ✅ Upload offline conversions weekly (or daily if automated)
Mistake #4: Not using Enhanced Conversions for phone leads ❌ Phone leads have no GCLID, so they're ignored in optimization ✅ Enable Enhanced Conversions for Leads — upload phone lead data (email, phone, name)
The Bottom Line
Google Ads optimization doesn't end at the form fill or phone call. It ends at the closed deal.
Set up the loop:
- Capture GCLID on all form submissions
- Store it in your CRM
- Upload closed deals back to Google Ads (via CSV or API)
- Enable Enhanced Conversions for Leads to match phone/email data
- Switch to value-based bidding (Target ROAS, Maximize Conversion Value)
Let Google's algorithm optimize for revenue, not lead volume. Your cost-per-lead will go up. Your cost-per-customer and ROI will go down. That's the goal.
Ready to Start Selling Leads?
Launch your first campaign in under 15 minutes. Try Growth free for 14 days.
Start Selling Leads →