The sale that closes days later in your CRM, over the phone or after a demo, is invisible to Google Ads by default, so the campaign that earned it gets no credit and optimizes blind. Offline conversion import fixes that by feeding those later sales back to Google. Here is how to do it in 2026.
What offline conversion import does
Offline conversion import connects a conversion that happens outside the website, like a closed deal in your CRM, back to the Google Ads click that started it. You capture the click identifier when the lead arrives, store it with the lead, and when the deal closes you upload the conversion with that identifier. Google then credits the right campaign, keyword, and ad.
Capture the GCLID first
None of this works without the click ID, so capturing it is step one. When a visitor arrives from a Google ad, the URL carries a gclid parameter; store it with the lead, typically in a hidden form field that writes to your CRM:
// Capture the Google click ID on the landing page and store it with the lead
const params = new URLSearchParams(location.search);
const gclid = params.get('gclid');
if (gclid) {
document.querySelector('#gclid_field').value = gclid; // saved into the CRM
}
Without a stored gclid, Google has nothing to tie the later sale to, so the whole import quietly produces no attributed conversions.
Know the 2026 migration
The upload path changed, and using the old one will break. Google is migrating offline conversion imports and enhanced-conversions-for-leads uploads to the Data Manager API, and blocking those uploads in the older Google Ads API from mid-June 2026. So new setups should target the Data Manager API, and anyone still on the old API path needs to migrate to avoid an interruption.
Upload the conversion when the deal closes
When the sale completes, send Google the conversion with the stored gclid, the conversion action name, the time, and the value. Each uploaded row ties one offline outcome to one click:
// Conceptual offline conversion row uploaded to Google (via Data Manager API)
{
"gclid": "<stored click id>",
"conversion_action": "Qualified Lead",
"conversion_date_time": "2026-10-25 14:30:00+03:00",
"conversion_value": 1200,
"currency_code": "USD"
}
Consider enhanced conversions for leads instead
Where you lack a reliable gclid but do have the customer's email, enhanced conversions for leads is often the better route, matching on hashed first-party data rather than the click ID. Many teams run both: the gclid path where the click ID survives, and hashed-data matching where it does not. Choosing per lead maximizes how many offline sales actually get attributed.
Verify attribution flows back
Confirm the loop closes:
- Check that gclids are actually being captured and stored on real leads.
- Watch for the uploaded conversions appearing in Google Ads against the right campaigns.
- Reconcile uploaded counts against closed deals so you know nothing is silently dropped.
Upload on a schedule, not once
Offline conversions are not a one-time export; they are a continuous feed. Deals close every day, so the upload should run on a schedule, pulling newly closed deals from the CRM and sending them with their stored click IDs. A one-off upload attributes a single batch and then goes stale, while a daily or near-daily job keeps Google learning from fresh outcomes. Mind the timing too: upload conversions promptly after they close, since a deal reported long after the click can fall outside the window where it still informs bidding.
A deal that closes days later in your CRM is invisible to Google Ads until you send it back, and offline conversion import is that return path. Capture the gclid up front, use the Data Manager API as the old upload path closes, send the conversion when the deal lands, and fall back to hashed-data matching where the click ID is missing. Do that and your campaigns finally optimize on the sales they actually caused, not just the forms they filled.
Want a stronger data analyst role or a raise? Grab the FREE Product Analyst Playbook and get the exact roadmap to your next offer.
