Кампании по продвижению мобильных приложений

В этом руководстве описывается, как выполнять настройку, а также отслеживать эффективность кампаний по продвижению мобильных приложений перечисленных ниже типов.

Универсальные кампании для приложений

Универсальные кампании для приложений позволяют рекламировать приложения для Android и iOS на таких популярных ресурсах Google, как Google Поиск, Google Play, YouTube, а также на ресурсах контекстно-медийной сети. Из этого руководства вы узнаете, как создавать такие кампании, настраивать для них таргетинг, а также получать отчеты по их эффективности.

Подготовка кампании

1. Создание бюджета

В первую очередь необходимо создать бюджет. Кампании этого типа не поддерживают общие бюджеты, поэтому переменной isExplicitlyShared нужно присвоить значение false.

Java

// Get the BudgetService.
BudgetServiceInterface budgetService =
    adWordsServices.get(session, BudgetServiceInterface.class);

// Create the campaign budget.
Budget budget = new Budget();
budget.setName("Interplanetary Cruise App Budget #" + System.currentTimeMillis());
Money budgetAmount = new Money();
budgetAmount.setMicroAmount(50000000L);
budget.setAmount(budgetAmount);
budget.setDeliveryMethod(BudgetBudgetDeliveryMethod.STANDARD);

// Universal app campaigns don't support shared budgets.
budget.setIsExplicitlyShared(false);
BudgetOperation budgetOperation = new BudgetOperation();
budgetOperation.setOperand(budget);
budgetOperation.setOperator(Operator.ADD);

// Add the budget
Budget addedBudget = budgetService.mutate(new BudgetOperation[] {budgetOperation}).getValue(0);
    

C#

