Торговые кампании

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

Из этой статьи вы узнаете, как настраивать торговые кампании и управлять ими через AdWords API.

Установление связи между аккаунтами Merchant Center и AdWords

Сначала необходимо связать аккаунт AdWords с аккаунтом Google Merchant Center. Для этого:

  1. Отправьте приглашение из своего аккаунта Merchant Center в аккаунт AdWords.
  2. Примите приглашение в аккаунте AdWords.

Отправка приглашения из аккаунта Merchant Center

Вы можете отправить приглашение через интерфейс Merchant Center либо обновить adwordsLinks своего adwordsLinks с помощью Content API for Shopping.

Управление приглашениями в аккаунте AdWords

Вы можете использовать методы getServiceLinks и mutateServiceLinks службы , чтобы получать, принимать и отклонять приглашения на установление связи между вашим аккаунтом AdWords и другими сервисами, в том числе Merchant Center.

Чтобы получить все ссылки на свой аккаунт, достаточно просто вызвать метод getServiceLinks с предикатом для serviceType = MERCHANT_CENTER:

Java

// Get the CustomerService.
CustomerServiceInterface customerService =
    adWordsServices.get(session, CustomerServiceInterface.class);

// Create a selector that filters by service type.
Selector selector =
    new SelectorBuilder()
        .fields("ServiceType")
        .equals("ServiceType", ServiceType.MERCHANT_CENTER.getValue())
        .build();

// Get the service links.
ServiceLink[] serviceLinks = customerService.getServiceLinks(selector);

// Display the results.
if (serviceLinks != null) {
  for (ServiceLink serviceLink : serviceLinks) {
    System.out.printf(
        "Found service link with service link ID %d, type %s, name '%s', and status %s.%n",
        serviceLink.getServiceLinkId(),
        serviceLink.getServiceType(),
        serviceLink.getName(),
        serviceLink.getLinkStatus());
  }
} else {
  System.out.println("No service links found.");
}

CSharp

// Get the CustomerService.
CustomerService customerService =
    (CustomerService) user.GetService(AdWordsService.v201802.CustomerService);

// Create a selector that filters by service type.
Selector selector = new Selector() {
  fields = new string[] { ServiceLink.Fields.ServiceType },
  predicates = new Predicate[] {
    Predicate.Equals(ServiceLink.Fields.ServiceType, ServiceType.MERCHANT_CENTER.ToString())
  }
};

// Get the service links.
ServiceLink[] serviceLinks = customerService.getServiceLinks(selector);

// Display the results.
if (serviceLinks != null) {
  foreach (ServiceLink serviceLink in serviceLinks) {
    Console.WriteLine("Found service link with service link ID {0}, type {1}, name " +
        "'{2}', and status {3}.", serviceLink.serviceLinkId, serviceLink.serviceType,
        serviceLink.name, serviceLink.linkStatus);
  }
} else {
  Console.WriteLine("No service links found.");
}

Python

def main(client):
  # Initialize appropriate service.
  customer_service = client.GetService('CustomerService',
                                       version='v201802')

  selector = {
      'fields': ['ServiceType'],
      'predicates': [
          {
              'field': 'ServiceType',
              'operator': 'EQUALS',
              'values': ['MERCHANT_CENTER']
          }
      ]
  }

  service_links = customer_service.getServiceLinks(selector)

  # Display results.
  if service_links:
    for service_link in service_links:
      print ('Service link with service link ID \'%s\', type \'%s\', '
             'name \'%s\', and status \'%s\' was found.' %
             (service_link['serviceLinkId'],
              service_link['serviceType'],
              service_link['name'],
              service_link['linkStatus']))
  else:
    print 'No service links were found.'

if __name__ == '__main__':
  # Initialize client object.
  adwords_client = adwords.AdWordsClient.LoadFromStorage()
  main(adwords_client)

PHP

$customerService =
    $adWordsServices->get($session, CustomerService::class);

// Create a selector to select all service links.
$selector = new Selector();
$selector->setFields(['ServiceType']);
$selector->setPredicates(
    [
        new Predicate(
            'ServiceType',
            PredicateOperator::EQUALS,
            [ServiceType::MERCHANT_CENTER]
        )
    ]
);

// Get the service links on the server.
$serviceLinks = $customerService->getServiceLinks($selector);

// Print out some information about service links.
if ($serviceLinks !== null) {
    foreach ($serviceLinks as $serviceLink) {
        printf(
            "Found service link with service link ID %d, type %s, name '%s',"
            . " and status %s.\n",
            $serviceLink->getServiceLinkId(),
            $serviceLink->getServiceType(),
            $serviceLink->getName(),
            $serviceLink->getLinkStatus()
        );
    }
} else {
    print "No service links found.\n";
}

