What this integration solves
Salesforce-heavy sales teams often lose gclid at Lead Convert. Without a field mapping plan, Google Ads only sees web conversions and never learns from Opportunity Closed Won. Budgets then chase MQL volume that sales discounts.
This guide keeps GCLID__c (or your agreed API name) from Web-to-Lead or form middleware onto Contact, mirrors it to Opportunity when needed, and uploads on StageName transitions you choose.
Prerequisites and permissions
Salesforce System Administrator access to create custom fields on Lead, Contact and Opportunity. Google Ads access to create offline click conversion actions. A middleware option: Salesforce Flow calling an invocable Apex/HTTP callout, MuleSoft, or n8n listening to Opportunity Change Data Capture.
Create custom fields: GCLID__c Text(255), GBRAID__c, WBRAID__c, Google_Click_Date__c (DateTime), Offline_Conversion_Uploaded__c (Checkbox). Ensure Lead mapping copies GCLID__c to Contact on convert.
The build, step by step
1. Capture identifiers on the landing experience into Lead fields via Web-to-Lead hidden fields or form handler.
2. Map Lead to Contact on convert. Test convert with a sample Lead so GCLID__c survives.
3. When an Opportunity is created from Contact, copy GCLID__c onto a Opportunity.GCLID__c field if your upload job reads Opportunities.
4. Create Google Ads conversion actions aligned to StageName values, for example SF Opportunity Qualified and SF Closed Won.
5. Flow criteria: StageName equals target, Offline_Conversion_Uploaded__c is false, GCLID__c is not blank. Callout payload includes conversion_date_time from LastStageChangeDate or NOW(), value from Amount, currency from CurrencyIsoCode.
6. On success, set Offline_Conversion_Uploaded__c true and stamp Offline_Conversion_Upload_Log__c.
Gotchas
Lead Convert field mapping is the number one silent failure. Person Accounts change where fields live. Multi-currency orgs must convert Amount into the Ads account currency. Partial sandbox tests do not prove production callout auth. Opportunity StageName picklist API values, not labels, should drive Flow conditions. Reopened Closed Lost opportunities need a reset policy for the uploaded checkbox.
How to verify it is working
Run a named test Opportunity through StageName changes in a full sandbox with callouts enabled, then in production with a low-value test action first. Confirm Google Ads upload acceptance and Salesforce field stamps. Compare campaign ID from the original click using Google Ads click reports where available.
What breaks it later
Deployments that omit field mappings, Connected App secret rotation, StageName renames, and duplicate Management of Opportunities after account merges. Add a weekly report: Opportunities in Closed Won with blank GCLID__c or uploaded false.
Identity and capture for Salesforce to Google Ads offline conversions
Salesforce identity fails at Lead Convert more than at the HTTP callout. Prove GCLID__c survives convert onto Contact, then onto Opportunity.GCLID__c on every creation path (Contact, Account, CPQ). Person Accounts change field residency. Document the live API names beside a sample payload and block blank overwrites on merge.
Upload contract for Salesforce to Google Ads offline conversions
One Google Ads action per StageName API value you monetise (qualified and Closed Won at minimum). Payload uses LastStageChangeDate or NOW(), Amount converted into Ads account currency, CurrencyIsoCode, and an order_id that survives Flow retries. Gate on Offline_Conversion_Uploaded__c false and non-blank GCLID__c. Stamp success fields only after Ads accepts the hit.
Monitoring for Salesforce to Google Ads offline conversions
Weekly report Closed Won Opportunities with blank GCLID__c or uploaded false. Watch Connected App auth failures and StageName picklist deploys. After any Lead or Contact field-mapping change, re-run a convert canary with a distinctive GCLID__c string the same day. A named measurement owner owns the Flow; deploy pipelines do not.
Deep dive: Salesforce to Google Ads offline conversions
Store StageName API values in Custom Metadata so label renames cannot break uploads. Use a Named Credential with a least-privilege integration user that only updates offline stamp fields. Partial sandboxes lie about Connected App behaviour; keep a production canary action finance ignores. Reopened Closed Lost records need an explicit reset policy for the uploaded checkbox.
Operator checklist: salesforce-google-ads-offline-conversions
1) Web-to-Lead or form writes GCLID__c. 2) Convert test proves Contact.GCLID__c. 3) Opportunity creation copies the ID. 4) Flow fires on StageName API value. 5) Ads shows Accepted within 72 hours. 6) Offline_Conversion_Uploaded__c flips. 7) Re-test after the next Lead mapping deploy.