Adjust uploaded conversions
Retracts, restates the value of, or enhances conversions you already sent to Google Ads, for refunds or late customer data.
Adjust conversions that were previously uploaded via POST /v1/ads/conversions:
retract them, restate their value, or enhance them with first-party data. Requires
the Ads add-on.
Google Ads only. Google handles adjustments through the classic Google Ads API
(ConversionAdjustmentUploadService); the Data Manager ingestEvents path used for
sending conversions is ingest-only. Meta and LinkedIn have no equivalent, so this
endpoint returns 405 for those platforms.
Adjustment types:
RETRACTION: remove the conversion entirely (refund, chargeback, cancelled order, churn).RESTATEMENT: change the conversion's value (upgrade / downgrade / partial refund). Send the corrected total value inrestatementValue(not a delta).ENHANCEMENT: attach first-party identifiers (hashed email / phone) to an existing conversion (enhanced conversions applied after the fact).
Identifying the original conversion (per adjustment):
orderId: the transaction ID you sent aseventIdon the original conversion. Recommended, and required forENHANCEMENT.- or
gclid+conversionTime: the click ID and the original conversion's time (unix seconds). Not available forENHANCEMENT.
destinationId is the conversion action resource name, e.g.
customers/1234567890/conversionActions/987654321 (same value you send to
POST /v1/ads/conversions). PII in user is hashed with SHA-256 server-side
(Gmail-specific normalization included). Send plaintext.
Times are unix seconds; we convert to Google's required
yyyy-MM-dd HH:mm:ss+00:00 format. Up to 2000 adjustments per request; partial
failure is supported (inspect adjustmentsFailed / failures[]).
Authorization
bearerAuth API key authentication: send your Zernio API key in the Authorization header, prefixed with Bearer.
In: header
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
import Zernio from '@zernio/node';const zernio = new Zernio({ apiKey: process.env.ZERNIO_API_KEY });const { data } = await zernio.conversions.adjustConversions({ body: { accountId: 'account_abc123', destinationId: 'destination_abc123', adjustments: [ { adjustmentType: 'RETRACTION', adjustmentTime: 0, }, ], },});console.log(data);{ "platform": "googleads", "adjustmentsReceived": 0, "adjustmentsFailed": 0, "failures": [ { "adjustmentIndex": 0, "message": "string", "code": "string" } ], "traceId": "string"}Associate campaigns
Links campaigns to a LinkedIn conversion rule so they track it, reporting which links succeeded or failed. Returns a per-campaign success/failure result so callers can retry only the rows that failed (e.g. wrong campaign type for the rule's objective).
Remove associated campaigns
Unlinks campaigns from a LinkedIn conversion rule so they stop tracking it. Pass `adAccountId` and `campaignIds` as query parameters (`campaignIds` is comma-separated). The route also accepts a JSON body with the same fields for clients that prefer DELETE-with-body, but the documented surface is query-only because some SDK code generators (e.g. Python) collapse query + body parameters with the same name into a single kwarg.