Perl

my $client = shift;

# Create a selector that filters by service type.
my $paging = Google::Ads::AdWords::v201802::Paging->new({
  startIndex    => 0,
  numberResults => PAGE_SIZE
});
my $selector = Google::Ads::AdWords::v201802::Selector->new({
    fields     => ["ServiceType"],
    predicates => [
      Google::Ads::AdWords::v201802::Predicate->new({
          field    => "ServiceType",
          operator => "EQUALS",
          values   => ["MERCHANT_CENTER"]})
    ],
    paging => $paging
  });

# Get the service links.
my $service_links =
  $client->CustomerService->getServiceLinks({selector => $selector});

# Display the results.
if ($service_links) {
  foreach my $service_link ($service_links) {
    printf(
      "Found service link with service link ID %d," .
        " type %s, name '%s', and status %s.\n",
      $service_link->get_serviceLinkId(), $service_link->get_serviceType(),
      $service_link->get_name(),          $service_link->get_linkStatus());

  }
} else {
  printf("No service links found.\n");
}

Ruby

# Get the CustomerService.
customer_srv = adwords.service(:CustomerService, API_VERSION)

# Create a selector that filters by service type.
selector = {
  :fields => ['ServiceType'],
  :predicates => [{
    :field => 'ServiceType',
    :operator => 'EQUALS',
    :values => ['MERCHANT_CENTER']
  }]
}

# Get the service links.
service_links = customer_srv.get_service_links(selector)

# Display the results.
if service_links.kind_of?(Array)
  service_links.each do |service_link|
    puts ("Found service link with service link ID %d, type %s, name '%s'," +
        " and status %s.") % [
          service_link[:service_link_id],
          service_link[:service_type],
          service_link[:name],
          service_link[:link_status]
        ]
  end
else
  puts "No service links found."
end

Чтобы принять приглашение, вызовите mutateServiceLinks и передайте операцию SET, изменяющую значение поля linkStatus с PENDING на ACTIVE. Убедитесь, что вы задали значения полей serviceType и serviceLinkId в операнде.

Java

// Get the CustomerService.
CustomerServiceInterface customerService =
    adWordsServices.get(session, CustomerServiceInterface.class);

// Create the operation to set the status to ACTIVE.
ServiceLinkOperation op = new ServiceLinkOperation();
op.setOperator(Operator.SET);
ServiceLink serviceLink = new ServiceLink();
serviceLink.setServiceLinkId(serviceLinkId);
serviceLink.setServiceType(ServiceType.MERCHANT_CENTER);
serviceLink.setLinkStatus(ServiceLinkLinkStatus.ACTIVE);
op.setOperand(serviceLink);

// Update the service link.
ServiceLink[] mutatedServiceLinks =
    customerService.mutateServiceLinks(new ServiceLinkOperation[] {op});

// Display the results.
for (ServiceLink mutatedServiceLink : mutatedServiceLinks) {
  System.out.printf(
      "Service link with service link ID %d, type '%s' updated to status: %s.%n",
      mutatedServiceLink.getServiceLinkId(),
      mutatedServiceLink.getServiceType(),
      mutatedServiceLink.getLinkStatus());
}

CSharp