// Get the BudgetService.
using (BudgetService budgetService =
    (BudgetService) user.GetService(AdWordsService.v201802.BudgetService)) {

  // Create the campaign budget.
  Budget budget = new Budget();
  budget.name = "Interplanetary Cruise App Budget #" + ExampleUtilities.GetRandomString();
  budget.deliveryMethod = BudgetBudgetDeliveryMethod.STANDARD;
  budget.amount = new Money();
  budget.amount.microAmount = 5000000;

  // Universal app campaigns don't support shared budgets.
  budget.isExplicitlyShared = false;

  BudgetOperation budgetOperation = new BudgetOperation();
  budgetOperation.@operator = Operator.ADD;
  budgetOperation.operand = budget;

  BudgetReturnValue budgetRetval = budgetService.mutate(
    new BudgetOperation[] { budgetOperation });
    

Python

budget_service = client.GetService('BudgetService', version='v201802')

# Create a budget.
budget = {
    'name': 'Interplanetary Cruise App Budget #%s' % uuid.uuid4(),
    'amount': {
        'microAmount': '50000000'
    },
    'deliveryMethod': 'STANDARD',
    'isExplicitlyShared': False
}

budget_operations = [{
    'operator': 'ADD',
    'operand': budget
}]

# Create the budget and return its ID.
budget_id = budget_service.mutate(budget_operations)['value'][0]['budgetId']
    

PHP

$budgetService = $adWordsServices->get($session, BudgetService::class);

// Create the shared budget (required).
$budget = new Budget();
$budget->setName('Interplanetary Cruise Budget #' . uniqid());
$money = new Money();
$money->setMicroAmount(50000000);
$budget->setAmount($money);
$budget->setDeliveryMethod(BudgetBudgetDeliveryMethod::STANDARD);

// Universal App campaigns don't support shared budgets.
$budget->setIsExplicitlyShared(false);
$operations = [];

// Create a budget operation.
$operation = new BudgetOperation();
$operation->setOperand($budget);
$operation->setOperator(Operator::ADD);
$operations[] = $operation;

// Create the budget on the server.
$result = $budgetService->mutate($operations);
$budget = $result->getValue()[0];

printf(
    "Budget with name '%s' and ID %d was created.\n",
    $budget->getName(),
    $budget->getBudgetId()
);

    

Perl

# Create the campaign budget.
my $budget = Google::Ads::AdWords::v201802::Budget->new({
  # Required attributes.
  name => "Interplanetary Cruise App Budget #" . uniqid(),
  amount =>
    Google::Ads::AdWords::v201802::Money->new({microAmount => 5000000}),
  deliveryMethod => "STANDARD",
  # Universal app campaigns don't support shared budgets.
  isExplicitlyShared => 0
});

my $budget_operation = Google::Ads::AdWords::v201802::BudgetOperation->new({
  operator => "ADD",
  operand  => $budget
});

# Add budget.
my $addedBudget =
  $client->BudgetService()->mutate({operations => ($budget_operation)})
  ->get_value();
printf
  "Budget with name '%s' and ID %d was created.\n",
  $addedBudget->get_name(), $addedBudget->get_budgetId()->get_value();
    

Ruby

# Create a budget.
budget = {
  :name => 'Interplanetary budget #%d' % (Time.new.to_f * 1000).to_i,
  :amount => {:micro_amount => 50000000},
  :delivery_method => 'STANDARD',
  # Universal app campaigns don't support shared budgets.
  :is_explicitly_shared => false
}
budget_operation = {:operator => 'ADD', :operand => budget}

# Add the budget.
return_budget = budget_srv.mutate([budget_operation])
budget_id = return_budget[:value].first[:budget_id]
    

Подробнее о настройке бюджетов читайте в этом руководстве.

2. Создание кампании

Затем создайте кампанию. К этому типу кампаний применяются следующие ограничения:

  1. Необходимо задать для параметра advertisingChannelType значение MULTI_CHANNEL, а для advertisingChannelSubType – UNIVERSAL_APP_CAMPAIGN.
  2. Допускается использование только стратегии назначения ставок с целевой ценой за конверсию (TARGET_CPA).
  3. Нельзя использовать многие параметры, доступные в кампаниях других типов, например networkSetting, frequencyCap и trackingUrlTemplate. Подробнее об этом читайте в полном списке параметров.
  4. В версии v201082 или более поздних при добавлении настроек кампании universalAppSetting необходимо указать объект appVendor. Значение этого объекта определяется в более ранних версиях при помощи объекта appId.

Java

// Get the CampaignService.
CampaignServiceInterface campaignService =
    adWordsServices.get(session, CampaignServiceInterface.class);

// Create the campaign.
Campaign campaign = new Campaign();
campaign.setName("Interplanetary Cruise App #" + System.currentTimeMillis());

// Recommendation: Set the campaign to PAUSED when creating it to prevent
// the ads from immediately serving. Set to ENABLED once you've added
// targeting and the ads are ready to serve.
campaign.setStatus(CampaignStatus.PAUSED);

// Set the advertising channel and subchannel types for universal app campaigns.
campaign.setAdvertisingChannelType(AdvertisingChannelType.MULTI_CHANNEL);
campaign.setAdvertisingChannelSubType(AdvertisingChannelSubType.UNIVERSAL_APP_CAMPAIGN);

// Set the campaign's bidding strategy. universal app campaigns
// only support TARGET_CPA bidding strategy.
BiddingStrategyConfiguration biddingConfig = new BiddingStrategyConfiguration();
biddingConfig.setBiddingStrategyType(BiddingStrategyType.TARGET_CPA);

// Set the target CPA to $1 / app install.
TargetCpaBiddingScheme biddingScheme = new TargetCpaBiddingScheme();
biddingScheme.setTargetCpa(new Money());
biddingScheme.getTargetCpa().setMicroAmount(1000000L);

biddingConfig.setBiddingScheme(biddingScheme);
campaign.setBiddingStrategyConfiguration(biddingConfig);

// Set the campaign's budget.
campaign.setBudget(new Budget());
campaign.getBudget().setBudgetId(createBudget(adWordsServices, session));

// Optional: Set the start date.
campaign.setStartDate(new DateTime().plusDays(1).toString("yyyyMMdd"));

// Optional: Set the end date.
campaign.setEndDate(new DateTime().plusYears(1).toString("yyyyMMdd"));
    

C#

using (CampaignService campaignService =
    (CampaignService) user.GetService(AdWordsService.v201802.CampaignService)) {

  // Create the campaign.
  Campaign campaign = new Campaign();
  campaign.name = "Interplanetary Cruise App #" + ExampleUtilities.GetRandomString();

  // Recommendation: Set the campaign to PAUSED when creating it to prevent
  // the ads from immediately serving. Set to ENABLED once you've added
  // targeting and the ads are ready to serve.
  campaign.status = CampaignStatus.PAUSED;

  // Set the advertising channel and subchannel types for universal app campaigns.
  campaign.advertisingChannelType = AdvertisingChannelType.MULTI_CHANNEL;
  campaign.advertisingChannelSubType = AdvertisingChannelSubType.UNIVERSAL_APP_CAMPAIGN;

  // Set the campaign's bidding strategy. Universal app campaigns
  // only support TARGET_CPA bidding strategy.
  BiddingStrategyConfiguration biddingConfig = new BiddingStrategyConfiguration();
  biddingConfig.biddingStrategyType = BiddingStrategyType.TARGET_CPA;

  // Set the target CPA to $1 / app install.
  TargetCpaBiddingScheme biddingScheme = new TargetCpaBiddingScheme();
  biddingScheme.targetCpa = new Money();
  biddingScheme.targetCpa.microAmount = 1000000;

  biddingConfig.biddingScheme = biddingScheme;
  campaign.biddingStrategyConfiguration = biddingConfig;

  // Set the campaign's budget.
  campaign.budget = new Budget();
  campaign.budget.budgetId = CreateBudget(user).budgetId;

  // Optional: Set the start date.
  campaign.startDate = DateTime.Now.AddDays(1).ToString("yyyyMMdd");

  // Optional: Set the end date.
  campaign.endDate = DateTime.Now.AddYears(1).ToString("yyyyMMdd");
    

Python

# Initialize appropriate services.
campaign_service = client.GetService('CampaignService', version='v201802')

budget_id = CreateBudget(client)

# Create the Universal App campaign.
universal_app_campaign = {
    'name': 'Interplanetary Cruise App #%s' % uuid.uuid4(),
    # Recommendation: Set the campaign to PAUSED when creating it to stop the
    # ads from immediately serving. Set to ENABLED once you've added targeting
    # and the ads are ready to serve.
    'status': 'PAUSED',
    'advertisingChannelType': 'MULTI_CHANNEL',
    'advertisingChannelSubType': 'UNIVERSAL_APP_CAMPAIGN',
    # Set the campaign's bidding strategy. Universal app campaigns only
    # support TARGET_CPA bidding strategy.
    'biddingStrategyConfiguration': {
        # Set the target CPA to $1 / app install.
        'biddingScheme': {
            'xsi_type': 'TargetCpaBiddingScheme',
            'targetCpa': {
                'microAmount': '1000000'
            }
        },
        'biddingStrategyType': 'TARGET_CPA'
    },
    # Note that only the budgetId is required
    'budget': {
        'budgetId': budget_id
    },
    # Optional fields
    'startDate': (datetime.datetime.now() +
                  datetime.timedelta(1)).strftime('%Y%m%d'),
    'endDate': (datetime.datetime.now() +
                datetime.timedelta(365)).strftime('%Y%m%d'),
}
    

PHP

$campaignService = $adWordsServices->get($session, CampaignService::class);

// Create campaign with some properties set.
$campaign = new Campaign();
$campaign->setName('Interplanetary Cruise #' . uniqid());
// Recommendation: Set the campaign to PAUSED when creating it to stop
// the ads from immediately serving. Set to ENABLED once you've added
// targeting and the ads are ready to serve.
$campaign->setStatus(CampaignStatus::PAUSED);

// Set the advertising channel and subchannel types for Universal app
// campaigns.
$campaign->setAdvertisingChannelType(AdvertisingChannelType::MULTI_CHANNEL);
$campaign->setAdvertisingChannelSubType(
    AdvertisingChannelSubType::UNIVERSAL_APP_CAMPAIGN
);

// Set the campaign's bidding strategy. Universal App campaigns
// only support TARGET_CPA bidding strategy.
$biddingStrategyConfiguration = new BiddingStrategyConfiguration();
$biddingStrategyConfiguration->setBiddingStrategyType(
    BiddingStrategyType::TARGET_CPA
);

// Set the target CPA to $1 / app install.
$biddingScheme = new TargetCpaBiddingScheme();
$money = new Money();
$money->setMicroAmount(1000000);
$biddingScheme->setTargetCpa($money);

$biddingStrategyConfiguration->setBiddingScheme($biddingScheme);
$campaign->setBiddingStrategyConfiguration($biddingStrategyConfiguration);

// Set shared budget (required).
$campaign->setBudget(new Budget());
$campaign->getBudget()->setBudgetId(
    self::createBudget($adWordsServices, $session)
);

// Optional: Set the start date.
$campaign->setStartDate(date('Ymd', strtotime('+1 day')));

// Optional: Set the end date.
$campaign->setEndDate(date('Ymd', strtotime('+1 year')));
    

Perl

my (undef, undef, undef, $mday, $mon, $year) = localtime(time + 60 * 60 * 24);
my $start_date = sprintf("%d%02d%02d", ($year + 1900), ($mon + 1), $mday);
(undef, undef, undef, $mday, $mon, $year) =
  localtime(time + 60 * 60 * 24 * 365);
my $end_date = sprintf("%d%02d%02d", ($year + 1900), ($mon + 1), $mday);

my $budgetId = create_budget($client);

my $campaign = Google::Ads::AdWords::v201802::Campaign->new({
    name => "Interplanetary Cruise App #" . uniqid(),
    # Bidding strategy (required).
    # Set the campaign's bidding strategy. Universal app campaigns
    # only support TARGET_CPA bidding strategy.
    biddingStrategyConfiguration =>
      Google::Ads::AdWords::v201802::BiddingStrategyConfiguration->new({
        biddingStrategyType => "TARGET_CPA",
        # Set the target CPA to $1 / app install.
        biddingScheme =>
          Google::Ads::AdWords::v201802::TargetCpaBiddingScheme->new({
            targetCpa => Google::Ads::AdWords::v201802::Money->new(
              {microAmount => 1000000})})}
      ),
    # Budget (required) - note only the budgetId is required.
    budget =>
      Google::Ads::AdWords::v201802::Budget->new({budgetId => $budgetId}),
    # Advertising channel type (required).
    # Set the advertising channel and subchannel types for universal
    # app campaigns.
    advertisingChannelType    => "MULTI_CHANNEL",
    advertisingChannelSubType => "UNIVERSAL_APP_CAMPAIGN",
    settings                  => [$universalAppSetting, $geoSetting],
    # Additional properties (non-required).
    startDate => $start_date,
    endDate   => $end_date,
    # Recommendation: Set the campaign to PAUSED when creating it to stop
    # the ads from immediately serving. Set to ENABLED once you've added
    # targeting and the ads are ready to serve.
    status    => "PAUSED"
  });
    

Ruby

campaign_srv = adwords.service(:CampaignService, API_VERSION)
budget_srv = adwords.service(:BudgetService, API_VERSION)

# Create a budget.
budget = {
  :name => 'Interplanetary budget #%d' % (Time.new.to_f * 1000).to_i,
  :amount => {:micro_amount => 50000000},
  :delivery_method => 'STANDARD',
  # Universal app campaigns don't support shared budgets.
  :is_explicitly_shared => false
}
budget_operation = {:operator => 'ADD', :operand => budget}

# Add the budget.
return_budget = budget_srv.mutate([budget_operation])
budget_id = return_budget[:value].first[:budget_id]

# Create campaigns.
universal_app_campaign = {
  :name => "Interplanetary Cruise #%d" % (Time.new.to_f * 1000).to_i,
  # Recommendation: Set the campaign to PAUSED when creating it to stop the
  # ads from immediately serving. Set it to ENABLED once you've added
  # targeting and the ads are ready to serve.
  :status => 'PAUSED',
  # Set the advertising channel and subchannel types for universal app
  # campaigns.
  :advertising_channel_type => 'MULTI_CHANNEL',
  :advertising_channel_sub_type => 'UNIVERSAL_APP_CAMPAIGN',
  # Set the campaign's bidding strategy. Universal app campaigns only support
  # the TARGET_CPA bidding strategy.
  :bidding_strategy_configuration => {
    :bidding_scheme => {
      :xsi_type => 'TargetCpaBiddingScheme',
      :target_cpa => {
        :micro_amount => 1000000
      }
    }
  },
  # Budget (required) - note only the budget ID is required.
  :budget => {:budget_id => budget_id},
  # Optional fields:
  :start_date =>
      DateTime.parse((Date.today + 1).to_s).strftime('%Y%m%d'),
  :end_date =>
      DateTime.parse((Date.today + 365).to_s).strftime('%Y%m%d')
}
    

3. Настройка объявлений

В отличие от кампаний других типов, в универсальных кампаниях для приложений рекламодатели не могут сами создавать объявления. Объявления автоматически генерируются в разных форматах для разных сетей на основе информации, добавленной в магазин приложений, доступных вариантов текста, а также объектов, которые вы указываете в настройках кампании. Ниже приведен пример кода, задающего условия применения таких объектов.

Java

// Set the campaign's assets and ad text ideas. These values will be used to
// generate ads.
UniversalAppCampaignSetting universalAppSetting = new UniversalAppCampaignSetting();
universalAppSetting.setAppId("com.labpixies.colordrips");
universalAppSetting.setAppVendor(MobileApplicationVendor.VENDOR_GOOGLE_MARKET);
universalAppSetting.setDescription1("A cool puzzle game");
universalAppSetting.setDescription2("Remove connected blocks");
universalAppSetting.setDescription3("3 difficulty levels");
universalAppSetting.setDescription4("4 colorful fun skins");

// Optional: You can set up to 20 image assets for your campaign.
// See UploadImage.java for an example on how to upload images.
//
// universalAppSetting.setImageMediaIds(new long[] { INSERT_IMAGE_MEDIA_ID_HERE });
    

C#

// Set the campaign's assets and ad text ideas. These values will be used to
// generate ads.
UniversalAppCampaignSetting universalAppSetting = new UniversalAppCampaignSetting();
universalAppSetting.appId = "com.labpixies.colordrips";
universalAppSetting.appVendor = MobileApplicationVendor.VENDOR_GOOGLE_MARKET;
universalAppSetting.description1 = "A cool puzzle game";
universalAppSetting.description2 = "Remove connected blocks";
universalAppSetting.description3 = "3 difficulty levels";
universalAppSetting.description4 = "4 colorful fun skins";

// Optional: You can set up to 20 image assets for your campaign.
// See UploadImage.cs for an example on how to upload images.
//
// universalAppSetting.imageMediaIds = new long[] { INSERT_IMAGE_MEDIA_ID_HERE };
    

Python

universal_app_campaign['settings'] = [
    # Set the campaign's assets and ad text ideas. These values will
    # be used to generate ads.
    {
        'xsi_type': 'UniversalAppCampaignSetting',
        'appId': 'com.labpixies.colordrips',
        'appVendor': 'VENDOR_GOOGLE_MARKET',
        'description1': 'A cool puzzle game',
        'description2': 'Remove connected blocks',
        'description3': '3 difficulty levels',
        'description4': '4 colorful fun skins',
        # Optional: You can set up to 20 image assets for your campaign.
        # See upload_image.py for an example on how to upload images.
        #
        # 'imageMediaIds': [INSERT_IMAGE_MEDIA_ID(s)_HERE]
    }
]
    

PHP

// Set the campaign's assets and ad text ideas. These values will be used to
// generate ads.
$universalAppSetting = new UniversalAppCampaignSetting();
$universalAppSetting->setAppId('com.labpixies.colordrips');
$universalAppSetting->setAppVendor(
    MobileApplicationVendor::VENDOR_GOOGLE_MARKET
);
$universalAppSetting->setDescription1('A cool puzzle game');
$universalAppSetting->setDescription2('Remove connected blocks');
$universalAppSetting->setDescription3('3 difficulty levels');
$universalAppSetting->setDescription4('4 colorful fun skins');

// Optional: You can set up to 20 image assets for your campaign.
// See UploadImage.php for an example on how to upload images.
//
// $universalAppSetting->imageMediaIds = [INSERT_IMAGE_MEDIA_ID_HERE];
    

Perl

# Set the campaign's assets and ad text ideas. These values will be used to
# generate ads.
my $universalAppSetting =
  Google::Ads::AdWords::v201802::UniversalAppCampaignSetting->new({
    appId        => "com.labpixies.colordrips",
    appVendor    => "VENDOR_GOOGLE_MARKET",
    description1 => "A cool puzzle game",
    description2 => "Remove connected blocks",
    description3 => "3 difficulty levels",
    description4 => "4 colorful fun skins"
  });

# Optional: You can set up to 20 image assets for your campaign.
# See upload_image.pl for an example on how to upload images.
# universalAppSetting->set_imageMediaIds([INSERT_IMAGE_MEDIA_ID_HERE]);
    

Ruby

universal_app_setting = {
  # Set the campaign's assets and ad text ideas. These values will be used to
  # generate ads.
  :xsi_type => 'UniversalAppCampaignSetting',
  :app_id => 'com.labpixies.colordrips',
  :app_vendor => 'VENDOR_GOOGLE_MARKET',
  :description1 => 'A cool puzzle game',
  :description2 => 'Remove connected blocks',
  :description3 => '3 difficulty levels',
  :description4 => '4 colorful fun skins'
  # Optional: You can set up to 20 image assets for your campaign. See
  # upload_image.rb for an example on how to upload images.
  #
  # :image_media_ids => [INSERT_IMGAGE_MEDIA_ID(s)_HERE]
}
    

4. Оптимизация кампании

You can optimize your campaign using two settings:

  • Для назначения ставок используйте параметр universalAppBiddingStrategyGoalType, с помощью которого можно выбрать тип цели.

  • Если в качестве типа цели выбран OPTIMIZE_FOR_INSTALL_CONVERSION_VOLUME, задайте также условия оптимизации для разных типов конверсий в приложении с помощью поля selectiveOptimization. Получить список всех тегов отслеживания конверсий можно с помощью службы ConversionTrackerService.

Java

// Optimize this campaign for getting new users for your app.
universalAppSetting.setUniversalAppBiddingStrategyGoalType(
    UniversalAppBiddingStrategyGoalType.OPTIMIZE_FOR_INSTALL_CONVERSION_VOLUME);

// If you select the OPTIMIZE_FOR_IN_APP_CONVERSION_VOLUME goal type, then also specify
// your in-app conversion types so AdWords can focus your campaign on people who are
// most likely to complete the corresponding in-app actions.
// Conversion type IDs can be retrieved using ConversionTrackerService.get.
//
// campaign.selectiveOptimization = new SelectiveOptimization();
// campaign.selectiveOptimization.conversionTypeIds =
//    new long[] { INSERT_CONVERSION_TYPE_ID_1_HERE, INSERT_CONVERSION_TYPE_ID_2_HERE };

// Optional: Set the campaign settings for Advanced location options.
GeoTargetTypeSetting geoSetting = new GeoTargetTypeSetting();
geoSetting.setPositiveGeoTargetType(
    GeoTargetTypeSettingPositiveGeoTargetType.LOCATION_OF_PRESENCE);
geoSetting.setNegativeGeoTargetType(GeoTargetTypeSettingNegativeGeoTargetType.DONT_CARE);

campaign.setSettings(new Setting[] {universalAppSetting, geoSetting});
    

C#

// Optimize this campaign for getting new users for your app.
universalAppSetting.universalAppBiddingStrategyGoalType =
    UniversalAppBiddingStrategyGoalType.OPTIMIZE_FOR_INSTALL_CONVERSION_VOLUME;

// Optional: If you select the OPTIMIZE_FOR_IN_APP_CONVERSION_VOLUME goal
// type, then also specify your in-app conversion types so AdWords can
// focus your campaign on people who are most likely to complete the
// corresponding in-app actions.
// Conversion type IDs can be retrieved using ConversionTrackerService.get.
//
// campaign.selectiveOptimization = new SelectiveOptimization();
// campaign.selectiveOptimization.conversionTypeIds =
//    new long[] { INSERT_CONVERSION_TYPE_ID_1_HERE, INSERT_CONVERSION_TYPE_ID_2_HERE };

// Optional: Set the campaign settings for Advanced location options.
GeoTargetTypeSetting geoSetting = new GeoTargetTypeSetting();
geoSetting.positiveGeoTargetType =
    GeoTargetTypeSettingPositiveGeoTargetType.LOCATION_OF_PRESENCE;
geoSetting.negativeGeoTargetType =
    GeoTargetTypeSettingNegativeGeoTargetType.DONT_CARE;

campaign.settings = new Setting[] { universalAppSetting, geoSetting };
    

Python

# Optimize this campaign for getting new users for your app.
universal_app_campaign_setting = universal_app_campaign['settings'][0]
universal_app_campaign_setting['universalAppBiddingStrategyGoalType'] = (
    'OPTIMIZE_FOR_INSTALL_CONVERSION_VOLUME')

# Optional: If you select the OPTIMIZE_FOR_IN_APP_CONVERSION_VOLUME goal type,
# then also specify your in-app conversion types so AdWords can focus your
# campaign on people who are most likely to complete the corresponding in-app
# actions.
#
# Conversions type IDs can be retrieved using ConversionTrackerService.get.
# universal_app_campaign['selectiveOptimization'] = {
#     'conversionTypeIds': [INSERT_CONVERSION_TYPE_ID(s)_HERE]
# }

# Optional: Set the campaign settings for Advanced location options.
universal_app_campaign['settings'].append({
    'xsi_type': 'GeoTargetTypeSetting',
    'positiveGeoTargetType': 'DONT_CARE',
    'negativeGeoTargetType': 'DONT_CARE'
})
    

PHP

// Optimize this campaign for getting new users for your app.
$universalAppSetting->setUniversalAppBiddingStrategyGoalType(
    UniversalAppBiddingStrategyGoalType
    ::OPTIMIZE_FOR_INSTALL_CONVERSION_VOLUME
);

// If you select bidding strategy goal type as
// OPTIMIZE_FOR_IN_APP_CONVERSION_VOLUME, then you may specify a set of
// conversion types for in-app actions to optimize the campaign towards.
// Conversion type IDs can be retrieved using ConversionTrackerService.get.
//
// $campaign->selectiveOptimization = new SelectiveOptimization();
// $campaign->selectiveOptimization->conversionTypeIds = [
//     INSERT_CONVERSION_TYPE_ID_1_HERE,
//     INSERT_CONVERSION_TYPE_ID_2_HERE
// ];

// Optional: Set the campaign settings for Advanced location options.
$geoTargetTypeSetting = new GeoTargetTypeSetting();
$geoTargetTypeSetting->setNegativeGeoTargetType(
    GeoTargetTypeSettingNegativeGeoTargetType::LOCATION_OF_PRESENCE
);
$campaign->setSettings([$universalAppSetting, $geoTargetTypeSetting]);
    

Perl

# Optimize this campaign for getting new users for your app.
$universalAppSetting->set_universalAppBiddingStrategyGoalType(
  "OPTIMIZE_FOR_INSTALL_CONVERSION_VOLUME");

# If you select the OPTIMIZE_FOR_IN_APP_CONVERSION_VOLUME goal type, then also
# specify your in-app conversion types so AdWords can focus your campaign on
# people who are most likely to complete the corresponding in-app actions.
# Conversion type IDs can be retrieved using ConversionTrackerService.get.

# my $selectiveOptimization =
# Google::Ads::AdWords::v201802::SelectiveOptimization->new({
#  conversionTypeIds =>
#    [INSERT_CONVERSION_TYPE_ID_1_HERE, INSERT_CONVERSION_TYPE_ID_2_HERE]
# });
# $campaign->set_selectiveOptimization($selectiveOptimization);

# Optional: Set the campaign settings for advanced location options.
my $geoSetting = Google::Ads::AdWords::v201802::GeoTargetTypeSetting->new({
  positiveGeoTargetType => "LOCATION_OF_PRESENCE",
  negativeGeoTargetType => "DONT_CARE"
});
    

Ruby

# Optimize this campaign for getting new users for your app.
universal_app_setting[:universal_app_bidding_strategy_goal_type] =
    'OPTIMIZE_FOR_INSTALL_CONVERSION_VOLUME'

# Optional: If you select OPTIMIZE_FOR_IN_APP_CONVERSION_VOLUME goal type,
# then also specify your in-app conversion types so AdWords can focus your
# campaign on people who are most likely to complete the corresponding in-app
# actions.
# Conversion type IDs can be retrieved using ConversionTrackerService.get.
#
# universal_app_campaign[:selective_optimization] = {
#   :conversion_type_ids => [INSERT_CONVERSION_TYPE_ID(s)_HERE]
# }

# Optional: Set the campaign settings for Advanced location options.
geo_setting = {
  :xsi_type => 'GeoTargetTypeSetting',
  :positive_geo_target_type => 'DONT_CARE',
  :negative_geo_target_type => 'DONT_CARE'
}

universal_app_campaign[:settings] = [
  universal_app_setting,
  geo_setting
]
    

Завершив оптимизацию, переходите к созданию кампании с помощью метода CampaignService.mutate.

Java

// Create the operation.
CampaignOperation operation = new CampaignOperation();
operation.setOperand(campaign);
operation.setOperator(Operator.ADD);

CampaignOperation[] operations = new CampaignOperation[] {operation};

// Add the campaign.
CampaignReturnValue result = campaignService.mutate(operations);

// Display the results.
for (Campaign newCampaign : result.getValue()) {
  System.out.printf(
      "Universal app campaign with name '%s' and ID %d was added.%n",
      newCampaign.getName(), newCampaign.getId());

  // Optional: Set the campaign's location and language targeting. No other targeting
  // criteria can be used for universal app campaigns.
  setCampaignTargetingCriteria(newCampaign, adWordsServices, session);
}
    

C#

  // Create the operation.
  CampaignOperation operation = new CampaignOperation();
  operation.@operator = Operator.ADD;
  operation.operand = campaign;

  try {
    // Add the campaign.
    CampaignReturnValue retVal = campaignService.mutate(
        new CampaignOperation[] { operation });

    // Display the results.
    if (retVal != null && retVal.value != null && retVal.value.Length > 0) {
      foreach (Campaign newCampaign in retVal.value) {
        Console.WriteLine("Universal app campaign with name = '{0}' and id = '{1}' " +
            "was added.", newCampaign.name, newCampaign.id);

        // Optional: Set the campaign's location and language targeting. No other targeting
        // criteria can be used for universal app campaigns.
        SetCampaignTargetingCriteria(user, newCampaign);
      }
    } else {
      Console.WriteLine("No universal app campaigns were added.");
    }
  } catch (Exception e) {
    throw new System.ApplicationException("Failed to add universal app campaigns.", e);
  }
}
    

Python

# Construct operations and add campaigns.
operations = [{
    'operator': 'ADD',
    'operand': universal_app_campaign
}]

campaigns = campaign_service.mutate(operations)['value']
    

PHP

// Create a campaign operation and add it to the operations list.
$operations = [];
$operation = new CampaignOperation();
$operation->setOperand($campaign);
$operation->setOperator(Operator::ADD);
$operations[] = $operation;

// Create the campaign on the server and print out some information for the
// campaign.
$result = $campaignService->mutate($operations);
foreach ($result->getValue() as $campaign) {
    printf(
        "Universal App Campaign with name '%s' and ID %d was added.\n",
        $campaign->getName(),
        $campaign->getId()
    );
    // Optional: Set the campaign's location and language targeting. No other
    // targeting criteria can be used for Universal App campaigns.
    self::setCampaignTargetingCriteria(
        $campaign->getId(),
        $adWordsServices,
        $session
    );
}
    

Perl

# Create operation.
my $campaign_operation =
  Google::Ads::AdWords::v201802::CampaignOperation->new({
    operator => "ADD",
    operand  => $campaign
  });

# Add campaigns.
my $result =
  $client->CampaignService()->mutate({operations => [$campaign_operation]});

# Display campaigns.
foreach my $new_campaign (@{$result->get_value()}) {
  printf "Universal app campaign with name \"%s\" and ID %s was added.\n",
    $new_campaign->get_name(), $new_campaign->get_id();
  # Optional: Set the campaign's location and language targeting. No other
  # targeting criteria can be used for universal app campaigns.
  set_campaign_targeting_criteria($client, $new_campaign->get_id());
}
    

Ruby

  # Construct the operation and add the campaign.
  operations = [{
    :operator => 'ADD',
    :operand => universal_app_campaign
  }]

  campaigns = campaign_srv.mutate(operations)[:value]

  if campaigns
    campaigns.each do |campaign|
      puts "Universal app campaign with name '%s' and ID %d was added." %
          [campaign[:name], campaign[:id]]
      set_campaign_targeting_criteria(adwords, campaign)
    end
  else
    raise new StandardError, 'No universal app campaigns were added.'
  end
end

def set_campaign_targeting_criteria(adwords, campaign)
  campaign_criterion_service =
      adwords.service(:CampaignCriterionService, API_VERSION)

  criteria = [
    {
      :xsi_type => 'Location',
      :id => 21137 # California
    },
    {
      :xsi_type => 'Location',
      :id => 2484 # Mexico
    },
    {
      :xsi_type => 'Language',
      :id => 1000 # English
    },
    {
      :xsi_type => 'Language',
      :id => 1003 # Spanish
    }
  ]

  operations = criteria.map do |criterion|
    {
      :operator => 'ADD',
      :operand => {
        :campaign_id => campaign[:id],
        :criterion => criterion
      }
    }
  end

  response = campaign_criterion_service.mutate(operations)

  if response and response[:value]
    # Display the added campaign targets.
    response[:value].each do |criterion|
      puts 'Campaign criteria of type "%s" and id %d was added.' % [
          criterion[:criterion][:criterion_type],
          criterion[:criterion][:id]
      ]
    end
  end
end

if __FILE__ == $0
  API_VERSION = :v201802

  begin
    add_universal_app_campaigns()

  # Authorization error.
  rescue AdsCommon::Errors::OAuth2VerificationRequired => e
    puts "Authorization credentials are not valid. Edit adwords_api.yml for " +
        "OAuth2 client ID and secret and run misc/setup_oauth2.rb example " +
        "to retrieve and store OAuth2 tokens."
    puts "See this wiki page for more details:\n\n  " +
        'https://github.com/googleads/google-api-ads-ruby/wiki/OAuth2'

  # HTTP errors.
  rescue AdsCommon::Errors::HttpError => e
    puts "HTTP Error: %s" % e

  # API errors.
  rescue AdwordsApi::Errors::ApiException => e
    puts "Message: %s" % e.message
    puts 'Errors:'
    e.errors.each_with_index do |error, index|
      puts "\tError [%d]:" % (index + 1)
      error.each do |field, value|
        puts "\t\t%s: %s" % [field, value]
      end
    end
  end
end

    

Загрузка медиа

В универсальной кампании для приложений можно определить до двадцати графических объектов, на основе которых AdWords будет создавать объявления. Для загрузки изображений используйте метод MediaService.upload.

Java

MediaServiceInterface mediaService =
    adWordsServices.get(session, MediaServiceInterface.class);

// Create image.
Image image = new Image();
image.setData(
    com.google.api.ads.common.lib.utils.Media.getMediaDataFromUrl("https://goo.gl/3b9Wfh"));
image.setType(MediaMediaType.IMAGE);

Media[] media = new Media[] {image};

// Upload image.
Media[] result = mediaService.upload(media);
    

C#

using (MediaService mediaService = (MediaService) user.GetService(
    AdWordsService.v201802.MediaService)) {

  // Create the image.
  Image image = new Image();
  image.data = MediaUtilities.GetAssetDataFromUrl("https://goo.gl/3b9Wfh");
  image.type = MediaMediaType.IMAGE;

  try {
    // Upload the image.
    Media[] result = mediaService.upload(new Media[] { image });
    

Python

media_service = client.GetService('MediaService', version='v201802')

with open(image_filename, 'rb') as image_handle:
  image_data = image_handle.read().decode('utf-8')

# Construct media and upload image.
media = [{
    'xsi_type': 'Image',
    'data': image_data,
    'type': 'IMAGE'
}]
media = media_service.upload(media)[0]
    

PHP

$mediaService = $adWordsServices->get($session, MediaService::class);

// Create an image and add it to the images list.
$image = new Image();
$image->setData(file_get_contents('http://goo.gl/HJM3L'));
$image->setType(MediaMediaType::IMAGE);
$images = [$image];

// Upload the image to the server.
$result = $mediaService->upload($images);
    

Perl

# Create image.
my $image_data = Google::Ads::Common::MediaUtils::get_base64_data_from_url(
  "https://goo.gl/3b9Wfh");
my $image = Google::Ads::AdWords::v201802::Image->new({
    data => $image_data,
    type => "IMAGE"
  }
);

# Upload image.
$image = $client->MediaService()->upload({media => [$image]});
    

Ruby

media_srv = adwords.service(:MediaService, API_VERSION)

# This utility method retrieves the contents of a URL using all of the config
# options provided to the Api object.
image_url = 'https://goo.gl/3b9Wfh'
image_data = AdsCommon::Http.get(image_url, adwords.config)
base64_image_data = Base64.encode64(image_data)

# Create image.
image = {
  # The 'xsi_type' field allows you to specify the xsi:type of the object
  # being created. It's only necessary when you must provide an explicit
  # type that the client library can't infer.
  :xsi_type => 'Image',
  :data => base64_image_data,
  :type => 'IMAGE'
}

# Upload image.
response = media_srv.upload([image])
    

Работа с ListOperations

Для определения ListOperations и других полей списка в универсальных кампаниях для приложений используется метод imageMediaIds. ListOperations. Этот метод, описывающий поведение элементов в списке, всегда определяется в объекте API вместе со списком (например, imageMediaIdsOps описывает, как обновлять список imageMediaIds). Количество операторов в ListOperations должно равняться количеству элементов списка (поскольку каждая операция определяется парой из оператора и соответствующего ему элемента списка).

Для примера допустим, что список imageMediaIds содержит исходные значения [1000, 1001, 1002]. В таблице ниже описан метод mutate, вызываемый для обновления элементов списка imageMediaIds с помощью операторов из списка ListOperations.

Индекс элемента Идентификатор изображения Операция ListOperation Значение
0 1003 PUT Идентификатор 1003 будет добавлен, поскольку его не было в исходном списке.
1 1002 REMOVE Идентификатор 1002 будет удален, поскольку он был в исходном списке.

После вызова описанного выше метода mutate список imageMediaIds будет содержать значения [1000, 1001, 1003].

Таргетинг

В универсальных кампаниях для приложений поддерживаются только два типа таргетинга: языковой и географический на уровне кампании. По умолчанию таргетинг кампании настроен на любые регионы и языки. Ниже приведен фрагмент кода для настройки таргетинга на Калифорнию (США) и Мексику, а также на пользователей, говорящих на английском и испанском.

Java

// Get the CampaignCriterionService.
CampaignCriterionServiceInterface campaignCriterionService =
    adWordsServices.get(session, CampaignCriterionServiceInterface.class);

// Create locations. The IDs can be found in the documentation or
// retrieved with the LocationCriterionService.
Location california = new Location();
california.setId(21137L);

Location mexico = new Location();
mexico.setId(2484L);

// Create languages. The IDs can be found in the documentation or
// retrieved with the ConstantDataService.
Language english = new Language();
english.setId(1000L);

Language spanish = new Language();
spanish.setId(1003L);

List<Criterion> criteria = new ArrayList<>(Arrays.asList(california, mexico, english, spanish));

// Create operations to add each of the criteria above.
List<CampaignCriterionOperation> operations = new ArrayList<>();
for (Criterion criterion : criteria) {
  CampaignCriterionOperation operation = new CampaignCriterionOperation();

  CampaignCriterion campaignCriterion = new CampaignCriterion();
  campaignCriterion.setCampaignId(campaign.getId());
  campaignCriterion.setCriterion(criterion);
  operation.setOperand(campaignCriterion);

  operation.setOperator(Operator.ADD);

  operations.add(operation);
}

// Set the campaign targets.
CampaignCriterionReturnValue returnValue =
    campaignCriterionService.mutate(
        operations.toArray(new CampaignCriterionOperation[operations.size()]));

if (returnValue != null && returnValue.getValue() != null) {
  // Display added campaign targets.
  for (CampaignCriterion campaignCriterion : returnValue.getValue()) {
    System.out.printf(
        "Campaign criteria of type '%s' and ID %d was added.%n",
        campaignCriterion.getCriterion().getCriterionType(),
        campaignCriterion.getCriterion().getId());
  }
}
    

C#

using (CampaignCriterionService campaignCriterionService =
    (CampaignCriterionService) user.GetService(
        AdWordsService.v201802.CampaignCriterionService)) {

  // Create locations. The IDs can be found in the documentation or
  // retrieved with the LocationCriterionService.
  Location california = new Location() {
    id = 21137L
  };

  Location mexico = new Location() {
    id = 2484L
  };

  // Create languages. The IDs can be found in the documentation or
  // retrieved with the ConstantDataService.
  Language english = new Language() {
    id = 1000L
  };

  Language spanish = new Language() {
    id = 1003L
  };

  List<Criterion> criteria = new List<Criterion>() {
  california, mexico, english, spanish };

  // Create operations to add each of the criteria above.
  List<CampaignCriterionOperation> operations = new List<CampaignCriterionOperation>();
  foreach (Criterion criterion in criteria) {
    CampaignCriterionOperation operation = new CampaignCriterionOperation() {
      operand = new CampaignCriterion() {
        campaignId = campaign.id,
        criterion = criterion
      },
      @operator = Operator.ADD
    };

    operations.Add(operation);
  }

  // Set the campaign targets.
  CampaignCriterionReturnValue retVal = campaignCriterionService.mutate(
      operations.ToArray());

  if (retVal != null && retVal.value != null) {
    // Display the added campaign targets.
    foreach (CampaignCriterion criterion in retVal.value) {
      Console.WriteLine("Campaign criteria of type '{0}' and id '{1}' was added.",
                        criterion.criterion.CriterionType, criterion.criterion.id);
    }
  }
}
    

Python

campaign_criterion_service = client.GetService('CampaignCriterionService')

# Create locations. The IDs can be found in the documentation or retrieved
# with the LocationCriterionService.
criteria = [
    {
        'xsi_type': 'Location',
        'id': 21137  # California
    },
    {
        'xsi_type': 'Location',
        'id': 2484  # Mexico
    },
    {
        'xsi_type': 'Language',
        'id': 1000  # English
    },
    {
        'xsi_type': 'Language',
        'id': 1003  # Spanish
    }
]

operations = [{
    'operator': 'ADD',
    'operand': {
        'campaignId': campaign['id'],
        'criterion': criterion
    }
} for criterion in criteria]

response = campaign_criterion_service.mutate(operations)

if response and 'value' in response:
  # Display the added campaign targets.
  for criterion in response['value']:
    print ('Campaign criteria of type "%s" and id "%s" was added.'
           % (criterion['criterion']['type'],
              criterion['criterion']['id']))
    

PHP

$campaignCriterionService = $adWordsServices->get($session, CampaignCriterionService::class);

$campaignCriteria = [];
// Create locations. The IDs can be found in the documentation or retrieved
// with the LocationCriterionService.
$california = new Location();
$california->setId(21137);
$campaignCriteria[] = new CampaignCriterion($campaignId, null, $california);

$mexico = new Location();
$mexico->setId(2484);
$campaignCriteria[] = new CampaignCriterion($campaignId, null, $mexico);

// Create languages. The IDs can be found in the documentation or retrieved
// with the ConstantDataService.
$english = new Language();
$english->setId(1000);
$campaignCriteria[] = new CampaignCriterion($campaignId, null, $english);

$spanish = new Language();
$spanish->setId(1003);
$campaignCriteria[] = new CampaignCriterion($campaignId, null, $spanish);

// Create operations to add each of the criteria above.
$operations = [];
foreach ($campaignCriteria as $campaignCriterion) {
    $operation = new CampaignCriterionOperation();
    $operation->setOperand($campaignCriterion);
    $operation->setOperator(Operator::ADD);
    $operations[] = $operation;
}

// Set the campaign targets.
$result = $campaignCriterionService->mutate($operations);

// Display added campaign targets.
foreach ($result->getValue() as $campaignCriterion) {
    printf(
        "Campaign criterion of type '%s' and ID %d was added.\n",
        $campaignCriterion->getCriterion()->getType(),
        $campaignCriterion->getCriterion()->getId()
    );
}
    

Perl

# Create locations. The IDs can be found in the documentation or retrieved
# with the LocationCriterionService.
my $california = Google::Ads::AdWords::v201802::Location->new({id => 21137});
push @criteria, $california;
my $mexico = Google::Ads::AdWords::v201802::Location->new({id => 2484});
push @criteria, $mexico;

# Create languages. The IDs can be found in the documentation or retrieved
# with the ConstantDataService.
my $english = Google::Ads::AdWords::v201802::Language->new({id => 1000});
push @criteria, $english;
my $spanish = Google::Ads::AdWords::v201802::Language->new({id => 1003});
push @criteria, $spanish;

# Create operations.
my @operations = ();
foreach my $criterion (@criteria) {
  my $operation =
    Google::Ads::AdWords::v201802::CampaignCriterionOperation->new({
      operator => "ADD",
      operand  => Google::Ads::AdWords::v201802::CampaignCriterion->new({
          campaignId => $campaign_id,
          criterion  => $criterion
        })});
  push @operations, $operation;
}

# Set campaign criteria.
my $result =
  $client->CampaignCriterionService()->mutate({operations => \@operations});

# Display campaign criteria.
if ($result->get_value()) {
  foreach my $campaign_criterion (@{$result->get_value()}) {
    printf "Campaign criterion of type '%s' and ID %s was added.\n",
      $campaign_criterion->get_criterion()->get_type(),
      $campaign_criterion->get_criterion()->get_id();
  }
}
    

Ruby

campaign_criterion_service =
    adwords.service(:CampaignCriterionService, API_VERSION)

criteria = [
  {
    :xsi_type => 'Location',
    :id => 21137 # California
  },
  {
    :xsi_type => 'Location',
    :id => 2484 # Mexico
  },
  {
    :xsi_type => 'Language',
    :id => 1000 # English
  },
  {
    :xsi_type => 'Language',
    :id => 1003 # Spanish
  }
]

operations = criteria.map do |criterion|
  {
    :operator => 'ADD',
    :operand => {
      :campaign_id => campaign[:id],
      :criterion => criterion
    }
  }
end

response = campaign_criterion_service.mutate(operations)

if response and response[:value]
  # Display the added campaign targets.
  response[:value].each do |criterion|
    puts 'Campaign criteria of type "%s" and id %d was added.' % [
        criterion[:criterion][:criterion_type],
        criterion[:criterion][:id]
    ]
  end
end
    

Отчеты

Статистика по универсальным кампаниям для приложений доступна в отчете по эффективности кампаний. Данные в этом отчете можно фильтровать по параметрам advertisingChannelType и advertisingChannelSubType, как показано в примере ниже.

string query = "Select CampaignId, CampaignName, Clicks,
   Impressions, Cost from CAMPAIGN_PERFORMANCE_REPORT where
   AdvertisingChannelType = MULTI_CHANNEL and
   AdvertisingChannelSubType = UNIVERSAL_APP_CAMPAIGN during
   LAST_7_DAYS";

string fileName = ExampleUtilities.GetHomeDir() + Path.DirectorySeparatorChar +
    "CampaignPerformanceReport.gz";

ReportUtilities utilities = new ReportUtilities(user, "v201802", query,
    DownloadFormat.GZIPPED_CSV.ToString());
utilities.GetResponse().Save(fileName);

Также статистическую информацию можно извлечь из следующих отчетов:

Примеры кода

Примеры полного кода для добавления универсальной кампании для приложений можно найти в клиентских библиотеках.

Кампании типа "Взаимодействие с мобильным приложением"

Кампании типа Взаимодействие с мобильным приложением позволяют обратиться к людям, установившим ваше приложение, и побудить их более активно им пользоваться.

Из этого раздела вы узнаете, как создать кампанию, ориентированную на взаимодействие с мобильным приложением, настроить в ней объявления и отслеживать конверсии с помощью AdWords API.

Примеры кода в этом руководстве написаны на C#. Ссылки на примеры на других языках программирования приведены в таблице ниже.

Создание бюджета кампании

В первую очередь необходимо установить бюджет. Вы можете создать новый Budget с помощью службы BudgetService или же применить уже существующий общий бюджет. Ниже представлен пример кода для создания дневного бюджета в 5 долл. США в кампании с равномерным показом объявлений.

// Get the BudgetService.
AdWordsUser user = new AdWordsUser();
BudgetService budgetService =
    (BudgetService) user.GetService(AdWordsService.v201802.BudgetService);

// Create the campaign budget.
Budget budget = new Budget();
budget.name = "My App Budget 1";
budget.deliveryMethod = BudgetBudgetDeliveryMethod.STANDARD;
budget.amount = new Money();
budget.amount.microAmount = 500000;

BudgetOperation budgetOperation = new BudgetOperation();
budgetOperation.@operator = Operator.ADD;
budgetOperation.operand = budget;

BudgetReturnValue budgetRetval = budgetService.mutate(
    new BudgetOperation[] {budgetOperation});
budget = budgetRetval.value[0];

Создание кампании

Когда бюджет будет готов, можно переходить к созданию кампании типа "Взаимодействие с мобильным приложением" с помощью службы CampaignService.

Однако перед этим необходимо выбрать рекламную сеть и стратегию назначения ставок.

Выбор рекламной сети

Выбирая рекламную сеть, вы определяете аудиторию для своей кампании.

  • Объявления в поисковой сети показываются в результатах веб-поиска на смартфонах и планшетах, пользователи которых уже установили ваше приложение.
  • Объявления в контекстно-медийной сети показываются внутри разных приложений тем пользователям, которые уже установили ваше приложение.

Независимо от выбранной сети, цель такой рекламы состоит в повышении интереса уже существующих пользователей к вашему приложению.

Выбор стратегии назначения ставок

Назначать ставки можно разными способами. В объекте BiddingStrategyConfiguration, применяемом на уровне Campaign, поле biddingStrategyType определяет тип назначения ставок, а biddingScheme содержит метаданные о стратегии.

Назначение ставок в поисковой сети

Ниже перечислены стратегии назначения ставок, поддерживаемые в поисковой сети.

Описательное название Тип стратегии назначения ставок API Стратегия назначения ставок API
Максимальное количество кликов (по умолчанию) TARGET_SPEND TargetSpendBiddingScheme
Целевая цена за конверсию TARGET_CPA TargetCpaBiddingScheme
Целевая рентабельность инвестиций в рекламу TARGET_ROAS TargetRoasBiddingScheme
Целевое положение на странице поиска PAGE_ONE_PROMOTED PageOnePromotedBiddingScheme
Целевой процент выигрышей TARGET_OUTRANK_SHARE TargetOutrankShareBiddingScheme
Назначение цены за клик вручную MANUAL_CPC ManualCpcBiddingScheme
Назначение ставок в контекстно-медийной сети

Ниже перечислены стратегии назначения ставок, поддерживаемые в контекстно-медийной сети.

Описательное название Тип стратегии назначения ставок API Стратегия назначения ставок API
Плата за клики (по умолчанию) – использовать максимальные цены за клик MANUAL_CPC ManualCpcBiddingScheme
Плата за установки – использовать цену за конверсию TARGET_CPA TargetCpaBiddingScheme

Создание кампании в поисковой сети

Чтобы создать кампанию для поисковой сети, измените поля advertisingChannelType и networkSetting кампании, как показано ниже.

Параметр NetworkSetting определяет сети, на которые будет настроен таргетинг. Если переменным targetGoogleSearch и targetSearchNetwork присвоить значение true, кампания будет проводиться только в поисковой сети.

campaign.advertisingChannelType = AdvertisingChannelType.SEARCH;

campaign.networkSetting = new NetworkSetting();
campaign.networkSetting.targetGoogleSearch = true;
campaign.networkSetting.targetSearchNetwork = true;
campaign.networkSetting.targetContentNetwork = false;
campaign.networkSetting.targetPartnerSearchNetwork = false;

В веб-интерфейсе AdWords приложение нужно указать всего лишь один раз (в разделе Настройки на уровне кампании), чтобы не делать это при создании каждого объявления. Если вы работаете с API, то идентификатор приложения нужно указывать для каждого объявления, ориентированного на взаимодействие с приложением.

Создание кампании для контекстно-медийной сети

Вариант оптимизации по количеству конверсий становится доступным для кампании в КМС только после того, как кампания принесет определенное количество конверсий.

В следующем примере показано, как создать кампанию типа "Взаимодействие с мобильным приложением" для контекстно-медийной сети. Обратите внимание, что параметру advertisingChannelSubType присвоено значение DISPLAY_MOBILE_APP.

// Get the CampaignService.
AdWordsUser user = new AdWordsUser();
CampaignService campaignService =
     (CampaignService) user.GetService(AdWordsService.v201802.CampaignService);

Campaign campaign = new Campaign();
campaign.advertisingChannelType = AdvertisingChannelType.DISPLAY;
campaign.advertisingChannelSubType =
    AdvertisingChannelSubType.DISPLAY_MOBILE_APP;
// Recommendation: Set the campaign to PAUSED when creating it to stop
// the ads from immediately serving. Set to ENABLED once you've added
// targeting and the ads are ready to serve.
campaign.status = CampaignStatus.PAUSED;

campaign.name = "My App Engagement campaign 1";

BiddingStrategyConfiguration biddingConfig = new BiddingStrategyConfiguration();
biddingConfig.biddingStrategyType = BiddingStrategyType.TARGET_CPA;

// Specify a BiddingScheme with a target CPA.
TargetCpaBiddingScheme biddingScheme =  new TargetCpaBiddingScheme();
biddingScheme.targetCpa = new Money();
biddingScheme.targetCpa.microAmount = 1000000;
biddingConfig.biddingScheme = biddingScheme;
campaign.biddingStrategyConfiguration = biddingConfig;

// Use the ID of the Budget created in the previous step. You can also
// reuse an existing budget.
campaign.budget = new Budget();
campaign.budget.budgetId = budget.budgetId;

// Optional: Set the campaign ad serving optimization status.
campaign.adServingOptimizationStatus =
    AdServingOptimizationStatus.CONVERSION_OPTIMIZE;

// Create the operation.
CampaignOperation operation = new CampaignOperation();
operation.@operator = Operator.ADD;
operation.operand = campaign;

// Add the campaign.
CampaignReturnValue retVal = campaignService.mutate(new CampaignOperation[] {operation});

Campaign newCampaign = retVal.value[0];

Создание группы объявлений

Для создания объекта AdGroup используйте службу AdGroupService.

Сначала создайте группу объявлений:

// Get the AdGroupService.
AdWordsUser user = new AdWordsUser();
AdGroupService adGroupService =
    (AdGroupService) user.GetService(AdWordsService.v201802.AdGroupService);

// Create the ad group.
AdGroup adGroup = new AdGroup();
adGroup.name = "My App Engagement adgroup 1";
adGroup.status = AdGroupStatus.ENABLED;
adGroup.campaignId = campaign.id;

Затем задайте ставки. Параметр biddingStrategyConfiguration группы объявлений определяет, сколько вы готовы платить за каждый клик или конверсию. BiddingStrategyConfiguration. Для этого используется стратегия назначения ставок, выбранная на уровне кампании.

// Set the ad group bids.
BiddingStrategyConfiguration biddingConfig = new BiddingStrategyConfiguration();

CpaBid cpaBid = new CpaBid();
cpaBid.bid = new Money();
cpaBid.bid.microAmount = 10000000;

biddingConfig.bids = new Bids[] {cpaBid};

adGroup.biddingStrategyConfiguration = biddingConfig;

Ниже приведено несколько примеров ограничения настроек таргетинга на уровне группы объявлений в контекстно-медийной сети.

// Optional: Set targeting restrictions.
// These settings only affect serving for the Display Network.
TargetingSetting targetingSetting = new TargetingSetting();

TargetingSettingDetail placementDetail = new TargetingSettingDetail();
placementDetail.criterionTypeGroup = CriterionTypeGroup.PLACEMENT;
placementDetail.targetAll = true;

targetingSetting.details = new TargetingSettingDetail[] {
    placementDetail};

adGroup.settings = new Setting[] {targetingSetting};

// Optional: Set the bidding group. This allows you to set absolute bids on
// this dimension. These settings only affect serving for the Display Network.
adGroup.contentBidCriterionTypeGroup =
CriterionTypeGroup.USER_INTEREST_AND_LIST;

// Create the operation.
AdGroupOperation operation = new AdGroupOperation();
operation.@operator = Operator.ADD;
operation.operand = adGroup;

// Create the ad group.
AdGroupReturnValue retVal = adGroupService.mutate(new AdGroupOperation[]
{adGroup});
AdGroup newAdGroup = retVal.value[0];

AdWords может показывать объявления, ориентированные на установку мобильного приложения, не только в приложениях, но и на мобильных сайтах. Это позволяет добиваться более широкого охвата рекламы при заданной целевой цене за установку. Ниже показано, как включить показ на мобильных сайтах в параметре optimizerSetting.

ExplorerAutoOptimizerSetting optimizerSettings = new ExplorerAutoOptimizerSetting();
optimizerSetting.optin = true;

adGroup.settings = new Setting[] {optimizerSetting};

Обратите внимание, что вам нужно добавить в группу объявлений хотя бы один критерий таргетинга на мобильные устройства, чтобы эта функция работала.

Создание объявлений

Перейдем к созданию объявлений, ориентированных на взаимодействие с приложением. Чтобы такие объявления видели лишь те пользователи, у которых установлено ваше приложение, необходимо правильно настроить таргетинг. Нажав на такое объявление, пользователь переходит на контент приложения, установленного на его устройстве.

  • Объявления в поисковой сети применяются для перенаправления пользователей в раздел приложения, который больше всего соответствует их поисковым запросам в Google. Обратите внимание, что продвижение приложений iOS в поисковой сети в настоящее время не поддерживается.
  • Объявления в контекстно-медийной сети обычно включают призыв выполнить определенное действие в приложении (зарегистрироваться, купить товар, забронировать авиабилет и т. п.). Такие объявления могут ссылаться на определенный контент приложения или просто открывать приложение на том месте, где пользователь закрыл его в последний раз.

В качестве конечных URL в объявлениях, ориентированных на взаимодействие с приложением, необходимо указывать ссылки на контент – они не генерируются автоматически при создании приложения. Для кампаний типа "Взаимодействие с мобильным приложением" в поисковой сети система автоматически создает URI приложения на основе предоставленных вами ссылок. Подробнее о создании ссылок на контент читайте в следующих руководствах:

Ссылка на раздел приложения должна быть представлена в конечном URL следующим образом:

android-app://{package_id}/{scheme}/{rest_of_url}

или

ios-app://{app_id}/{scheme}/{rest_of_url}

Например, вот как будет выглядеть ссылка на раздел demogame://loadlevel?level=mars приложения com.example.demogame в URL объявления:

android-app://com.example.demogame/demogame/loadlevel?level=mars

Подробнее о форматах ссылок на разделы приложений можно узнать из следующих руководств:

Следующий пример показывает, как создать объявление, ориентированное на взаимодействие с приложением, используя службу AdGroupAdService. Для кампаний типа "Взаимодействие с мобильным приложением" в поисковой сети используется шаблон 453, а для кампаний типа "Установки мобильного приложения" в контекстно-медийной сети – шаблон 445 (для текстовых объявлений) или 455 (для графических).

AdWordsUser user = new AdWordsUser();
AdGroupAdService adGroupAdService =
    (AdGroupAdService) user.GetService(AdWordsService.v201802.AdGroupAdService);
    // Create the template ad.
TemplateAd appEngagementAd = new TemplateAd();

appEngagementAd.displayUrl = "play.google.com";

appEngagementAd.name = "Ad for demo game";
appEngagementAd.templateId = 445;

// Define the ad's URL. You can refer to
// https://developers.google.com/app-indexing/webmasters/server
// for the right formatting to use on Android.
// Refer to https://developers.google.com/app-indexing/ios/app
// for the right formatting to use on iOS.
// Only one URL is allowed in the finalAppUrls array.
appEngagementAd.finalAppUrls = new string[] {
    "android-app://com.example.demogame/demogame/loadlevel?level=mars" };

// Create the template elements for the ad. You can refer to
// https://developers.google.com/adwords/api/docs/appendix/templateads
// for the list of available template fields.
TemplateElementField headline = new TemplateElementField();
headline.name = "promoHeadline";
headline.fieldText = "New levels are available";
headline.type = TemplateElementFieldType.TEXT;

TemplateElementField description = new TemplateElementField();
description.name = "promoDescription";
description.fieldText = "Race against players online";
description.type = TemplateElementFieldType.TEXT;

TemplateElementField appId = new TemplateElementField();
appId.name = "appId";
appId.fieldText = "com.example.demogame";
appId.type = TemplateElementFieldType.TEXT;

TemplateElementField appStore = new TemplateElementField();
appStore.name = "appStore";
appStore.fieldText = "2";
appStore.type = TemplateElementFieldType.ENUM;

TemplateElementField callToActionOpen = new TemplateElementField();
callToActionOpen.name = "callToActionOpen";
callToActionOpen.fieldText = "Play Now";
callToActionOpen.type = TemplateElementFieldType.TEXT;

TemplateElementField layout = new TemplateElementField();
layout.name = "layout";
layout.fieldText = "dark";
layout.type = TemplateElementFieldType.ENUM;

TemplateElement adData = new TemplateElement();
adData.uniqueName = "adData";
adData.fields = new TemplateElementField[] {headline, description, appId,
    appStore, callToActionInstall, callToActionOpen, layout};

appEngagementAd.dimensions = new Dimensions() {
    width = 320,
    height = 480
};

appEngagementAd.templateElements = new TemplateElement[] {adData};

// Finally, we get to tie the ad to the AdGroup!
// An AdGroupAd is a container that ties an ad to an
// AdGroup in the AdWords API.
AdGroupAd appEngagementAdAppAdGroupAd = new AdGroupAd();
appEngagementAdAdGroupAd.adGroupId = adGroupId;
appEngagementAdAppAdGroupAd.ad = appEngagementAd;

 // Create the operation.
 AdGroupAdOperation operation = new AdGroupAdOperation();
 operation.@operator = Operator.ADD;
 operation.operand = appEngagementAdAppAdGroupAd;

// Send the command to create the ad.
// The command returns the successfully created ad.
AdGroupAdReturnValue retval = adGroupAdService.mutate(
    new AdGroupAdOperation[] {operation});
AdGroupAd newAd = retval.value[0];

С помощью AdWords API также можно создавать графические объявления, ориентированные на взаимодействие с приложением, и объявления для повторного привлечения пользователей. Подробнее о полях, которые нужно для этого задать, читайте на этой странице.

Создание списков пользователей для таргетинга в КМС

Объявления из кампании типа "Взаимодействие с мобильным приложением" для КМС должны показываться только тем, у кого установлено ваше приложение. Такое ограничение задается с помощью списков аудитории. Чтобы пользователи, установившие приложение, автоматически добавлялись в этот список, свяжите свои аккаунты Google Play и AdWords. При этом система сама создаст список всех пользователей приложения. Вы также можете составлять в AdWords более сложные списки, используя службу AdwordsUserListService. Затем настройте таргетинг групп объявлений на созданные списки.

Таргетинг объявлений

Определите, кому вы будете показывать свою рекламу, добавив к объявлениям критерии таргетинга.

Таргетинг в поисковой сети (необязательно)

В качестве критерия таргетинга в поисковой сети можно применять ключевые слова, по которым пользователи ищут в Google функции, доступные в вашем приложении.

Чтобы создать критерий таргетинга для группы объявлений, используйте службу AdGroupCriterionService. В следующем примере показано, как добавить mars race event в качестве ключевого слова и применить конечный URL для перехода на соответствующий раздел в приложении.

AdWordsUser user = new AdWordsUser();
AdGroupCriterionService adGroupCriterionService =
    (AdGroupCriterionService) user.GetService(
        AdWordsService.v201802.AdGroupCriterionService);

// Create the keyword.
Keyword keyword = new Keyword();
keyword.text = "mars race event";
keyword.matchType = KeywordMatchType.BROAD;

// Create the biddable ad group criterion.
BiddableAdGroupCriterion keywordCriterion = new BiddableAdGroupCriterion();
keywordCriterion.adGroupId = adGroupId;
keywordCriterion.criterion = keyword;

// Optional: Set the keyword final url.
keywordCriterion.finalAppUrls = new string[] {
    "android-app://com.example.demogame/loadevent/mars/megarace" };

// Create the operations.
AdGroupCriterionOperation operation = new AdGroupCriterionOperation();
operation.@operator = Operator.ADD;
operation.operand = keywordCriterion;

// Create the keywords.
AdGroupCriterionReturnValue criteriaRetVal = adGroupCriterionService.mutate(
    new AdGroupCriterionOperation[] {operation});

Таргетинг в контекстно-медийной сети (обязательно)

Объявления в контекстно-медийной должны показываться только тем, у кого установлено ваше приложение. Для этого нужно настроить таргетинг на списки пользователей с помощью службы AdGroupCriterionService, выбрав тип критерия CriterionUserList.

Выбор целевой аудитории

Создайте список ремаркетинга для существующих пользователей приложения и укажите его в качестве критерия таргетинга. Объявления, ориентированные на взаимодействие с приложением, должны быть адресованы тем, у кого оно уже установлено.

Следующий пример показывает, как получить список пользователей, который вы создали в аккаунте AdWords. Если вы связали свои аккаунты Google Play и AdWords, то список уже был создан автоматически. Вам остается только настроить на него таргетинг. Если нет, выполните эти инструкции.

Ниже показано, как получить существующий список пользователей по его названию.

AdWordsUser user = new AdWordsUser();
AdwordsUserListService userListService =
    (AdwordsUserListService)
         user.GetService(AdWordsService.v201802.AdwordsUserListService);

Selector selector = new Selector() {
    fields = new string[] { "Id", "Name", "ListType"},
    predicates = new Predicate[] {
        new Predicate() {
            field = "Name",
            @operator = PredicateOperator.EQUALS,
            values = new string[] {"All users of Demo App (Google Play)"}
        }
    }
};

UserListPage page = userListService.get(selector);
UserList myUserList = page.values[0];

Изменить настройки или задать специальные ставки можно в экземпляре UserList.

Настройка специальных ставок

По умолчанию с критериями таргетинга используются ставки, заданные на уровне группы объявлений. Однако вы можете устанавливать специальные ставки на уровне критерия, используя собственную логику.

Специальные ставки для контекстно-медийной сети

Чтобы задать специальные ставки на уровне критерия для кампании в контекстно-медийной сети, необходимо предварительно включить специальные ставки на уровне группы объявлений и задать параметр, к которому такие ставки будут применяться.

В приведенном ниже примере выбран тип критериев PLACEMENT. Это означает, что специальные ставки будут использоваться для разных Placement.

// Get the AdGroupService.
AdWordsUser user = new AdWordsUser();
AdGroupService adGroupService = (AdGroupService) user.GetService(
    AdWordsService.v201802.AdGroupService);

// Create the ad group.
AdGroup adGroup = new AdGroup();

// Optional: Set the bidding group. This allows you to set absolute bids on
// this dimension. This setting only affects serving for the Display Network.
adGroup.contentBidCriterionTypeGroup = CriterionTypeGroup.PLACEMENT;
adGroup.id = adGroupId;

// Create the operation.
AdGroupOperation operation = new AdGroupOperation();
operation.@operator = Operator.SET;
operation.operand = adGroup;

// Update the ad group.
AdGroupReturnValue adGroupRetVal = adGroupService.mutate(
   new AdGroupOperation[] {operation});

Обновить ставки для критериев можно с помощью службы AdGroupCriterionService. Ниже показано, как задать для места размещения ставку в 6 долл. США.

// Get the AdGroupCriterionService.
AdGroupCriterionService adGroupCriterionService =
    (AdGroupCriterionService) user.GetService(
         AdWordsService.v201802.AdGroupCriterionService);

// Since we are not updating any placement-specific fields, it is enough to
// create a criterion object. The placementId, in this case,
// is a pre-existing Placement targeting a website.
Criterion criterion = new Criterion();
criterion.id = placementId;

// Create ad group criterion.
BiddableAdGroupCriterion biddableAdGroupCriterion =
    new BiddableAdGroupCriterion();
biddableAdGroupCriterion.adGroupId = adGroupId;
biddableAdGroupCriterion.criterion = criterion;

// Create the bids.
BiddingStrategyConfiguration biddingConfig =
     new BiddingStrategyConfiguration();
CpaBid cpcBid = new CpaBid();
cpaBid.bid = new Money();
cpaBid.bid.microAmount = 6000000;
biddingConfig.bids = new Bids[] {cpaBid};

biddableAdGroupCriterion.biddingStrategyConfiguration = biddingConfig;

// Create the operation.
AdGroupCriterionOperation operation = new AdGroupCriterionOperation();
operation.@operator = Operator.SET;
operation.operand = biddableAdGroupCriterion;

// Update the placement.
AdGroupCriterionReturnValue agcRetVal = adGroupCriterionService.mutate(
    new AdGroupCriterionOperation[] {operation});

Отслеживание эффективности кампании

Настроив кампанию, вы наверняка захотите отслеживать ее эффективность. AdWords API поддерживает несколько типов отчетов, позволяющих делать это.

Ниже показано, как создать отчет по эффективности кампаний.

string query = "SELECT CampaignId, Conversions, Cost, Impressions from
CAMPAIGN_PERFORMANCE_REPORT DURING LAST_7_DAYS";

string filePath = ExampleUtilities.GetHomeDir() + Path.DirectorySeparatorChar
    + "CampaignPerformanceReport.gz";

ReportUtilities utilities = new ReportUtilities(user, "v201802", query,
    DownloadFormat.GZIPPED_CSV.ToString());
utilities.GetResponse().Save(fileName);

Чтобы понять, как пользователи взаимодействуют с вашим приложением, настройте отслеживание конверсий. Инструкции по интеграции SDK отслеживания конверсий можно найти здесь.

Примеры кода

Оставить отзыв о...

Текущей странице
Нужна помощь? Обратитесь в службу поддержки.