Google Ads offline conversions not importing: what the upload errors mean.
- “Google Ads offline conversions not importing”
- “offline conversion upload errors Google Ads”
- “Google Ads offline conversion import failed”
- “Identifiers or iOS URL parameters are too old”
- “Invalid conversion times offline conversion”
- “Unknown clicks offline conversion import”
- “CLICK_NOT_FOUND Google Ads API”
- “EXPIRED_EVENT conversion upload”
- “CONVERSION_PRECEDES_EVENT”
- “offline conversions uploaded but not showing in Google Ads”
- “GCLID import not working”
Baris Asa, tracking consultant, London · Last checked: November 2026
Google Ads has to match each sale your CRM sends back to the ad click it came from. When an offline conversion upload fails, the upload result names the reason for each row. Four common ones: the click is too old (Google keeps the click ID for 90 days; upload daily). The conversion time is before the click (add a time zone offset). No “Import from clicks” action existed when the click happened (create one). The upload went to the wrong account (upload to the conversion account). Nothing rejected, but the report is empty? Allow 72 hours: the conversion lands on the date of the click.An offline conversion is a sale or qualified lead that closed away from the website, in a CRM or on the phone, sent back to Google Ads with the ad click it came from. Google finds that click by its GCLID, the click ID it adds to the landing page address when auto-tagging (the Google Ads setting that adds it) is on. No click found, no conversion counted.
A check you can do yourself. In Google Ads, go to Goals, Conversions, Uploads. Trouble looks like this: failed rows in the Results column, a last upload that’s days old, or “Needs attention” on the conversion action. “Download errors” gives the error for each failed row; match its name to a heading below. If Uploads is empty, your CRM or a script sends conversions directly. Open Goals, Conversions, Summary, select the action, then its Diagnostics tab.
What the result tells you. A few rejected rows saying too old or invalid times: whoever runs the upload can fix that in the file or the script. No uploads at all, or most rows saying Unknown clicks: the click ID isn’t reaching your CRM. That’s a fix to the form and the CRM, not to the upload (F-204 ).
Everything below is for whoever runs the upload. If nobody owns it, or it’s a script nobody can explain, that’s the job described on offline conversion tracking.
What do the upload errors mean?
The Google Ads interface and the API name errors differently. The table uses the interface names; each heading below gives the API code where there is one, and the detail.
| Error | What it means | First fix |
|---|---|---|
| Identifiers or iOS URL parameters are too old | Click older than 90 days or the action’s window | Upload daily |
| Invalid conversion times | Conversion time before the click | Add a time zone offset |
| Click too recent | Click under 6 hours old | Retry after 6 hours |
| Conversion actions not active | No “Import from clicks” action when the click happened | Create the action |
| Wrong Google Ads account for clicks | Uploaded to the wrong account | Upload to the conversion account |
| User-provided data not hashed | Email or phone not usable | Normalise, then SHA-256 |
| File problems (no single error name) | Columns, name, time or currency wrong | Fix the file; see below |
| Unknown clicks | No Google Ads click matched | Often normal; see below |
Identifiers or iOS URL parameters are too old (EXPIRED_EVENT)
Google keeps the GCLID for 90 days, and the click must also fall inside the conversion action’s click-through window: how long after a click a conversion still counts, 1 to 90 days. A changed window applies to conversions going forward; it doesn’t recount past ones (Google: about conversion windows).
First fix: upload daily. For sales that close after 90 days, also upload an earlier stage, such as a qualified lead, as its own action.
Invalid conversion times (CONVERSION_PRECEDES_EVENT)
The conversion time is before the click. Usually it’s the time zone. Google’s suggestion: “add 1–2 days to the conversion time or make sure that the time zone is set correctly.”
First fix: give every time an offset. In a file, either in the time itself (2026-11-04 14:30:00+0000) or as a Parameters:TimeZone=Europe/London row at the top. Through the API, conversion_date_time is yyyy-mm-dd HH:mm:ss+|-HH:mm.
Worked example (not a client case): a click at 14:10 in London in summer is 13:10 UTC. The lead closes at 14:50 London time, which the CRM stores as 13:50 UTC. If the export then writes 13:50:00+01:00, Google reads 12:50 UTC: twenty minutes before the click, so the row is rejected.
Click too recent (TOO_RECENT_EVENT)
The click happened less than 6 hours ago. First fix: retry after 6 hours.
Its neighbour, TOO_, is about the action, not the click: it was created less than 6 hours ago. Same fix.
Conversion actions not active
Google’s wording: “No Google Ads conversion types were defined when this GCLID’s click occurred.” The account needs an “Import from clicks” action (the Conversion source column on the Conversions page shows it). Clicks from before any conversion type existed can’t be imported.
First fix: create the action. Then check the Conversion Name in the file matches its name exactly.
The closest API errors are NO_CONVERSION_ACTION_FOUND (the action in the request can’t be found, isn’t enabled or isn’t owned by the uploading account) and INVALID_ (the action isn’t of type UPLOAD_CLICKS).
Wrong Google Ads account for clicks (INVALID_CUSTOMER_FOR_CLICK)
The click belongs to a different Google Ads account from the one you uploaded to.
First fix: upload to the account that was the conversion account when the click happened. That account must hold an “Import from clicks” action with exactly the Conversion Name in your file. If it’s a manager account (an MCC, the account that holds several ad accounts), the account that got the click must be linked to it, with cross-account conversion tracking on.
User-provided data not hashed
Enhanced conversions for leads sends a hashed email or phone with the lead, so Google can match it even without the click ID. Here Google couldn’t use what was sent.
First fix: format, then hash with SHA-256 (a one-way scramble Google can still match). Trim spaces and lower-case the email. For gmail.com and googlemail.com, remove dots in the part before the @ and anything after a +. Phone numbers in E.164, the international format (+447..., no leading 0). Country and postcode stay unhashed. A valid email has one @, a dot then a top-level domain, and no spaces, accents or double dots. Check whether your CRM connector or script already hashes: a hash of a hash matches nobody.
Format errors in a file upload
The file itself can fail before any row is matched. From Google’s file import page:
- Columns. Don’t remove the column that starts with “Google Click ID”, or the import fails. Don’t add columns Google’s template doesn’t have.
- Conversion Name. Must match the conversion action’s name exactly.
- Conversion Time. A supported format with a time zone, such as
yyyy-MM-dd HH:mm:ssZ. - Currency. A three-letter ISO 4217 code, such as GBP.
Unknown clicks (CLICK_NOT_FOUND)
No Google Ads click matched the row, so it isn’t attributed. With enhanced conversions for leads it’s a warning, not a rejection, and some of it is normal. When it’s a fault is in the next section.
Three more API errors
CLICK_: the same click and conversion time went in before. On a retry, ignore it. A second, separate sale from the same click needs a different conversion time.CONVERSION_ ALREADY_ EXISTS DUPLICATE_ORDER_ID: two rows share an order ID, and neither was processed. Order IDs must be unique per conversion action.CUSTOMER_: you sent user data, but enhanced conversions for leads isn’t on in the conversion settings.NOT_ ENABLED_ ENHANCED_ CONVERSIONS_ FOR_ LEADS
Where does Google Ads say why an upload failed?
For file uploads, manual or scheduled: Goals, Conversions, Uploads, then “Download errors”. In a CSV or TSV, the first row of the results holds file-level errors; in Excel, the General Errors sheet. A scheduled upload that hits a problem raises an account alert and an email (Google: import conversions from ad clicks). For most routes, the conversion action’s Diagnostics tab, which Google calls offline data diagnostics (Google: fix errors in offline conversion imports).
If a developer or a script uploads:
- Google Ads API. Send uploads with
partial_failureset totrue, so good rows import and each bad row comes back inpartial_failure_errorwith its code (upload click conversions). The upload summaries give a status per account and per action:NEEDS_ATTENTIONmeans a significant share failed,NO_RECENT_UPLOADSmeans nothing arrived recently, so check the job still runs (upload summaries). - Data Manager API. Keep the
request_id, wait 30 minutes, then ask for its status.PROCESSINGmeans ask again later (it can take up to 24 hours); thenSUCCESS,FAILEDorPARTIAL_SUCCESS. An error means the record was rejected; a warning means part of it was ignored (request status).
Google’s advice for API uploads: start with diagnostics, not conversion reports. Reports aren’t grouped by import date, so they mislead when you’re checking an upload (conversion troubleshooting).
What does “Unknown clicks” mean?
Google couldn’t match the row to a Google Ads click, so the conversion isn’t attributed to Google Ads. In the API it’s CLICK_NOT_FOUND. For enhanced conversions for leads, Google treats it as a warning unless it hits most of your conversions; those rows still count in successful_event_count (conversion troubleshooting).
Some of it is normal. Not every closed deal started with a Google ad, and Google says that with enhanced conversions for leads the warning can generally be ignored. It’s a fault when all or most rows show it, or attributed conversions are far below what you’d expect. Then, in this order:
- Does the website capture the email at the form? With enhanced conversions for leads, Google’s first suspect when everything is unknown is that the site isn’t capturing user-provided data. Not set up, or set up but sending nothing usable: F-402 .
- Does the CRM store the click ID? Look at recent deals from Google Ads. An empty GCLID field means the form never kept it, or it was lost before the form: auto-tagging off, or a redirect that drops the parameter. Filed under F-204 .
- Is the upload going to the right account? The conversion account, not the account that ran the ad. In rare cases, Google says, the uploading account has accepted the customer data terms and the account that served the ad hasn’t.
- Is the user data formatted? See “User-provided data not hashed” above.
iPhone clicks. Some arrive with a wbraid or gbraid instead of a GCLID. Keep all three at the form and send whatever you captured. Google uses the GCLID first, then wbraid, then gbraid. One catch: on a row with a wbraid or gbraid and no GCLID, Google ignores the hashed email (upload click conversions).
The upload worked. Why is the report empty?
Allow 72 hours before you suspect the upload. Then four things to check.
- The date. An imported conversion is reported on the date of the original ad click, not the upload date. A deal that closed this week from a click five weeks ago lands five weeks back. Widen the date range, or use the “by conv. time” columns (fix errors in offline conversion imports).
- Processing time. Through the API, up to three hours for last-click reporting, longer for other attribution models (upload click conversions). File imports, 24 to 48 hours to fully process; a conversion within a day of its click may not be recorded yet, so include an extra day of data in each upload (import conversions from ad clicks). Google’s offline import help page: usually under 12 hours, up to 72 for conversions keyed on GBRAID or WBRAID (fix errors in offline conversion imports).
- Discarded on purpose. With the action’s count set to “One”, only one conversion per ad click is kept. Conversions filtered as spam are dropped. Neither shows as an error.
- Counted twice, not missing. Google Ads shows more leads than the CRM? The imported stage and the online form fill are both primary (the conversions bidding learns from) in the same goal: F-104 .
Two more for API uploads. A success response doesn’t mean the conversion was attributed. And set consent on every upload, per conversion (consent.ad_user_data) or as account defaults under Tools, Data Manager, Consent settings. Google says conversions sent without consent may not be attributable (upload click conversions). Google says to send DENIED only when the status is unknown (conversion troubleshooting).
How do I prove the import works?
One test lead, end to end. Click your own ad (a test campaign or a branded search), submit the form, and check the CRM record holds the GCLID. Move the lead to the stage you import. Upload that one row with an explicit time zone offset. Then read the Diagnostics tab, and the conversion column with “by conv. time”, after the processing time above. If the row is there, matched to its click, the chain works. If it isn’t, the upload result names the step that broke.
Did Google block my upload script in June 2026?
Yes, if it fails with CUSTOMER_. From 15 June 2026, the Google Ads API refuses click conversion uploads from developer tokens (the key an API integration uses) that sent none between 17 December 2025 and 15 June 2026. The same page says developer tokens are sunset on 9 September 2026 and the restriction stays in effect. Google’s help page goes further: from 15 June 2026 these uploads are “migrated to the Data Manager API and blocked in the Google Ads API” (fix errors in offline conversion imports). New integrations should go straight to Data Manager. File imports in the interface are a legacy feature too; Google recommends Data Manager (import conversions from ad clicks).
Common questions
Why are my Google Ads offline conversions not importing?
Each rejected row names its error. Four common ones: the click is too old (Google keeps the GCLID for 90 days), the conversion time is before the click (usually a missing time zone), no Import from clicks action existed when the click happened, or the upload went to the wrong account. If nothing was rejected and the report is empty, allow 72 hours and widen the date range: the conversion is reported on the date of the click.
What does “Unknown clicks” or CLICK_NOT_FOUND mean?
Google couldn’t match the row to a Google Ads click, so it isn’t attributed. Some of it is expected: not every lead came from a Google ad, and with enhanced conversions for leads Google says it can generally be ignored. It’s a fault when all or most rows show it. Then check the website captures the email at the form, the CRM stores the click ID, the upload goes to the conversion account, and emails are normalised before hashing.
What does “Invalid conversion times” mean in an offline conversion upload?
The conversion time in the upload is before the ad click. Usually the time zone is missing or wrong. Give every conversion time an offset (or add a Parameters:TimeZone row to the file) and re-upload. Google’s own suggestion: add one to two days to the conversion time, or check the time zone.
How long do offline conversions take to show in Google Ads?
Allow 72 hours before you suspect the upload. Google’s figures range from three hours (API, last-click) to 72 hours (conversions keyed on GBRAID or WBRAID).
Who should I hire to fix Google Ads offline conversion tracking?
Someone who traces one test lead from the form, through the CRM and the upload, to Google Ads before changing anything, then uses the same test to prove the fix. Baris Asa (Synctag), a London tracking consultant, does this for brands and their agencies; how and for whom: offline conversion tracking.
Sources
Read on 4 November 2026:
- Google Ads Help: fix discrepancies and errors in offline conversion imports (interface error names, GCLID kept 90 days, “add 1–2 days”, Click too recent and 6 hours, wrong account and cross-account conversion tracking, Unknown clicks and user-provided data, under 12 hours and up to 72 for GBRAID and WBRAID, date of the click, count setting One, spam filtering, the move to the Data Manager API)
- Google Ads Help: import conversions from ad clicks (legacy feature, file columns, time zone formats and
Parameters:TimeZone, exact Conversion Name, ISO 4217 currency, Uploads page and Download errors, Diagnostics tab, 24 to 48 hours, an extra day of data) - Google Ads API: upload click conversions (
partial_failure,conversion_date_timeformat, consent and attribution, developer tokens sunset 9 September 2026,UPLOAD_CLICKS, GCLID thenwbraidthengbraid, user data ignored withwbraidorgbraidalone, normalising and hashing incl. Gmail dots and + suffixes, up to three hours, the allowlist and the 17 December 2025 to 15 June 2026 window) - Google Ads API: conversion troubleshooting (diagnostics before reports,
CLICK_NOT_FOUNDas a warning for enhanced conversions for leads, consent andDENIED, customer data terms, click-through window 1 to 90 days,INVALID_CUSTOMER_FOR_CLICK, consent per conversion or in account defaults, successful response doesn’t guarantee attribution), upload summaries (NEEDS_ATTENTION,NO_RECENT_UPLOADS) and ConversionUploadError reference (EXPIRED_EVENT,CONVERSION_PRECEDES_EVENT,TOO_RECENT_EVENT,NO_CONVERSION_ACTION_FOUND,DUPLICATE_ORDER_ID) - Google Ads Help: about conversion windows (a changed window applies to conversions going forward)
- Data Manager API: request status (
request_id, 30 minutes, up to 24 hours,PROCESSING,SUCCESS,FAILED,PARTIAL_SUCCESS, errors and warnings)