ショッピング キャンペーン

ショッピング キャンペーンは、ユーザーが広告をクリックする前に詳細な商品情報を提供できるキャンペーンです。ショッピング キャンペーンの広告では、商品の写真に加えて、見出し、価格、店舗名なども表示できます。

このガイドでは AdWords API でショッピング キャンペーンを設定、管理する方法を説明します。

Merchant Center と AdWords アカウントをリンクする

ショッピング キャンペーンを作成する場合は、まず AdWords アカウントを Google Merchant Center アカウントにリンクします。このリンク作業は次の手順で行います。

  1. Merchant Center アカウントから AdWords アカウントへ招待状を送信します。
  2. AdWords アカウントで招待状を承認します。

Merchant Center アカウントから招待状を送信する

Merchant Center の管理画面からこの招待状を送信するか、Content API for Shopping を使ってアカウントadwordsLinks を更新できます。

AdWords アカウントで招待状を管理する

CustomerServicegetServiceLinksmutateServiceLinks を使って、AdWords アカウントと他のサービス(Merchant Center など)のリンクを取得、承認、拒否できます。

アカウントのすべてのリンクを取得するには、次のように serviceType = MERCHANT_CENTER として getServiceLinks を呼び出します。

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.");
}

C#

// 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 を呼び出し、linkStatusPENDING から ACTIVE に変更する SET オペレーションを渡します。オペランドには必ず serviceTypeserviceLinkId を設定してください。

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());
}

C#

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 を呼び出し、オペランドに serviceTypeserviceLinkId を設定した REMOVE オペレーションを渡します。

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());
}

C#

// 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 つだけ設定します。

ショッピング キャンペーンの設定では次の 2 段階の手順を行います。

  1. キャンペーンの advertisingChannelTypeSHOPPING に設定します。

  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 アカウント ID です。
