Conversion adjustments need an identity and a restatement value
Not UploadClickConversions. The adjustment upload wants conversionAction, partialFailure true, adjustmentType, a timestamp with a timezone offset, and either orderId or gclidDateTimePair.gclid. A gclid pair also needs conversionDateTime. RESTATEMENT needs a numeric restatementValue.adjustedValue. RETRACTION must not send it.
RESTATEMENT needs the new value
Google documents restatementValue.adjustedValue as required on a restatement. A retraction must not send it.
Rule: vendor.google-ads-conversion-adjustments.body.restatement_requires_value
What this pack matches
Rules
Codes are stable. A finding in CI, MCP, or the playground lands on the same id.
| Field | Required | What it checks | Rule ids | Source |
|---|---|---|---|---|
conversionAdjustments |
required | UploadConversionAdjustments requires a `conversionAdjustments` array. Native JSON type: array. Minimum array items: 1. Maximum array items: 2000. Fix: Send at least one ConversionAdjustment in `conversionAdjustments`. | vendor.google-ads-conversion-adjustments.body.conversionAdjustments.missingvendor.google-ads-conversion-adjustments.body.conversionAdjustments.invalid |
docs |
partialFailure |
required | Google documents `partial_failure` as required, and the upload guides say to always send true. Native JSON type: boolean. Fix: Set `partialFailure` to `true`. | vendor.google-ads-conversion-adjustments.body.partialFailure.missingvendor.google-ads-conversion-adjustments.body.partialFailure.emptyvendor.google-ads-conversion-adjustments.body.partialFailure.invalid |
docs |
conversionAdjustments[] |
optional | The vendor documents `conversionAdjustments[]` in the request contract. Native JSON type: object. | vendor.google-ads-conversion-adjustments.body.conversionAdjustments[].invalid |
docs |
validateOnly |
optional | The vendor documents `validateOnly` in the request contract. Native JSON type: boolean. | vendor.google-ads-conversion-adjustments.body.validateOnly.invalid |
docs |
root |
optional | The vendor documents `` in the request contract. Native JSON type: object. | vendor.google-ads-conversion-adjustments.body.root.invalid |
docs |
conversionAction |
required | It is the conversion action resource name, and every uploaded adjustment requires it. Body scope: ["conversionAdjustments[]","conversion_adjustments[]"]. Native JSON type: string. Fix: Set `conversionAction` to `customers/{id}/conversionActions/{id}`. | vendor.google-ads-conversion-adjustments.body.conversionAction.missingvendor.google-ads-conversion-adjustments.body.conversionAction.emptyvendor.google-ads-conversion-adjustments.body.conversionAction.invalid |
docs |
adjustmentType |
required | Google documents `RETRACTION`, `RESTATEMENT`, and `ENHANCEMENT`. Body scope: ["conversionAdjustments[]","conversion_adjustments[]"]. Native JSON type: string or integer. Fix: Set `adjustmentType` to `RETRACTION`, `RESTATEMENT`, or `ENHANCEMENT`. | vendor.google-ads-conversion-adjustments.body.adjustmentType.missingvendor.google-ads-conversion-adjustments.body.adjustmentType.emptyvendor.google-ads-conversion-adjustments.body.adjustmentType.invalid |
docs |
adjustmentDateTime |
optional | Google documents the adjustment time with a timezone offset as `yyyy-mm-dd hh:mm:ss+|-hh:mm`. Body scope: ["conversionAdjustments[]","conversion_adjustments[]"]. Native JSON type: string. Fix: Send a timestamp such as `2026-08-21 12:00:00+00:00`. | vendor.google-ads-conversion-adjustments.body.adjustmentDateTime.emptyvendor.google-ads-conversion-adjustments.body.adjustmentDateTime.invalid |
docs |
orderId |
optional | It identifies the conversion to adjust. Google documents `orderId` as the recommended identifier. Body scope: ["conversionAdjustments[]","conversion_adjustments[]"]. Native JSON type: string. | vendor.google-ads-conversion-adjustments.body.orderId.emptyvendor.google-ads-conversion-adjustments.body.orderId.invalid |
docs |
gclidDateTimePair.gclid |
optional | Google click ID plus conversion time, as an alternative to `orderId`. Body scope: ["conversionAdjustments[]","conversion_adjustments[]"]. Native JSON type: string. | vendor.google-ads-conversion-adjustments.body.gclidDateTimePair.gclid.emptyvendor.google-ads-conversion-adjustments.body.gclidDateTimePair.gclid.invalid |
docs |
gclidDateTimePair.conversionDateTime |
optional | The original conversion time when identifying via `gclidDateTimePair`. Same timestamp shape as `adjustmentDateTime`. Body scope: ["conversionAdjustments[]","conversion_adjustments[]"]. Native JSON type: string. | vendor.google-ads-conversion-adjustments.body.gclidDateTimePair.conversionDateTime.emptyvendor.google-ads-conversion-adjustments.body.gclidDateTimePair.conversionDateTime.invalid |
docs |
restatementValue.adjustedValue |
optional | The restated conversion value. Google documents it as required on `RESTATEMENT` and invalid on `RETRACTION`. Body scope: ["conversionAdjustments[]","conversion_adjustments[]"]. Native JSON type: number or string. Fix: Set `restatementValue.adjustedValue` to the new conversion value. | vendor.google-ads-conversion-adjustments.body.restatementValue.adjustedValue.emptyvendor.google-ads-conversion-adjustments.body.restatementValue.adjustedValue.invalid |
docs |
restatementValue.currencyCode |
optional | It is an ISO 4217 currency code for `adjustedValue`. Body scope: ["conversionAdjustments[]","conversion_adjustments[]"]. Native JSON type: string. Fix: Use the three-letter code, such as `USD`. | vendor.google-ads-conversion-adjustments.body.restatementValue.currencyCode.emptyvendor.google-ads-conversion-adjustments.body.restatementValue.currencyCode.invalid |
docs |
consent |
optional | The vendor documents `consent` in the request contract. Body scope: ["conversionAdjustments[]","conversion_adjustments[]"]. Native JSON type: object. | vendor.google-ads-conversion-adjustments.body.consent.invalid |
docs |
restatementValue |
optional | The vendor documents `restatementValue` in the request contract. Body scope: ["conversionAdjustments[]","conversion_adjustments[]"]. Native JSON type: object. | vendor.google-ads-conversion-adjustments.body.restatementValue.invalid |
docs |
gclidDateTimePair |
optional | The vendor documents `gclidDateTimePair` in the request contract. Body scope: ["conversionAdjustments[]","conversion_adjustments[]"]. Native JSON type: object. | vendor.google-ads-conversion-adjustments.body.gclidDateTimePair.invalid |
docs |
userIdentifiers |
optional | Body scope: ["conversionAdjustments[]","conversion_adjustments[]"]. Native JSON type: array. Maximum array items: 5. | vendor.google-ads-conversion-adjustments.body.userIdentifiers.invalid |
docs |
userIdentifiers[] |
optional | Body scope: ["conversionAdjustments[]","conversion_adjustments[]"]. Native JSON type: object. | vendor.google-ads-conversion-adjustments.body.userIdentifiers[].invalid |
docs |
userAgent |
optional | Body scope: ["conversionAdjustments[]","conversion_adjustments[]"]. Native JSON type: string. | vendor.google-ads-conversion-adjustments.body.userAgent.invalid |
docs |
body.order_or_gclid_required |
required | The adjustment has neither `orderId` nor `gclidDateTimePair.gclid`. Google documents one of them as required so the conversion can be identified. Body scope: ["conversionAdjustments[]","conversion_adjustments[]"]. Fix: Send `orderId`, or send `gclidDateTimePair` with `gclid` and `conversionDateTime`. | vendor.google-ads-conversion-adjustments.body.order_or_gclid_required |
docs |
body.gclid_requires_conversion_time |
required | The adjustment sends `gclidDateTimePair.gclid` without `conversionDateTime`. Google documents the pair together. Body scope: ["conversionAdjustments[]","conversion_adjustments[]"]. Fix: Set `gclidDateTimePair.conversionDateTime` to the original conversion time. | vendor.google-ads-conversion-adjustments.body.gclid_requires_conversion_time |
docs |
body.restatement_requires_value |
required | A `RESTATEMENT` has no `restatementValue.adjustedValue`. Google documents the restated value as required. Body scope: ["conversionAdjustments[]","conversion_adjustments[]"]. Fix: Set `restatementValue.adjustedValue` to the new conversion value. | vendor.google-ads-conversion-adjustments.body.restatement_requires_value |
docs |
body.retraction_forbids_value |
required | A `RETRACTION` carries `restatementValue.adjustedValue`. Google documents that field as required on `RESTATEMENT` and invalid on a retraction. Body scope: ["conversionAdjustments[]","conversion_adjustments[]"]. Fix: Drop `restatementValue` from a retraction. | vendor.google-ads-conversion-adjustments.body.retraction_forbids_value |
docs |
body.adjustment_time_required |
required | The request does not satisfy the documented adjustment time required requirement. Body scope: ["conversionAdjustments[]","conversion_adjustments[]"]. | vendor.google-ads-conversion-adjustments.body.adjustment_time_required |
docs |
body.enhancement_order_required |
required | The request does not satisfy the documented enhancement order required requirement. Body scope: ["conversionAdjustments[]","conversion_adjustments[]"]. | vendor.google-ads-conversion-adjustments.body.enhancement_order_required |
docs |
body.user_identifiers_enhancement_only |
required | The request does not satisfy the documented user identifiers enhancement only requirement. Body scope: ["conversionAdjustments[]","conversion_adjustments[]"]. | vendor.google-ads-conversion-adjustments.body.user_identifiers_enhancement_only |
docs |
body.user_agent_enhancement_only |
required | The request does not satisfy the documented user agent enhancement only requirement. Body scope: ["conversionAdjustments[]","conversion_adjustments[]"]. | vendor.google-ads-conversion-adjustments.body.user_agent_enhancement_only |
docs |
body.user_agent_requires_identifiers |
required | The request does not satisfy the documented user agent requires identifiers requirement. Body scope: ["conversionAdjustments[]","conversion_adjustments[]"]. | vendor.google-ads-conversion-adjustments.body.user_agent_requires_identifiers |
docs |
body.adjustmentDateTime.calendar_invalid |
required | The conversion timestamp must represent a valid calendar date, time and timezone offset. Body scope: ["conversionAdjustments[]","conversion_adjustments[]"]. | vendor.google-ads-conversion-adjustments.body.adjustmentDateTime.calendar_invalid |
docs |
body.gclidDateTimePair.conversionDateTime.calendar_invalid |
required | The conversion timestamp must represent a valid calendar date, time and timezone offset. Body scope: ["conversionAdjustments[]","conversion_adjustments[]"]. | vendor.google-ads-conversion-adjustments.body.gclidDateTimePair.conversionDateTime.calendar_invalid |
docs |
root |
optional | Body scope: ["conversionAdjustments[].userIdentifiers[]","conversionAdjustments[].user_identifiers[]","conversion_adjustments[].userIdentifiers[]","conversion_adjustments[].user_identifiers[]"]. Native JSON type: object. | vendor.google-ads-conversion-adjustments.body.root.invalid |
docs |
hashedEmail |
optional | Body scope: ["conversionAdjustments[].userIdentifiers[]","conversionAdjustments[].user_identifiers[]","conversion_adjustments[].userIdentifiers[]","conversion_adjustments[].user_identifiers[]"]. Native JSON type: string. | vendor.google-ads-conversion-adjustments.body.hashedEmail.emptyvendor.google-ads-conversion-adjustments.body.hashedEmail.invalid |
docs |
hashedPhoneNumber |
optional | Body scope: ["conversionAdjustments[].userIdentifiers[]","conversionAdjustments[].user_identifiers[]","conversion_adjustments[].userIdentifiers[]","conversion_adjustments[].user_identifiers[]"]. Native JSON type: string. | vendor.google-ads-conversion-adjustments.body.hashedPhoneNumber.emptyvendor.google-ads-conversion-adjustments.body.hashedPhoneNumber.invalid |
docs |
userIdentifierSource |
optional | Body scope: ["conversionAdjustments[].userIdentifiers[]","conversionAdjustments[].user_identifiers[]","conversion_adjustments[].userIdentifiers[]","conversion_adjustments[].user_identifiers[]"]. Native JSON type: string or integer. | vendor.google-ads-conversion-adjustments.body.userIdentifierSource.emptyvendor.google-ads-conversion-adjustments.body.userIdentifierSource.invalid |
docs |
mobileId |
forbidden | Body scope: ["conversionAdjustments[].userIdentifiers[]","conversionAdjustments[].user_identifiers[]","conversion_adjustments[].userIdentifiers[]","conversion_adjustments[].user_identifiers[]"]. Native JSON type: string. | vendor.google-ads-conversion-adjustments.body.mobileId.forbiddenvendor.google-ads-conversion-adjustments.body.mobileId.invalid |
docs |
thirdPartyUserId |
forbidden | Body scope: ["conversionAdjustments[].userIdentifiers[]","conversionAdjustments[].user_identifiers[]","conversion_adjustments[].userIdentifiers[]","conversion_adjustments[].user_identifiers[]"]. Native JSON type: string. | vendor.google-ads-conversion-adjustments.body.thirdPartyUserId.forbiddenvendor.google-ads-conversion-adjustments.body.thirdPartyUserId.invalid |
docs |
addressInfo |
optional | Body scope: ["conversionAdjustments[].userIdentifiers[]","conversionAdjustments[].user_identifiers[]","conversion_adjustments[].userIdentifiers[]","conversion_adjustments[].user_identifiers[]"]. Native JSON type: object. | vendor.google-ads-conversion-adjustments.body.addressInfo.invalid |
docs |
body.identifier_required |
required | The request does not satisfy the documented identifier required requirement. Body scope: ["conversionAdjustments[].userIdentifiers[]","conversionAdjustments[].user_identifiers[]","conversion_adjustments[].userIdentifiers[]","conversion_adjustments[].user_identifiers[]"]. | vendor.google-ads-conversion-adjustments.body.identifier_required |
docs |
body.identifier_oneof |
required | The request does not satisfy the documented identifier oneof requirement. Body scope: ["conversionAdjustments[].userIdentifiers[]","conversionAdjustments[].user_identifiers[]","conversion_adjustments[].userIdentifiers[]","conversion_adjustments[].user_identifiers[]"]. | vendor.google-ads-conversion-adjustments.body.identifier_oneof |
docs |
root |
optional | Body scope: ["conversionAdjustments[].userIdentifiers[].addressInfo","conversionAdjustments[].userIdentifiers[].address_info","conversionAdjustments[].user_identifiers[].addressInfo","conversionAdjustments[].user_identifiers[].address_info","conversion_adjustments[].userIdentifiers[].addressInfo","conversion_adjustments[].userIdentifiers[].address_info","conversion_adjustments[].user_identifiers[].addressInfo","conversion_adjustments[].user_identifiers[].address_info"]. Native JSON type: object. | vendor.google-ads-conversion-adjustments.body.root.invalid |
docs |
hashedFirstName |
required | Body scope: ["conversionAdjustments[].userIdentifiers[].addressInfo","conversionAdjustments[].userIdentifiers[].address_info","conversionAdjustments[].user_identifiers[].addressInfo","conversionAdjustments[].user_identifiers[].address_info","conversion_adjustments[].userIdentifiers[].addressInfo","conversion_adjustments[].userIdentifiers[].address_info","conversion_adjustments[].user_identifiers[].addressInfo","conversion_adjustments[].user_identifiers[].address_info"]. Native JSON type: string. | vendor.google-ads-conversion-adjustments.body.hashedFirstName.missingvendor.google-ads-conversion-adjustments.body.hashedFirstName.emptyvendor.google-ads-conversion-adjustments.body.hashedFirstName.invalid |
docs |
hashedLastName |
required | Body scope: ["conversionAdjustments[].userIdentifiers[].addressInfo","conversionAdjustments[].userIdentifiers[].address_info","conversionAdjustments[].user_identifiers[].addressInfo","conversionAdjustments[].user_identifiers[].address_info","conversion_adjustments[].userIdentifiers[].addressInfo","conversion_adjustments[].userIdentifiers[].address_info","conversion_adjustments[].user_identifiers[].addressInfo","conversion_adjustments[].user_identifiers[].address_info"]. Native JSON type: string. | vendor.google-ads-conversion-adjustments.body.hashedLastName.missingvendor.google-ads-conversion-adjustments.body.hashedLastName.emptyvendor.google-ads-conversion-adjustments.body.hashedLastName.invalid |
docs |
hashedStreetAddress |
optional | Body scope: ["conversionAdjustments[].userIdentifiers[].addressInfo","conversionAdjustments[].userIdentifiers[].address_info","conversionAdjustments[].user_identifiers[].addressInfo","conversionAdjustments[].user_identifiers[].address_info","conversion_adjustments[].userIdentifiers[].addressInfo","conversion_adjustments[].userIdentifiers[].address_info","conversion_adjustments[].user_identifiers[].addressInfo","conversion_adjustments[].user_identifiers[].address_info"]. Native JSON type: string. | vendor.google-ads-conversion-adjustments.body.hashedStreetAddress.emptyvendor.google-ads-conversion-adjustments.body.hashedStreetAddress.invalid |
docs |
countryCode |
required | Body scope: ["conversionAdjustments[].userIdentifiers[].addressInfo","conversionAdjustments[].userIdentifiers[].address_info","conversionAdjustments[].user_identifiers[].addressInfo","conversionAdjustments[].user_identifiers[].address_info","conversion_adjustments[].userIdentifiers[].addressInfo","conversion_adjustments[].userIdentifiers[].address_info","conversion_adjustments[].user_identifiers[].addressInfo","conversion_adjustments[].user_identifiers[].address_info"]. Native JSON type: string. | vendor.google-ads-conversion-adjustments.body.countryCode.missingvendor.google-ads-conversion-adjustments.body.countryCode.emptyvendor.google-ads-conversion-adjustments.body.countryCode.invalid |
docs |
postalCode |
required | Body scope: ["conversionAdjustments[].userIdentifiers[].addressInfo","conversionAdjustments[].userIdentifiers[].address_info","conversionAdjustments[].user_identifiers[].addressInfo","conversionAdjustments[].user_identifiers[].address_info","conversion_adjustments[].userIdentifiers[].addressInfo","conversion_adjustments[].userIdentifiers[].address_info","conversion_adjustments[].user_identifiers[].addressInfo","conversion_adjustments[].user_identifiers[].address_info"]. Native JSON type: string. | vendor.google-ads-conversion-adjustments.body.postalCode.missingvendor.google-ads-conversion-adjustments.body.postalCode.invalid |
docs |
city |
optional | Body scope: ["conversionAdjustments[].userIdentifiers[].addressInfo","conversionAdjustments[].userIdentifiers[].address_info","conversionAdjustments[].user_identifiers[].addressInfo","conversionAdjustments[].user_identifiers[].address_info","conversion_adjustments[].userIdentifiers[].addressInfo","conversion_adjustments[].userIdentifiers[].address_info","conversion_adjustments[].user_identifiers[].addressInfo","conversion_adjustments[].user_identifiers[].address_info"]. Native JSON type: string. | vendor.google-ads-conversion-adjustments.body.city.invalid |
docs |
state |
optional | Body scope: ["conversionAdjustments[].userIdentifiers[].addressInfo","conversionAdjustments[].userIdentifiers[].address_info","conversionAdjustments[].user_identifiers[].addressInfo","conversionAdjustments[].user_identifiers[].address_info","conversion_adjustments[].userIdentifiers[].addressInfo","conversion_adjustments[].userIdentifiers[].address_info","conversion_adjustments[].user_identifiers[].addressInfo","conversion_adjustments[].user_identifiers[].address_info"]. Native JSON type: string. | vendor.google-ads-conversion-adjustments.body.state.invalid |
docs |
method |
required | This published ingestion operation uses HTTP POST. Complete HTTP capture contract. Native JSON type: string. | vendor.google-ads-conversion-adjustments.http.method.missingvendor.google-ads-conversion-adjustments.http.method.emptyvendor.google-ads-conversion-adjustments.http.method.invalid |
docs |
content_type |
recommended | Use a published request media type. Complete HTTP capture contract. Presence diagnostic severity: warning. Value diagnostic severity: warning. Native JSON type: string. | vendor.google-ads-conversion-adjustments.http.content_type.missingvendor.google-ads-conversion-adjustments.http.content_type.emptyvendor.google-ads-conversion-adjustments.http.content_type.invalid |
docs |
body |
required | The request body is a JSON object. Complete HTTP capture contract. Native JSON type: object. | vendor.google-ads-conversion-adjustments.http.body.missingvendor.google-ads-conversion-adjustments.http.body.invalid |
docs |
path |
required | REST conversion upload requires a versioned customer RPC path. Complete HTTP capture contract. Native JSON type: string. | vendor.google-ads-conversion-adjustments.http.path.missingvendor.google-ads-conversion-adjustments.http.path.emptyvendor.google-ads-conversion-adjustments.http.path.invalid |
docs |
headers.authorization |
required | Every Google Ads API request requires an OAuth Bearer token. Complete HTTP capture contract. Native JSON type: string. | vendor.google-ads-conversion-adjustments.http.headers.authorization.missingvendor.google-ads-conversion-adjustments.http.headers.authorization.emptyvendor.google-ads-conversion-adjustments.http.headers.authorization.invalid |
docs |
headers.developer-token |
required | Every Google Ads API request requires a developer token. Complete HTTP capture contract. Native JSON type: string. | vendor.google-ads-conversion-adjustments.http.headers.developer-token.missingvendor.google-ads-conversion-adjustments.http.headers.developer-token.emptyvendor.google-ads-conversion-adjustments.http.headers.developer-token.invalid |
docs |
headers.login-customer-id |
optional | Manager customer ID, when supplied, omits hyphens. Complete HTTP capture contract. Native JSON type: string. | vendor.google-ads-conversion-adjustments.http.headers.login-customer-id.emptyvendor.google-ads-conversion-adjustments.http.headers.login-customer-id.invalid |
docs |
headers.linked-customer-id |
optional | Linked account customer ID, when supplied, omits hyphens. Complete HTTP capture contract. Native JSON type: string. | vendor.google-ads-conversion-adjustments.http.headers.linked-customer-id.emptyvendor.google-ads-conversion-adjustments.http.headers.linked-customer-id.invalid |
docs |
Validate a payload
pixellint validate json @payload.json --rulepack vendor/google-ads-conversion-adjustments
Try this failing payload in the playground. Conversion adjustment restatement without a value.
{"partialFailure":true,"conversionAdjustments":[{"conversionAction":"customers/1/conversionActions/2","adjustmentType":"RESTATEMENT","adjustmentDateTime":"2026-08-21 12:00:00+00:00","orderId":"ORDER-1"}]}
cargo install pixellint
·
npm install pixellint