How to Upload Offline Conversions to Google Ads: Step-by-Step Guide
A step-by-step guide to uploading offline conversions to Google Ads — from creating an Import conversion action and enabling auto-tagging to preparing your CSV file and verifying uploads. The Upload Offline Conversions App walks through both manual and automated methods.
Uploading offline conversions to Google Ads connects the revenue your ads generate — booked jobs, signed contracts, completed sales — to the clicks that produced them. This step-by-step guide from The Upload Offline Conversions App (TUOCA) walks through the entire process, from initial setup to verification.
Prerequisites Checklist
Before uploading offline conversions, confirm you have:
- Google Ads account with admin or standard access
- Auto-tagging enabled (Settings → Account settings → Auto-tagging)
- GCLID capture — Your CRM, call tracking tool, or forms store the GCLID from ad clicks
- Conversion data — A list of conversions with GCLIDs, dates, and values
- 6 hours since the click. Wait 6 hours after the click before you upload it: a click at 9:00 a.m. is too recent at noon and is ready at 3:00 p.m., and if you upload sooner the error asks you to try again in 12 hours.
If you don’t have GCLIDs captured, you can use Enhanced Conversions for Leads with hashed PII (email, phone) instead.
Step 1: Create an Import Conversion Action
The conversion action defines what type of offline conversion you’re tracking. It must be type “Import” — other types (Website, App) won’t accept uploaded data.
In Google Ads:
- Navigate to Goals → Conversions → Summary
- Click + New conversion action
- Select Import
- Choose CRM, files, or other data sources
- Select your conversion type:
- Track conversions from clicks — if you have GCLIDs
- Track conversions from leads (Enhanced Conversions for Leads) — if you’re using hashed PII
Configure the action:
| Setting | Recommended Value | Notes |
|---|---|---|
| Name | Descriptive (e.g., “Booked Job”) | Use different actions for different funnel stages |
| Goal | Purchase/Sale, Lead, or custom | Choose the most appropriate goal category |
| Value | “Use different values for each conversion” | Enables value-based bidding |
| Default value | Your average conversion value | Fallback if value not provided in upload |
| Count | “One” | For lead/booking conversions (one per GCLID) |
| Click-through window | Match your sales cycle | 30, 60, or 90 days |
| Include in “Conversions” | Yes (Primary) | Required for Smart Bidding |
| Attribution model | Data-driven | Google’s recommended default |
- Click Create and Continue
- Note the conversion action name — you’ll need it for your CSV upload
Step 2: Enable Auto-Tagging
Auto-tagging is what appends the GCLID to your ad URLs. Without it, there’s no click identifier to match conversions against.
- Go to Settings → Account settings
- Under Auto-tagging, check “Tag the URL that people click through from my ad”
- Save
Auto-tagging is enabled by default, but verify — especially if someone on your team or a previous agency may have disabled it. Auto-tagging works alongside manual UTM tagging; you don’t need to choose one or the other.
Step 3: Capture and Store GCLIDs
Your system must capture the GCLID at click time and store it alongside the lead record. Common methods:
Call Tracking Tools (Recommended for Service Businesses)
CallRail, CallTrackingMetrics, and similar tools automatically capture the GCLID from the referring URL when a tracked call occurs. This is the easiest path for businesses where phone calls are the primary lead source.
Hidden Form Fields
For form submissions, add a hidden field that captures the GCLID from the URL:
<input type="hidden" name="gclid" id="gclid" value="">
<script>
// Capture GCLID from URL on page load
const params = new URLSearchParams(window.location.search);
const gclid = params.get('gclid');
if (gclid) {
document.getElementById('gclid').value = gclid;
// Also store in cookie for multi-page visits
document.cookie = `gclid=${gclid};max-age=7776000;path=/`;
}
</script>
CRM Native Capture
Some CRMs (HubSpot, Salesforce) can capture the GCLID natively if configured. Check your CRM’s documentation for “GCLID” or “Google Click ID” field settings.
Step 4: Prepare Your Upload File
Google Ads accepts CSV files with a specific format.
CSV Format
Google Click ID,Hashed Email,Order ID,Conversion Name,Conversion Time,Conversion Value,Conversion Currency
EAIaIQobChMI8dml_ePi9gIV...,a8b14f04b2be6c5f...,job-1842,Booked Job,2026-04-10 14:30:00-05:00,4500.00,USD
EAIaIQobChMIxNqP7vTi9gIV...,9c1e77aa01d04424...,job-1843,Booked Job,2026-04-11 09:15:00-05:00,1200.00,USD
The first row is job 1842: a click ID, the hash of the customer’s email, your job number, the name of the conversion action, 2:30 p.m. Central on April 10, and $4,500. The -05:00 is the offset for that clock time. If you leave the offset off and only write America/Chicago on a header line, Google may treat 14:30 as UTC.
Column Definitions
| Column | Required | Format | Notes |
|---|---|---|---|
| Google Click ID | When the visit had one | Full click ID | If the URL had a GBRAID or WBRAID, give that its own column. Keep the GCLID column for the GCLID. |
| Hashed Email / Hashed Phone Number | When the lead has one | SHA-256 hex | Lowercase and trim the email, or format the phone as E.164, then hash. Put the hash on the same row as the click ID. |
| Order ID | Recommended | Your job or invoice ID | Stops the same job from counting twice |
| Conversion Name | Yes | Text | Must match the conversion action name exactly |
| Conversion Time | Yes | yyyy-MM-dd HH:mm:ss±HH:mm | The time the job closed, with an offset, not the upload time |
| Conversion Value | Recommended | Decimal number | Revenue amount (e.g., 4500.00) |
| Conversion Currency | Recommended | ISO 4217 | USD, CAD, GBP, etc. |
A visit can leave you with both a GCLID and a GBRAID. Put both on the row, plus the hashed email if you have it. If the only click ID you saved is a GBRAID or WBRAID, open that conversion action and set the count to Every. A count of One can reject the row.
Hash before the address goes in the file. Jane@Example.com becomes jane@example.com, then a 64-character SHA-256 hex string. A phone becomes +15125550100, then the hash. The spreadsheet should contain the hash, not jane@example.com.
Upload the jobs that never touched a Google ad, too, when you have an email or phone to hash. A direct call that becomes a $4,500 replacement can still match a signed-in Google user. A row with no click ID and no hash has nothing for Google to match, so leave that one out.
Common CSV Mistakes
| Mistake | Impact | Fix |
|---|---|---|
| Wrong date format | Upload rejected | Use yyyy-MM-dd HH:mm:ss-05:00, with the offset on that time |
| Conversion Name doesn’t match action | Conversion not counted | Copy the exact name from Google Ads |
| Timezone only in a header | Clock time shifted | Put the offset on each conversion time |
| Extra whitespace in GCLID | CLICK_NOT_FOUND error | Trim all GCLID values |
| Empty rows | Parsing errors | Remove any blank lines |
| BOM characters | Parsing errors | Save as UTF-8 without BOM |
Step 5: Upload via Google Ads UI
- Go to Goals → Conversions → Uploads
- Click the + upload button (blue plus icon)
- Click Choose file and select your CSV
- Google will preview the data — review for errors
- Click Apply
- Monitor the upload status — it will show “Processing” then “Done”
Reading the Upload Report
After a successful upload, imported conversions usually show in reports in about 3 hours. Processing is typically under 12 hours, and a row keyed by a GBRAID or WBRAID can take up to 72 hours. The upload report shows per-record status:
| Status | Meaning |
|---|---|
| Successful | Conversion matched and recorded |
| CLICK_NOT_FOUND | GCLID not recognized (see troubleshooting) |
| EXPIRED_GCLID | Google keeps a GCLID for 90 days after the click, so a job closed on day 75 can still be uploaded and the same job closed on day 91 cannot |
| INVALID_CONVERSION_ACTION | Conversion action not found or wrong type |
| UNPARSEABLE_GCLID | GCLID format is malformed |
| DUPLICATE | Already uploaded (order_id match) |
A small number of CLICK_NOT_FOUND errors is normal, especially with Enhanced Conversions for Leads (which upload all conversions, including non-Google traffic).
Step 6: Verify in Reports
After processing, verify the conversions appear in your reports:
- Go to Campaigns (or Ad Groups, Keywords)
- Set the date range to include the click dates of the uploaded conversions (not today’s date — see click date vs. conversion date)
- Check the Conversions column — you should see the uploaded values
- Check the Conv. value column — revenue amounts should appear
- If conversions appear in “All conversions” but not “Conversions,” the action is set to Secondary
Alternative: Automate with TUOCA
Manual CSV uploads work for testing and one-time backfills, but they don’t scale. At 20 clients × 4 platforms × weekly uploads = 80 manual uploads per cycle.
TUOCA’s Automated Relays eliminate this entirely:
- Connect your source — CallRail, CallTrackingMetrics, ServiceTitan, Jobber, or webhooks
- Connect your destination — Google Ads (OAuth authentication)
- Map your conversion action — Select which action to upload to
- Set filters — Only upload qualified leads, minimum value thresholds, etc.
- Set schedule — Hourly, daily, or weekly
- Activate — TUOCA handles fetching, transforming, deduplicating, uploading, and logging
For revenue attribution, Fusion Relays combine call tracking data (GCLID) with CRM revenue data (dollar amount) automatically.
TUOCA’s Free tier includes Manual Uploads with a guided wizard that validates your data before upload, catching formatting errors before they reach the Google Ads API.
Upload Schedule Recommendations
| Business Type | Recommended Frequency | Rationale |
|---|---|---|
| Emergency services (plumbing, locksmith) | Daily | Fast conversion cycle, fresh data for Smart Bidding |
| Home services (HVAC, electrical) | Daily | 1-7 day conversion lag, daily uploads keep data current |
| Legal, dental | 2-3x per week | Moderate lag, frequent enough for the 90-day window |
| B2B, enterprise | Weekly | Longer sales cycles, but don’t let GCLIDs expire |
| Agencies (multi-client) | Daily (automated) | Multiple clients × platforms = manual uploads are impossible |
Next Steps After Your First Upload
- Verify data — Check reports on the click dates for uploaded conversions
- Monitor errors — Review the upload report for
CLICK_NOT_FOUNDand other errors - Set up regular uploads — Manual weekly, or automated via TUOCA
- Judge Smart Bidding on enough conversions — Google’s Smart Bidding help says you can turn it on with no conversion history, and that you should judge results over a period with at least 30 conversions, such as a month, and over 50 conversions before you judge Target ROAS.
- Switch to value-based bidding — Once enough data accumulates, switch to Target ROAS or Maximize Conversion Value
- Add Fusion Relays — Combine call tracking + CRM for revenue-attributed conversions