Google Ads offline conversion import sends outcomes from your CRM, such as qualified leads and closed deals, back to Google Ads and matches them to ad clicks. Since June 15, 2026, Google’s route for these uploads is Data Manager: in the Google Ads UI for files and connectors, or the Data Manager API for code.
This guide is part of our offline conversions series. It covers the Google Ads side only. For the tag-side setup of enhanced conversions, see the enhanced conversions guide.
What changed on June 15, 2026
Google moved offline conversion imports to the Data Manager API. The Google Ads API deprecations page sets out the rule:
- The date. From June 15, 2026, offline conversion uploads through the Google Ads API are restricted.
- Who is restricted. Developer tokens with no offline conversion upload requests between December 17, 2025 and June 15, 2026. The allowlist is per developer token, not per Google Ads account.
- What breaks. UploadClickConversions requests from those tokens return a
CUSTOMER_NOT_ALLOWLISTED_FOR_THIS_FEATUREerror. - What it covers. Google’s Developer Blog announcement says this includes enhanced conversions for leads.
- What to do. Migrate the workflow to the Data Manager API.
Google’s help center and the blog post describe the activity window in looser terms. Use the deprecations page for the exact dates. Tokens that were active can keep uploading through the Google Ads API while they integrate, according to the blog post. But Google’s upgrade guide recommends the Data Manager API for current and future offline conversion and enhanced conversions for leads uploads.
Two more changes sit around it. Since February 2, 2026, new adopters can’t send session attributes or IP addresses with conversion imports in the Google Ads API. And on September 9, 2026, Google sunset developer tokens and moved API access to Google Cloud projects. The deprecations page says the offline conversion restriction “remains in effect.”
Who needs to act
Find the way you upload today. Each line says what Google’s documentation means for it.
- Your own script or in-house integration calls UploadClickConversions. If it sent no offline uploads between December 17, 2025 and June 15, 2026, it is already blocked. If it did, Google’s blog post says it can keep uploading while you integrate, so plan the move to the Data Manager API now.
- You are building a new integration. Start on the Data Manager API. New adopters can’t use the Google Ads API for offline conversion uploads.
- You import through Data Manager in your Google Ads account. This is the route Google recommends, with no API code on your side. Check that each connection is still running.
- You upload files under Goals, then Conversions, then Uploads. Google labels this file import as legacy. Enhanced conversions for leads only supports Data Manager files, so move file uploads into Data Manager when you upgrade.
- A third-party tool sends your uploads. Google names Zapier and HubSpot as third-party import methods. For any tool, ask which API it calls. If it uses the Google Ads API, it needs an allowlisted integration or a move to the Data Manager API.
- You still rely on the old Salesforce connector. Google stopped supporting the legacy Salesforce integration on May 31, 2025. Move to the Data Manager Salesforce connection.
GCLID import vs enhanced conversions for leads
Both send conversions to an Import from clicks conversion action. The difference is how Google matches them to an ad. Google now calls GCLID-only import a legacy feature and recommends enhanced conversions for leads for new setups.
1 / 6
Since April 2026, enhanced conversions for web and for leads share one on/off setting, and existing users were moved over automatically (Google Ads Help). Google’s advice is to upload every conversion: those with only a GCLID, those with both, and those with only customer data. If your GCLID imports record but enhanced conversions for leads shows alerts, see enhanced conversions for leads not working.
What you need before you start
- Auto-tagging turned on in Google Ads, so ad clicks carry a GCLID. iOS traffic may carry GBRAID or WBRAID instead.
- A form that saves the click ID, email, phone, a timestamp and the consent choice on each new lead, and a CRM that keeps them on the contact and links every deal back to it.
- An Import from clicks conversion action for each CRM stage you will send, such as qualified lead or closed won. Google says to wait 4 to 6 hours after creating one before the first upload.
- Enhanced conversions turned on, with customer data terms accepted, if you will send hashed customer data.
- Admin access to the Google Ads account that owns the conversion action. Google’s Data Manager guides ask for administrative access, and the API accepts Admin or Standard but not Read-only.
- For the API route only: a Google Cloud project with the Data Manager API enabled.
Click IDs arrive in the landing page URL and are easy to lose before the form. Our default is to store them in a first-party cookie set from your own tracking domain, such as a server-side Google Tag Manager container on a subdomain like sgtm.example.com. Google recommends serving the server container from the same origin as your site, because cookies the server sets need the two to share a domain (custom domain guide). The server-side tagging guide covers the setup.

