App User-Agent
As part of our broader efforts to combat spam, we have developed a standardized specification for the User-Agent header sent by an analytics/ads product on behalf of an app user. The app User-Agent can be derived from native code to adhere to the following specification:
name version ( os_and_version ; locale ; device ; build ; Proxy)
The definition of these fields is as follows:
The name of the analytics/ads product. ( Google AdMob
)
Note that if user agent is constructed on the client side, name
should be the bundle ID of client app instead.
Android
// Specified by API consumer.
iOS
// Specified by API consumer.
The version of the analytics/ads product.
( 7.10.1
)
Android
// Specified by API consumer.
iOS
// Specified by API consumer.
The operating system and operating system version the app
is running on. ( Android 6.0
)
Android
String osAndVersion = "Android " + Build.VERSION.RELEASE;
iOS
UIDevice * uid = [ UIDevice currentDevice ]; NSString * osAndVersion = [ NSString stringWithFormat : @"%@ %@" , [ uid systemName ], [ uid systemVersion ]];
An IETF locale tag for the device, using two-letter
language and country code separated by an underscore.
( en_US
)
Android
String locale = Locale.getDefault();
iOS
NSString * locale = [[ NSLocale currentLocale ] localeIdentifier ]
The name of the physical device running the analytics/ads
product.
( iPhone9,1
)
Android
String device = Build.MODEL;
iOS
@import Darwin . sys . sysctl ; NSString * device ( void ) { size_t bufferSize = 64 ; NSMutableData * buffer = [[ NSMutableData alloc ] initWithLength : bufferSize ]; int status = sysctlbyname ( "hw.machine" , buffer . mutableBytes , & bufferSize , NULL , 0 ); if ( status != 0 ) { return nil ; } return [[ NSString alloc ] initWithCString : buffer . mutableBytes encoding : NSUTF8StringEncoding ]; }
"Build/" followed by the build number of the operating
system.
( Build/13D15
)
Android
String build = "Build/" + Build.ID;
iOS
@import Darwin . sys . sysctl ; NSString * build ( void ) { size_t bufferSize = 64 ; NSMutableData * buffer = [[ NSMutableData alloc ] initWithLength : bufferSize ]; int status = sysctlbyname ( "kern.osversion" , buffer . mutableBytes , & bufferSize , NULL , 0 ); if ( status != 0 ) { return nil ; } return [[ NSString alloc ] initWithCString : buffer . mutableBytes encoding : NSUTF8StringEncoding ]; }
Only include ; Proxy
at the end of the app User-Agent when constructing the
app User-Agent server side. If the app User-Agent is entirely constructed on the
client side, exclude ; Proxy
. Thus an app User-Agent might be:
- Android:
AdMob/7.10.1 (Android 6.0; en_US; SM-G900F; Build/MMB29M; Proxy)
- iOS:
AdMob/7.10.1 (iOS 10.0.2; en_US; iPhone9,1; Build/13D15; Proxy)
Conversion Tracking Request
The purpose of conversion tracking requests is to notify Google Ads of an app event that should be tracked as a conversion and/or used to populate a remarketing list, and to retrieve metadata describing any click that preceded the event.
All API calls are made to the www.googleadservices.com
domain. Conversion
requests are POST
requests via HTTPS on the following path:
/pagead/conversion/app/ version
1.0
. A standard app conversion request will contain the following parameters.
dev_token
Required
Location: Query
The unique, static developer token issued to the API consumer.
Z_eErE4DkvcKjDM1OVE4c4
link_id
Required
Location: Query
The link identifier binding the developer token of the API consumer to a specific app.
31FF8D67E5BB5DD5029DCC2734C2F884
app_event_type
Required
Location: Query
The name of the app event that occurred. This field is an enumeration, and will only accept the following values:
• first_open • session_start • in_app_purchase • view_item_list • view_item • view_search_results • add_to_cart • ecommerce_purchase • custom
The first_open
event should always be sent for attributing
installs and the session_start
event should always be sent for
reattributing sessions. Use in_app_purchase
for purchases made
through the native app store; use ecommerce_purchase
for all other
purchases.
app_event_name
Required under certain conditions
Location: Query
The name of any custom app event which is not accepted in the app_event_type
field. This field should contain 1 to 64 Unicode
characters (using UTF-8 encoding). This field is required if
app_event_type
is custom
.
level_achieved Level Achieved
This field must not contain any of the values reserved for app_event_type
. If a reserved event name is used, the API will
return an APP_EVENT_NAME_RESERVED_VALUE
error.
app_event_data
Optional
Location: Body
Forward any additional rich event data as a simple JSON object mapping string keys to values. Acceptable values are strings and arrays of strings.
{"level": 5, "attempts": 20}
rdid
Required
Location: Query
A valid UUID string representing the raw device ID.
f10e1de2-e237-4f50-b6aa-843c45cc63d6
In case that device id is missing, such as device id from an ATT unconsented user, set it as all zero.
00000000-0000-0000-0000-000000000000
id_type
Required
Location: Query
The type of identifier stored in the rdid
field. We may accept
more values here in the future, but to begin with, we will support the
following.
Android
advertisingid
iOS
idfa
eea
Required under certain conditions
Location: Query
The EEA
scope.
0:
European regulations do not apply to this user and conversion
1:
European regulations apply to this user and conversion.
For example, if a user is located within the EEA
, they are
within scope for applicable European regulations.
*Required to be sent when the value is known.
ad_personalization
Required under certain conditions
Location: Query
The flags for personalized ads
0:
End user has denied ads personalization consent
1:
End user has granted ads personalization consent
*Required to be sent when the value is known.
ad_user_data
Required under certain conditions
Location: Query
The consent flag for use of user data for ads purposes
0:
User has denied consent for transmission of user level data to Google for ads purposes
1:
User has granted consent for transmission of user level data to Google for ads purposes
*Required to be sent when the value is known.
lat
Required
Location: Query
Limit-ad-tracking status for the device.
-
0
: User has not chosen to limit ad tracking. -
1
: User has chosen to limit ad tracking.
app_version
Required
Location: Query
The current version of the app. This should be standardized as follows.
Android
packageManager . getPackageInfo ( packageName (), PackageManager . GET_META_DATA ). versionName
iOS
[[[NSBundle mainBundle] infoDictionary] objectForKey : @"CFBundleShortVersionString"]
1.2.4
os_version
Required
Location: Query
The current version of the app’s host OS. This should be standardized as follows.
Android
android.os.Build.VERSION.RELEASE
iOS
[[UIDevice currentDevice] systemVersion]
sdk_version
Required
Location: Query
The version of the SDK that measured the event. Because this is mainly used
for debugging, it should reflect the release version exactly as it is published
with your SDK releases. If the app does not use an SDK, please pass the same
value as
app_version
.
1.9.5r6
timestamp
Required
Location: Query
The UNIX timestamp the conversion event occurred, in seconds with up to microseconds precision.
1432681913.123456
value
Optional
Location: Query
The monetary value of the event, if any. This should always be formatted as a machine-readable floating point value using a decimal point to separate the integer and fractional part of the value.
1.99
currency_code
Required under certain conditions
Location: Query
The ISO
4217 currency code
for the value
parameter. This field is
required if the
value
parameter is provided and not
blank
.
USD
gclid
Required under certain conditions
Location: Query
The value of the gclid
query parameter from a deep link URL that
opened the app.
Cj0KEQjw0dy4BRCuuL_e5M
market_referrer_gclid
Required under certain conditions
Location: Query
The value of the gclid
query parameter from a deep link URL
captured from the install_referrer value via the Play
Install Referrer API
.
BX3QojHp4mY5MrJtFM_d1u
gclid_only_request
Required under certain conditions
Location: Query
Identifier for gclid
based attribution in scenarios where
rdid (advertisingid) is not
available or all zeroes
AND either gclid
or market_referrer_gclid
is present.
1
gbraid
Required under certain conditions
Location: Query
Last seen gbraid
value sent through deep link URL that opened
the app. Note that this needs to be cached on the app so that it can be sent
with the future conversions that happen on the app.
ChEI8IixhgYQrufHkIjz3YWRARIzALev_G_O
app_open_source
Required under certain conditions
Location: Query
Value to identify ad click deeplink or organic app sessions.
ad_click or organic
User-Agent
Required
Location: Header
The app user agent as defined previous section.
AdMob/7.10.1 (Android 6.0; en_US; SM-G900F; Build/MMB29M)
X-Forwarded-For
Required
Location: Header
The public IPv4 or IPv6 address of the device where the event was measured.
216.58.194.174
All requests must be sent via HTTPS. Pings received via HTTP will be rejected.
Please note that if the request body is empty (in cases where no rich event data
is passed in the app_event_data
payload), our server requires that
you explicitly set the Content-Length: 0
header on your request.
Sample Request
An example of a valid conversion tracking request with a non-custom event typeand revenue informationis:
POST /pagead/conversion/app/1.0 ?dev_token=Z_eErE4DkvcKjDM1OVE4c4 &link_id=31FF8D67E5BB5DD5029DCC2734C2F884 &app_event_type=in_app_purchase &rdid=0F7AB11F-DA50-498E-B225-21AC1977A85D &id_type=idfa &eea=0 &ad_personalization=1 &ad_user_data=1 &lat=0 &app_version=1.2.4 &os_version=9.3.2 &sdk_version=1.9.5r6 ×tamp=1432681913.123456 &value=1.99 ¤cy_code=USD &market_referrer_gclid=BX3QojHp4mY5MrJtFM_d1u &gclid=Cj0KEQjw0dy4BRCuuL_e5M &gclid_only_request=0 &gbraid=ChEI8IixhgYQrufHkIjz3YWRARIzALev_G_O Host: www.googleadservices.com User-Agent: MyAnalyticsCompany/1.0.0 (iOS 10.0.2; en_US; iPhone9,1; Build/13D15; Proxy) X-Forwarded-For: 216.58.194.174 Content-Type: application/json; charset=utf-8
{"app_event_data":{"item_id":["Crayons","Markers"]}}
An example of a valid conversion tracking request with a non-custom event typeand revenue informationwith rdid (advertisingid) not availableis:
POST /pagead/conversion/app/1.0 ?dev_token=Z_eErE4DkvcKjDM1OVE4c4 &link_id=31FF8D67E5BB5DD5029DCC2734C2F884 &app_event_type=in_app_purchase &rdid=00000000-0000-0000-0000-000000000000 &id_type=advertisingid &eea=0 &ad_personalization=1 &ad_user_data=1 &lat=1 &app_version=1.2.4 &os_version=9.3.2 &sdk_version=1.9.5r6 ×tamp=1432681913.123456 &value=1.99 ¤cy_code=USD &market_referrer_gclid=BX3QojHp4mY5MrJtFM_d1u &gclid=Cj0KEQjw0dy4BRCuuL_e5M &gclid_only_request=1 &gbraid=ChEI8IixhgYQrufHkIjz3YWRARIzALev_G_O Host: www.googleadservices.com User-Agent: MyAnalyticsCompany/1.0.0 (iOS 10.0.2; en_US; Android,1; Build/13D15; Proxy) X-Forwarded-For: 216.58.194.174 Content-Type: application/json; charset=utf-8
{"app_event_data":{"item_id":["Crayons","Markers"]}}
An example of a valid session startrequest is:
POST /pagead/conversion/app/1.0 ?dev_token=Z_eErE4DkvcKjDM1OVE4c4 &link_id=31FF8D67E5BB5DD5029DCC2734C2F884 &app_event_type=session_start &rdid=0F7AB11F-DA50-498E-B225-21AC1977A85D &id_type=idfa &eea=0 &ad_personalization=1 &ad_user_data=1 &lat=0 &app_version=1.2.4 &os_version=9.3.2 &sdk_version=1.9.5r6 ×tamp=1432681913.123456 &gclid=Cj0KEQjw0dy4BRCuuL_e5M &gbraid=ChEI8IixhgYQrufHkIjz3YWRARIzALev_G_O Host: www.googleadservices.com User-Agent: MyAnalyticsCompany/1.0.0 (iOS 10.0.2; en_US; iPhone9,1; Build/13D15; Proxy) X-Forwarded-For: 216.58.194.174 Content-Type: application/json; charset=utf-8
An example of a valid session start reattribution
request for a session
which began from the deep link example://product/123?gclid=Cj0KEQjw0dy4BRCuuL_e5M
is:
POST /pagead/conversion/app/1.0 ?dev_token=Z_eErE4DkvcKjDM1OVE4c4 &link_id=31FF8D67E5BB5DD5029DCC2734C2F884 &app_event_type=session_start &rdid=0F7AB11F-DA50-498E-B225-21AC1977A85D &id_type=idfa &eea=0 &ad_personalization=1 &ad_user_data=1 &lat=0 &app_version=1.2.4 &os_version=9.3.2 &sdk_version=1.9.5r6 ×tamp=1432681913.123456 &gclid=Cj0KEQjw0dy4BRCuuL_e5M &gbraid=ChEI8IixhgYQrufHkIjz3YWRARIzALev_G_O Host: www.googleadservices.com User-Agent: MyAnalyticsCompany/1.0.0 (iOS 10.0.2; en_US; iPhone9,1; Build/13D15; Proxy) X-Forwarded-For: 216.58.194.174 Content-Type: application/json; charset=utf-8
An example of a valid conversion tracking request for an EEA user with ad user data consent granted and ads personalization declined is:
POST /pagead/conversion/app/1.0 ?dev_token=Z_eErE4DkvcKjDM1OVE4c4 &link_id=31FF8D67E5BB5DD5029DCC2734C2F884 &app_event_type=in_app_purchase &rdid=0F7AB11F-DA50-498E-B225-21AC1977A85D &id_type=idfa &eea=1 &ad_personalization=0 &ad_user_data=1 &lat=0 &app_version=1.2.4 &os_version=9.3.2 &sdk_version=1.9.5r6 ×tamp=1432681913.123456 &value=1.99 ¤cy_code=USD Host: www.googleadservices.com User-Agent: MyAnalyticsCompany/1.0.0 (iOS 10.0.2; en_US; iPhone9,1; Build/13D15; Proxy) X-Forwarded-For: 216.58.194.174 Content-Type: application/json; charset=utf-8
Event Data Encoding
For the app_event_data
body parameter, please use the following conventions
for primitive data types:
-
Float
- Use dot character as decimal separator independently of app localisation
- Use two-digit decimal precision to represent monetary values. e.g. 2.99
- Do notuse exponential notation, e.g. 2E+9
- Do notuse a comma character to separate groups of digits, e.g. 1,000,000
- Valid examples:
-
-0.5
-
2.99
-
1000000.123
-
-
Integer
- Only send whole integer values with no decimal digits
- Do notuse a comma character to separate groups of digits, e.g. 1,000,000
- Valid examples:
-
1000
-
-11
-
0
-
-
Date
- Date format: yyyy-mm-dd
-
yyyy
= four digit year, e.g. 2016 -
mm
= two digit month, e.g. 09 for September -
dd
= two digit day, e.g. 23 for the 23rd day of the month
-
- Always send the number of digits specified above, e.g. if sending the
value for dd for the 5th day of the month, send
05
. - Valid examples:
-
"2016-09-23"
-
"1990-12-31"
-
- Date format: yyyy-mm-dd
-
Timestamp
- Time format: Unix/Epoch timestamp defined in UTC timezone with up to microseconds precision
- Valid examples:
-
1478713087
for Wed, 09 Nov 2016 17:38:07 GMT -
1073513982.123000
for Wed, 07 Jan 2004 22:19:42.123 GMT
-
-
Arrays
- Only send arrays of primitive values (strings, numbers, and booleans)
- Valid Examples:
-
[123, 456, 789]
-
["abc"]
-
Conversion Tracking Response
The conversion tracking response has the following format:
{ "ad_events": [<ad event objects>], "errors": [<error strings>], "attributed": true|false }
Both the ad_eventsand errorsarrays may be empty.
We expect errors will be machine readable error codes, e.g. invalid_timestamp
.
Error Codes
-
invalid_timestamp- The request did not have a valid timestamp.
-
eea_missing_or_invalid- Either request did not have the "eea" field set or it was invalid.
-
ad_user_data_missing- The "ad_user_data" request field was not set. The "ad_user_data" field is required for all in-scope DMA requests.
-
ad_user_data_invalid- The "ad_user_data" request value was invalid. The "ad_user_data" field is required for all in-scope DMA requests.
-
ad_personalization_missing_or_invalid- Either request did not have the "ad_personalization" field set or it was invalid. The "ad_personalization" field is required for all in-scope DMA requests.
Ad events are the core objects of app attribution, and will contain the following properties.
Important notes regarding response behavior dependent on user consent:
If the conversion has ads user data consent and the user has cross-use consent
within their Google user settings, Google Ads will respond with a single last
click across all of its CPSes. If the user has not consented to cross-use consent
within their Google user settings, Google Ads will respond with multiple last
clicks, on a per CPS basis.
If the conversion includes certain CPSes in the user-selected cross-use consent
but not others, Google Ads will respond with a single last click across the CPSes
granted cross-use consent, but with multiple last clicks, on a per CPS basis,
for those CPSes not granted cross-use consent.
ad_event_id
Always present
string
ad_event_id
serves as a unique identifier for ad events. It is
reused in the cross-network attribution request and should be logged/retained
for debugging purposes.
Q2owS0VRancwZHk0QlJDdXVMX2U1TQ
conversion_metric
Always present
string
The conversion metric used for attribution. We will initially support one conversion metric.
conversion
timestamp
Always present
number
The UNIX timestamp the ad event occurred, in seconds with up to microseconds precision. This value should be used for last-click attribution.
1432681913.123456
campaign_type
Always present
string
This field will identify the type of campaign that produced the ad event. The possible values are as follows.
ACI ACE ACPre Search Display Video Shopping Hotel Performance_Max Other
ACI is an abbreviation for App Campaign for Install. ACE is an abbreviation for App Campaigns for Engagement.
campaign_id
Always present
number
The numeric campaign ID of the campaign that produced the ad event. This value is guaranteed unique.
123456789
campaign_name
Always present
string
The advertiser-defined campaign name of the campaign that produced the ad event. This value is not guaranteed unique.
Occasional Gamers (Video)
ad_type
Always present
string
The type of ad that resulted in the ad event. This value can be used to distinguish between various types of inventory as follows.
App PromotionClickToDownload
AppDeepLink
AppDeepLinkContinue
Unknown
external_customer_id
Always present
number
The advertiser identifier for the advertiser that owns the campaign that produced the ad event. This value can be used to differentiate Google Ads accounts.
123456789
location
Always present
number
The location ID code for the geographical location of the ad event. Refer to the Google Ads API reference to interpret location codes.
network_type
Always present
string
This field will identify the Google Ads advertising network the ad event occurred on. The possible values are as follows.
Search Display YouTube GoogleTv cross-network
network_subtype
Will be null
when campaign_type
is ACI
or ACE
and network_type
is Display
.
string
This field will identify the “subtype” of the Google Ads advertising network the ad event occurred on. The possible values vary by primary network type.
Search
Ordinary Google SearchGoogleSearch
SearchPartners
Display
Mobile Web PublishersmGDN
Google AdMob
YouTube
YouTube Videos networkYouTubeVideos
YouTubeSearch
VideoPartners
GoogleTv
GoogleTV Videos networkGoogleTvVideos
cross-network
Performance Max cross networkcross-network
video_id
Only provided when network_type
is YouTube
and campaign_type
is not
ACI
and ACE
.
string
The YouTube video ID associated with the ad event.
dQw4w9WgXcQ
keyword
Only provided when network_type
is Search
and campaign_type
is not
ACI
and ACE
.
string
The search keyword associated with the ad event.
+food +delivery
match_type
Only provided when network_type
is Search
and campaign_type
is not
ACI
and ACE
.
string
The match type for search keywords.
Exacte
p
b
placement
Only provided when network_type
is Display
and campaign_type
is not
ACI
and ACE
.
string
The placement associated with the ad event.
mobileapp::1-343200656
ad_group_id
Only provided when campaign_type
is not Performance_Max
.
number
The numeric ID of the ad group that produced with the ad event. This value is guaranteed unique.
123456789
ad_group_name
Only provided when campaign_type
is ACI
, ACE
, or ACPRE
.
string
The advertiser-defined ad group name of the ad group that produced the ad event. This value is not guaranteed unique.
My App AdGroup
creative_id
Only provided when campaign_type
is not
ACI
, ACE
, ACPRE
, or Performance_Max
.
number
The numeric ID of the creative ad unit that produced the ad event. This value is guaranteed unique.
123456789
interaction_type
This field will always be engagement.
string
Sample Responses
An example of a conversion tracking response when the request contained errors is:
{ "ad_events": [], "errors": ["INVALID_CURRENCY_CODE"], "attributed": false }
An example of a negative conversion tracking response is:
{ "ad_events": [], "errors": [], "attributed": false }
A conversion tracking response will be returned for all conversion tracking requests.
An example of an affirmative conversion tracking response for a non-EEA user for a Universal App Campaign is:
{ "ad_events": [{ "ad_event_id": "Q2owS0VRancwZHk0QlJDdXVMX2U1TQ", "conversion_metric": "conversion", "interaction_type": "engagement", "campaign_type": "ACI", "campaign_id": 123456789, "campaign_name": "My App Campaign", "ad_type": "ClickToDownload", "external_customer_id": 123456789, "location": 21144, "network_type": "Search", "network_subtype": "GoogleSearch", "video_id": null, "keyword": null, "match_type": null, "placement": null, "ad_group_id": null, "ad_group_name": "", "creative_id": null, "timestamp": 1432681913.123456 }], "errors": [], "attributed": true, "warnings": [] }
An example of an affirmative conversion tracking response for a non-EEA user for a Search campaign is:
{ "ad_events": [{ "ad_event_id": "Q2owS0VRancwZHk0QlJDdXVMX2U1TQ", "conversion_metric": "conversion", "interaction_type": "engagement", "campaign_type": "Search", "campaign_id": 123456789, "campaign_name": "My App Campaign", "ad_type": "ClickToDownload", "external_customer_id": 123456789, "location": 21144, "network_type": "Search", "network_subtype": "GoogleSearch", "video_id": null, "keyword": "+space +birds", "match_type": "b", "placement": null, "ad_group_id": 123456789, "ad_group_name": "My App AdGroup", "creative_id": 123456789, "timestamp": 1432681913.123456 }], "errors": [], "attributed": true, "warnings": [] }
An example of an affirmative conversion tracking response for a non-EEA user for a Display campaign is:
{ "ad_events": [{ "ad_event_id": "Q2owS0VRancwZHk0QlJDdXVMX2U1TQ", "conversion_metric": "conversion", "interaction_type": "engagement", "campaign_type": "Display", "campaign_id": 123456789, "campaign_name": "My App Campaign", "ad_type": "ClickToDownload", "external_customer_id": 123456789, "location": 21144, "network_type": "Display", "network_subtype": "mGDN", "video_id": null, "keyword": null, "match_type": null, "placement": "mobile-app::2-343200656", "ad_group_id": 123456789, "ad_group_name": "My App AdGroup", "creative_id": 123456789, "timestamp": 1432681913.123456 }], "errors": [], "attributed": true, "warnings": [] }
An example of an affirmative conversion tracking response for a non-EEA user for a YouTube campaign is:
{ "ad_events": [{ "ad_event_id": "Q2owS0VRancwZHk0QlJDdXVMX2U1TQ", "conversion_metric": "conversion", "interaction_type": "engagement", "campaign_type": "Video", "campaign_id": 123456789, "campaign_name": "My App Campaign", "ad_type": "ClickToDownload", "external_customer_id": 123456789, "location": 21144, "network_type": "YouTube", "network_subtype": "YouTubeVideos", "video_id": "dQw4w9WgXcQ", "keyword": null, "match_type": null, "placement": null, "ad_group_id": 123456789, "ad_group_name": "My App AdGroup", "creative_id": 123456789, "timestamp": 1432681913.123456 }], "errors": [], "attributed": true, "warnings": [] }
An example of an attributed conversion tracking response where the conversion is attributed to both Play + Search ad interactions but 5(2)(b) + 5(2)(c) cross-use consent is denied between the Play + Search CPSs is:
{ "ad_events": [{ "ad_event_id": "Q2owS0VRancwZHk0QlJDdXVMX2U1TQ", "conversion_metric": "conversion", "interaction_type": "click", "campaign_type": "ACI", "campaign_id": 123456789, "campaign_name": "My App Campaign", "ad_type": "ClickToDownload", "external_customer_id": 123456789, "location": 21144, "network_type": "Display", "network_subtype": "", "video_id": null, "keyword": null, "match_type": null, "placement": null, "ad_group_id": null, "ad_group_name": "", "creative_id": null, "timestamp": 1432681913.123456 }, { "ad_event_id": "I8YUwWqxvOyqcwOcqBAkYZBMaOONSd", "conversion_metric": "conversion", "interaction_type": "click", "campaign_type": "ACI", "campaign_id": 123456789, "campaign_name": "My App Campaign", "ad_type": "ClickToDownload", "external_customer_id": 123456789, "location": 21144, "network_type": "Search", "network_subtype": "", "video_id": null, "keyword": null, "match_type": null, "placement": null, "ad_group_id": null, "ad_group_name": "", "creative_id": null, "timestamp": 1432681913.123456 }, ], "errors": [], "warnings": [], "attributed": true }
An example of an attributed conversion tracking response where the conversion is attributed to both Play + Search ad interactions and 5(2)(b) + 5(2)(c) cross-use consent is accepted between the Play + Search CPSs is similar to today's conversion behavior:
{ "ad_events": [{ "ad_event_id": "Q2owS0VRancwZHk0QlJDdXVMX2U1TQ", "conversion_metric": "conversion", "interaction_type": "click", "campaign_type": "ACI", "campaign_id": 123456789, "campaign_name": "My App Campaign", "ad_type": "ClickToDownload", "external_customer_id": 123456789, "location": 21144, "network_type": "Display", "network_subtype": "", "video_id": null, "keyword": null, "match_type": null, "placement": null, "ad_group_id": null, "ad_group_name": "", "creative_id": null, "timestamp": 1432681913.123456 }, ], "errors": [], "warnings": [], "attributed": true }
An example of an attributed conversion tracking response where the conversion is attributed to both Play, Search and YouTube ad interactions and 5(2)(b) + 5(2)(c) cross-use consent is accepted between the Play + Search CPSs but is denied to the YouTube CPS is:
{ "ad_events": [{ "ad_event_id": "Q2owS0VRancwZHk0QlJDdXVMX2U1TQ", "conversion_metric": "conversion", "interaction_type": "click", "campaign_type": "ACI", "campaign_id": 123456789, "campaign_name": "My App Campaign", "ad_type": "ClickToDownload", "external_customer_id": 123456789, "location": 21144, "network_type": "Display", "network_subtype": "", "video_id": null, "keyword": null, "match_type": null, "placement": null, "ad_group_id": null, "ad_group_name": "", "creative_id": null, "timestamp": 1432681913.123456 }, { "ad_event_id": "I8YUwWqxvOyqcwOcqBAkYZBMaOONSd", "conversion_metric": "conversion", "interaction_type": "click", "campaign_type": "ACI", "campaign_id": 123456789, "campaign_name": "My App Campaign", "ad_type": "ClickToDownload", "external_customer_id": 123456789, "location": 21144, "network_type": "Youtube", "network_subtype": "YouTubeVideos", "video_id": null, "keyword": null, "match_type": null, "placement": null, "ad_group_id": null, "ad_group_name": "", "creative_id": null, "timestamp": 1432681913.123456 }, ], "errors": [], "warnings": [], "attributed": true }
Cross-network Attribution Request
When Google Ads responds to a conversion tracking request affirmatively, the API consumer must notify Google Ads of its cross-network attribution decision after identifying the last click.
The cross-network attribution request is identical to the original conversion tracking request, but with a request path of:
/pagead/conversion/app/1.0/cross_network
and the addition of two required parameters:
ad_event_id
Required
Location: Query
The ad_event_id
identifier from the ad event associated with the
attribution in the prior request.
attributed
Required
Location: Query
Whether or not Google Ads received credit for the conversion by the API
consumer. Either 0
or 1
.
An example of a valid cross-network attribution request is:
POST /pagead/conversion/app/1.0/cross_network ?dev_token=Z_eErE4DkvcKjDM1OVE4c4 &link_id=31FF8D67E5BB5DD5029DCC2734C2F884 &app_event_type=custom &app_event_name=level_achieved &rdid=0F7AB11F-DA50-498E-B225-21AC1977A85D &id_type=idfa &lat=0 &app_version=1.2.4 &os_version=9.3.2 &sdk_version=1.9.5r6 ×tamp=1432681913.123456 &value=1.99 ¤cy_code=USD &ad_event_id=Q2owS0VRancwZHk0QlJDdXVMX2U1TQ &attributed=1 Host: www.googleadservices.com User-Agent: MyAnalyticsCompany/1.0.0 (iOS 10.0.2; en_US; iPhone9,1; Build/13D15; Proxy) X-Forwarded-For: 216.58.194.174 Content-Type: application/json; charset=utf-8
A valid cross-network attribution request will always receive a generic 200 response with no response body.