The Measurement II module explained why you upload offline conversions. This tutorial is the how, from start to finish, using the route that needs no developer: a Google Sheet that Google Ads reads every day. Total time: one afternoon, if your form accepts a hidden field.
Step 0 · What you need
- Admin access to Google Ads.
- Access to the website (or to whoever runs it) to add a small script and a hidden field to the form.
- Somewhere the leads live with their status: a CRM or a sheet.
- A Google account for the upload sheet.
Step 1 · Auto-tagging
Admin → Account settings → Auto-tagging → Yes. Check that clicking an
ad gives you a destination URL carrying gclid=…. If your site
redirects (http→https, www, language), verify that the parameter
survives the redirect (open it in the browser and look at the final URL).
Step 2 · Store the GCLID in the browser
A 10-line script on every page (via Tag Manager or in the template) that,
if the URL carries a gclid, stores it in a 90-day cookie
(gclid). Tag Manager has gallery templates for this ("GCLID to
cookie"); if you use WordPress, there are plugins that do it and fill in
forms as well (step 3).
Check: visit with ?gclid=TEST123 in the URL, browse to another
page and look at the site's cookies: gclid=TEST123 should be there.
Step 3 · Hidden field in the form
In every form: a hidden field called gclid that is filled from the
cookie when the page loads (the same script or plugin). On submit, the
GCLID travels with the lead to the email, the CRM or the sheet the
submissions land in. If you can, add hidden fields with utm_campaign
and the page URL too: they help with diagnosis.
Check: submit a test form after visiting with ?gclid=TEST123: the
lead you receive should carry TEST123.
Step 4 · Store the GCLID alongside the lead
- CRM: a custom "GCLID" field on the contact/opportunity, mapped from the form (HubSpot, Zoho, Pipedrive… all allow it).
- Sheet: if leads land in a sheet (Zapier, forms that write to Sheets), a GCLID column.
Rule: the GCLID is stored once and never modified; it is the key.
Step 5 · Create the conversion actions
Goals → Conversions → + New → Import → Other data sources or CRM → Track conversions from clicks. Create:
- Qualified lead (category: qualified lead; count one; window 60-90 days; fixed value or value per row; primary).
- Sale (category: purchase; count one; window 90 days; value per row; primary).
Write down the exact names: they are used in the sheet.
Step 6 · The upload sheet
Conversions → the action → Uploads → Google Sheets → Create template
(or download the template). It has three header rows you must not
touch (the third, Parameters:TimeZone=…, carries the account's time
zone) and these columns:
| Google Click ID | Conversion Name | Conversion Time | Conversion Value | Conversion Currency |
|---|---|---|---|---|
| CjwKCAjw… | Qualified lead | 2026-08-20 14:32:00 | 80 | EUR |
| CjwKCAjw… | Sale | 2026-08-22 10:05:00 | 1250 | EUR |
Date format: yyyy-MM-dd HH:mm:ss (or with a time zone, +01:00). The
date is the conversion's (when it was qualified / sold), later than
the click and within 90 days.
How it gets filled in: with a formula or a small automation that reads your CRM/lead sheet and generates one row for every lead that changed status (qualified, sale) and hasn't been uploaded yet. Mark a "Qualified uploaded ✓ / Sale uploaded ✓" column in the lead sheet so you don't duplicate.
Step 7 · Schedule the upload
Conversions → Uploads → + → Google Sheets → scheduled → paste the sheet's URL, share the sheet with the service account Google gives you, frequency daily (the hour is up to you). Google reads the sheet every day and imports the new rows (already-imported ones are ignored by GCLID
- name + date).
Check: after the first upload, Conversions → Uploads shows the history (rows imported, errors). And the conversion appears in the campaign of the original click, on the date of the click.
Step 8 · Adjustments and refunds
To retract or correct: the conversion adjustments template (same
route), with columns for GCLID, name, original conversion date,
adjustment type (RETRACT to cancel, RESTATE to change the value) and
the new value. Scheduled the same way. Use it for returned sales, leads
that turned out to be bad, or corrected values.
Errors you will see in the upload history
| Error | Cause | Fix |
|---|---|---|
| Invalid GCLID | Copied wrongly, truncated, from another account | Check the capture; check the click belongs to this account |
| Date earlier than the click | Wrong conversion time | The qualification/sale date, not the lead's |
| Outside the window | > 90 days | Upload intermediate stages first |
| Conversion name doesn't match | An accent, a capital letter | Copy the exact name |
| Duplicate | Same row twice | The "uploaded ✓" column |
What to expect
First week: offline conversions appear with a delay (it uploads daily; Google processes in hours). Smart Bidding starts using them after a few weeks if they are primary. Review the ratio of qualified leads uploaded to leads in the CRM every month.
💡 Ninja trick: this tutorial is exactly what Lead Rating automates out of the box: GCLID capture with its snippet, a daily bulk upload from the script (no upload sheet and no scheduling in Google Ads), the three actions with the rating as the value of the raw lead, per-lead upload marks and adjustments. If you're building it by hand, this is the route; if you want it to build itself, that's the other one.
What you should remember
- Auto-tagging → GCLID in a cookie → hidden field → CRM/sheet: the
capture chain, verified with
?gclid=TEST. - "Track conversions from clicks" actions (qualified, sale) with exact names.
- A sheet using the template (three headers, time zone, the conversion's date, value, currency) and a daily scheduled upload.
- Adjustments for refunds; an "uploaded ✓" column against duplicates; check the upload history.