pixellint

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

Hosts
googleads.googleapis.com
Paths
…uploadConversionAdjustments…
Vendor docs
developers.google.com/google-ads/api/docs/conversions/upload-adjustments

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.missing
vendor.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.missing
vendor.google-ads-conversion-adjustments.body.partialFailure.empty
vendor.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.missing
vendor.google-ads-conversion-adjustments.body.conversionAction.empty
vendor.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.missing
vendor.google-ads-conversion-adjustments.body.adjustmentType.empty
vendor.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.empty
vendor.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.empty
vendor.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.empty
vendor.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.empty
vendor.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.empty
vendor.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.empty
vendor.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.empty
vendor.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.empty
vendor.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.empty
vendor.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.forbidden
vendor.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.forbidden
vendor.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.missing
vendor.google-ads-conversion-adjustments.body.hashedFirstName.empty
vendor.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.missing
vendor.google-ads-conversion-adjustments.body.hashedLastName.empty
vendor.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.empty
vendor.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.missing
vendor.google-ads-conversion-adjustments.body.countryCode.empty
vendor.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.missing
vendor.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.missing
vendor.google-ads-conversion-adjustments.http.method.empty
vendor.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.missing
vendor.google-ads-conversion-adjustments.http.content_type.empty
vendor.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.missing
vendor.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.missing
vendor.google-ads-conversion-adjustments.http.path.empty
vendor.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.missing
vendor.google-ads-conversion-adjustments.http.headers.authorization.empty
vendor.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.missing
vendor.google-ads-conversion-adjustments.http.headers.developer-token.empty
vendor.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.empty
vendor.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.empty
vendor.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