using (CustomerService customerService = (CustomerService) user.GetService(
    AdWordsService.v201802.CustomerService)) {

  // Create the operation to set the status to ACTIVE.
  ServiceLinkOperation op = new ServiceLinkOperation();
  op.@operator = Operator.SET;
  ServiceLink serviceLink = new ServiceLink();
  serviceLink.serviceLinkId = serviceLinkId;
  serviceLink.serviceType = ServiceType.MERCHANT_CENTER;
  serviceLink.linkStatus = ServiceLinkLinkStatus.ACTIVE;
  op.operand = serviceLink;

  try {
    // Update the service link.
    ServiceLink[] mutatedServiceLinks =
        customerService.mutateServiceLinks(new ServiceLinkOperation[] { op });

    // Display the results.
    foreach (ServiceLink mutatedServiceLink in mutatedServiceLinks) {
      Console.WriteLine("Service link with service link ID {0}, type '{1}' updated to " +
          "status: {2}.", mutatedServiceLink.serviceLinkId, mutatedServiceLink.serviceType,
          mutatedServiceLink.linkStatus);
    }

Python

def main(client, service_link_id):
  # Initialize appropriate service.
  customer_service = client.GetService(
      'CustomerService', version='v201802')

  # Create the operation to set the status to ACTIVE.
  operations = [{
      'operator': 'SET',
      'operand': {
          'serviceLinkId': service_link_id,
          'serviceType': 'MERCHANT_CENTER',
          'linkStatus': 'ACTIVE',
      }
  }]

  # Update the service link.
  mutated_service_links = customer_service.mutateServiceLinks(operations)

  # Display results.
  for mutated_service_link in mutated_service_links:
    print ('Service link with service link ID "%s", type "%s" was updated '
           'to status: "%s".' % (mutated_service_link['serviceLinkId'],
                                 mutated_service_link['serviceType'],
                                 mutated_service_link['linkStatus']))

PHP

$customerService = $adWordsServices->get($session, CustomerService::class);

// Create service link.
$serviceLink = new ServiceLink();
$serviceLink->setServiceLinkId($serviceLinkId);
$serviceLink->setServiceType(ServiceType::MERCHANT_CENTER);
$serviceLink->setLinkStatus(ServiceLinkLinkStatus::ACTIVE);

// Create a service link operation and add it to the list.
$operations = [];
$operation = new ServiceLinkOperation();
$operation->setOperator(Operator::SET);
$operation->setOperand($serviceLink);
$operations[] = $operation;

// Accept service links on the server and print out some information about
// accepted service links.
$serviceLinks = $customerService->mutateServiceLinks($operations);
foreach ($serviceLinks as $serviceLink) {
    printf(
        "Service link with service link ID %d and type '%s' updated to status: %s.\n",
        $serviceLink->getServiceLinkId(),
        $serviceLink->getServiceType(),
        $serviceLink->getLinkStatus()
    );
}

Perl

my $client          = shift;
my $service_link_id = shift;

my $service_link = Google::Ads::AdWords::v201802::ServiceLink->new({
  serviceLinkId => $service_link_id,
  serviceType   => "MERCHANT_CENTER",
  linkStatus    => "ACTIVE"
});

# Create the operation to set the status to ACTIVE.
my $op = Google::Ads::AdWords::v201802::ServiceLinkOperation->new({
  operator => "SET",
  operand  => $service_link
});

# Update the service link.
my $mutated_service_links =
  $client->CustomerService->mutateServiceLinks({operations => [$op]});

# Display the results.
foreach my $mutated_service_link ($mutated_service_links) {
  printf(
    "Service link with service link ID %d, " .
      "type '%s' updated to status: %s.\n",
    $mutated_service_link->get_serviceLinkId(),
    $mutated_service_link->get_serviceType(),
    $mutated_service_link->get_linkStatus());

}

Ruby

# Get the CustomerService.
customer_srv = adwords.service(:CustomerService, API_VERSION)

# Create the operation to set the status to ACTIVE.
operation = {
  :operator => 'SET',
  :operand => {
    :service_link_id => service_link_id,
    :service_type => 'MERCHANT_CENTER',
    :link_status => 'ACTIVE'
  }
}

# Update the service link.
mutated_service_links = customer_srv.mutate_service_links([operation])

# Display the results.
mutated_service_links.each do |mutated_service_link|
  puts ("Service link with service link ID %d, type '%s' updated to status:" +
      "%s.") % [
        mutated_service_link[:service_link_id],
        mutated_service_link[:service_type],
        mutated_service_link[:link_status]
      ]
end

VB.NET

Using customerService As CustomerService = CType(user.GetService(
    AdWordsService.v201802.CustomerService), CustomerService)

  ' Create the operation to set the status to ACTIVE.
  Dim op As New ServiceLinkOperation()
  op.operator = [Operator].SET
  Dim serviceLink As New ServiceLink()
  serviceLink.serviceLinkId = serviceLinkId
  serviceLink.serviceType = ServiceType.MERCHANT_CENTER
  serviceLink.linkStatus = ServiceLinkLinkStatus.ACTIVE
  op.operand = serviceLink

  Try
    ' Update the service link.
    Dim mutatedServiceLinks As ServiceLink() =
      customerService.mutateServiceLinks(New ServiceLinkOperation() {op})

    ' Display the results.
    For Each mutatedServiceLink As ServiceLink In mutatedServiceLinks
      Console.WriteLine("Service link with service link ID {0}, type '{1}' updated to " &
        "status: {2}.", mutatedServiceLink.serviceLinkId, mutatedServiceLink.serviceType,
        mutatedServiceLink.linkStatus)
    Next

Чтобы отклонить приглашение, вызовите mutateServiceLinks и передайте операцию REMOVE с операндом, где заданы значения полей serviceType и serviceLinkId.

Java

// Get the CustomerService.
CustomerServiceInterface customerService =
    adWordsServices.get(session, CustomerServiceInterface.class);

// Create the operation to remove the service link.
ServiceLinkOperation op = new ServiceLinkOperation();
op.setOperator(Operator.REMOVE);
ServiceLink serviceLink = new ServiceLink();
serviceLink.setServiceLinkId(serviceLinkId);
serviceLink.setServiceType(ServiceType.MERCHANT_CENTER);
op.setOperand(serviceLink);

// Remove the service link.
ServiceLink[] mutatedServiceLinks =
    customerService.mutateServiceLinks(new ServiceLinkOperation[] {op});

// Display the results.
for (ServiceLink mutatedServiceLink : mutatedServiceLinks) {
  System.out.printf(
      "Service link with service link ID %d and type '%s' was removed.%n",
      mutatedServiceLink.getServiceLinkId(), mutatedServiceLink.getServiceType());
}

CSharp

// Get the CustomerService.
CustomerService customerService =
    (CustomerService) user.GetService(AdWordsService.v201802.CustomerService);

// Create the operation to remove the service link.
ServiceLinkOperation op = new ServiceLinkOperation();
op.@operator = Operator.REMOVE;
ServiceLink serviceLink = new ServiceLink();
serviceLink.serviceLinkId = serviceLinkId;
serviceLink.serviceType = ServiceType.MERCHANT_CENTER;
op.operand = serviceLink;

// Remove the service link.
ServiceLink[] mutatedServiceLinks = customerService.mutateServiceLinks(
    new ServiceLinkOperation[] { op });

// Display the results.
foreach (ServiceLink mutatedServiceLink in mutatedServiceLinks) {
  Console.WriteLine("Service link with service link ID {0} and type '{1}' was removed.",
      mutatedServiceLink.serviceLinkId, mutatedServiceLink.serviceType);
}

Python

def main(client, service_link_id):
  # Initialize appropriate service.
  customer_service = client.GetService(
      'CustomerService', version='v201802')

  # Create the operation to set the status to ACTIVE.
  operations = [{
      'operator': 'REMOVE',
      'operand': {
          'serviceLinkId': service_link_id,
          'serviceType': 'MERCHANT_CENTER',
      }
  }]

  # Remove the service link.
  mutated_service_links = customer_service.mutateServiceLinks(operations)

  # Display results.
  for mutated_service_link in mutated_service_links:
    print ('Service link with service link ID \'%s\' and type \'%s\' was '
           'removed.' % (mutated_service_link['serviceLinkId'],
                         mutated_service_link['serviceType']))

PHP

$customerService =
    $adWordsServices->get($session, CustomerService::class);

// Create service link.
$serviceLink = new ServiceLink();
$serviceLink->setServiceLinkId($serviceLinkId);
$serviceLink->setServiceType(ServiceType::MERCHANT_CENTER);

// Create a service link operation and add it to the list.
$operations = [];
$operation = new ServiceLinkOperation();
$operation->setOperator(Operator::REMOVE);
$operation->setOperand($serviceLink);
$operations[] = $operation;

// Reject service links on the server and print out some information about
// rejected service links.
$serviceLinks = $customerService->mutateServiceLinks($operations);
foreach ($serviceLinks as $serviceLink) {
    printf(
        "Service link with service link ID %d and type '%s' was removed.\n",
        $serviceLink->getServiceLinkId(),
        $serviceLink->getServiceType()
    );
}

Perl

my $client          = shift;
my $service_link_id = shift;

my $service_link = Google::Ads::AdWords::v201802::ServiceLink->new({
  serviceLinkId => $service_link_id,
  serviceType   => "MERCHANT_CENTER"
});

# Create the operation to remove the service link.
my $op = Google::Ads::AdWords::v201802::ServiceLinkOperation->new({
  operator => "REMOVE",
  operand  => $service_link
});

# Remove the service link.
my $mutated_service_links =
  $client->CustomerService->mutateServiceLinks({operations => [$op]});

# Display the results.
foreach my $mutated_service_link ($mutated_service_links) {
  printf(
    "Service link with service link ID %d and type '%s' was removed.\n",
    $mutated_service_link->get_serviceLinkId(),
    $mutated_service_link->get_serviceType());

}

Ruby

# Get the CustomerService.
customer_srv = adwords.service(:CustomerService, API_VERSION)

# Create the operation to remove the service link.
operation = {
  :operator => 'REMOVE',
  :operand => {
    :service_link_id => service_link_id,
    :service_type => 'MERCHANT_CENTER'
  }
}

# Update the service link.
mutated_service_links = customer_srv.mutate_service_links([operation])

# Display the results.
mutated_service_links.each do |mutated_service_link|
  puts "Service link with service link ID %d, type '%s' was removed." % [
    mutated_service_link[:service_link_id],
    mutated_service_link[:service_type]
  ]
end

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

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

Однако в настройке торговой кампании есть два дополнительных этапа:

  1. Для advertisingChannelType следует задать значение SHOPPING.

  2. Необходимо создать и добавить в кампанию объект ShoppingSetting.

Как это сделать, показано в приведенном ниже коде.

Java

// Create campaign.
Campaign campaign = new Campaign();
campaign.setName("Shopping campaign #" + System.currentTimeMillis());
// The advertisingChannelType is what makes this a Shopping campaign
campaign.setAdvertisingChannelType(AdvertisingChannelType.SHOPPING);

// 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 shared budget (required).
Budget budget = new Budget();
budget.setBudgetId(budgetId);
campaign.setBudget(budget);

// Set bidding strategy (required).
BiddingStrategyConfiguration biddingStrategyConfiguration = new BiddingStrategyConfiguration();
biddingStrategyConfiguration.setBiddingStrategyType(BiddingStrategyType.MANUAL_CPC);
campaign.setBiddingStrategyConfiguration(biddingStrategyConfiguration);

// All Shopping campaigns need a ShoppingSetting.
ShoppingSetting shoppingSetting = new ShoppingSetting();
shoppingSetting.setSalesCountry("US");
shoppingSetting.setCampaignPriority(0);
shoppingSetting.setMerchantId(merchantId);

// Set to 'true' to enable Local Inventory Ads in your campaign.
shoppingSetting.setEnableLocal(true);

campaign.setSettings(new Setting[] {shoppingSetting});

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

// Make the mutate request.
CampaignReturnValue campaignAddResult =
    campaignService.mutate(new CampaignOperation[] {campaignOperation});

// Display result.
campaign = campaignAddResult.getValue(0);

System.out.printf("Campaign with name '%s' and ID %d was added.%n", campaign.getName(),
    campaign.getId());

Python

def main(client, budget_id, merchant_id, create_default_partition):
  campaign_service = client.GetService('CampaignService', version='v201802')
  ad_group_service = client.GetService('AdGroupService', version='v201802')
  ad_group_ad_service = client.GetService('AdGroupAdService', version='v201802')

  # Create campaign
  campaign = {
      'name': 'Shopping campaign #%s' % uuid.uuid4(),
      # The advertisingChannelType is what makes this a shopping campaign
      'advertisingChannelType': 'SHOPPING',
      # 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',
      # Set portfolio budget (required)
      'budget': {
          'budgetId': budget_id
      },
      'biddingStrategyConfiguration': {
          'biddingStrategyType': 'MANUAL_CPC'
      },
      'settings': [
          # All shopping campaigns need a ShoppingSetting
          {
              'xsi_type': 'ShoppingSetting',
              'salesCountry': 'US',
              'campaignPriority': '0',
              'merchantId': merchant_id,
              # Set to "True" to enable Local Inventory Ads in your campaign.
              'enableLocal': True
          }
      ]
  }

  campaign_operations = [{
      'operator': 'ADD',
      'operand': campaign
  }]

  result = campaign_service.mutate(campaign_operations)

  for campaign in result['value']:
    print ('Campaign with name "%s" and ID "%s" was added.'
           % (campaign['name'], campaign['id']))

  # Create the AdGroup
  ad_group = {
      'campaignId': campaign['id'],
      'name': 'AdGroup #%s' % uuid.uuid4()
  }

  adgroup_operations = {
      'operator': 'ADD',
      'operand': ad_group
  }

  # Make the mutate request to add the AdGroup to the Shopping Campaign
  ad_group = ad_group_service.mutate(adgroup_operations)['value'][0]
  ad_group_id = ad_group['id']

  print ('AdGroup with name "%s" and ID "%s" was added.'
         % (ad_group['name'], ad_group_id))

  # Create an AdGroup Ad
  adgroup_ad = {
      'adGroupId': ad_group_id,
      # Create ProductAd
      'ad': {
          'xsi_type': 'ProductAd',
          'Ad.Type': 'ProductAd'
      }
  }

  ad_operation = {
      'operator': 'ADD',
      'operand': adgroup_ad
  }

  # Make the mutate request to add the ProductAd to the AdGroup
  ad_result = ad_group_ad_service.mutate([ad_operation])

  for adgroup_ad in ad_result['value']:
    print 'ProductAd with ID "%s" was added.' % adgroup_ad['ad']['id']

  if create_default_partition:
    CreateDefaultPartition(client, ad_group_id)

PHP

// Create a campaign with required and optional settings.
$campaign = new Campaign();
$campaign->setName('Shopping campaign #' . uniqid());
// The advertisingChannelType is what makes this a Shopping campaign
$campaign->setAdvertisingChannelType(AdvertisingChannelType::SHOPPING);
// 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 portfolio budget (required).
$campaign->setBudget(new Budget());
$campaign->getBudget()->setBudgetId($budgetId);

// Set bidding strategy (required).
$biddingStrategyConfiguration = new BiddingStrategyConfiguration();
$biddingStrategyConfiguration->setBiddingStrategyType(
    BiddingStrategyType::MANUAL_CPC
);

$campaign->setBiddingStrategyConfiguration($biddingStrategyConfiguration);

// All Shopping campaigns need a ShoppingSetting.
$shoppingSetting = new ShoppingSetting();
$shoppingSetting->setSalesCountry('US');
$shoppingSetting->setCampaignPriority(0);
$shoppingSetting->setMerchantId($merchantId);
// Set to "true" to enable Local Inventory Ads in your campaign.
$shoppingSetting->setEnableLocal(true);
$campaign->setSettings([$shoppingSetting]);

// 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.
$campaign = $campaignService->mutate($operations)->getValue()[0];
printf(
    "Campaign with name '%s' and ID %d was added.\n",
    $campaign->getName(),
    $campaign->getId()
);

Perl

my $campaign = Google::Ads::AdWords::v201802::Campaign->new({
    name => "Shopping campaign #" . uniqid(),
    # The advertisingChannelType is what makes this a Shopping campaign
    advertisingChannelType => "SHOPPING",
    # 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",
    # Set budget (required)
    budget =>
      Google::Ads::AdWords::v201802::Budget->new({budgetId => $budget_id}),
    # Set bidding strategy (required)
    biddingStrategyConfiguration =>
      Google::Ads::AdWords::v201802::BiddingStrategyConfiguration->new(
      {biddingStrategyType => "MANUAL_CPC"}
      ),
    # Set shopping setting (required)
    settings => [
      # All Shopping campaigns need a ShoppingSetting
      Google::Ads::AdWords::v201802::ShoppingSetting->new({
          salesCountry     => "US",
          campaignPriority => 0,
          merchantId       => $merchant_id,
          # By setting enableLocal to true (1) below, you will enable Local
          # Inventory Ads in your campaign. Set this to false (0) if you want
          # to disable this feature in your campaign.
          enableLocal => 1
        })]});

Ruby

# Create campaign.
campaign = {
  :name => "Shopping campaign #%d" % (Time.new.to_f * 1000).to_i,
  # The advertising_channel_type is what makes this a Shopping campaign.
  :advertising_channel_type => 'SHOPPING',
  # 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',
  :budget => {:budget_id => budget_id},
  :bidding_strategy_configuration => {
    :bidding_strategy_type => 'MANUAL_CPC'
  },
  :settings => [
    {
      :xsi_type => 'ShoppingSetting',
      :sales_country => 'US',
      :campaign_priority => 0,
      :merchant_id => merchant_id,
      # Set to "true" to enable Local Inventory Ads in your campaign.
      :enable_local => true
    }
  ]
}
campaign_operation = {:operator => 'ADD', :operand => campaign}

# Make the mutate request.
result = campaign_srv.mutate([campaign_operation])

VB.NET

''' <summary>
''' Creates the shopping campaign.
''' </summary>
''' <param name="user">The AdWords user.</param>
''' <param name="budgetId">The budget id.</param>
''' <param name="merchantId">The Merchant Center id.</param>
''' <returns>The Shopping campaign.</returns>
Private Function CreateCampaign(ByVal user As AdWordsUser, ByVal budgetId As Long,
    ByVal merchantId As Long) As Campaign
  ' Get the required services.
  Dim campaignService As CampaignService = CType(user.GetService(
      AdWordsService.v201802.CampaignService), CampaignService)

  ' Create campaign.
  Dim campaign As New Campaign()
  campaign.name = "Shopping campaign #" & ExampleUtilities.GetRandomString()

  ' The advertisingChannelType is what makes this a Shopping campaign.
  campaign.advertisingChannelType = AdvertisingChannelType.SHOPPING

  ' 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 shared budget (required).
  campaign.budget = New Budget()
  campaign.budget.budgetId = budgetId

  ' Set bidding strategy (required).
  Dim biddingStrategyConfiguration As New BiddingStrategyConfiguration()
  biddingStrategyConfiguration.biddingStrategyType = BiddingStrategyType.MANUAL_CPC

  campaign.biddingStrategyConfiguration = biddingStrategyConfiguration

  ' All Shopping campaigns need a ShoppingSetting.
  Dim shoppingSetting As New ShoppingSetting()
  shoppingSetting.salesCountry = "US"
  shoppingSetting.campaignPriority = 0
  shoppingSetting.merchantId = merchantId

  ' Enable Local Inventory Ads in your campaign.
  shoppingSetting.enableLocal = True
  campaign.settings = New Setting() {shoppingSetting}

  ' Create operation.
  Dim campaignOperation As New CampaignOperation()
  campaignOperation.operand = campaign
  campaignOperation.operator = [Operator].ADD

  ' Make the mutate request.
  Dim retval As CampaignReturnValue = campaignService.mutate(
      New CampaignOperation() {campaignOperation})

  Return retval.value(0)
End Function

Как показано в примере выше, ShoppingSetting имеет следующие свойства:

merchantId (обязательно)
Идентификатор аккаунта Merchant Center, в котором представлены ваши товары.
salesCountry (обязательно)
Обеспечивает выбор товаров из Merchant Center только с указанными целевыми странами. Обратите внимание. что эти значения никак не влияют на таргетинг объявлений.
campaignPriority (необязательно, значение по умолчанию – 0)
Варианты значений: 0, 1 и 2. Определяет приоритетную кампанию, если данные из фида Merchant Center используются в нескольких кампаниях. Выбирается кампания с наивысшим приоритетом. Если у двух кампаний одинаковый приоритет, в каждом случае будет выбираться объявление с наиболее высокой ставкой.
enableLocal (необязательно, по умолчанию: false)
Если задано значение true, этот флаг активирует рекламу местного ассортимента в торговых кампаниях.
purchasePlatform (необязательно, по умолчанию: MERCHANT)
Указывает платформу, на которой продается товар, но только при условии, что в вашем аккаунте Merchant Center включены покупки в Google.

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

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

В торговых кампаниях поддерживаются два типа групп объявлений:

  • SHOPPING_PRODUCT_ADS – тип группы объявлений по умолчанию для торговых кампаний. Используется для показа стандартных товарных объявлений.
  • SHOPPING_SHOWCASE_ADS – тип, который можно использовать только для показа товарных объявлений-витрин в результатах поиска товаров. Чтобы создать такую группу объявлений, выполните следующие действия:
    1. Присвойте значение SHOPPING_SHOWCASE_ADS полю adGroupType вашей группы объявлений.
    2. Полю biddingStrategyType объекта biddingStrategyConfiguration присвойте значение MANUAL_CPC или ENHANCED_CPC.

Создав группу объявлений нужного типа, добавьте в нее ProductAd или ShowcaseAd.

На следующем этапе необходимо определиться с набором рекламируемых товаров и ставками.

Сегментация товаров

Основное достоинство торговых кампаний – возможность использовать различные параметры для сегментации товаров и работать с отдельными группами товаров. На приведенной ниже схеме товары разделены по широким категориям: Electronics (Электроника) (эта категория дополнительно разделена по брендам), Toys (Игрушки) и Everything else (Все остальное) (в этой категории выделен дополнительный раздел по статусу Used (б/у).

Для торговых кампаний создается древовидная структура, на каждом уровне которой производится сегментация товаров.

Каждый узел структуры представляет конечный элемент или набор подгрупп. В первом случае узел является конечным (листом в древовидной структуре), во втором за ним следует дополнительный уровень. В каждом наборе подгрупп должна присутствовать подгруппа Other. В качестве примеров корректной структуры можно рассматривать сегментацию корневого узла, а также узлов Category: Electronics и Category: (Other).

Узлы являются объектами подкласса ProductPartition класса Criterion. Объекты ProductPartition связаны с AdGroup с помощью BiddableAdGroupCriterion либо NegativeAdGroupCriterion.

Ниже описаны варианты комбинации типов ProductPartition и AdGroupCriterion.

Тип ProductPartition Тип AdGroupCriterion Эффект
UNIT BiddableAdGroupCriterion Назначение ставки для элементов, соответствующих выбранному конечному узлу.
UNIT NegativeAdGroupCriterion Эта комбинация означает, что вы не хотите назначать ставку для этого узла в данной группе объявлений, однако в других группах объявлений и кампаниях с более низким приоритетом это можно делать.

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

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

Значение caseValue для подчиненного и родительского узла должно относиться к одному подтипу ProductDimension. Значения caseValue нет только у корневого узла.

ProductPartition root = new ProductPartition();
root.setPartitionType(ProductPartitionType.SUBDIVISION);
root.setId(-1);

ProductPartition node1 = new ProductPartition();
node1.setPartitionType(ProductPartitionType.UNIT);
node1.setCaseValue(new ProductBrand(null, "Brand A"));
node1.setParentCriterionId(root.getId());

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

ProductPartition node2 = new ProductPartition();
node2.setPartitionType(ProductPartitionType.UNIT);
node2.setCaseValue(new ProductBrand());
node2.setParentCriterionId(root.getId());

Временные идентификаторы

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

Для назначения parentCriterionId для подчиненных узлов используйте временные идентификаторы критериев. Это уникальные локальные (не глобальные) идентификаторы, которые используются только в рамках одного запроса mutate. В качестве временного идентификатора можно использовать любое целое отрицательное число. В примере кода выше корневому узлу ProductPartition присвоен идентификатор -1.

После выполнения этого запроса всем элементам Criterion будут присвоены обычные положительные глобальные идентификаторы.

Параметры товаров

Для торговых кампаний можно использовать следующие типы ProductDimension:

ProductBiddingCategory, ProductCustomAttribute и ProductType содержат подтипы. При сегментации по одному их типов все подчиненные элементы должны относиться к тому же подтипу caseValue, что и родительский элемент.

ProductBiddingCategory и ProductType являются иерархичными параметрами, и подтипы представляют собой более низкие ступени иерархии. Категория Media (BIDDING_CATEGORY_L1) является родительской по отношению к Books (BIDDING_CATEGORY_L2). Использовать разбиение по caseValue можно только в том случае, если оно было задействовано для родительского узла.

Так, категорию Books нельзя выделить непосредственно под корневым узлом, а также в рамках группы Electronics, поскольку последняя не является родительской для Books.

Параметр ProductCustomAttribute не является иерархичным. Подтипы CUSTOM_ATTRIBUTE_0 – CUSTOM_ATTRIBUTE_4 соответствуют значениям custom attribute 0 – custom attribute 4 в Merchant Center.

Используя параметры товаров ProductChannel и ProductChannelExclusivity, можно указать канал (местный магазин, интернет-магазин или и то и другое).

Категории назначения ставок

Значения для типа ProductBiddingCategory представляют собой фиксированные идентификаторы. Вы можете получить полный набор категорий назначения ставок с помощью метода getProductBiddingCategoryData службы ConstantDataService. Настоятельно рекомендуем кешировать результаты этого вызова в связи с их большим объемом и редким обновлением.

Изменение существующих деревьев ProductPartition

Дерево всегда должно оставаться полным, поэтому, если в запросе есть операция mutate, делающая структуру недействительной, она должна сопровождаться операцией, возвращающей нормальную структуру. У всех подчиненных узлов должны быть значения caseValue одного типа, а в каждой подгруппе должен быть узел other для значений, не входящих в другие выделенные категории.

Чтобы добавить подчиненные элементы для конечного узла, необходимо удалить его и создать подгруппу с тем же значением caseValue. Разбиение на подтипы можно использовать для подчиненных узлов.

При удалении подгруппы рекурсивно удаляются все подчиненные ей элементы.

Фильтрация по параметрам товаров

Для фильтрации товаров в кампании можно использовать критерий ProductScope. В кампании может быть только один критерий ProductScope. ProductScope представляет собой контейнер для одного или нескольких параметров ProductDimension, каждый из которых является простым фильтром по одной характеристике товара. Например, если добавить подтип ProductBrand типа ProductDimension и задать для него значение Nexus, в кампании будут рекламироваться только те товары, для которых в Merchant Center указан бренд Nexus.

ProductScope productScope = new ProductScope();
productScope.setDimensions(new ProductDimension[] {new ProductBrand(null, "Nexus")});

В одном критерии ProductScope может быть не более семи параметров ProductDimension. В кампанию включаются только те товары, которые соответствуют всем заданным параметрам ProductDimension.

Ограничения для назначения ставок

Варианты назначения ставок для группы объявлений зависят от ее типа: SHOPPING_PRODUCT_ADS (товарные объявления) или SHOPPING_SHOWCASE_ADS (объявления "Витрина"). В приведенной ниже таблице показано, какие способы назначения ставок доступны для каждого типа.

  SHOPPING_PRODUCT_ADS SHOPPING_SHOWCASE_ADS
Стратегия назначения ставок Поддерживаются только следующие типы:
  • MANUAL_CPC
  • ENHANCED_CPC
  • TARGET_ROAS
  • TARGET_SPEND
Поддерживаются только следующие типы:
  • MANUAL_CPC
  • ENHANCED_CPC
Стратегия назначения ставок на уровне группы объявлений Необязательно Обязательно
Ставки на уровне набора подгрупп товаров Обязательно Запрещено

Отчеты

Для торговых кампаний были добавлены два новых типа отчетов: Product Partition (Сегментация товаров) и Shopping Performance (Эффективность товарных объявлений).

Подробнее о них можно узнать из руководства по отчетам.

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

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