salesCountry(必須)
Merchant Center でターゲットの国が一致している商品のみ選択されます。広告のターゲット設定には影響しません。
campaignPriority(省略可能で、デフォルトは 0
値は 01 または 2 になります。 複数のキャンペーンで同じ Merchant Center データフィードを使用している場合は、このプロパティでキャンペーンの優先度が決まります。優先度の高いキャンペーンが選択されますが、2 つのキャンペーンの優先度が同じ場合は、商品により高い入札単価を設定しているキャンペーンが使用されます。
enableLocal(省略可能で、デフォルトは false
true に設定した場合は、ショッピング キャンペーンのローカル在庫広告が有効になります。
purchasePlatform(省略可能で、デフォルトは MERCHANT
Merchant Center アカウントが Google ショッピング広告から商品を購入で有効になっている場合に、ショッピング商品を購入できるプラットフォームを示します。

ショッピング広告グループとショッピング広告を作成する

ショッピング キャンペーンの広告を配信するには、広告グループに少なくとも 1 つの広告が含まれる AdGroup を作成します。

ショッピング キャンペーンでは次の 2 種類の広告グループを使用できます。

  • SHOPPING_PRODUCT_ADS: ショッピング キャンペーンの広告グループのデフォルトの種類です。標準的な商品広告を配信します。
  • SHOPPING_SHOWCASE_ADS: ショッピングの検索結果に表示されるショーケース広告のみを配信する広告グループの種類です。この種類の広告グループを作成するには次の設定が必要です。
    1. 広告グループの adGroupType フィールドを SHOPPING_SHOWCASE_ADS に設定します。
    2. 広告グループの biddingStrategyConfigurationbiddingStrategyTypeMANUAL_CPCENHANCED_CPC に設定します。

必要な種類の広告グループを作成したら、広告グループに ProductAdShowcaseAd を追加してキャンペーンの基本的な設定を行います。

続いて、追加する商品とそれぞれの入札単価を決めます。

分割

ショッピング キャンペーンの最大の魅力は、複数の属性で商品の在庫を分割し、各商品グループを個別に扱える点にあります。次の図をご覧ください。商品が電化製品、玩具、「その他」に大きく分割されています。電化製品はブランドで、「その他」は中古品かどうかでさらに分割されています。

この図はツリー構造でも表現可能で、ツリーの各レベルが分割を表します。

ツリーの各ノードは下位区分またはユニットです。下位区分はツリーに新しいレベルを追加するもので、ユニットはツリーの葉ノードになります。各下位区分は明確な分類に基づいているため、その他のユニットタイプが必ず必要となります。この例ではルート、カテゴリ: 電化製品カテゴリ: (その他)のノードが下位区分となります。

ノードは Criterion クラスのサブクラスである ProductPartition クラスのオブジェクトです。ProductPartitionBiddableAdGroupCriterionNegativeAdGroupCriterion を保持する AdGroup にリンクしています。

ProductPartition タイプと AdGroupCriterion タイプを組み合わせると、次のような効果があります。

ProductPartition タイプ AdGroupCriterion タイプ 効果
UNIT BiddableAdGroupCriterion ツリーの特定の葉ノードに一致する商品アイテムに、共通の入札単価を設定できます。
UNIT NegativeAdGroupCriterion この組み合わせを使用すると、この広告グループの特定の葉ノードでは入札したくないが、その他の広告グループや(優先度が低い)キャンペーンでは入札可能であることを示すことができます。

その他の組み合わせはエラーになります。

ProductPartition には ProductDimension タイプのいずれかのサブクラスに設定できる caseValue というプロパティもあります。ProductDimension は商品に関連付けられている値(ブランド、カテゴリ、条件など)を表します。利用可能な ProductDimension タイプについて詳しくは、参考資料をご覧ください。

下位区分の直下の子ノードは、同じ ProductDimension サブタイプの caseValue を保持している必要があります。ルートノードのみ 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());

一時的な ID

条件を作成する mutate リクエストがサーバー側で処理されるまで、条件に ID は割り当てられません。ただし完成するまで ProductPartition は無効であるため、下位区分を作成する際には必ず、同じオペレーションで子ノードを少なくとも 1 つ作成する必要があります。

子ノードで parentCriterionId を設定できるようにするには、一時的な条件 ID を使用します。これはグローバルではなくローカルで固有の識別子であり、1 つの mutate リクエストの範囲内でのみ適用されます。一時的な ID としては、任意の負の整数を使用できます。上記のサンプルコードでは、ルートの ProductPartition の ID は -1 に設定されます。

リクエストの処理が完了すると、各 Criterion には通常どおり正のグローバル ID が割り当てられます。

商品のディメンション

ショッピング キャンペーンでは以下の ProductDimension タイプを使用できます。

ProductBiddingCategoryProductCustomAttributeProductType はサブタイプへとさらに細分化されます。いずれかのタイプで分割を行う場合は、その分割の各 caseValue も同じサブタイプにする必要があります。

ProductBiddingCategoryProductType は階層構造になっており、そのサブタイプは階層の深さを表します。メディアというカテゴリは BIDDING_CATEGORY_L1 である一方、書籍BIDDING_CATEGORY_L2 であり、メディアを親として持ちます。ツリー上で親をさらに分割しない限り、caseValue で分割を行うことはできません。

たとえば、カテゴリの書籍はルートの直下に置くことができず、書籍電化製品の下に置くこともできません。電化製品書籍の親ではないからです。

ProductCustomAttribute は階層構造ではありません。サブタイプ CUSTOM_ATTRIBUTE_0CUSTOM_ATTRIBUTE_4 は、Merchant Center の値のカスタム属性 0カスタム属性 4 に対応します。

商品ディメンションの ProductChannelProductChannelExclusivity では、ローカル、オンラインのいずれのチャネルでも指定できます。

単価設定のカテゴリ

ProductBiddingCategory タイプの値は固定 ID です。単価設定の全カテゴリは ConstantDataService のメソッド getProductBiddingCategoryData から取得できます。この呼び出しの結果はデータ量が多く頻繁には変更されないため、キャッシュしておくことを強くおすすめします。

既存の ProductPartition ツリーを修正する

ツリーは常に完全な状態でなければならないため、ツリーを無効にしてしまう mutate オペレーションは、ツリーを再度修正するオペレーションと同じリクエストで渡す必要があります。ツリーが有効であるためには、下位区分の子ノードすべてが同じタイプの caseValue を保持し、すべての下位区分に「その他」ノードが含まれている必要があります。

葉ノードをさらに分割する場合は、既存のユニットを削除し、同じ caseValue を持つ下位区分で置き換える必要があります。こうすることで、新しいノードの子として調整を加えることができます。

下位区分を削除すると、その子もすべて削除されることになります。

商品ディメンションに基づくフィルタ

ProductScope 条件を設定すると、キャンペーンの対象商品を絞り込むことができます。キャンペーンごとに作成可能な ProductScope は 1 つまでです。ProductScope は商品の特定の側面を対象とする、シンプルなフィルタを表す ProductDimension のコンテナです。たとえば ProductDimensionProductBrand サブタイプを追加して値を Nexus に設定すると、Merchant Center で「Nexus」がブランドとなっている商品にのみキャンペーンが適用されます。

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

ProductDimension は 7 つまで ProductScope に追加できます。商品はすべての ProductDimension と一致しないと、キャンペーンの対象となりません。

入札に関する制限事項

ショッピング広告グループの入札に関する制限事項は、広告グループの種類が SHOPPING_PRODUCT_ADSSHOPPING_SHOWCASE_ADS かで異なります。次の表にその違いをまとめています。

  SHOPPING_PRODUCT_ADS SHOPPING_SHOWCASE_ADS
入札戦略 次の種類でのみ使用できます。
  • MANUAL_CPC
  • ENHANCED_CPC
  • TARGET_ROAS
  • TARGET_SPEND
次の種類でのみ使用できます。
  • MANUAL_CPC
  • ENHANCED_CPC
広告グループ単位の入札戦略 オプション 必須
商品分割ノード単位の入札単価 必須 許可されない

レポート

ショッピング キャンペーンでは、商品分割ショッピングの掲載結果の 2 つの新しいレポートを利用できます。

詳しくはレポートガイドをご覧ください。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。