Google has three kinds of click id and a separate field for each. File one in the wrong field and Google says it accepted the upload while quietly refusing it, so every booking from an iPhone app disappears from your numbers.
An offline click conversion is keyed by the identifier Google put on the click. There are three, and the
upload takes exactly one, each in its own field. gclid is the ordinary click. wbraid
is a click inside an iOS app that landed on a web page. gbraid is a web click that landed in an
iOS app.
Google Ads help, offline conversions with GBRAID;
Google Ads API, upload click conversions.
Give Google a string in the gclid field that is not a gclid and it does not throw an error
status. It answers 200. Inside the body, that row carries the error named UNPARSEABLE_GCLID if the string does not
decode, or CLICK_NOT_FOUND if it decodes and matches no click. Google's own troubleshooting page
lists both.
Google Ads API, conversion troubleshooting.
A landing page captures the click id from the URL and stores it in one column: the click id. That is right
for Meta, which has one kind. A Google upload written against that column files the stored id in the
gclid field every time.
Now a homeowner taps the ad inside Instagram on an iPhone. They arrive with a wbraid. The page stores it as the click id. The upload files it as a gclid. Google answers 200 and says, in the body, that it found no click.
A sender that reads only the status code records the conversion as sent. The retry sweep never looks at it again. The account never learns from a single iOS booking, and nothing you would normally look at says why.
Nothing about this shows up as a symptom. To find it, read the upload's field list against what your landing page stored.
gclid, wbraid or
gbraid. Store the kind with the id. File the upload under the field the kind names.GBRAID_WBRAID_BOTH_SET. Filling both "to be safe" is a refusal you asked for.Open your landing page from an ad clicked inside the Instagram or Facebook app on an iPhone. Look at the URL
you arrived with. If it carries wbraid= and your stored click ids all upload as gclids, look at the
response bodies. You will find CLICK_NOT_FOUND on every one of those visitors.
EXPIRED_EVENT, which is a timing problem and not this one.