How to upload offline conversions to Google Ads
There are four routes. Pick the first one that fits: the UI routes need no code, and the API route suits teams that already run their own pipeline.
1. A Data Manager connection in Google Ads
Data Manager connects a data source to a conversion action and imports from it on a schedule or on demand. Google’s supported data sources for offline conversion import include HubSpot, Salesforce, Zoho CRM, ActiveCampaign, Klaviyo, Google Sheets, Google Drive, BigQuery, Snowflake, Amazon S3, SFTP and HTTPS. The steps below follow Google’s Google Sheets guide. Other sources work the same way, with their own sign-in step. For HubSpot lifecycle stages and deals, see the HubSpot offline conversions guide.
- In Google Ads, open Goals, then Summary, and click + New conversion action.
- Click Import, then select CRMs, files, or other data sources, and choose a tracking method.
- Under Data source, select Connect a new data source, then pick your source and Direct connection.
- Select Conversions as the use case, accept the customer data policy, and click Continue.
- Sign in to the source and choose the file, object or table to import.
- Optionally, add filters so only the right rows import, such as deals at one stage.
- Map your columns to the Google Ads fields, and set a fallback time zone for the conversion time.
- Name the connection, click Finish, then Save and continue.
Data Manager hashes customer data for you if you send it unhashed. Each run re-reads a set window of data. Per Google’s data preparation guide, file sources such as Sheets, SFTP and HTTPS import the last 90 days on every run. HubSpot and Salesforce import 14 days on the first run, then changes since the last run. Database sources such as BigQuery import the last 14 days each time.
For Salesforce, Google’s Salesforce guide supports the Order, Lead and Opportunity objects, with one connection per object. It doesn’t support sandbox environments.
2. A scheduled file upload
You can still schedule a file under Goals, then Conversions, then Uploads. Google’s file import guide now labels this route legacy, and enhanced conversions for leads only supports Data Manager files. Use it for GCLID-only uploads you already run, and set up new file imports through route 1.
- In Google Ads, click Goals, then the Conversions drop-down, then Uploads.
- Click Schedules along the top of the page, then the plus button.
- Choose the source: Google Sheets, HTTPS or SFTP. For HTTPS or SFTP, enter the file URL, username and password.
- Pick a frequency and a time for the import.
- Click Save & preview. The schedule won’t save if Google Ads can’t reach the file or the file isn’t formatted properly.
The file needs a Parameters:TimeZone row, such as Parameters:TimeZone=America/Chicago, and the conversion action name must match exactly, including capitalization. For scheduled uploads, hash email and phone with SHA-256 before they go in the file. Google suggests waiting 6 hours after the click when you use scheduled uploads.
3. A third-party connector
If your CRM isn’t a direct Data Manager source, Google points to third-party integrations. Its upgrade guide names Zapier and HubSpot and says to follow their own instructions for adding user-provided data to the import. Before you rely on any connector, check which Google API it uses and whether it sends GBRAID, WBRAID and consent as well as the GCLID.
4. The Data Manager API
Use this route for your own pipeline, or to replace a Google Ads API integration. Google’s offline conversions overview has four parts: prepare destinations, prepare events, send the request, then check diagnostics.
- Enable the Data Manager API in a Google Cloud project, and set up credentials with the
https://www.googleapis.com/auth/datamanagerscope (set up access). - Build the destination. The
operatingAccountmust be the Google Ads account that owns the conversion action. TheproductDestinationIdis the numeric ID of that action, whose source is Website (Import from clicks). - Build each event: the time, an event source such as
WEBand at least one identifier, plus the transaction ID, value and currency when you have them. - Normalize and SHA-256 hash email, phone and name fields, per the formatting guide, and set the request’s encoding to HEX or BASE64.
- Send a test with
validateOnly: true. Then send for real, with up to 2,000 events per request. - Save the
requestIdfrom each response so you can check how it was processed.
POST https://datamanager.googleapis.com/v1/events:ingest
{
"destinations": [{
"operatingAccount": { "accountType": "GOOGLE_ADS", "accountId": "<CUSTOMER_ID>" },
"loginAccount": { "accountType": "GOOGLE_ADS", "accountId": "<LOGIN_CUSTOMER_ID>" },
"productDestinationId": "<CONVERSION_ACTION_ID>"
}],
"encoding": "HEX",
"validateOnly": true,
"events": [{
"eventTimestamp": "2026-10-20T15:07:01-05:00",
"transactionId": "deal_10427",
"eventSource": "WEB",
"conversionValue": 12000,
"currency": "USD",
"adIdentifiers": { "gclid": "<GCLID>" },
"userData": {
"userIdentifiers": [
{ "emailAddress": "<SHA-256 hex of the normalized email>" },
{ "phoneNumber": "<SHA-256 hex of the E.164 phone>" }
]
},
"consent": { "adUserData": "CONSENT_GRANTED", "adPersonalization": "CONSENT_GRANTED" }
}]
}If you are moving off the Google Ads API, most of the change is in the request, not the data. Google’s upgrade guide lists the differences:
1 / 7
One gap to plan for: the Data Manager API doesn’t support conversion retractions. You can restate a conversion’s value, but its count stays the same.
Field mapping
The same data goes into every route under different names. These are the fields that matter for matching, deduplication and value.
| What | File or Data Manager column | Data Manager API | Notes |
|---|---|---|---|
| Click ID | Google Click ID (GCLID) | adIdentifiers.gclid | Required for GCLID import. Keep sending it with enhanced conversions for leads. |
| iOS click IDs | GBRAID, WBRAID | adIdentifiers.gbraid, adIdentifiers.wbraid | Send whenever the landing URL had one. |
userData.userIdentifiers[].emailAddress | Trimmed and lowercase. For gmail.com and googlemail.com, also remove dots and anything from a plus sign before the @. Then SHA-256. Data Manager in the UI can hash it for you. | ||
| Phone | Phone number | userData.userIdentifiers[].phoneNumber | E.164 format, such as +18005550199, then SHA-256. |
| Conversion action | Conversion Name, or the action the connection feeds | destinations[].productDestinationId | The numeric conversion action ID in the API, not its name. |
| Conversion time | Conversion Time, with a time zone | eventTimestamp | RFC 3339 in the API. A row with no time zone and no fallback isn’t imported. |
| Value and currency | Conversion Value, Conversion Currency | conversionValue, currency | Currency units, not micros: 5.23, not 5230000. ISO 4217 currency code. |
| Order or deal ID | Order ID | transactionId | Used to deduplicate, and to adjust the conversion later. |
| Event source | Event source | eventSource | Required in the API, such as WEB or CALL. |
| Consent | Ad User Data, Ad Personalization (file template) | consent.adUserData, consent.adPersonalization | CONSENT_GRANTED or CONSENT_DENIED. Google highly recommends filling it in. |
| Session attributes | Session attributes | adIdentifiers.sessionAttributes | The encoded string captured on the form. Useful when there is no click ID. |
| IP address | User IP address | adIdentifiers.landingPageDeviceInfo.ipAddress | Not hashed. Google doesn’t support IP matching for users in the EEA, UK or Switzerland. |
On consent, Google’s upgrade guide warns that leaving the field empty “may result in conversions that are not attributable.” Send the choice you recorded when the lead was created.
How to check that it works
- For the API, send one request with validateOnly set to true. It runs the same validation and returns the same errors, without importing anything.
- After a real API request, wait 30 minutes, then call RetrieveRequestStatus with the requestId. Keep polling with backoff until each destination shows SUCCESS, PARTIAL_SUCCESS or FAILURE. Google says this can take up to 24 hours.
- For file uploads, open Goals, then Conversions, then Uploads. Check the Status and Results columns, and use Download errors to see which rows failed and why.
- Open offline data diagnostics from the Conversion summary page: hover over the data quality in the action’s status, then click Go to diagnostics.
- Read the data quality rating. Excellent means at least 90% of events are well-formed and valid, Good is 70 to 90%, and Needs attention is below 70%. No recent data means nothing arrived in the last 28 days.
- Allow about 3 hours for imported conversions to show, and up to 72 hours for conversions keyed by GBRAID or WBRAID.
- Compare the All conv. (by conv. time) column with your CRM for the same dates. Standard reporting dates conversions by the impression or click time, not the upload date.
Google’s diagnostics page also keeps a history of the last 7 days or the last 7 upload jobs, with the share of events that had errors. The API diagnostics guide notes that the status call must use the same access path as the original request.
Common errors and fixes
| Error or symptom | Likely cause | Fix |
|---|---|---|
CUSTOMER_NOT_ALLOWLISTED_FOR_THIS_FEATURE on UploadClickConversions | The integration sent no offline uploads between December 17, 2025 and June 15, 2026 | Send the conversions through the Data Manager API or a Data Manager connection. |
| The same error when sending session attributes or an IP address | New adopters of these fields are restricted in the Google Ads API since February 2, 2026 | Send them through the Data Manager API. |
| Identifiers or iOS URL parameters are too old | The click was more than 90 days ago, or outside the conversion window | Upload more often, or send an earlier stage that falls inside the window. |
| Click too recent | The click was less than 6 hours ago | Retry after 6 hours. |
| Invalid conversion times | The conversion time is before the click, often a time zone mistake | Check the time zone on the file or the fallback time zone in Data Manager. |
| Wrong Google Ads account for clicks | The conversion action doesn’t exist in the account you upload to, or isn’t an Import from clicks action | Upload to the account that owns the action. In the API, set it as the operatingAccount. |
| Unknown clicks | The conversion couldn’t be attributed to Google Ads | Expected for some rows with enhanced conversions for leads. If every row shows it, check the form’s customer data capture. |
| User-provided data not hashed | Email or phone was sent unhashed, or normalized wrongly | Trim and lowercase email, and strip dots and plus suffixes from Gmail addresses. Use E.164 for phone, then SHA-256. |
| The whole API request is rejected | The Data Manager API fails fast: one invalid event fails the batch | Test with validateOnly, fix the event, and resend with the same transaction IDs. |
PERMISSION_DENIED on a status check | The account has Read-only access, or the check used a different login account | Use Admin or Standard access, through the same login account as the original request. |
| A Data Manager run imports fewer rows than expected, or fails | Rows with no time zone are skipped when no fallback is set. One DD/MM/YYYY date fails the whole import. | Set a fallback time zone, and use ISO 8601 dates. |
Duplicates don’t need a fix of their own. Google counts a conversion once when the click ID or customer data, conversion name and time all match, and it removes repeats when you re-upload (Google Ads Help). To record several conversions for one click, give them different times and set the action to count every conversion. See Google’s errors guide for the full list.
How Google Ads fits with your other platforms
The groundwork is the same on every platform: save the click ID and contact details when the lead arrives, keep them on the CRM record, and send each stage inside the platform’s window. Only the field names and upload routes change. Our guide to offline conversions compares the match keys, hashing and upload windows for Google Ads, Meta, Microsoft, LinkedIn and TikTok. For Microsoft and ChatGPT, see Microsoft Ads offline conversions and ChatGPT Ads offline conversions.
- Enhanced conversions on the website are set up in the Google tag, not in an upload. See the enhanced conversions guide.
- GoHighLevel users can follow the GoHighLevel offline conversions guide for Google Ads and Meta.
- ChatGPT Ads accepts offline action sources through its own Conversions API. See the ChatGPT Ads Conversions API guide.
Maven sends CRM outcomes, such as qualified leads and closed-won deals, to Google Ads as offline conversions, alongside Meta and other ad platforms. To check the website side first, a Free Tracking Scan shows which tags load on your lead pages today.
Get the next one before it hits.
Short emails when Meta, Google, GA4 or LinkedIn change something that moves your numbers.
Part of: Offline conversions
Also in By ad platform: Microsoft Ads offline conversions: how to import CRM outcomes into Microsoft Advertising, ChatGPT Ads offline conversions: how to send CRM, phone and in-store sales to OpenAI
Frequently asked questions
What changed for Google Ads offline conversion imports on June 15, 2026?
From June 15, 2026, Google restricted offline conversion uploads through the Google Ads API. Developer tokens that sent no offline conversion upload requests between December 17, 2025 and June 15, 2026 get a CUSTOMER_NOT_ALLOWLISTED_FOR_THIS_FEATURE error on UploadClickConversions. Google says to move those workflows to the Data Manager API, and recommends it for current and future uploads.
Do I need the Data Manager API if I upload conversions in the Google Ads UI?
Not for the restriction itself. Google’s notice is about Google Ads API requests. If you import through Data Manager in your Google Ads account, with a file, Google Sheets or a connector such as HubSpot or Salesforce, there is no API code to migrate. Google does call the older file upload a legacy route and recommends Data Manager instead.
What is the difference between GCLID import and enhanced conversions for leads?
GCLID import matches each uploaded conversion to the ad click by its Google click ID. Enhanced conversions for leads also sends hashed customer data, such as an email address or phone number, so Google can match conversions without a click ID when the Google tag also collects that data on your lead form. Google recommends enhanced conversions for leads for new setups and says to keep sending GCLIDs when you have them.
How long after the click can I upload an offline conversion?
Google accepts conversions with a GCLID up to 90 days after the click. For enhanced conversions for leads, conversions uploaded more than 63 days after the last click are not imported. If deals close later than that, also upload an earlier stage, such as a qualified lead.
Does the Data Manager API need a developer token?
No. Google’s migration guide says the Data Manager API does not require a developer token. You enable the API in a Google Cloud project, authenticate with the https://www.googleapis.com/auth/datamanager scope, and use a Google Account with Admin or Standard access to the Google Ads account that owns the conversion action.
What does CUSTOMER_NOT_ALLOWLISTED_FOR_THIS_FEATURE mean?
On UploadClickConversions, it means the developer token is not allowlisted for offline conversion uploads in the Google Ads API, because it sent no such uploads between December 17, 2025 and June 15, 2026. The fix is to send those conversions through the Data Manager API or Data Manager in Google Ads. The same error appears when a non-allowlisted integration sends session attributes or IP addresses through the Google Ads API.
How long until imported conversions show in Google Ads?
Google says imported conversion statistics take about 3 hours to show. Processing typically takes less than 12 hours, and up to 72 hours for conversions keyed by GBRAID or WBRAID. For a new conversion action, wait 4 to 6 hours before the first upload.
Can I import offline conversions from HubSpot or Salesforce?
Yes. Google’s Data Manager lists HubSpot and Salesforce as direct connections for offline conversion import, along with Google Sheets, BigQuery, SFTP, Zoho CRM and others. The legacy Salesforce integration stopped being supported on May 31, 2025, so older Salesforce setups should move to the Data Manager Salesforce connection.
Sources and references
- Google Ads API: Deprecations and restrictions
- Google Ads API: API access management and developer token sunset
- Google Ads Developer Blog: Changes to offline click conversion import support (May 15, 2026)
- Google Ads Help: Upgrade offline conversion import to enhanced conversions for leads
- Google Ads Help: Guidelines for importing offline conversions
- Google Ads Help: Offline conversion import FAQ (upload windows)
- Google Ads Help: Set up offline conversions using Google Click ID (GCLID)
- Google Ads Help: Import conversions from ad clicks using files (legacy)
- Google Ads Help: Fix discrepancies and errors in offline conversion imports
- Google Ads Help: About offline data diagnostics
- Google Ads Help: Import conversions from Salesforce (Legacy)
- Google Ads Data Manager Help: Supported data sources
- Google Ads Data Manager Help: Prepare your data for import
- Google Ads Data Manager Help: Google Sheets
- Google Ads Data Manager Help: Salesforce
- Data Manager API: Google Ads offline conversions overview
- Data Manager API: Send offline conversions
- Data Manager API: Upgrade from the Google Ads API
- Data Manager API: Field mappings from the Google Ads API
- Data Manager API: Diagnostics
- Data Manager API: Format user data
- Data Manager API: Set up API access
- Data Manager API reference: events.ingest
- Google Tag Manager: Map server-side tagging to a custom domain
