pixellint

vendor/google-ads-click-conversions · vendor documented

Click conversion uploads need a click ID or hashed user

Not the /pagead/conversion image. The REST upload wants conversionAction, a timestamp with a timezone offset, partialFailure true, and either a click ID or hashed userIdentifiers.

conversionDateTime is not ISO 8601

Google wants yyyy-mm-dd hh:mm:ss+|-hh:mm. A T separator or a Z suffix fails the format even when the instant is right.

Rule: vendor.google-ads-click-conversions.body.conversionDateTime.invalid

What this pack matches

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

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
conversions required UploadClickConversions requires a `conversions` array. Fix: Send at least one ClickConversion in `conversions`. vendor.google-ads-click-conversions.body.conversions.missing docs
partialFailure required Google documents `partial_failure` as required, and the upload guides say to always send true. Fix: Set `partialFailure` to `true`. vendor.google-ads-click-conversions.body.partialFailure.missing
vendor.google-ads-click-conversions.body.partialFailure.empty
vendor.google-ads-click-conversions.body.partialFailure.invalid
docs
conversionAction required It is the conversion action resource name, and every uploaded click conversion requires it. Fix: Set `conversionAction` to `customers/{id}/conversionActions/{id}`. vendor.google-ads-click-conversions.body.conversionAction.missing
vendor.google-ads-click-conversions.body.conversionAction.empty
docs
conversionDateTime required Google documents the conversion time with a timezone offset as `yyyy-mm-dd hh:mm:ss+|-hh:mm`. Fix: Send a timestamp such as `2026-08-21 12:00:00+00:00`. vendor.google-ads-click-conversions.body.conversionDateTime.missing
vendor.google-ads-click-conversions.body.conversionDateTime.empty
vendor.google-ads-click-conversions.body.conversionDateTime.invalid
docs
gclid optional Google click ID. A click-ID upload needs exactly one of `gclid`, `gbraid`, or `wbraid`. vendor.google-ads-click-conversions.body.gclid.empty docs
gbraid optional App-to-web click identifier from iOS. Alternative to `gclid`. vendor.google-ads-click-conversions.body.gbraid.empty docs
wbraid optional Web-to-app click identifier. Alternative to `gclid`. vendor.google-ads-click-conversions.body.wbraid.empty docs
userIdentifiers optional Hashed user identifiers for enhanced conversions for leads. The upload service accepts `hashedEmail` and `hashedPhoneNumber` only, at most five. docs
userIdentifiers[].hashedEmail optional Email must be normalized and SHA-256 hashed before it is sent. Fix: Lowercase and trim the address, hash it with SHA-256, and send the hex digest. vendor.google-ads-click-conversions.body.userIdentifiers[].hashedEmail.empty
vendor.google-ads-click-conversions.body.userIdentifiers[].hashedEmail.invalid
docs
userIdentifiers[].hashedPhoneNumber optional Phone must be E.164 and SHA-256 hashed before it is sent. Fix: Normalize to E.164, hash with SHA-256, and send the hex digest. vendor.google-ads-click-conversions.body.userIdentifiers[].hashedPhoneNumber.empty
vendor.google-ads-click-conversions.body.userIdentifiers[].hashedPhoneNumber.invalid
docs
currencyCode optional It is an ISO 4217 currency code for `conversionValue`. Fix: Use the three-letter code, such as `USD`. vendor.google-ads-click-conversions.body.currencyCode.empty
vendor.google-ads-click-conversions.body.currencyCode.invalid
docs
body.click_id_or_user_required required The conversion has no click ID and no `userIdentifiers`. Google documents a `gclid`, `gbraid`, or `wbraid` for click-ID uploads, or hashed user identifiers for enhanced conversions for leads. Fix: Send `gclid` (or `gbraid` / `wbraid`), or send hashed `userIdentifiers`. vendor.google-ads-click-conversions.body.click_id_or_user_required docs
body.unhashed_email required A field carries what looks like a raw email address. Google requires email as `hashedEmail`, SHA-256 hashed after normalization. Fix: Normalize the address, hash it with SHA-256, and send `userIdentifiers[].hashedEmail`. vendor.google-ads-click-conversions.body.unhashed_email docs

Validate a payload

pixellint validate json @payload.json --rulepack vendor/google-ads-click-conversions

Or paste it into the playground. Same engine, in the browser, nothing sent anywhere.

cargo install pixellint · npm install pixellint