Guide
Migrating offline conversion imports to the Data Manager API
On June 15, 2026, Google blocked offline conversion imports and enhanced conversions for leads through the Google Ads API. This guide walks through moving an existing upload workflow to the Data Manager API, step by step.
Step 1 — Pick your route
There is no like-for-like replacement; the migration splits into two paths:
| API route | UI route | |
|---|---|---|
| Who it's for | CRM integrations, scheduled scripts, anything that called UploadClickConversions | Marketers uploading CSV files by hand |
| New destination | POST https://datamanager.googleapis.com/v1/events:ingest (JSON) | Data Manager import inside Google Ads (CSV, with column mapping) |
| What changes | New request shape, RFC 3339 timestamps, numeric conversion action IDs, no developer token | Mostly familiar — the legacy file import is marked "legacy" and Data Manager takes over |
Step 2 — Map your fields
The field mapping table covers every field. The three that break most migrations:
- Timestamps:
conversion_date_time(yyyy-MM-dd HH:mm:ss+00:00) becomesevent_timestampin RFC 3339 (2026-06-20T15:07:01Z). See the timestamp cheatsheet. - Conversion action: no longer a per-row name. It becomes
destinations[].product_destination_id— the numeric ID from Goals › Conversions (thectIdparameter in the URL). One request per conversion action. - Click IDs:
gclid,gbraid, andwbraidmove into the nestedad_identifiersobject.
Step 3 — Convert your existing files
The converter tool takes a legacy CSV and produces both a Data Manager API JSON payload and a clean import CSV, validating every row. All processing happens in your browser — conversion data (gclids, order IDs, values) never leaves your machine.
Step 4 — Authenticate and send (API route)
- OAuth 2.0 scope:
https://www.googleapis.com/auth/datamanager. A Google Ads developer token is no longer required. - Batch up to 2,000 events per request.
- Set
validate_only: trueto dry-run a payload before sending it for real. - Processing is asynchronous — keep the returned
request_idto retrieve diagnostics. There is no per-row synchronous result and no partial-failure mode.
Step 5 — Verify
- Start with
validate_only: trueand fix anything it rejects. Common failures are listed in the error codes FAQ. - Send a small live batch, then check the conversion action's status in Google Ads after processing.
- Watch for silently dropped data:
conversion_environmentandexternal_attribution_datahave no Data Manager API equivalent.
Rather not maintain this pipeline at all? Server-side tracking platforms such as Stape or Tracklution stream conversions to Google continuously, so there is no monthly CSV ritual and no format migration next time Google changes the API.