Conversions

A conversion in Google Ads is when a user performs some specified action after clicking an ad or viewing a Display Network ad, such as purchasing a product, installing a mobile app, or signing up for an email list.

Conversion tracking provides key insights into users' actions after viewing or clicking an ad. You can keep track of users who call, buy a product, install a mobile app, and more.

Conversion actions

To measure conversions, you set up a ConversionAction for the type of conversion action you want to track. For instance, an online purchase and a phone call require different conversion actions.

Most conversion actions also require additional steps on your part to track them. For instance, tracking conversion actions on your website requires creation of a ConversionAction with the ConversionActionType set as WEBPAGE and a code snippet called a tag that you add to the conversion page on your website.

Note that the Source related to calls in the Google Ads web interface (Phone number clicks, Calls from ads, and Calls from websites) are each mapped to a different ConversionActionType in Google Ads API:

  • Phone number clicks corresponds to CLICK_TO_CALL
  • Calls from ads corresponds to AD_CALL
  • Calls from websites corresponds to WEBSITE_CALL

Phone call conversions

Tracking phone calls from call extensions requires a ConversionAction with a type of AD_CALL. These use a Google forwarding number and specify the conversion action in the phone call extension's FeedItem. In the Google Ads web interface, this type of conversion is called Calls from ads.

A call is reported as a conversion if it lasts longer than a specified duration. The default is 60 seconds.

Website call conversions

A WEBSITE_CALL conversion action type maps to Calls from a website in the Google Ads web interface.

Unlike AD_CALL, this tracker requires event_snippet and global_site_tag to be added to your website to retrieve the dynamic Google forwarding number for call tracking on numbers listed on your website. In addition, you must set up a call extension and attach it to the campaign or ad groups whose website calls you want to track.

Website conversions

The ConversionAction encompasses several types of website conversions, distinguished within the API by the type field in TagSnippet.

The following table shows the equivalent API parameters to use for each Source in the Google Ads web interface:

Tracking Code Type Google Ads Source
WEBPAGE Website, Website (Google Analytics (GA4))
WEBPAGE_ONCLICK Website, Website (Google Analytics (GA4))
CLICK_TO_CALL Phone number clicks
--- Website (Google Analytics (UA))

Website and Phone number clicks conversions require the event_snippet, which should be placed on web pages that indicate a conversion action such as a checkout confirmation or lead submission page, and global_site_tag, which must be installed on every page of your website. You can retrieve both of these attributes with ConversionActionService.

The CLICK_TO_CALL type differs from AD_CALL type in ConversionAction.type in that it does not track actual phone calls. Instead, it tracks only clicks on a phone number from a mobile device. This is useful when you're unable to use a Google forwarding number for tracking actual phone calls.

App conversions

ConversionActionType covers both mobile app installs and in-app actions for Android. The following table shows the equivalent API parameters to use for each Source in the Google Ads web interface:

Conversion Action Type Google Ads Source
GOOGLE_PLAY_DOWNLOAD Android app install (first open)
GOOGLE_PLAY_IN_APP_PURCHASE Android in-app action

SKAdNetwork conversions

If you run iOS App campaigns and have implemented SKAdNetwork, you can access SKAdNetwork data provided to Google at the Customer and Campaign level using the following resources:

Report field Description
metrics.sk_ad_network_conversions The number of conversions reported by Apple. This metric can only be segmented by any combination of segments.sk_ad_network_conversion_value and date-related segments.
segments.sk_ad_network_conversion_value

The value of a conversion reported by Apple. This segment cannot be applied to any metric other than metrics.sk_ad_network_conversions, and can only be combined with date-related segments.

A value of 0 is returned if Apple reports a value of 0 and no value otherwise. Check the field presence to distinguish between the two cases.

You can also save a SKAdNetwork conversion value mapping for specific linked customers with iOS apps through CustomerSkAdNetworkConversionValueSchema.

Sample Python code

#!/usr/bin/env python
# Copyright 2019 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import argparse
import sys

from google.ads.googleads.client import GoogleAdsClient
from google.ads.googleads.errors import GoogleAdsException


def main(client, customer_id):
    """Adds a keyword plan, campaign, ad group, etc. to the customer account.

    Also handles errors from the API and prints them.

    Args:
        client: An initialized instance of GoogleAdsClient
        customer_id: A str of the customer_id to use in requests.
    """

    res = update_skan_cv_schema(
        client, customer_id, "my_app_id", "account_link_id"
    )
    print(res)


