Identify the Google Ads conversion action configured for STORE_PURCHASES or UPLOAD_CLICKS type in the account and retrieve its resource name for use in the upload payload
Call OfflineUserDataJobService.CreateOfflineUserDataJob in Google Ads API v23 to create a new job of type STORE_SALES_UPLOAD_FIRST_PARTY or CLICK_CONVERSION_UPLOAD, receiving a job resource name
Prepare conversion records: for store sales, include hashed user identifiers (email, phone, address) and transaction amount; for click conversions, include gclid, conversion_date_time, and conversion_value
Call OfflineUserDataJobService.AddOfflineUserDataJobOperations in batches of up to 100,000 records per RPC call, passing the job resource name and conversion data
Call OfflineUserDataJobService.RunOfflineUserDataJob to trigger processing; this is asynchronous — poll the job status via a GAQL query on the offline_user_data_job resource until status=SUCCESS or FAILED
Check job.failure_reason and operation-level error details on FAILED jobs; common failures include insufficient match rate or malformed identifiers
Known gotchas
Store sales uploads require a minimum number of matched transactions to clear Google's privacy threshold; uploads with fewer than the minimum matched records (typically around 1,000) are accepted but produce no reportable data
Conversion date_time must fall within the 90-day upload window relative to the current date; conversions older than 90 days are silently discarded without a job-level error
Hashed identifiers must use SHA-256 with the exact normalization Google specifies (lowercase, no leading/trailing spaces for email; E.164 for phone); using MD5 or incorrect normalization produces near-zero match rates
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp