Troubleshooting Guide

Google Ads Click Conversion Upload: Step-by-Step Tutorial

Uploading click conversions to Google Ads requires three things working together: a captured GCLID, a formatted payload, and a working API call. This tutorial walks through every step — then shows the no-code shortcut.

4 causes explainedExact fixes for eachAutomated solution included
3
Steps in the upload process
90d
Upload window from click
<60s
Delay with automation
10 min
No-code setup time

Key Takeaways

1

Click conversion upload requires: a GCLID captured at click time, a Google Ads conversion action with type Import from clicks, and an API call with the correct format.

2

The GCLID must be captured when the user first lands on your page — it cannot be recovered retroactively.

3

The upload window is 90 days from click date. Uploads outside this window are silently discarded.

4

The UploadClickConversions API endpoint requires OAuth or a developer token — or you can use the CSV import in Google Ads UI.

5

A no-code tool handles every step automatically: GCLID capture, formatting, and API upload in under 60 seconds.

1

Step 1: Capture the GCLID on your landing page

When a user clicks your Google ad, the URL contains ?gclid=CjwKCA.... You need a script on the landing page to extract and store this before the user navigates away. The storage must link the GCLID to a contact identifier (email or phone) so you can match it to a conversion event later.

Fix: Option A (manual): Add a JavaScript snippet to your landing page head: (function() { const p = new URLSearchParams(window.location.search); const g = p.get('gclid'); if (g) { const email = document.querySelector('[name=email]')?.value; localStorage.setItem('cl_gclid', JSON.stringify({ gclid: g, ts: Date.now() })); } })(); Option B (automated): Add cl.js — one script tag that handles capture, storage, and email matching automatically.
2

Step 2: Create the correct conversion action in Google Ads

Not all Google Ads conversion actions accept uploaded click conversions. The action must be created with source set to Imported from clicks. Actions created as Website or App type silently reject uploaded GCLIDs.

Fix: In Google Ads: Goals > Conversions > New conversion action > Import > Click conversions. Name the action clearly (e.g., Invoice Paid – Import). Set the value to use the value from the upload (not a fixed value). Note the exact action name — it must match your upload payload character-for-character.
3

Step 3: Format the upload payload

The Google Ads UploadClickConversions API requires a specific JSON structure. Key fields: conversionAction (full resource name), gclid, conversionDateTime (yyyy-MM-dd HH:mm:ss+00:00 format in UTC), conversionValue (float), currencyCode (ISO 4217).

Fix: API endpoint: POST https://googleads.googleapis.com/v18/customers/{customer-id}:uploadClickConversions Payload structure: { "conversions": [{ "gclid": "CjwKCAiA...", "conversionAction": "customers/1234567890/conversionActions/987654321", "conversionDateTime": "2026-05-20 14:30:00+00:00", "conversionValue": 250.00, "currencyCode": "USD" }], "partialFailure": true } The conversionAction resource name requires your Customer ID (without dashes) and the numeric conversion action ID from Google Ads.
4

Step 4: Authenticate and send the API call

The Google Ads API requires OAuth 2.0 authentication. You need: a Google Ads developer token (apply via Google Ads API Center), a manager account OAuth client ID and secret, and a refresh token. For the CSV approach, no authentication is needed — you upload the file directly in Google Ads UI.

Fix: OAuth approach (automated): Use a service account or refresh token flow. Required headers: - Authorization: Bearer {access_token} - developer-token: {your_developer_token} - login-customer-id: {manager_customer_id} CSV approach (manual): In Google Ads, go to Goals > Conversions > select your import action > Upload. CSV columns: Google Click ID, Conversion Name, Conversion Time, Conversion Value, Conversion Currency. Time format: yyyy-MM-dd HH:mm:ss (UTC).
5

Step 5: Verify the upload succeeded

A successful API response (HTTP 200) doesn't guarantee conversions were credited. Google Ads validates each row separately. The response includes a partialFailureError field that lists row-level failures. Common errors: GCLID_NOT_FOUND (expired or uncaptured), CONVERSION_PRECONDITIONS_NOT_MET (wrong action type), CONVERSION_TIME_OUT_OF_BOUNDS (90-day window exceeded).

Fix: Check the Diagnostics tab on your conversion action in Google Ads. It shows upload history, row counts, match rates, and specific error codes for any failed rows. Wait 3-4 hours after upload before checking — conversions don't appear instantly in reports.

Manual upload vs. ConversionLoop

Why the manual process breaks at scale — and what changes with automation

Feature
Manual CSV
ConversionLoop
GCLID capture
Custom JS required
cl.js — one script tag
OAuth setup
Developer token + refresh flow
Handled — no setup needed
Payload formatting
Custom code per upload
Automatic — always correct
Error handling
Parse partialFailureError
Dashboard + email alerts
Upload timing
Batch job or manual trigger
Real-time on webhook receipt
API version updates
Maintain manually
Handled automatically

When to use the manual API approach

The manual API approach makes sense if you have a dedicated developer, need a custom integration with a proprietary system, or are building a conversion tracking product. It requires maintaining OAuth tokens, handling API versioning changes, and managing error retry logic. For most service businesses, the overhead is not worth it.

The no-code alternative: ConversionLoop

ConversionLoop handles every step of the click conversion upload pipeline automatically. cl.js captures the GCLID on page load. When your CRM or booking software fires a webhook, ConversionLoop formats the conversion payload, authenticates, and uploads via the Google Ads API in under 60 seconds. No developer token management, no OAuth flows, no CSV formatting.

Stop diagnosing. Start tracking.

ConversionLoop handles GCLID capture, upload formatting, and delivery automatically. Set it up once.

Start free trial

Testing your upload setup end-to-end

For manual API: submit a test payload with a synthetic GCLID (use a real one from a test click for best results), check the partialFailureError field in the response, then check Diagnostics in Google Ads 3-4 hours later. For ConversionLoop: use the built-in test mode — it sends a synthetic event through the full pipeline and confirms the upload result before you go live.

Frequently asked questions

Where do I find my conversion action's numeric ID for the resource name?

In Google Ads, go to Goals > Conversions, click your conversion action, and look at the URL. The number after /detail/ is your conversion action ID. Alternatively, use the Google Ads API ConversionActionService to list all actions and their resource names.

Can I upload conversions in bulk — hundreds or thousands per day?

Yes. The UploadClickConversions endpoint accepts up to 2,000 conversions per request. For higher volumes, batch your conversions into groups of 2,000 and send sequential requests. The CSV import in the Google Ads UI has lower limits and is not recommended for high-volume automated uploads.

Never debug offline conversions again

Automated GCLID capture, real-time upload, and full error diagnostics. Every conversion, every time.

Start free — 14 days on us

No credit card required · No developer needed · Cancel anytime