def update_skan_cv_schema(client, customer_id, app_id, account_link_id):
    skan_service = client.get_service(
        "CustomerSkAdNetworkConversionValueSchemaService"
    )

    req = client.get_type(
        "MutateCustomerSkAdNetworkConversionValueSchemaRequest"
    )
    operation = client.get_type(
        "CustomerSkAdNetworkConversionValueSchemaOperation"
    )
    schema_instance = client.get_type(
        "CustomerSkAdNetworkConversionValueSchema"
    )

    new_schema = operation.update
    new_schema.resource_name = (
        skan_service.customer_sk_ad_network_conversion_value_schema_path(
            "customer_id", "account_link_id"
        )
    )
    new_schema.schema.app_id = app_id
    new_schema.schema.measurement_window_hours = 48

    skan_cv_mapping = (
        schema_instance.SkAdNetworkConversionValueSchema.FineGrainedConversionValueMappings()
    )
    skan_cv_mapping.fine_grained_conversion_value = 0  # 0 - 63
    skan_cv_mapping.conversion_value_mapping.min_time_post_install_hours = 0
    skan_cv_mapping.conversion_value_mapping.max_time_post_install_hours = 48

    skan_cv_event = schema_instance.SkAdNetworkConversionValueSchema.Event()
    skan_cv_event.mapped_event_name = "TEST"
    skan_cv_event.event_revenue_value = 10

    skan_cv_mapping.conversion_value_mapping.mapped_events.append(skan_cv_event)
    new_schema.schema.fine_grained_conversion_value_mappings.append(
        skan_cv_mapping
    )

    req.operation = operation
    req.customer_id = customer_id

    res = skan_service.mutate_customer_sk_ad_network_conversion_value_schema(
        req
    )
    return res


if __name__ == "__main__":
    # GoogleAdsClient will read the google-ads.yaml configuration file in the
    # home directory if none is specified.
    googleads_client = GoogleAdsClient.load_from_storage(
        version="v14"
    )

    parser = argparse.ArgumentParser(
        description="Creates a keyword plan for specified customer."
    )
    # The following argument(s) should be provided to run the example.
    parser.add_argument(
        "-c",
        "--customer_id",
        type=str,
        required=True,
        help="The Google Ads customer ID.",
    )
    args = parser.parse_args()

    try:
        main(googleads_client, args.customer_id)
    except GoogleAdsException as ex:
        print(
            f'Request with ID "{ex.request_id}" failed with status '
            f'"{ex.error.code().name}" and includes the following errors:'
        )
        for error in ex.failure.errors:
            print(f'\tError with message "{error.message}".')
            if error.location:
                for field_path_element in error.location.field_path_elements:
                    print(f"\t\tOn field: {field_path_element.field_name}")
        sys.exit(1)
  

Offline conversions

Conversion actions can be used to upload offline click or call conversions into Google Ads by setting the conversion action type to UPLOAD_CLICKS or UPLOAD_CALLS.

Additional conversion types

There are several types of conversion actions that cannot be created using the Google Ads API, but you can still retrieve their performance metrics in reports and, in some cases, modify some of their attributes.

Conversion goals

Conversion goals help you organize your conversion actions so that you can more easily optimize toward your advertising objectives. Check out the goals guide for more information.

Conversion value rules

Conversion value rules let you define rules for adjusting the values of your conversions based on various dimensions.

Enabling conversion tracking

You can check your account's conversion tracking setup and confirm conversion tracking is enabled by issuing the following query with GoogleAdsService.searchStream:

SELECT
  customer.conversion_tracking_setting.conversion_tracking_id,
  customer.conversion_tracking_setting.conversion_tracking_status,
  customer.conversion_tracking_setting.cross_account_conversion_tracking_id,
  customer.conversion_tracking_setting.google_ads_conversion_customer
FROM customer

The conversion_tracking_status field indicates whether conversion tracking is enabled and whether the account is using cross-account conversion tracking.

NOT_CONVERSION_TRACKED

Conversion tracking is not enabled for the account. Enable conversion tracking by creating at least one ConversionAction in the account identified by google_ads_conversion_customer.

Starting with v12 of the Google Ads API, the conversion_tracking_id will be a non-zero value, even if the conversion_tracking_status is NOT_CONVERSION_TRACKED. If your application uses conversion_tracking_id to determine if conversion tracking is enabled, switch to using conversion_tracking_status instead.

CONVERSION_TRACKING_MANAGED_BY_SELF

Conversion tracking is enabled, and the account is managing its conversions instead of using cross-account conversion tracking.

CONVERSION_TRACKING_MANAGED_BY_THIS_MANAGER

Conversion tracking is enabled and the account is using cross-account conversion tracking. The account specified in the login-customer-id of the request and returned in google_ads_conversion_customer in the response manages conversions.

CONVERSION_TRACKING_MANAGED_BY_ANOTHER_MANAGER

Conversion tracking is enabled and the account is using cross-account conversion tracking. However, the account managing conversions is the google_ads_conversion_customer, not the login-customer-id in the request header.

Cross-account conversion tracking

If you're using cross-account conversion tracking, the ConversionActionService returns the following conversion actions:

  • All conversion actions defined by the manager account used by the account for cross-account conversion tracking
  • All conversion actions on which the customer has accrued stats, including system-defined actions, and actions owned by the manager even if that manager unlinks subsequently
  • All actions the customer has defined in their own account, including Analytics goals and transactions created in linked Google Analytics profiles. This includes actions not imported into Google Ads, which would have a status of HIDDEN and could only be imported using the Google Ads web interface.

You can set up and query cross-account conversion actions using the API, but you must opt in your accounts to cross-account conversion tracking from the manager account.