Add Merchant Center Dynamic Remarketing Campaign

  • The content provides code examples in Ruby and Perl for creating a dynamic remarketing campaign in Google Ads linked to a Merchant Center account.

  • Both Ruby and Perl examples demonstrate the programmatic steps involved, including creating a campaign, an ad group, a responsive display ad, and targeting a user list.

  • The scripts require specific IDs such as customer ID, Merchant Center account ID, campaign budget ID, and user list ID as input.

  • The examples illustrate how to configure various aspects of the campaign and ad, including setting the advertising channel, status, budget, ad assets (like images), and targeting criteria.

Java

 // Copyright 2019 Google LLC 
 // 
 // Licensed under the Apache License, Version 2.0 (the "License"); 
 // you may not use this file except in compliance with the License. 
 // You may obtain a copy of the License at 
 // 
 //     https://www.apache.org/licenses/LICENSE-2.0 
 // 
 // Unless required by applicable law or agreed to in writing, software 
 // distributed under the License is distributed on an "AS IS" BASIS, 
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
 // See the License for the specific language governing permissions and 
 // limitations under the License. 
 package 
  
 com.google.ads.googleads.examples.remarketing 
 ; 
 import static 
  
 com.google.ads.googleads.examples.utils.CodeSampleHelper.getPrintableDateTime 
 ; 
 import static 
  
 com.google.ads.googleads.v23.enums.EuPoliticalAdvertisingStatusEnum.EuPoliticalAdvertisingStatus.DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING 
 ; 
 import 
  
 com.beust.jcommander.Parameter 
 ; 
 import 
  
 com.google.ads.googleads.examples.utils.ArgumentNames 
 ; 
 import 
  
 com.google.ads.googleads.examples.utils.CodeSampleParams 
 ; 
 import 
  
 com.google.ads.googleads.lib.GoogleAdsClient 
 ; 
 import 
  
 com.google.ads.googleads.v23.common.AdImageAsset 
 ; 
 import 
  
 com.google.ads.googleads.v23.common.AdTextAsset 
 ; 
 import 
  
 com.google.ads.googleads.v23.common.ImageAsset 
 ; 
 import 
  
 com.google.ads.googleads.v23.common.ManualCpc 
 ; 
 import 
  
 com.google.ads.googleads.v23.common.ResponsiveDisplayAdInfo 
 ; 
 import 
  
 com.google.ads.googleads.v23.common.UserListInfo 
 ; 
 import 
  
 com.google.ads.googleads.v23.enums.AdGroupStatusEnum.AdGroupStatus 
 ; 
 import 
  
 com.google.ads.googleads.v23.enums.AdvertisingChannelTypeEnum.AdvertisingChannelType 
 ; 
 import 
  
 com.google.ads.googleads.v23.enums.AssetTypeEnum.AssetType 
 ; 
 import 
  
 com.google.ads.googleads.v23.enums.CampaignStatusEnum.CampaignStatus 
 ; 
 import 
  
 com.google.ads.googleads.v23.enums.DisplayAdFormatSettingEnum.DisplayAdFormatSetting 
 ; 
 import 
  
 com.google.ads.googleads.v23.errors.GoogleAdsError 
 ; 
 import 
  
 com.google.ads.googleads.v23.errors.GoogleAdsException 
 ; 
 import 
  
 com.google.ads.googleads.v23.resources.Ad 
 ; 
 import 
  
 com.google.ads.googleads.v23.resources.AdGroup 
 ; 
 import 
  
 com.google.ads.googleads.v23.resources.AdGroupAd 
 ; 
 import 
  
 com.google.ads.googleads.v23.resources.AdGroupCriterion 
 ; 
 import 
  
 com.google.ads.googleads.v23.resources.Asset 
 ; 
 import 
  
 com.google.ads.googleads.v23.resources.Campaign 
 ; 
 import 
  
 com.google.ads.googleads.v23.resources.Campaign.ShoppingSetting 
 ; 
 import 
  
 com.google.ads.googleads.v23.services.AdGroupAdOperation 
 ; 
 import 
  
 com.google.ads.googleads.v23.services.AdGroupAdServiceClient 
 ; 
 import 
  
 com.google.ads.googleads.v23.services.AdGroupCriterionOperation 
 ; 
 import 
  
 com.google.ads.googleads.v23.services.AdGroupCriterionServiceClient 
 ; 
 import 
  
 com.google.ads.googleads.v23.services.AdGroupOperation 
 ; 
 import 
  
 com.google.ads.googleads.v23.services.AdGroupServiceClient 
 ; 
 import 
  
 com.google.ads.googleads.v23.services.AssetOperation 
 ; 
 import 
  
 com.google.ads.googleads.v23.services.AssetServiceClient 
 ; 
 import 
  
 com.google.ads.googleads.v23.services.CampaignOperation 
 ; 
 import 
  
 com.google.ads.googleads.v23.services.CampaignServiceClient 
 ; 
 import 
  
 com.google.ads.googleads.v23.services.MutateAdGroupAdsResponse 
 ; 
 import 
  
 com.google.ads.googleads.v23.services.MutateAdGroupCriteriaResponse 
 ; 
 import 
  
 com.google.ads.googleads.v23.services.MutateAdGroupsResponse 
 ; 
 import 
  
 com.google.ads.googleads.v23.services.MutateAssetsResponse 
 ; 
 import 
  
 com.google.ads.googleads.v23.services.MutateCampaignsResponse 
 ; 
 import 
  
 com.google.ads.googleads.v23.utils.ResourceNames 
 ; 
 import 
  
 com.google.common.collect.ImmutableList 
 ; 
 import 
  
 com.google.common.io.ByteStreams 
 ; 
 import 
  
 com.google.protobuf.ByteString 
 ; 
 import 
  
 java.io.FileNotFoundException 
 ; 
 import 
  
 java.io.IOException 
 ; 
 import 
  
 java.net.URL 
 ; 
 /** 
 * Creates a shopping campaign associated with an existing merchant center account, along with a 
 * related ad group and dynamic display ad, and targets a user list for remarketing purposes. 
 */ 
 public 
  
 class 
 AddMerchantCenterDynamicRemarketingCampaign 
  
 { 
  
 private 
  
 static 
  
 class 
 AddMerchantCenterDynamicRemarketingCampaignParams 
  
 extends 
  
 CodeSampleParams 
  
 { 
  
 @Parameter 
 ( 
 names 
  
 = 
  
 ArgumentNames 
 . 
 CUSTOMER_ID 
 , 
  
 required 
  
 = 
  
 true 
 ) 
  
 private 
  
 long 
  
 customerId 
 ; 
  
 @Parameter 
 ( 
 names 
  
 = 
  
 ArgumentNames 
 . 
 MERCHANT_CENTER_ACCOUNT_ID 
 , 
  
 required 
  
 = 
  
 true 
 ) 
  
 private 
  
 long 
  
 merchantCenterAccountId 
 ; 
  
 @Parameter 
 ( 
 names 
  
 = 
  
 ArgumentNames 
 . 
 CAMPAIGN_BUDGET_ID 
 , 
  
 required 
  
 = 
  
 true 
 ) 
  
 private 
  
 long 
  
 campaignBudgetId 
 ; 
  
 @Parameter 
 ( 
 names 
  
 = 
  
 ArgumentNames 
 . 
 USER_LIST_ID 
 , 
  
 required 
  
 = 
  
 true 
 ) 
  
 private 
  
 long 
  
 userListId 
 ; 
  
 } 
  
 public 
  
 static 
  
 void 
  
 main 
 ( 
 String 
 [] 
  
 args 
 ) 
  
 throws 
  
 IOException 
  
 { 
  
 AddMerchantCenterDynamicRemarketingCampaignParams 
  
 params 
  
 = 
  
 new 
  
 AddMerchantCenterDynamicRemarketingCampaignParams 
 (); 
  
 if 
  
 ( 
 ! 
 params 
 . 
 parseArguments 
 ( 
 args 
 )) 
  
 { 
  
 // Either pass the required parameters for this example on the command line, or insert them 
  
 // into the code here. See the parameter class definition above for descriptions. 
  
 params 
 . 
 customerId 
  
 = 
  
 Long 
 . 
 parseLong 
 ( 
 "INSERT_CUSTOMER_ID_HERE" 
 ); 
  
 params 
 . 
 merchantCenterAccountId 
  
 = 
  
 Long 
 . 
 parseLong 
 ( 
 "INSERT_MERCHANT_CENTER_ACCOUNT_ID_HERE" 
 ); 
  
 params 
 . 
 campaignBudgetId 
  
 = 
  
 Long 
 . 
 parseLong 
 ( 
 "INSERT_CAMPAIGN_BUDGET_ID_HERE" 
 ); 
  
 params 
 . 
 userListId 
  
 = 
  
 Long 
 . 
 parseLong 
 ( 
 "INSERT_USER_LIST_ID_HERE" 
 ); 
  
 } 
  
 GoogleAdsClient 
  
 googleAdsClient 
  
 = 
  
 null 
 ; 
  
 try 
  
 { 
  
 googleAdsClient 
  
 = 
  
 GoogleAdsClient 
 . 
 newBuilder 
 (). 
 fromPropertiesFile 
 (). 
 build 
 (); 
  
 } 
  
 catch 
  
 ( 
 FileNotFoundException 
  
 fnfe 
 ) 
  
 { 
  
 System 
 . 
 err 
 . 
 printf 
 ( 
  
 "Failed to load GoogleAdsClient configuration from file. Exception: %s%n" 
 , 
  
 fnfe 
 ); 
  
 System 
 . 
 exit 
 ( 
 1 
 ); 
  
 } 
  
 catch 
  
 ( 
 IOException 
  
 ioe 
 ) 
  
 { 
  
 System 
 . 
 err 
 . 
 printf 
 ( 
 "Failed to create GoogleAdsClient. Exception: %s%n" 
 , 
  
 ioe 
 ); 
  
 System 
 . 
 exit 
 ( 
 1 
 ); 
  
 } 
  
 try 
  
 { 
  
 new 
  
 AddMerchantCenterDynamicRemarketingCampaign 
 (). 
 runExample 
 ( 
 googleAdsClient 
 , 
  
 params 
 ); 
  
 } 
  
 catch 
  
 ( 
 GoogleAdsException 
  
 gae 
 ) 
  
 { 
  
 // GoogleAdsException is the base class for most exceptions thrown by an API request. 
  
 // Instances of this exception have a message and a GoogleAdsFailure that contains a 
  
 // collection of GoogleAdsErrors that indicate the underlying causes of the 
  
 // GoogleAdsException. 
  
 System 
 . 
 err 
 . 
 printf 
 ( 
  
 "Request ID %s failed due to GoogleAdsException. Underlying errors:%n" 
 , 
  
 gae 
 . 
 getRequestId 
 ()); 
  
 int 
  
 i 
  
 = 
  
 0 
 ; 
  
 for 
  
 ( 
 GoogleAdsError 
  
 googleAdsError 
  
 : 
  
 gae 
 . 
 getGoogleAdsFailure 
 (). 
 getErrorsList 
 ()) 
  
 { 
  
 System 
 . 
 err 
 . 
 printf 
 ( 
 "  Error %d: %s%n" 
 , 
  
 i 
 ++ 
 , 
  
 googleAdsError 
 ); 
  
 } 
  
 System 
 . 
 exit 
 ( 
 1 
 ); 
  
 } 
  
 } 
  
 /** 
 * Runs the example. 
 * 
 * @param googleAdsClient the Google Ads API client. 
 * @param params the AddMerchantCenterDynamicRemarketingCampaignParams for the example. 
 * @throws GoogleAdsException if an API request failed with one or more service errors. 
 */ 
  
 private 
  
 void 
  
 runExample 
 ( 
  
 GoogleAdsClient 
  
 googleAdsClient 
 , 
  
 AddMerchantCenterDynamicRemarketingCampaignParams 
  
 params 
 ) 
  
 throws 
  
 IOException 
  
 { 
  
 // Creates a shopping campaign associated with a given merchant center account. 
  
 String 
  
 campaignResourceName 
  
 = 
  
 createCampaign 
 ( 
  
 googleAdsClient 
 , 
  
 params 
 . 
 customerId 
 , 
  
 params 
 . 
 merchantCenterAccountId 
 , 
  
 params 
 . 
 campaignBudgetId 
 ); 
  
 // Creates an ad group for the campaign. 
  
 String 
  
 adGroupResourceName 
  
 = 
  
 createAdGroup 
 ( 
 googleAdsClient 
 , 
  
 params 
 . 
 customerId 
 , 
  
 campaignResourceName 
 ); 
  
 // Creates a dynamic display ad in the ad group. 
  
 createAd 
 ( 
 googleAdsClient 
 , 
  
 params 
 . 
 customerId 
 , 
  
 adGroupResourceName 
 ); 
  
 // Targets a specific user list for remarketing. 
  
 attachUserList 
 ( 
 googleAdsClient 
 , 
  
 params 
 . 
 customerId 
 , 
  
 adGroupResourceName 
 , 
  
 params 
 . 
 userListId 
 ); 
  
 } 
  
 /** 
 * Creates a campaign linked to a Merchant Center product feed. 
 * 
 * @param googleAdsClient the Google Ads API client. 
 * @param customerId the client customer ID. 
 * @param merchantCenterAccountId the Merchant Center account ID. 
 * @param campaignBudgetId the campaign budget ID. 
 * @throws GoogleAdsException if an API request failed with one or more service errors. 
 */ 
  
 private 
  
 String 
  
 createCampaign 
 ( 
  
 GoogleAdsClient 
  
 googleAdsClient 
 , 
  
 long 
  
 customerId 
 , 
  
 long 
  
 merchantCenterAccountId 
 , 
  
 long 
  
 campaignBudgetId 
 ) 
  
 { 
  
 String 
  
 budgetResourceName 
  
 = 
  
 ResourceNames 
 . 
 campaignBudget 
 ( 
 customerId 
 , 
  
 campaignBudgetId 
 ); 
  
 // Creates the campaign. 
  
 Campaign 
  
 campaign 
  
 = 
  
 Campaign 
 . 
 newBuilder 
 () 
  
 . 
 setName 
 ( 
 "Shopping campaign #" 
  
 + 
  
 getPrintableDateTime 
 ()) 
  
 // Dynamic remarketing campaigns are only available on the Google Display Network. 
  
 . 
 setAdvertisingChannelType 
 ( 
 AdvertisingChannelType 
 . 
 DISPLAY 
 ) 
  
 . 
 setStatus 
 ( 
 CampaignStatus 
 . 
 PAUSED 
 ) 
  
 . 
 setCampaignBudget 
 ( 
 budgetResourceName 
 ) 
  
 . 
 setManualCpc 
 ( 
 ManualCpc 
 . 
 newBuilder 
 (). 
 build 
 ()) 
  
 // The settings for the shopping campaign. 
  
 // This connects the campaign to the merchant center account. 
  
 . 
 setShoppingSetting 
 ( 
  
 ShoppingSetting 
 . 
 newBuilder 
 () 
  
 . 
 setCampaignPriority 
 ( 
 0 
 ) 
  
 . 
 setMerchantId 
 ( 
 merchantCenterAccountId 
 ) 
  
 . 
 setEnableLocal 
 ( 
 true 
 ) 
  
 . 
 build 
 ()) 
  
 // Declares whether this campaign serves political ads targeting the EU. 
  
 . 
 setContainsEuPoliticalAdvertising 
 ( 
 DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING 
 ) 
  
 . 
 build 
 (); 
  
 // Creates the campaign operation. 
  
 CampaignOperation 
  
 operation 
  
 = 
  
 CampaignOperation 
 . 
 newBuilder 
 (). 
 setCreate 
 ( 
 campaign 
 ). 
 build 
 (); 
  
 // Creates the campaign service client. 
  
 try 
  
 ( 
 CampaignServiceClient 
  
 campaignServiceClient 
  
 = 
  
 googleAdsClient 
 . 
 getLatestVersion 
 (). 
 createCampaignServiceClient 
 ()) 
  
 { 
  
 // Adds the campaign. 
  
 MutateCampaignsResponse 
  
 response 
  
 = 
  
 campaignServiceClient 
 . 
 mutateCampaigns 
 ( 
  
 Long 
 . 
 toString 
 ( 
 customerId 
 ), 
  
 ImmutableList 
 . 
 of 
 ( 
 operation 
 )); 
  
 String 
  
 campaignResourceName 
  
 = 
  
 response 
 . 
 getResults 
 ( 
 0 
 ). 
 getResourceName 
 (); 
  
 System 
 . 
 out 
 . 
 printf 
 ( 
 "Created campaign with resource name '%s'.%n" 
 , 
  
 campaignResourceName 
 ); 
  
 return 
  
 campaignResourceName 
 ; 
  
 } 
  
 } 
  
 /** 
 * Creates an ad group for the remarketing campaign. 
 * 
 * @param googleAdsClient the Google Ads API client. 
 * @param customerId the client customer ID. 
 * @param campaignResourceName the campaign resource name. 
 * @throws GoogleAdsException if an API request failed with one or more service errors. 
 */ 
  
 private 
  
 String 
  
 createAdGroup 
 ( 
  
 GoogleAdsClient 
  
 googleAdsClient 
 , 
  
 long 
  
 customerId 
 , 
  
 String 
  
 campaignResourceName 
 ) 
  
 { 
  
 // Creates the ad group. 
  
 AdGroup 
  
 adGroup 
  
 = 
  
 AdGroup 
 . 
 newBuilder 
 () 
  
 . 
 setName 
 ( 
 "Dynamic remarketing ad group" 
 ) 
  
 . 
 setCampaign 
 ( 
 campaignResourceName 
 ) 
  
 . 
 setStatus 
 ( 
 AdGroupStatus 
 . 
 ENABLED 
 ) 
  
 . 
 build 
 (); 
  
 // Creates the ad group operation. 
  
 AdGroupOperation 
  
 operation 
  
 = 
  
 AdGroupOperation 
 . 
 newBuilder 
 (). 
 setCreate 
 ( 
 adGroup 
 ). 
 build 
 (); 
  
 // Creates the ad group service client. 
  
 try 
  
 ( 
 AdGroupServiceClient 
  
 adGroupServiceClient 
  
 = 
  
 googleAdsClient 
 . 
 getLatestVersion 
 (). 
 createAdGroupServiceClient 
 ()) 
  
 { 
  
 // Adds the ad group. 
  
 MutateAdGroupsResponse 
  
 response 
  
 = 
  
 adGroupServiceClient 
 . 
 mutateAdGroups 
 ( 
  
 Long 
 . 
 toString 
 ( 
 customerId 
 ), 
  
 ImmutableList 
 . 
 of 
 ( 
 operation 
 )); 
  
 String 
  
 adGroupResourceName 
  
 = 
  
 response 
 . 
 getResults 
 ( 
 0 
 ). 
 getResourceName 
 (); 
  
 System 
 . 
 out 
 . 
 printf 
 ( 
 "Created ad group with resource name '%s'.%n" 
 , 
  
 adGroupResourceName 
 ); 
  
 return 
  
 adGroupResourceName 
 ; 
  
 } 
  
 } 
  
 /** 
 * Creates the responsive display ad. 
 * 
 * @param googleAdsClient the Google Ads API client. 
 * @param customerId the client customer ID. 
 * @param adGroupResourceName the campaign resource name. 
 * @throws GoogleAdsException if an API request failed with one or more service errors. 
 */ 
  
 private 
  
 void 
  
 createAd 
 ( 
  
 GoogleAdsClient 
  
 googleAdsClient 
 , 
  
 long 
  
 customerId 
 , 
  
 String 
  
 adGroupResourceName 
 ) 
  
 throws 
  
 IOException 
  
 { 
  
 String 
  
 marketingImageUrl 
  
 = 
  
 "https://gaagl.page.link/Eit5" 
 ; 
  
 String 
  
 marketingImageName 
  
 = 
  
 "Marketing Image" 
 ; 
  
 String 
  
 marketingImageResourceName 
  
 = 
  
 uploadAsset 
 ( 
 googleAdsClient 
 , 
  
 customerId 
 , 
  
 marketingImageUrl 
 , 
  
 marketingImageName 
 ); 
  
 String 
  
 squareMarketingImageName 
  
 = 
  
 "Square Marketing Image" 
 ; 
  
 String 
  
 squareMarketingImageUrl 
  
 = 
  
 "https://gaagl.page.link/bjYi" 
 ; 
  
 String 
  
 squareMarketingImageResourceName 
  
 = 
  
 uploadAsset 
 ( 
 googleAdsClient 
 , 
  
 customerId 
 , 
  
 squareMarketingImageUrl 
 , 
  
 squareMarketingImageName 
 ); 
  
 // Creates the responsive display ad info object. 
  
 ResponsiveDisplayAdInfo 
  
 responsiveDisplayAdInfo 
  
 = 
  
 ResponsiveDisplayAdInfo 
 . 
 newBuilder 
 () 
  
 . 
 addMarketingImages 
 ( 
  
 AdImageAsset 
 . 
 newBuilder 
 (). 
 setAsset 
 ( 
 marketingImageResourceName 
 ). 
 build 
 ()) 
  
 . 
 addSquareMarketingImages 
 ( 
  
 AdImageAsset 
 . 
 newBuilder 
 (). 
 setAsset 
 ( 
 squareMarketingImageResourceName 
 ). 
 build 
 ()) 
  
 . 
 addHeadlines 
 ( 
 AdTextAsset 
 . 
 newBuilder 
 (). 
 setText 
 ( 
 "Travel" 
 ). 
 build 
 ()) 
  
 . 
 setLongHeadline 
 ( 
 AdTextAsset 
 . 
 newBuilder 
 (). 
 setText 
 ( 
 "Travel the World" 
 ). 
 build 
 ()) 
  
 . 
 addDescriptions 
 ( 
 AdTextAsset 
 . 
 newBuilder 
 (). 
 setText 
 ( 
 "Take to the air!" 
 ). 
 build 
 ()) 
  
 . 
 setBusinessName 
 ( 
 "Interplanetary Cruises" 
 ) 
  
 // Optional: Call to action text. 
  
 // Valid texts: https://support.google.com/adwords/answer/7005917 
  
 . 
 setCallToActionText 
 ( 
 "Apply Now" 
 ) 
  
 // Optional: Sets the ad colors. 
  
 . 
 setMainColor 
 ( 
 "#0000ff" 
 ) 
  
 . 
 setAccentColor 
 ( 
 "#ffff00" 
 ) 
  
 // Optional: Sets to false to strictly render the ad using the colors. 
  
 . 
 setAllowFlexibleColor 
 ( 
 false 
 ) 
  
 // Optional: Sets the format setting that the ad will be served in. 
  
 . 
 setFormatSetting 
 ( 
 DisplayAdFormatSetting 
 . 
 NON_NATIVE 
 ) 
  
 // Optional: Creates a logo image and sets it to the ad. 
  
 /* 
 .addLogoImages( 
 AdImageAsset.newBuilder() 
 .setAsset(StringValue.of("INSERT_LOGO_IMAGE_RESOURCE_NAME_HERE")) 
 .build()) 
 */ 
  
 // Optional: Creates a square logo image and sets it to the ad. 
  
 /* 
 .addSquareLogoImages( 
 AdImageAsset.newBuilder() 
 .setAsset(StringValue.of("INSERT_SQUARE_LOGO_IMAGE_RESOURCE_NAME_HERE")) 
 .build()) 
 */ 
  
 . 
 build 
 (); 
  
 // Creates the ad. 
  
 Ad 
  
 ad 
  
 = 
  
 Ad 
 . 
 newBuilder 
 () 
  
 . 
 setResponsiveDisplayAd 
 ( 
 responsiveDisplayAdInfo 
 ) 
  
 . 
 addFinalUrls 
 ( 
 "http://www.example.com/" 
 ) 
  
 . 
 build 
 (); 
  
 // Creates the ad group ad. 
  
 AdGroupAd 
  
 adGroupAd 
  
 = 
  
 AdGroupAd 
 . 
 newBuilder 
 (). 
 setAdGroup 
 ( 
 adGroupResourceName 
 ). 
 setAd 
 ( 
 ad 
 ). 
 build 
 (); 
  
 // Creates the ad group ad operation. 
  
 AdGroupAdOperation 
  
 operation 
  
 = 
  
 AdGroupAdOperation 
 . 
 newBuilder 
 (). 
 setCreate 
 ( 
 adGroupAd 
 ). 
 build 
 (); 
  
 // Creates the ad group ad service client. 
  
 try 
  
 ( 
 AdGroupAdServiceClient 
  
 adGroupAdServiceClient 
  
 = 
  
 googleAdsClient 
 . 
 getLatestVersion 
 (). 
 createAdGroupAdServiceClient 
 ()) 
  
 { 
  
 // Adds the ad group ad. 
  
 MutateAdGroupAdsResponse 
  
 response 
  
 = 
  
 adGroupAdServiceClient 
 . 
 mutateAdGroupAds 
 ( 
  
 Long 
 . 
 toString 
 ( 
 customerId 
 ), 
  
 ImmutableList 
 . 
 of 
 ( 
 operation 
 )); 
  
 System 
 . 
 out 
 . 
 printf 
 ( 
  
 "Created ad group ad with resource name '%s'.%n" 
 , 
  
 response 
 . 
 getResults 
 ( 
 0 
 ). 
 getResourceName 
 ()); 
  
 } 
  
 } 
  
 /** 
 * Adds an image to the Google Ads account. 
 * 
 * @param googleAdsClient the Google Ads API client. 
 * @param customerId the client customer ID. 
 * @param imageUrl the url of the image. 
 * @param assetName the name of the asset. 
 * @throws GoogleAdsException if an API request failed with one or more service errors. 
 */ 
  
 private 
  
 String 
  
 uploadAsset 
 ( 
  
 GoogleAdsClient 
  
 googleAdsClient 
 , 
  
 long 
  
 customerId 
 , 
  
 String 
  
 imageUrl 
 , 
  
 String 
  
 assetName 
 ) 
  
 throws 
  
 IOException 
  
 { 
  
 byte 
 [] 
  
 imageData 
  
 = 
  
 ByteStreams 
 . 
 toByteArray 
 ( 
 new 
  
 URL 
 ( 
 imageUrl 
 ). 
 openStream 
 ()); 
  
 // Creates the image asset. 
  
 Asset 
  
 asset 
  
 = 
  
 Asset 
 . 
 newBuilder 
 () 
  
 . 
 setName 
 ( 
 assetName 
 ) 
  
 . 
 setType 
 ( 
 AssetType 
 . 
 IMAGE 
 ) 
  
 . 
 setImageAsset 
 ( 
 ImageAsset 
 . 
 newBuilder 
 (). 
 setData 
 ( 
 ByteString 
 . 
 copyFrom 
 ( 
 imageData 
 )). 
 build 
 ()) 
  
 . 
 build 
 (); 
  
 // Creates the asset operation. 
  
 AssetOperation 
  
 operation 
  
 = 
  
 AssetOperation 
 . 
 newBuilder 
 (). 
 setCreate 
 ( 
 asset 
 ). 
 build 
 (); 
  
 // Creates the asset service client. 
  
 try 
  
 ( 
 AssetServiceClient 
  
 assetServiceClient 
  
 = 
  
 googleAdsClient 
 . 
 getLatestVersion 
 (). 
 createAssetServiceClient 
 ()) 
  
 { 
  
 // Adds the image asset. 
  
 MutateAssetsResponse 
  
 response 
  
 = 
  
 assetServiceClient 
 . 
 mutateAssets 
 ( 
 Long 
 . 
 toString 
 ( 
 customerId 
 ), 
  
 ImmutableList 
 . 
 of 
 ( 
 operation 
 )); 
  
 String 
  
 imageResourceName 
  
 = 
  
 response 
 . 
 getResults 
 ( 
 0 
 ). 
 getResourceName 
 (); 
  
 System 
 . 
 out 
 . 
 printf 
 ( 
 "Created image asset with resource name '%s'.%n" 
 , 
  
 imageResourceName 
 ); 
  
 return 
  
 imageResourceName 
 ; 
  
 } 
  
 } 
  
 /** 
 * Targets a user list. 
 * 
 * @param googleAdsClient the Google Ads API client. 
 * @param customerId the client customer ID. 
 * @param adGroupResourceName the campaign resource name. 
 * @param userListId ID of the user list. 
 * @throws GoogleAdsException if an API request failed with one or more service errors. 
 */ 
  
 private 
  
 void 
  
 attachUserList 
 ( 
  
 GoogleAdsClient 
  
 googleAdsClient 
 , 
  
 long 
  
 customerId 
 , 
  
 String 
  
 adGroupResourceName 
 , 
  
 long 
  
 userListId 
 ) 
  
 { 
  
 String 
  
 userListResourceName 
  
 = 
  
 ResourceNames 
 . 
 userList 
 ( 
 customerId 
 , 
  
 userListId 
 ); 
  
 // Creates the ad group criterion that targets the user list. 
  
 AdGroupCriterion 
  
 adGroupCriterion 
  
 = 
  
 AdGroupCriterion 
 . 
 newBuilder 
 () 
  
 . 
 setAdGroup 
 ( 
 adGroupResourceName 
 ) 
  
 . 
 setUserList 
 ( 
 UserListInfo 
 . 
 newBuilder 
 (). 
 setUserList 
 ( 
 userListResourceName 
 ). 
 build 
 ()) 
  
 . 
 build 
 (); 
  
 // Creates the ad group criterion operation. 
  
 AdGroupCriterionOperation 
  
 operation 
  
 = 
  
 AdGroupCriterionOperation 
 . 
 newBuilder 
 (). 
 setCreate 
 ( 
 adGroupCriterion 
 ). 
 build 
 (); 
  
 // Creates the ad group criterion service client. 
  
 try 
  
 ( 
 AdGroupCriterionServiceClient 
  
 adGroupCriterionServiceClient 
  
 = 
  
 googleAdsClient 
 . 
 getLatestVersion 
 (). 
 createAdGroupCriterionServiceClient 
 ()) 
  
 { 
  
 // Adds the ad group criterion. 
  
 MutateAdGroupCriteriaResponse 
  
 response 
  
 = 
  
 adGroupCriterionServiceClient 
 . 
 mutateAdGroupCriteria 
 ( 
  
 Long 
 . 
 toString 
 ( 
 customerId 
 ), 
  
 ImmutableList 
 . 
 of 
 ( 
 operation 
 )); 
  
 System 
 . 
 out 
 . 
 printf 
 ( 
  
 "Created ad group criterion with resource name '%s'.%n" 
 , 
  
 response 
 . 
 getResults 
 ( 
 0 
 ). 
 getResourceName 
 ()); 
  
 } 
  
 } 
 } 
  
  

C#

 // Copyright 2020 Google LLC 
 // 
 // Licensed under the Apache License, Version 2.0 (the "License"); 
 // you may not use this file except in compliance with the License. 
 // You may obtain a copy of the License at 
 // 
 //     http://www.apache.org/licenses/LICENSE-2.0 
 // 
 // Unless required by applicable law or agreed to in writing, software 
 // distributed under the License is distributed on an "AS IS" BASIS, 
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
 // See the License for the specific language governing permissions and 
 // limitations under the License. 
 using 
  
 CommandLine 
 ; 
 using 
  
 Google.Ads.Gax.Examples 
 ; 
 using 
  
 Google.Ads.Gax.Util 
 ; 
 using 
  
 Google.Ads.GoogleAds.Lib 
 ; 
 using 
  
 Google.Ads.GoogleAds.V23.Common 
 ; 
 using 
  
 Google.Ads.GoogleAds.V23.Errors 
 ; 
 using 
  
 Google.Ads.GoogleAds.V23.Resources 
 ; 
 using 
  
 Google.Ads.GoogleAds.V23.Services 
 ; 
 using 
  
 Google.Protobuf 
 ; 
 using 
  
 System 
 ; 
 using 
  
 System.Linq 
 ; 
 using 
  
 static 
  
 Google 
 . 
 Ads 
 . 
 GoogleAds 
 . 
 V23 
 . 
 Enums 
 . 
 AdGroupStatusEnum 
 . 
 Types 
 ; 
 using 
  
 static 
  
 Google 
 . 
 Ads 
 . 
 GoogleAds 
 . 
 V23 
 . 
 Enums 
 . 
 AdvertisingChannelTypeEnum 
 . 
 Types 
 ; 
 using 
  
 static 
  
 Google 
 . 
 Ads 
 . 
 GoogleAds 
 . 
 V23 
 . 
 Enums 
 . 
 AssetTypeEnum 
 . 
 Types 
 ; 
 using 
  
 static 
  
 Google 
 . 
 Ads 
 . 
 GoogleAds 
 . 
 V23 
 . 
 Enums 
 . 
 CampaignStatusEnum 
 . 
 Types 
 ; 
 using 
  
 static 
  
 Google 
 . 
 Ads 
 . 
 GoogleAds 
 . 
 V23 
 . 
 Enums 
 . 
 DisplayAdFormatSettingEnum 
 . 
 Types 
 ; 
 using 
  
 static 
  
 Google 
 . 
 Ads 
 . 
 GoogleAds 
 . 
 V23 
 . 
 Enums 
 . 
 EuPoliticalAdvertisingStatusEnum 
 . 
 Types 
 ; 
 namespace 
  
 Google.Ads.GoogleAds.Examples.V23 
 { 
  
 /// <summary> 
  
 /// This code example creates a shopping campaign associated with an existing Merchant Center 
  
 /// account, along with a related ad group and responsive display ad, and targets a user list 
  
 /// for remarketing purposes. 
  
 /// </summary> 
  
 public 
  
 class 
  
 AddMerchantCenterDynamicRemarketingCampaign 
  
 : 
  
 ExampleBase 
  
 { 
  
 /// <summary> 
  
 /// Command line options for running the 
  
 /// <see cref="AddMerchantCenterDynamicRemarketingCampaign"/> example. 
  
 /// </summary> 
  
 public 
  
 class 
  
 Options 
  
 : 
  
 OptionsBase 
  
 { 
  
 /// <summary> 
  
 /// The Google Ads customer ID for which the call is made. 
  
 /// </summary> 
  
 [Option("customerId", Required = true, HelpText = 
 "The Google Ads customer ID for which the call is made.")] 
  
 public 
  
 long 
  
 CustomerId 
  
 { 
  
 get 
 ; 
  
 set 
 ; 
  
 } 
  
 /// <summary> 
  
 /// ID of the Merchant Center account to be associated with the new campaign. 
  
 /// </summary> 
  
 [Option("merchantCenterAccountId", Required = true, HelpText = 
 "ID of the Merchant Center account to be associated with the new campaign.")] 
  
 public 
  
 long 
  
 MerchantCenterAccountId 
  
 { 
  
 get 
 ; 
  
 set 
 ; 
  
 } 
  
 /// <summary> 
  
 /// ID of the campaign budget to be associated with the new campaign. 
  
 /// </summary> 
  
 [Option("campaignBudgetId", Required = true, HelpText = 
 "ID of the campaign budget to be associated with the new campaign.")] 
  
 public 
  
 long 
  
 CampaignBudgetId 
  
 { 
  
 get 
 ; 
  
 set 
 ; 
  
 } 
  
 /// <summary> 
  
 /// ID of the user list to be used for remarketing. 
  
 /// </summary> 
  
 [Option("userListId", Required = true, HelpText = 
 "ID of the user list to be used for remarketing.")] 
  
 public 
  
 long 
  
 UserListId 
  
 { 
  
 get 
 ; 
  
 set 
 ; 
  
 } 
  
 } 
  
 /// <summary> 
  
 /// Main method, to run this code example as a standalone application. 
  
 /// </summary> 
  
 /// <param name="args">The command line arguments.</param> 
  
 public 
  
 static 
  
 void 
  
 Main 
 ( 
 string 
 [] 
  
 args 
 ) 
  
 { 
  
 Options 
  
 options 
  
 = 
  
 ExampleUtilities 
 . 
 ParseCommandLine<Options> 
 ( 
 args 
 ); 
  
 AddMerchantCenterDynamicRemarketingCampaign 
  
 codeExample 
  
 = 
  
 new 
  
 AddMerchantCenterDynamicRemarketingCampaign 
 (); 
  
 Console 
 . 
 WriteLine 
 ( 
 codeExample 
 . 
 Description 
 ); 
  
 codeExample 
 . 
 Run 
 ( 
 new 
  
 GoogleAdsClient 
 (), 
  
 options 
 . 
 CustomerId 
 , 
  
 options 
 . 
 MerchantCenterAccountId 
 , 
  
 options 
 . 
 CampaignBudgetId 
 , 
  
 options 
 . 
 UserListId 
 ); 
  
 } 
  
 /// <summary> 
  
 /// Returns a description about the code example. 
  
 /// </summary> 
  
 public 
  
 override 
  
 string 
  
 Description 
  
 = 
>  
 "This code example creates a shopping campaign associated with an existing Merchant " 
  
 + 
  
 "Center account, along with a related ad group and responsive display ad, and " 
  
 + 
  
 "targets a user list for remarketing purposes." 
 ; 
  
 /// <summary> 
  
 /// Runs the code example. 
  
 /// </summary> 
  
 /// <param name="client">The Google Ads client.</param> 
  
 /// <param name="customerId">The Google Ads customer ID for which the call is made.</param> 
  
 /// <param name="merchantCenterAccountId">ID of the Merchant Center account to be 
  
 /// associated with the new campaign.</param> 
  
 /// <param name="campaignBudgetId">ID of the campaign budget to be associated with the new 
  
 /// campaign.</param> 
  
 /// <param name="userListId">ID of the user list to be used for remarketing.</param> 
  
 public 
  
 void 
  
 Run 
 ( 
 GoogleAdsClient 
  
 client 
 , 
  
 long 
  
 customerId 
 , 
  
 long 
  
 merchantCenterAccountId 
 , 
  
 long 
  
 campaignBudgetId 
 , 
  
 long 
  
 userListId 
 ) 
  
 { 
  
 try 
  
 { 
  
 // Creates a shopping campaign associated with a given Merchant Center account. 
  
 string 
  
 campaignResourceName 
  
 = 
  
 CreateCampaign 
 ( 
 client 
 , 
  
 customerId 
 , 
  
 merchantCenterAccountId 
 , 
  
 campaignBudgetId 
 ); 
  
 // Creates an ad group for the campaign. 
  
 string 
  
 adGroupResourceName 
  
 = 
  
 CreateAdGroup 
 ( 
 client 
 , 
  
 customerId 
 , 
  
 campaignResourceName 
 ); 
  
 // Creates a responsive display ad in the ad group. 
  
 CreateAd 
 ( 
 client 
 , 
  
 customerId 
 , 
  
 adGroupResourceName 
 ); 
  
 // Targets a specific user list for remarketing. 
  
 AttachUserList 
 ( 
 client 
 , 
  
 customerId 
 , 
  
 adGroupResourceName 
 , 
  
 userListId 
 ); 
  
 } 
  
 catch 
  
 ( 
 GoogleAdsException 
  
 e 
 ) 
  
 { 
  
 Console 
 . 
 WriteLine 
 ( 
 "Failure:" 
 ); 
  
 Console 
 . 
 WriteLine 
 ( 
 $"Message: {e.Message}" 
 ); 
  
 Console 
 . 
 WriteLine 
 ( 
 $"Failure: {e.Failure}" 
 ); 
  
 Console 
 . 
 WriteLine 
 ( 
 $"Request ID: {e.RequestId}" 
 ); 
  
 throw 
 ; 
  
 } 
  
 } 
  
 /// <summary> 
  
 /// Creates a campaign linked to a Merchant Center product feed. 
  
 /// </summary> 
  
 /// <param name="client">The Google Ads API client.</param> 
  
 /// <param name="customerId">The client customer ID.</param> 
  
 /// <param name="merchantCenterAccountId">The Merchant Center account ID.</param> 
  
 /// <param name="campaignBudgetId">The campaign budget ID.</param> 
  
 /// <returns>The string resource name for the newly created campaign.</returns> 
  
 private 
  
 string 
  
 CreateCampaign 
 ( 
 GoogleAdsClient 
  
 client 
 , 
  
 long 
  
 customerId 
 , 
  
 long 
  
 merchantCenterAccountId 
 , 
  
 long 
  
 campaignBudgetId 
 ) 
  
 { 
  
 // Creates the Campaign Service client. 
  
 CampaignServiceClient 
  
 campaignServiceClient 
  
 = 
  
 client 
 . 
 GetService 
 ( 
 Services 
 . 
 V23 
 . 
 CampaignService 
 ); 
  
 string 
  
 budgetResourceName 
  
 = 
  
 ResourceNames 
 . 
 CampaignBudget 
 ( 
 customerId 
 , 
  
 campaignBudgetId 
 ); 
  
 // Creates the campaign. 
  
 Campaign 
  
 campaign 
  
 = 
  
 new 
  
 Campaign 
 () 
  
 { 
  
 Name 
  
 = 
  
 "Shopping campaign #" 
  
 + 
  
 ExampleUtilities 
 . 
 GetRandomString 
 (), 
  
 // Dynamic remarketing campaigns are only available on the Google Display Network. 
  
 AdvertisingChannelType 
  
 = 
  
 AdvertisingChannelType 
 . 
 Display 
 , 
  
 Status 
  
 = 
  
 CampaignStatus 
 . 
 Paused 
 , 
  
 CampaignBudget 
  
 = 
  
 budgetResourceName 
 , 
  
 ManualCpc 
  
 = 
  
 new 
  
 ManualCpc 
 (), 
  
 // The settings for the shopping campaign. 
  
 // This connects the campaign to the Merchant Center account. 
  
 ShoppingSetting 
  
 = 
  
 new 
  
 Campaign 
 . 
 Types 
 . 
 ShoppingSetting 
 () 
  
 { 
  
 CampaignPriority 
  
 = 
  
 0 
 , 
  
 MerchantId 
  
 = 
  
 merchantCenterAccountId 
 , 
  
 EnableLocal 
  
 = 
  
 true 
  
 }, 
  
 // Declare whether or not this campaign contains political ads targeting the EU. 
  
 ContainsEuPoliticalAdvertising 
  
 = 
  
 EuPoliticalAdvertisingStatus 
 . 
 DoesNotContainEuPoliticalAdvertising 
 , 
  
 }; 
  
 // Creates the campaign operation. 
  
 CampaignOperation 
  
 operation 
  
 = 
  
 new 
  
 CampaignOperation 
 () 
  
 { 
  
 Create 
  
 = 
  
 campaign 
  
 }; 
  
 // Adds the campaign. 
  
 MutateCampaignsResponse 
  
 response 
  
 = 
  
 campaignServiceClient 
 . 
 MutateCampaigns 
 ( 
 customerId 
  
 . 
 ToString 
 (), 
  
 new 
 [] 
  
 { 
  
 operation 
  
 }); 
  
 string 
  
 campaignResourceName 
  
 = 
  
 response 
 . 
 Results 
 . 
 First 
 (). 
 ResourceName 
 ; 
  
 Console 
 . 
 WriteLine 
 ( 
 $"Created campaign with resource name '{campaignResourceName}'." 
 ); 
  
 return 
  
 campaignResourceName 
 ; 
  
 } 
  
 /// <summary> 
  
 /// Creates an ad group for the remarketing campaign. 
  
 /// </summary> 
  
 /// <param name="client">The Google Ads API client.</param> 
  
 /// <param name="customerId">The client customer ID.</param> 
  
 /// <param name="campaignResourceName">The campaign resource name.</param> 
  
 /// <returns>The string resource name for the newly created ad group.</returns> 
  
 private 
  
 string 
  
 CreateAdGroup 
 ( 
 GoogleAdsClient 
  
 client 
 , 
  
 long 
  
 customerId 
 , 
  
 string 
  
 campaignResourceName 
 ) 
  
 { 
  
 // Creates the ad group service client. 
  
 AdGroupServiceClient 
  
 adGroupServiceClient 
  
 = 
  
 client 
 . 
 GetService 
 ( 
 Services 
 . 
 V23 
 . 
 AdGroupService 
 ); 
  
 // Creates the ad group. 
  
 AdGroup 
  
 adGroup 
  
 = 
  
 new 
  
 AdGroup 
 () 
  
 { 
  
 Name 
  
 = 
  
 "Dynamic remarketing ad group" 
 , 
  
 Campaign 
  
 = 
  
 campaignResourceName 
 , 
  
 Status 
  
 = 
  
 AdGroupStatus 
 . 
 Enabled 
  
 }; 
  
 // Creates the ad group operation. 
  
 AdGroupOperation 
  
 operation 
  
 = 
  
 new 
  
 AdGroupOperation 
 () 
  
 { 
  
 Create 
  
 = 
  
 adGroup 
  
 }; 
  
 // Adds the ad group. 
  
 MutateAdGroupsResponse 
  
 response 
  
 = 
  
 adGroupServiceClient 
 . 
 MutateAdGroups 
 ( 
  
 customerId 
 . 
 ToString 
 (), 
  
 new 
 [] 
  
 { 
  
 operation 
  
 }); 
  
 string 
  
 adGroupResourceName 
  
 = 
  
 response 
 . 
 Results 
 . 
 First 
 (). 
 ResourceName 
 ; 
  
 Console 
 . 
 WriteLine 
 ( 
 $"Created ad group with resource name '{adGroupResourceName}'." 
 ); 
  
 return 
  
 adGroupResourceName 
 ; 
  
 } 
  
 /// <summary> 
  
 /// Creates the responsive display ad. 
  
 /// </summary> 
  
 /// <param name="client">The Google Ads API client.</param> 
  
 /// <param name="customerId">The client customer ID.</param> 
  
 /// <param name="adGroupResourceName">The ad group resource name to receive the ad.</param> 
  
 private 
  
 void 
  
 CreateAd 
 ( 
 GoogleAdsClient 
  
 client 
 , 
  
 long 
  
 customerId 
 , 
  
 string 
  
 adGroupResourceName 
 ) 
  
 { 
  
 // Creates the ad group ad service client. 
  
 AdGroupAdServiceClient 
  
 adGroupAdServiceClient 
  
 = 
  
 client 
 . 
 GetService 
 ( 
 Services 
 . 
 V23 
 . 
 AdGroupAdService 
 ); 
  
 string 
  
 marketingImageUrl 
  
 = 
  
 "https://gaagl.page.link/Eit5" 
 ; 
  
 string 
  
 marketingImageName 
  
 = 
  
 "Marketing Image" 
 ; 
  
 string 
  
 marketingImageResourceName 
  
 = 
  
 UploadAsset 
 ( 
 client 
 , 
  
 customerId 
 , 
  
 marketingImageUrl 
 , 
  
 marketingImageName 
 ); 
  
 string 
  
 squareMarketingImageName 
  
 = 
  
 "Square Marketing Image" 
 ; 
  
 string 
  
 squareMarketingImageUrl 
  
 = 
  
 "https://gaagl.page.link/bjYi" 
 ; 
  
 string 
  
 squareMarketingImageResourceName 
  
 = 
  
 UploadAsset 
 ( 
 client 
 , 
  
 customerId 
 , 
  
 squareMarketingImageUrl 
 , 
  
 squareMarketingImageName 
 ); 
  
 // Creates the responsive display ad info object. 
  
 ResponsiveDisplayAdInfo 
  
 responsiveDisplayAdInfo 
  
 = 
  
 new 
  
 ResponsiveDisplayAdInfo 
 () 
  
 { 
  
 MarketingImages 
  
 = 
  
 { 
  
 new 
  
 AdImageAsset 
 () 
  
 { 
  
 Asset 
  
 = 
  
 marketingImageResourceName 
  
 } 
  
 }, 
  
 SquareMarketingImages 
  
 = 
  
 { 
  
 new 
  
 AdImageAsset 
 () 
  
 { 
  
 Asset 
  
 = 
  
 squareMarketingImageResourceName 
  
 } 
  
 }, 
  
 Headlines 
  
 = 
  
 { 
  
 new 
  
 AdTextAsset 
 () 
  
 { 
  
 Text 
  
 = 
  
 "Travel" 
  
 } 
  
 }, 
  
 LongHeadline 
  
 = 
  
 new 
  
 AdTextAsset 
 () 
  
 { 
  
 Text 
  
 = 
  
 "Travel the World" 
  
 }, 
  
 Descriptions 
  
 = 
  
 { 
  
 new 
  
 AdTextAsset 
 () 
  
 { 
  
 Text 
  
 = 
  
 "Take to the air!" 
  
 } 
  
 }, 
  
 BusinessName 
  
 = 
  
 "Interplanetary Cruises" 
 , 
  
 // Optional: Call to action text. 
  
 // Valid texts: https://support.google.com/adwords/answer/7005917 
  
 CallToActionText 
  
 = 
  
 "Apply Now" 
 , 
  
 // Optional: Sets the ad colors. 
  
 MainColor 
  
 = 
  
 "#0000ff" 
 , 
  
 AccentColor 
  
 = 
  
 "#ffff00" 
 , 
  
 // Optional: Sets to false to strictly render the ad using the colors. 
  
 AllowFlexibleColor 
  
 = 
  
 false 
 , 
  
 // Optional: Sets the format setting that the ad will be served in. 
  
 FormatSetting 
  
 = 
  
 DisplayAdFormatSetting 
 . 
 NonNative 
 , 
  
 // Optional: Creates a logo image and sets it to the ad. 
  
 /* 
 LogoImages = { new AdImageAsset() 
 { 
 Asset = "INSERT_LOGO_IMAGE_RESOURCE_NAME_HERE" 
 }} 
 */ 
  
 // Optional: Creates a square logo image and sets it to the ad. 
  
 /* 
 SquareLogoImages = { new AdImageAsset() 
 { 
 Asset = "INSERT_SQUARE_LOGO_IMAGE_RESOURCE_NAME_HERE" 
 }} 
 */ 
  
 }; 
  
 // Creates the ad. 
  
 Ad 
  
 ad 
  
 = 
  
 new 
  
 Ad 
 () 
  
 { 
  
 ResponsiveDisplayAd 
  
 = 
  
 responsiveDisplayAdInfo 
 , 
  
 FinalUrls 
  
 = 
  
 { 
  
 "http://www.example.com/" 
  
 } 
  
 }; 
  
 // Creates the ad group ad. 
  
 AdGroupAd 
  
 adGroupAd 
  
 = 
  
 new 
  
 AdGroupAd 
 () 
  
 { 
  
 AdGroup 
  
 = 
  
 adGroupResourceName 
 , 
  
 Ad 
  
 = 
  
 ad 
  
 }; 
  
 // Creates the ad group ad operation. 
  
 AdGroupAdOperation 
  
 operation 
  
 = 
  
 new 
  
 AdGroupAdOperation 
 () 
  
 { 
  
 Create 
  
 = 
  
 adGroupAd 
  
 }; 
  
 // Adds the ad group ad. 
  
 MutateAdGroupAdsResponse 
  
 response 
  
 = 
  
 adGroupAdServiceClient 
 . 
 MutateAdGroupAds 
  
 ( 
 customerId 
 . 
 ToString 
 (), 
  
 new 
 [] 
  
 { 
  
 operation 
  
 }); 
  
 Console 
 . 
 WriteLine 
 ( 
 "Created ad group ad with resource name " 
  
 + 
  
 $"'{response.Results.First().ResourceName}'." 
 ); 
  
 } 
  
 /// <summary> 
  
 /// Adds an image to the Google Ads account. 
  
 /// </summary> 
  
 /// <param name="client">The Google Ads API client.</param> 
  
 /// <param name="customerId">The client customer ID.</param> 
  
 /// <param name="imageUrl">The URL of the image.</param> 
  
 /// <param name="assetName">The name of the asset.</param> 
  
 /// <returns>The string resource name of the newly uploaded asset.</returns> 
  
 private 
  
 string 
  
 UploadAsset 
 ( 
 GoogleAdsClient 
  
 client 
 , 
  
 long 
  
 customerId 
 , 
  
 string 
  
 imageUrl 
 , 
  
 string 
  
 assetName 
 ) 
  
 { 
  
 // Creates the asset service client. 
  
 AssetServiceClient 
  
 assetServiceClient 
  
 = 
  
 client 
 . 
 GetService 
 ( 
 Services 
 . 
 V23 
 . 
 AssetService 
 ); 
  
 byte 
 [] 
  
 imageData 
  
 = 
  
 MediaUtilities 
 . 
 GetAssetDataFromUrl 
 ( 
 imageUrl 
 , 
  
 client 
 . 
 Config 
 ); 
  
 // Creates the image asset. 
  
 Asset 
  
 asset 
  
 = 
  
 new 
  
 Asset 
 () 
  
 { 
  
 Name 
  
 = 
  
 assetName 
 , 
  
 Type 
  
 = 
  
 AssetType 
 . 
 Image 
 , 
  
 ImageAsset 
  
 = 
  
 new 
  
 ImageAsset 
 () 
  
 { 
  
 Data 
  
 = 
  
 ByteString 
 . 
 CopyFrom 
 ( 
 imageData 
 ) 
  
 } 
  
 }; 
  
 // Creates the asset operation. 
  
 AssetOperation 
  
 operation 
  
 = 
  
 new 
  
 AssetOperation 
 () 
  
 { 
  
 Create 
  
 = 
  
 asset 
  
 }; 
  
 // Adds the image asset. 
  
 MutateAssetsResponse 
  
 response 
  
 = 
  
 assetServiceClient 
 . 
 MutateAssets 
 ( 
 customerId 
 . 
 ToString 
 () 
  
 , 
  
 new 
 [] 
  
 { 
  
 operation 
  
 }); 
  
 string 
  
 imageResourceName 
  
 = 
  
 response 
 . 
 Results 
 . 
 First 
 (). 
 ResourceName 
 ; 
  
 Console 
 . 
 WriteLine 
 ( 
 $"Created image asset with resource name '{imageResourceName}'." 
 ); 
  
 return 
  
 imageResourceName 
 ; 
  
 } 
  
 /// <summary> 
  
 /// Targets the specified user list to the specified ad group. 
  
 /// </summary> 
  
 /// <param name="client">The Google Ads API client.</param> 
  
 /// <param name="customerId">The client customer ID.</param> 
  
 /// <param name="adGroupResourceName">The campaign resource name.</param> 
  
 /// <param name="userListId">The user list ID.</param> 
  
 private 
  
 void 
  
 AttachUserList 
 ( 
 GoogleAdsClient 
  
 client 
 , 
  
 long 
  
 customerId 
 , 
  
 string 
  
 adGroupResourceName 
 , 
  
 long 
  
 userListId 
 ) 
  
 { 
  
 // Creates the ad group criterion service client. 
  
 AdGroupCriterionServiceClient 
  
 adGroupCriterionServiceClient 
  
 = 
  
 client 
 . 
 GetService 
  
 ( 
 Services 
 . 
 V23 
 . 
 AdGroupCriterionService 
 ); 
  
 string 
  
 userListResourceName 
  
 = 
  
 ResourceNames 
 . 
 UserList 
 ( 
 customerId 
 , 
  
 userListId 
 ); 
  
 // Creates the ad group criterion that targets the user list. 
  
 AdGroupCriterion 
  
 adGroupCriterion 
  
 = 
  
 new 
  
 AdGroupCriterion 
 () 
  
 { 
  
 AdGroup 
  
 = 
  
 adGroupResourceName 
 , 
  
 UserList 
  
 = 
  
 new 
  
 UserListInfo 
 () 
  
 { 
  
 UserList 
  
 = 
  
 userListResourceName 
  
 } 
  
 }; 
  
 // Creates the ad group criterion operation. 
  
 AdGroupCriterionOperation 
  
 operation 
  
 = 
  
 new 
  
 AdGroupCriterionOperation 
 () 
  
 { 
  
 Create 
  
 = 
  
 adGroupCriterion 
  
 }; 
  
 // Adds the ad group criterion. 
  
 MutateAdGroupCriteriaResponse 
  
 response 
  
 = 
  
 adGroupCriterionServiceClient 
  
 . 
 MutateAdGroupCriteria 
 ( 
 customerId 
 . 
 ToString 
 (), 
  
 new 
 [] 
  
 { 
  
 operation 
  
 }); 
  
 Console 
 . 
 WriteLine 
 ( 
 "Created ad group criterion with resource name " 
  
 + 
  
 $"'{response.Results.First().ResourceName}'." 
 ); 
  
 } 
  
 } 
 } 
  
  

PHP

< ?php 
 /** 
 * Copyright 2020 Google LLC 
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); 
 * you may not use this file except in compliance with the License. 
 * You may obtain a copy of the License at 
 * 
 *     https://www.apache.org/licenses/LICENSE-2.0 
 * 
 * Unless required by applicable law or agreed to in writing, software 
 * distributed under the License is distributed on an "AS IS" BASIS, 
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
 * See the License for the specific language governing permissions and 
 * limitations under the License. 
 */ 
 namespace Google\Ads\GoogleAds\Examples\Remarketing; 
 require __DIR__ . '/../../vendor/autoload.php'; 
 use GetOpt\GetOpt; 
 use Google\Ads\GoogleAds\Examples\Utils\ArgumentNames; 
 use Google\Ads\GoogleAds\Examples\Utils\ArgumentParser; 
 use Google\Ads\GoogleAds\Examples\Utils\Helper; 
 use Google\Ads\GoogleAds\Lib\V23\GoogleAdsClient; 
 use Google\Ads\GoogleAds\Lib\V23\GoogleAdsClientBuilder; 
 use Google\Ads\GoogleAds\Lib\V23\GoogleAdsException; 
 use Google\Ads\GoogleAds\Lib\OAuth2TokenBuilder; 
 use Google\Ads\GoogleAds\Util\V23\ResourceNames; 
 use Google\Ads\GoogleAds\V23\Common\AdImageAsset; 
 use Google\Ads\GoogleAds\V23\Common\AdTextAsset; 
 use Google\Ads\GoogleAds\V23\Common\ImageAsset; 
 use Google\Ads\GoogleAds\V23\Common\ManualCpc; 
 use Google\Ads\GoogleAds\V23\Common\ResponsiveDisplayAdInfo; 
 use Google\Ads\GoogleAds\V23\Common\UserListInfo; 
 use Google\Ads\GoogleAds\V23\Enums\AdGroupStatusEnum\AdGroupStatus; 
 use Google\Ads\GoogleAds\V23\Enums\AdvertisingChannelTypeEnum\AdvertisingChannelType; 
 use Google\Ads\GoogleAds\V23\Enums\AssetTypeEnum\AssetType; 
 use Google\Ads\GoogleAds\V23\Enums\CampaignStatusEnum\CampaignStatus; 
 use Google\Ads\GoogleAds\V23\Enums\DisplayAdFormatSettingEnum\DisplayAdFormatSetting; 
 use Google\Ads\GoogleAds\V23\Enums\EuPoliticalAdvertisingStatusEnum\EuPoliticalAdvertisingStatus; 
 use Google\Ads\GoogleAds\V23\Errors\GoogleAdsError; 
 use Google\Ads\GoogleAds\V23\Resources\Ad; 
 use Google\Ads\GoogleAds\V23\Resources\AdGroup; 
 use Google\Ads\GoogleAds\V23\Resources\AdGroupAd; 
 use Google\Ads\GoogleAds\V23\Resources\AdGroupCriterion; 
 use Google\Ads\GoogleAds\V23\Resources\Asset; 
 use Google\Ads\GoogleAds\V23\Resources\Campaign; 
 use Google\Ads\GoogleAds\V23\Resources\Campaign\ShoppingSetting; 
 use Google\Ads\GoogleAds\V23\Services\AdGroupAdOperation; 
 use Google\Ads\GoogleAds\V23\Services\AdGroupCriterionOperation; 
 use Google\Ads\GoogleAds\V23\Services\AdGroupOperation; 
 use Google\Ads\GoogleAds\V23\Services\AssetOperation; 
 use Google\Ads\GoogleAds\V23\Services\CampaignOperation; 
 use Google\Ads\GoogleAds\V23\Services\MutateAdGroupAdsRequest; 
 use Google\Ads\GoogleAds\V23\Services\MutateAdGroupCriteriaRequest; 
 use Google\Ads\GoogleAds\V23\Services\MutateAdGroupsRequest; 
 use Google\Ads\GoogleAds\V23\Services\MutateAssetResult; 
 use Google\Ads\GoogleAds\V23\Services\MutateAssetsRequest; 
 use Google\Ads\GoogleAds\V23\Services\MutateCampaignsRequest; 
 use Google\ApiCore\ApiException; 
 /** 
 * This example creates a shopping campaign associated with an existing merchant center account, 
 * along with a related ad group and dynamic display ad, and targets a user list for remarketing 
 * purposes. 
 */ 
 class AddMerchantCenterDynamicRemarketingCampaign 
 { 
 private const CUSTOMER_ID = 'INSERT_CUSTOMER_ID_HERE'; 
 private const MERCHANT_CENTER_ACCOUNT_ID = 'INSERT_MERCHANT_CENTER_ACCOUNT_ID_HERE'; 
 private const CAMPAIGN_BUDGET_ID = 'INSERT_CAMPAIGN_BUDGET_ID_HERE'; 
 private const USER_LIST_ID = 'INSERT_USER_LIST_ID_HERE'; 
 public static function main() 
 { 
 // Either pass the required parameters for this example on the command line, or insert them 
 // into the constants above. 
 $options = (new ArgumentParser())->parseCommandArguments([ 
 ArgumentNames::CUSTOMER_ID => GetOpt::REQUIRED_ARGUMENT, 
 ArgumentNames::MERCHANT_CENTER_ACCOUNT_ID => GetOpt::REQUIRED_ARGUMENT, 
 ArgumentNames::CAMPAIGN_BUDGET_ID => GetOpt::REQUIRED_ARGUMENT, 
 ArgumentNames::USER_LIST_ID => GetOpt::REQUIRED_ARGUMENT 
 ]); 
 // Generate a refreshable OAuth2 credential for authentication. 
 $oAuth2Credential = (new OAuth2TokenBuilder())->fromFile()->build(); 
 // Construct a Google Ads client configured from a properties file and the 
 // OAuth2 credentials above. 
 $googleAdsClient = (new GoogleAdsClientBuilder()) 
 ->fromFile() 
 ->withOAuth2Credential($oAuth2Credential) 
 ->build(); 
 try { 
 self::runExample( 
 $googleAdsClient, 
 $options[ArgumentNames::CUSTOMER_ID] ?: self::CUSTOMER_ID, 
 $options[ArgumentNames::MERCHANT_CENTER_ACCOUNT_ID] 
 ?: self::MERCHANT_CENTER_ACCOUNT_ID, 
 $options[ArgumentNames::CAMPAIGN_BUDGET_ID] ?: self::CAMPAIGN_BUDGET_ID, 
 $options[ArgumentNames::USER_LIST_ID] ?: self::USER_LIST_ID 
 ); 
 } catch (GoogleAdsException $googleAdsException) { 
 printf( 
 "Request with ID '%s' has failed.%sGoogle Ads failure details:%s", 
 $googleAdsException->getRequestId(), 
 PHP_EOL, 
 PHP_EOL 
 ); 
 foreach ($googleAdsException->getGoogleAdsFailure()->getErrors() as $error) { 
 /** @var GoogleAdsError $error */ 
 printf( 
 "\t%s: %s%s", 
 $error->getErrorCode()->getErrorCode(), 
 $error->getMessage(), 
 PHP_EOL 
 ); 
 } 
 exit(1); 
 } catch (ApiException $apiException) { 
 printf( 
 "ApiException was thrown with message '%s'.%s", 
 $apiException->getMessage(), 
 PHP_EOL 
 ); 
 exit(1); 
 } 
 } 
 /** 
 * Runs the example. 
 * 
 * @param GoogleAdsClient $googleAdsClient the Google Ads API client 
 * @param int $customerId the customer ID 
 * @param int $merchantCenterAccountId the Merchant Center account ID 
 * @param int $campaignBudgetId the campaign budget ID 
 * @param int $userListId the user list ID 
 */ 
 public static function runExample( 
 GoogleAdsClient $googleAdsClient, 
 int $customerId, 
 int $merchantCenterAccountId, 
 int $campaignBudgetId, 
 int $userListId 
 ) { 
 // Creates a shopping campaign associated with a given merchant center account. 
 $campaignResourceName = self::createCampaign( 
 $googleAdsClient, 
 $customerId, 
 $merchantCenterAccountId, 
 $campaignBudgetId 
 ); 
 // Creates an ad group for the campaign. 
 $adGroupResourceName = 
 self::createAdGroup($googleAdsClient, $customerId, $campaignResourceName); 
 // Creates a dynamic display ad in the ad group. 
 self::createAd($googleAdsClient, $customerId, $adGroupResourceName); 
 // Targets a specific user list for remarketing. 
 self::attachUserList($googleAdsClient, $customerId, $adGroupResourceName, $userListId); 
 } 
 /** 
 * Creates a campaign linked to a Merchant Center product feed. 
 * 
 * @param GoogleAdsClient $googleAdsClient the Google Ads API client 
 * @param int $customerId the customer ID 
 * @param int $merchantCenterAccountId the Merchant Center account ID 
 * @param int $campaignBudgetId the campaign budget ID 
 * @return string the resource name of the newly created campaign 
 */ 
 private static function createCampaign( 
 GoogleAdsClient $googleAdsClient, 
 int $customerId, 
 int $merchantCenterAccountId, 
 int $campaignBudgetId 
 ): string { 
 // Configures the settings for the shopping campaign. 
 $shoppingSettings = new ShoppingSetting([ 
 'campaign_priority' => 0, 
 'merchant_id' => $merchantCenterAccountId, 
 'enable_local' => true 
 ]); 
 // Creates the campaign. 
 $campaign = new Campaign([ 
 'name' => 'Shopping campaign #' . Helper::getPrintableDatetime(), 
 // Dynamic remarketing campaigns are only available on the Google Display Network. 
 'advertising_channel_type' => AdvertisingChannelType::DISPLAY, 
 'status' => CampaignStatus::PAUSED, 
 'campaign_budget' => ResourceNames::forCampaignBudget($customerId, $campaignBudgetId), 
 'manual_cpc' => new ManualCpc(), 
 // Declare whether or not this campaign serves political ads targeting the EU. 
 'contains_eu_political_advertising' = 
> EuPoliticalAdvertisingStatus::DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING 
 // This connects the campaign to the merchant center account. 
 'shopping_setting' => $shoppingSettings 
 ]); 
 // Creates a campaign operation. 
 $campaignOperation = new CampaignOperation(); 
 $campaignOperation->setCreate($campaign); 
 // Issues a mutate request to add the campaign. 
 $campaignServiceClient = $googleAdsClient->getCampaignServiceClient(); 
 $response = $campaignServiceClient->mutateCampaigns( 
 MutateCampaignsRequest::build($customerId, [$campaignOperation]) 
 ); 
 /** @var Campaign $addedCampaign */ 
 $addedCampaign = $response->getResults()[0]; 
 $addedCampaignResourceName = $addedCampaign->getResourceName(); 
 printf("Created campaign with resource name '%s'.%s", $addedCampaignResourceName, PHP_EOL); 
 return $addedCampaignResourceName; 
 } 
 /** 
 * Creates an ad group for the remarketing campaign. 
 * 
 * @param GoogleAdsClient $googleAdsClient the Google Ads API client 
 * @param int $customerId the customer ID 
 * @param string $campaignResourceName the resource name of the campaign that 
 *     the new ad group will belong to 
 * @return string the resource name of the newly created ad group 
 */ 
 private static function createAdGroup( 
 GoogleAdsClient $googleAdsClient, 
 int $customerId, 
 string $campaignResourceName 
 ): string { 
 // Creates the ad group. 
 $adGroup = new AdGroup([ 
 'name' => 'Dynamic remarketing ad group', 
 'campaign' => $campaignResourceName, 
 'status' => AdGroupStatus::ENABLED 
 ]); 
 // Creates an ad group operation. 
 $adGroupOperation = new AdGroupOperation(); 
 $adGroupOperation->setCreate($adGroup); 
 // Issues a mutate request to add the ad group. 
 $adGroupServiceClient = $googleAdsClient->getAdGroupServiceClient(); 
 $response = $adGroupServiceClient->mutateAdGroups( 
 MutateAdGroupsRequest::build($customerId, [$adGroupOperation]) 
 ); 
 /** @var AdGroup $addedAdGroup */ 
 $addedAdGroup = $response->getResults()[0]; 
 $addedAdGroupResourceName = $addedAdGroup->getResourceName(); 
 printf("Created ad group with resource name '%s'.%s", $addedAdGroupResourceName, PHP_EOL); 
 return $addedAdGroupResourceName; 
 } 
 /** 
 * Creates the responsive display ad. 
 * 
 * @param GoogleAdsClient $googleAdsClient the Google Ads API client 
 * @param int $customerId the customer ID 
 * @param string $adGroupResourceName the resource name of the ad group that 
 *     the new ad group ad will belong to 
 */ 
 private static function createAd( 
 GoogleAdsClient $googleAdsClient, 
 int $customerId, 
 string $adGroupResourceName 
 ) { 
 $marketingImageResourceName = self::uploadAsset( 
 $googleAdsClient, 
 $customerId, 
 'https://gaagl.page.link/Eit5', 
 'Marketing Image' 
 ); 
 $squareMarketingImageResourceName = self::uploadAsset( 
 $googleAdsClient, 
 $customerId, 
 'https://gaagl.page.link/bjYi', 
 'Square Marketing Image' 
 ); 
 // Creates the responsive display ad info object. 
 $responsiveDisplayAdInfo = new ResponsiveDisplayAdInfo([ 
 'marketing_images' => [new AdImageAsset(['asset' => $marketingImageResourceName])], 
 'square_marketing_images' => [new AdImageAsset([ 
 'asset' => $squareMarketingImageResourceName 
 ])], 
 'headlines' => [new AdTextAsset(['text' => 'Travel'])], 
 'long_headline' => new AdTextAsset(['text' => 'Travel the World']), 
 'descriptions' => [new AdTextAsset(['text' => 'Take to the air!'])], 
 'business_name' => 'Interplanetary Cruises', 
 // Optional: Call to action text. 
 // Valid texts: https://support.google.com/google-ads/answer/7005917 
 'call_to_action_text' => 'Apply Now', 
 // Optional: Sets the ad colors. 
 'main_color' => '#0000ff', 
 'accent_color' => '#ffff00', 
 // Optional: Sets to false to strictly render the ad using the colors. 
 'allow_flexible_color' => false, 
 // Optional: Sets the format setting that the ad will be served in. 
 'format_setting' => DisplayAdFormatSetting::NON_NATIVE 
 // Optional: Creates a logo image and sets it to the ad. 
 // 'logo_images' => [new AdImageAsset([ 
 //     'asset' => 'INSERT_LOGO_IMAGE_RESOURCE_NAME_HERE' 
 // ])], 
 // Optional: Creates a square logo image and sets it to the ad. 
 // 'square_logo_images' => [new AdImageAsset([ 
 //     'asset' => 'INSERT_SQUARE_LOGO_IMAGE_RESOURCE_NAME_HERE' 
 // ])] 
 ]); 
 // Creates a new ad group ad. 
 $adGroupAd = new AdGroupAd([ 
 'ad' => new Ad([ 
 'responsive_display_ad' => $responsiveDisplayAdInfo, 
 'final_urls' => ['http://www.example.com/'] 
 ]), 
 'ad_group' => $adGroupResourceName 
 ]); 
 // Creates an ad group ad operation. 
 $adGroupAdOperation = new AdGroupAdOperation(); 
 $adGroupAdOperation->setCreate($adGroupAd); 
 // Issues a mutate request to add the ad group ad. 
 $adGroupAdServiceClient = $googleAdsClient->getAdGroupAdServiceClient(); 
 $response = $adGroupAdServiceClient->mutateAdGroupAds( 
 MutateAdGroupAdsRequest::build($customerId, [$adGroupAdOperation]) 
 ); 
 /** @var AdGroupAd $addedAdGroupAd */ 
 $addedAdGroupAd = $response->getResults()[0]; 
 printf( 
 "Created ad group ad with resource name '%s'.%s", 
 $addedAdGroupAd->getResourceName(), 
 PHP_EOL 
 ); 
 } 
 /** 
 * Adds an image asset to the Google Ads account. 
 * 
 * @param GoogleAdsClient $googleAdsClient the Google Ads API client 
 * @param int $customerId the customer ID 
 * @param string $imageUrl the image URL 
 * @param string $assetName the asset name 
 * @return string the resource name of the newly added asset 
 */ 
 private static function uploadAsset( 
 GoogleAdsClient $googleAdsClient, 
 int $customerId, 
 string $imageUrl, 
 string $assetName 
 ): string { 
 // Creates an asset. 
 $asset = new Asset([ 
 'name' => $assetName, 
 'type' => AssetType::IMAGE, 
 'image_asset' => new ImageAsset(['data' => file_get_contents($imageUrl)]) 
 ]); 
 // Creates an asset operation. 
 $assetOperation = new AssetOperation(); 
 $assetOperation->setCreate($asset); 
 // Issues a mutate request to add the asset. 
 $assetServiceClient = $googleAdsClient->getAssetServiceClient(); 
 $response = $assetServiceClient->mutateAssets( 
 MutateAssetsRequest::build($customerId, [$assetOperation]) 
 ); 
 // Prints the resource name of the added image asset. 
 /** @var MutateAssetResult $addedImageAsset */ 
 $addedImageAsset = $response->getResults()[0]; 
 $addedImageAssetResourceName = $addedImageAsset->getResourceName(); 
 printf( 
 "Created image asset with resource name '%s'.%s", 
 $addedImageAssetResourceName, 
 PHP_EOL 
 ); 
 return $addedImageAssetResourceName; 
 } 
 /** 
 * Targets a user list. 
 * 
 * @param GoogleAdsClient $googleAdsClient the Google Ads API client 
 * @param int $customerId the customer ID 
 * @param string $adGroupResourceName the resource name of the ad group that 
 *     the user list will be attached to 
 * @param int $userListId the user list ID 
 */ 
 private static function attachUserList( 
 GoogleAdsClient $googleAdsClient, 
 int $customerId, 
 string $adGroupResourceName, 
 int $userListId 
 ) { 
 // Creates the ad group criterion that targets the user list. 
 $adGroupCriterion = new AdGroupCriterion([ 
 'ad_group' => $adGroupResourceName, 
 'user_list' => new UserListInfo([ 
 'user_list' => ResourceNames::forUserList($customerId, $userListId) 
 ]) 
 ]); 
 // Creates an ad group criterion operation. 
 $adGroupCriterionOperation = new AdGroupCriterionOperation(); 
 $adGroupCriterionOperation->setCreate($adGroupCriterion); 
 // Issues a mutate request to add the ad group criterion. 
 $adGroupCriterionServiceClient = $googleAdsClient->getAdGroupCriterionServiceClient(); 
 $response = $adGroupCriterionServiceClient->mutateAdGroupCriteria( 
 MutateAdGroupCriteriaRequest::build($customerId, [$adGroupCriterionOperation]) 
 ); 
 /** @var AdGroupCriterion $addedAdGroupCriterion */ 
 $addedAdGroupCriterion = $response->getResults()[0]; 
 printf( 
 "Created ad group criterion with resource name '%s'.%s", 
 $addedAdGroupCriterion->getResourceName(), 
 PHP_EOL 
 ); 
 } 
 } 
 AddMerchantCenterDynamicRemarketingCampaign::main(); 
  
  

Python

 #!/usr/bin/env python 
 # Copyright 2020 Google LLC 
 # 
 # Licensed under the Apache License, Version 2.0 (the "License"); 
 # you may not use this file except in compliance with the License. 
 # You may obtain a copy of the License at 
 # 
 #     https://www.apache.org/licenses/LICENSE-2.0 
 # 
 # Unless required by applicable law or agreed to in writing, software 
 # distributed under the License is distributed on an "AS IS" BASIS, 
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
 # See the License for the specific language governing permissions and 
 # limitations under the License. 
 """Creates a campaign associated with an existing Merchant Center account. 
 Creates a shopping campaign, related ad group and dynamic display ad, and 
 targets a user list for remarketing purposes. 
 """ 
 import 
  
 argparse 
 import 
  
 requests 
 import 
  
 sys 
 from 
  
 uuid 
  
 import 
 uuid4 
 from 
  
 google.ads.googleads.client 
  
 import 
 GoogleAdsClient 
 from 
  
 google.ads.googleads.errors 
  
 import 
 GoogleAdsException 
 from 
  
 google.ads.googleads.v23.resources.types.ad_group 
  
 import 
 AdGroup 
 from 
  
 google.ads.googleads.v23.resources.types.ad_group_ad 
  
 import 
 AdGroupAd 
 from 
  
 google.ads.googleads.v23.resources.types.ad_group_criterion 
  
 import 
 ( 
 AdGroupCriterion 
 , 
 ) 
 from 
  
 google.ads.googleads.v23.resources.types.asset 
  
 import 
 Asset 
 from 
  
 google.ads.googleads.v23.resources.types.campaign 
  
 import 
 Campaign 
 from 
  
 google.ads.googleads.v23.services.services.ad_group_ad_service 
  
 import 
 ( 
 AdGroupAdServiceClient 
 , 
 ) 
 from 
  
 google.ads.googleads.v23.services.services.ad_group_criterion_service 
  
 import 
 ( 
 AdGroupCriterionServiceClient 
 , 
 ) 
 from 
  
 google.ads.googleads.v23.services.services.ad_group_service 
  
 import 
 ( 
 AdGroupServiceClient 
 , 
 ) 
 from 
  
 google.ads.googleads.v23.services.services.asset_service 
  
 import 
 ( 
 AssetServiceClient 
 , 
 ) 
 from 
  
 google.ads.googleads.v23.services.services.campaign_service 
  
 import 
 ( 
 CampaignServiceClient 
 , 
 ) 
 from 
  
 google.ads.googleads.v23.services.types.ad_group_ad_service 
  
 import 
 ( 
 AdGroupAdOperation 
 , 
 MutateAdGroupAdsResponse 
 , 
 ) 
 from 
  
 google.ads.googleads.v23.services.types.ad_group_criterion_service 
  
 import 
 ( 
 AdGroupCriterionOperation 
 , 
 MutateAdGroupCriteriaResponse 
 , 
 ) 
 from 
  
 google.ads.googleads.v23.services.types.ad_group_service 
  
 import 
 ( 
 AdGroupOperation 
 , 
 MutateAdGroupsResponse 
 , 
 ) 
 from 
  
 google.ads.googleads.v23.services.types.asset_service 
  
 import 
 ( 
 AssetOperation 
 , 
 MutateAssetsResponse 
 , 
 ) 
 from 
  
 google.ads.googleads.v23.services.types.campaign_service 
  
 import 
 ( 
 CampaignOperation 
 , 
 MutateCampaignsResponse 
 , 
 ) 
 from 
  
 google.ads.googleads.v23.common.types.ad_asset 
  
 import 
 ( 
 AdImageAsset 
 , 
 AdTextAsset 
 , 
 ) 
 from 
  
 google.ads.googleads.v23.common.types.ad_type_infos 
  
 import 
 ( 
 ResponsiveDisplayAdInfo 
 , 
 ) 
 def 
  
 main 
 ( 
 client 
 : 
 GoogleAdsClient 
 , 
 customer_id 
 : 
 str 
 , 
 merchant_center_account_id 
 : 
 int 
 , 
 campaign_budget_id 
 : 
 int 
 , 
 user_list_id 
 : 
 int 
 , 
 ) 
 - 
> None 
 : 
  
 """Creates a campaign associated with an existing Merchant Center account. 
 Args: 
 client: An initialized GoogleAds client. 
 customer_id: The Google Ads customer ID. 
 merchant_center_account_id: The target Merchant Center account ID. 
 campaign_budget_id: The ID of the campaign budget to utilize. 
 user_list_id: The ID of the user list to target for remarketing. 
 """ 
 # Create a shopping campaign associated with a given Merchant Center 
 # account. 
 campaign_resource_name 
 : 
 str 
 = 
 create_campaign 
 ( 
 client 
 , 
 customer_id 
 , 
 merchant_center_account_id 
 , 
 campaign_budget_id 
 ) 
 # Create an ad group for the campaign. 
 ad_group_resource_name 
 : 
 str 
 = 
 create_ad_group 
 ( 
 client 
 , 
 customer_id 
 , 
 campaign_resource_name 
 ) 
 # Create a dynamic display ad in the ad group. 
 create_ad 
 ( 
 client 
 , 
 customer_id 
 , 
 ad_group_resource_name 
 ) 
 # Target a specific user list for remarketing. 
 attach_user_list 
 ( 
 client 
 , 
 customer_id 
 , 
 ad_group_resource_name 
 , 
 user_list_id 
 ) 
 def 
  
 create_campaign 
 ( 
 client 
 : 
 GoogleAdsClient 
 , 
 customer_id 
 : 
 str 
 , 
 merchant_center_account_id 
 : 
 int 
 , 
 campaign_budget_id 
 : 
 int 
 , 
 ) 
 - 
> str 
 : 
  
 """Creates a campaign linked to a Merchant Center product feed. 
 Args: 
 client: An initialized GoogleAds client. 
 customer_id: The Google Ads customer ID. 
 merchant_center_account_id: The target Merchant Center account ID. 
 campaign_budget_id: The ID of the campaign budget to utilize. 
 Returns: 
 The string resource name of the newly created campaign. 
 """ 
 # Gets the CampaignService client. 
 campaign_service 
 : 
 CampaignServiceClient 
 = 
 client 
 . 
 get_service 
 ( 
 "CampaignService" 
 ) 
 # Creates a campaign operation and configures the new campaign. 
 campaign_operation 
 : 
 CampaignOperation 
 = 
 client 
 . 
 get_type 
 ( 
 "CampaignOperation" 
 ) 
 campaign 
 : 
 Campaign 
 = 
 campaign_operation 
 . 
 create 
 campaign 
 . 
 name 
 = 
 f 
 "Shopping campaign # 
 { 
 uuid4 
 () 
 } 
 " 
 # Configures the settings for the shopping campaign. 
 campaign 
 . 
 shopping_setting 
 . 
 campaign_priority 
 = 
 0 
 # This connects the campaign to the Merchant Center account. 
 campaign 
 . 
 shopping_setting 
 . 
 merchant_id 
 = 
 merchant_center_account_id 
 campaign 
 . 
 shopping_setting 
 . 
 enable_local 
 = 
 True 
 # Dynamic remarketing campaigns are only available on the Google Display 
 # Network. 
 campaign 
 . 
 advertising_channel_type 
 = 
 ( 
 client 
 . 
 enums 
 . 
 AdvertisingChannelTypeEnum 
 . 
 DISPLAY 
 ) 
 campaign 
 . 
 status 
 = 
 client 
 . 
 enums 
 . 
 CampaignStatusEnum 
 . 
 PAUSED 
 campaign 
 . 
 campaign_budget 
 = 
 client 
 . 
 get_service 
 ( 
 "CampaignBudgetService" 
 ) 
 . 
 campaign_budget_path 
 ( 
 customer_id 
 , 
 str 
 ( 
 campaign_budget_id 
 )) 
 client 
 . 
 copy_from 
 ( 
 campaign 
 . 
 manual_cpc 
 , 
 client 
 . 
 get_type 
 ( 
 "ManualCpc" 
 )) 
 # Declare whether or not this campaign serves political ads targeting the 
 # EU. Valid values are: 
 #   CONTAINS_EU_POLITICAL_ADVERTISING 
 #   DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING 
 campaign 
 . 
 contains_eu_political_advertising 
 = 
 ( 
 client 
 . 
 enums 
 . 
 EuPoliticalAdvertisingStatusEnum 
 . 
 DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING 
 ) 
 # Issues a mutate request to add the campaign. 
 campaign_response 
 : 
 MutateCampaignsResponse 
 = 
 ( 
 campaign_service 
 . 
 mutate_campaigns 
 ( 
 customer_id 
 = 
 customer_id 
 , 
 operations 
 = 
 [ 
 campaign_operation 
 ] 
 ) 
 ) 
 campaign_resource_name 
 : 
 str 
 = 
 campaign_response 
 . 
 results 
 [ 
 0 
 ] 
 . 
 resource_name 
 print 
 ( 
 f 
 "Created campaign with resource name ' 
 { 
 campaign_resource_name 
 } 
 '." 
 ) 
 return 
 campaign_resource_name 
 def 
  
 create_ad_group 
 ( 
 client 
 : 
 GoogleAdsClient 
 , 
 customer_id 
 : 
 str 
 , 
 campaign_resource_name 
 : 
 str 
 ) 
 - 
> str 
 : 
  
 """Creates an ad group for the remarketing campaign. 
 Args: 
 client: An initialized GoogleAds client. 
 customer_id: The Google Ads customer ID. 
 campaign_resource_name: The resource name of the target campaign. 
 Returns: 
 The string resource name of the newly created ad group. 
 """ 
 # Gets the AdGroupService. 
 ad_group_service 
 : 
 AdGroupServiceClient 
 = 
 client 
 . 
 get_service 
 ( 
 "AdGroupService" 
 ) 
 # Creates an ad group operation and configures the new ad group. 
 ad_group_operation 
 : 
 AdGroupOperation 
 = 
 client 
 . 
 get_type 
 ( 
 "AdGroupOperation" 
 ) 
 ad_group 
 : 
 AdGroup 
 = 
 ad_group_operation 
 . 
 create 
 ad_group 
 . 
 name 
 = 
 "Dynamic remarketing ad group" 
 ad_group 
 . 
 campaign 
 = 
 campaign_resource_name 
 ad_group 
 . 
 status 
 = 
 client 
 . 
 enums 
 . 
 AdGroupStatusEnum 
 . 
 ENABLED 
 # Issues a mutate request to add the ad group. 
 ad_group_response 
 : 
 MutateAdGroupsResponse 
 = 
 ( 
 ad_group_service 
 . 
 mutate_ad_groups 
 ( 
 customer_id 
 = 
 customer_id 
 , 
 operations 
 = 
 [ 
 ad_group_operation 
 ] 
 ) 
 ) 
 ad_group_resource_name 
 : 
 str 
 = 
 ad_group_response 
 . 
 results 
 [ 
 0 
 ] 
 . 
 resource_name 
 return 
 ad_group_resource_name 
 def 
  
 create_ad 
 ( 
 client 
 : 
 GoogleAdsClient 
 , 
 customer_id 
 : 
 str 
 , 
 ad_group_resource_name 
 : 
 str 
 ) 
 - 
> None 
 : 
  
 """Creates the responsive display ad. 
 Args: 
 client: An initialized GoogleAds client. 
 customer_id: The Google Ads customer ID. 
 ad_group_resource_name: The resource name of the target ad group. 
 """ 
 # Get the AdGroupAdService client. 
 ad_group_ad_service 
 : 
 AdGroupAdServiceClient 
 = 
 client 
 . 
 get_service 
 ( 
 "AdGroupAdService" 
 ) 
 # Upload image assets for the ad. 
 marketing_image_resource_name 
 : 
 str 
 = 
 upload_image_asset 
 ( 
 client 
 , 
 customer_id 
 , 
 "https://gaagl.page.link/Eit5" 
 , 
 "Marketing Image" 
 ) 
 square_marketing_image_resource_name 
 : 
 str 
 = 
 upload_image_asset 
 ( 
 client 
 , 
 customer_id 
 , 
 "https://gaagl.page.link/bjYi" 
 , 
 "Square Marketing Image" 
 , 
 ) 
 # Create the relevant asset objects for the ad. 
 marketing_image 
 : 
 AdImageAsset 
 = 
 client 
 . 
 get_type 
 ( 
 "AdImageAsset" 
 ) 
 marketing_image 
 . 
 asset 
 = 
 marketing_image_resource_name 
 square_marketing_image 
 : 
 AdImageAsset 
 = 
 client 
 . 
 get_type 
 ( 
 "AdImageAsset" 
 ) 
 square_marketing_image 
 . 
 asset 
 = 
 square_marketing_image_resource_name 
 headline 
 : 
 AdTextAsset 
 = 
 client 
 . 
 get_type 
 ( 
 "AdTextAsset" 
 ) 
 headline 
 . 
 text 
 = 
 "Travel" 
 description 
 : 
 AdTextAsset 
 = 
 client 
 . 
 get_type 
 ( 
 "AdTextAsset" 
 ) 
 description 
 . 
 text 
 = 
 "Take to the air!" 
 # Create an ad group ad operation and set the ad group ad values. 
 ad_group_ad_operation 
 : 
 AdGroupAdOperation 
 = 
 client 
 . 
 get_type 
 ( 
 "AdGroupAdOperation" 
 ) 
 ad_group_ad 
 : 
 AdGroupAd 
 = 
 ad_group_ad_operation 
 . 
 create 
 ad_group_ad 
 . 
 ad_group 
 = 
 ad_group_resource_name 
 ad_group_ad 
 . 
 ad 
 . 
 final_urls 
 . 
 append 
 ( 
 "http://www.example.com/" 
 ) 
 # Configure the responsive display ad info object. 
 responsive_display_ad_info 
 : 
 ResponsiveDisplayAdInfo 
 = 
 ( 
 ad_group_ad 
 . 
 ad 
 . 
 responsive_display_ad 
 ) 
 responsive_display_ad_info 
 . 
 marketing_images 
 . 
 append 
 ( 
 marketing_image 
 ) 
 responsive_display_ad_info 
 . 
 square_marketing_images 
 . 
 append 
 ( 
 square_marketing_image 
 ) 
 responsive_display_ad_info 
 . 
 headlines 
 . 
 append 
 ( 
 headline 
 ) 
 responsive_display_ad_info 
 . 
 long_headline 
 . 
 text 
 = 
 "Travel the World" 
 responsive_display_ad_info 
 . 
 descriptions 
 . 
 append 
 ( 
 description 
 ) 
 responsive_display_ad_info 
 . 
 business_name 
 = 
 "Interplanetary Cruises" 
 # Optional: Call to action text. 
 # Valid texts: https://support.google.com/google-ads/answer/7005917 
 responsive_display_ad_info 
 . 
 call_to_action_text 
 = 
 "Apply Now" 
 # Optional: Set the ad colors. 
 responsive_display_ad_info 
 . 
 main_color 
 = 
 "#0000ff" 
 responsive_display_ad_info 
 . 
 accent_color 
 = 
 "#ffff00" 
 # Optional: Set to false to strictly render the ad using the colors. 
 responsive_display_ad_info 
 . 
 allow_flexible_color 
 = 
 False 
 # Optional: Set the format setting that the ad will be served in. 
 responsive_display_ad_info 
 . 
 format_setting 
 = 
 ( 
 client 
 . 
 enums 
 . 
 DisplayAdFormatSettingEnum 
 . 
 NON_NATIVE 
 ) 
 # Optional: Create a logo image and set it to the ad. 
 # logo_image = client.get_type("AdImageAsset") 
 # logo_image.asset = "INSERT_LOGO_IMAGE_RESOURCE_NAME_HERE" 
 # responsive_display_ad_info.logo_images.append(logo_image) 
 # Optional: Create a square logo image and set it to the ad. 
 # square_logo_image = client.get_type("AdImageAsset") 
 # square_logo_image.asset = "INSERT_SQUARE_LOGO_IMAGE_RESOURCE_NAME_HERE" 
 # responsive_display_ad_info.square_logo_images.append(square_logo_image) 
 # Issue a mutate request to add the ad group ad. 
 ad_group_ad_response 
 : 
 MutateAdGroupAdsResponse 
 = 
 ( 
 ad_group_ad_service 
 . 
 mutate_ad_group_ads 
 ( 
 customer_id 
 = 
 customer_id 
 , 
 operations 
 = 
 [ 
 ad_group_ad_operation 
 ] 
 ) 
 ) 
 print 
 ( 
 "Created ad group ad with resource name " 
 f 
 "' 
 { 
 ad_group_ad_response 
 . 
 results 
 [ 
 0 
 ] 
 . 
 resource_name 
 } 
 '." 
 ) 
 def 
  
 upload_image_asset 
 ( 
 client 
 : 
 GoogleAdsClient 
 , 
 customer_id 
 : 
 str 
 , 
 image_url 
 : 
 str 
 , 
 asset_name 
 : 
 str 
 ) 
 - 
> str 
 : 
  
 """Adds an image asset to the Google Ads account. 
 Args: 
 client: An initialized GoogleAds client. 
 customer_id: The Google Ads customer ID. 
 image_url: The URL of the image source. 
 asset_name: The string label for this image asset. 
 Returns: 
 The string resource name of the newly uploaded image asset. 
 """ 
 # Get the AssetService client. 
 asset_service 
 : 
 AssetServiceClient 
 = 
 client 
 . 
 get_service 
 ( 
 "AssetService" 
 ) 
 # Fetch the image data. 
 image_data 
 : 
 bytes 
 = 
 requests 
 . 
 get 
 ( 
 image_url 
 ) 
 . 
 content 
 # Create an asset operation and set the image asset values. 
 asset_operation 
 : 
 AssetOperation 
 = 
 client 
 . 
 get_type 
 ( 
 "AssetOperation" 
 ) 
 asset 
 : 
 Asset 
 = 
 asset_operation 
 . 
 create 
 asset 
 . 
 type_ 
 = 
 client 
 . 
 enums 
 . 
 AssetTypeEnum 
 . 
 IMAGE 
 asset 
 . 
 image_asset 
 . 
 data 
 = 
 image_data 
 asset 
 . 
 name 
 = 
 asset_name 
 mutate_asset_response 
 : 
 MutateAssetsResponse 
 = 
 asset_service 
 . 
 mutate_assets 
 ( 
 customer_id 
 = 
 customer_id 
 , 
 operations 
 = 
 [ 
 asset_operation 
 ] 
 ) 
 image_asset_resource_name 
 : 
 str 
 = 
 mutate_asset_response 
 . 
 results 
 [ 
 0 
 ] 
 . 
 resource_name 
 print 
 ( 
 "Created image asset with resource name " 
 f 
 "' 
 { 
 image_asset_resource_name 
 } 
 '." 
 ) 
 return 
 image_asset_resource_name 
 def 
  
 attach_user_list 
 ( 
 client 
 : 
 GoogleAdsClient 
 , 
 customer_id 
 : 
 str 
 , 
 ad_group_resource_name 
 : 
 str 
 , 
 user_list_id 
 : 
 int 
 , 
 ) 
 - 
> None 
 : 
  
 """Targets a user list with an ad group. 
 Args: 
 client: An initialized GoogleAds client. 
 customer_id: The Google Ads customer ID. 
 ad_group_resource_name: The resource name of the target ad group. 
 user_list_id: The ID of the user list to target for remarketing. 
 """ 
 # Get the AdGroupCriterionService client. 
 ad_group_criterion_service 
 : 
 AdGroupCriterionServiceClient 
 = 
 ( 
 client 
 . 
 get_service 
 ( 
 "AdGroupCriterionService" 
 ) 
 ) 
 # Create an ad group criterion operation and set the ad group criterion 
 # values. 
 ad_group_criterion_operation 
 : 
 AdGroupCriterionOperation 
 = 
 client 
 . 
 get_type 
 ( 
 "AdGroupCriterionOperation" 
 ) 
 ad_group_criterion 
 : 
 AdGroupCriterion 
 = 
 ad_group_criterion_operation 
 . 
 create 
 ad_group_criterion 
 . 
 ad_group 
 = 
 ad_group_resource_name 
 ad_group_criterion 
 . 
 user_list 
 . 
 user_list 
 = 
 client 
 . 
 get_service 
 ( 
 "UserListService" 
 ) 
 . 
 user_list_path 
 ( 
 customer_id 
 , 
 str 
 ( 
 user_list_id 
 )) 
 # Issue a mutate request to add the ad group criterion. 
 ad_group_criterion_response 
 : 
 MutateAdGroupCriteriaResponse 
 = 
 ( 
 ad_group_criterion_service 
 . 
 mutate_ad_group_criteria 
 ( 
 customer_id 
 = 
 customer_id 
 , 
 operations 
 = 
 [ 
 ad_group_criterion_operation 
 ] 
 ) 
 ) 
 print 
 ( 
 "Created ad group criterion with resource name " 
 f 
 "' 
 { 
 ad_group_criterion_response 
 . 
 results 
 [ 
 0 
 ] 
 . 
 resource_name 
 } 
 '." 
 ) 
 if 
 __name__ 
 == 
 "__main__" 
 : 
 parser 
 : 
 argparse 
 . 
 ArgumentParser 
 = 
 argparse 
 . 
 ArgumentParser 
 ( 
 description 
 = 
 ( 
 "Creates a shopping campaign associated with an existing " 
 "Merchant Center account." 
 ) 
 ) 
 # The following argument(s) should be provided to run the example. 
 parser 
 . 
 add_argument 
 ( 
 "-c" 
 , 
 "--customer_id" 
 , 
 type 
 = 
 str 
 , 
 required 
 = 
 True 
 , 
 help 
 = 
 "The Google Ads customer ID." 
 , 
 ) 
 parser 
 . 
 add_argument 
 ( 
 "-m" 
 , 
 "--merchant_center_account_id" 
 , 
 type 
 = 
 int 
 , 
 required 
 = 
 True 
 , 
 help 
 = 
 "The target Merchant Center account ID." 
 , 
 ) 
 parser 
 . 
 add_argument 
 ( 
 "-b" 
 , 
 "--campaign_budget_id" 
 , 
 type 
 = 
 int 
 , 
 required 
 = 
 True 
 , 
 help 
 = 
 "The campaign budget ID to apply to the campaign." 
 , 
 ) 
 parser 
 . 
 add_argument 
 ( 
 "-u" 
 , 
 "--user_list_id" 
 , 
 type 
 = 
 int 
 , 
 required 
 = 
 True 
 , 
 help 
 = 
 "The user list ID to target." 
 , 
 ) 
 args 
 : 
 argparse 
 . 
 Namespace 
 = 
 parser 
 . 
 parse_args 
 () 
 # GoogleAdsClient will read the google-ads.yaml configuration file in the 
 # home directory if none is specified. 
 googleads_client 
 : 
 GoogleAdsClient 
 = 
 GoogleAdsClient 
 . 
 load_from_storage 
 ( 
 version 
 = 
 "v23" 
 ) 
 try 
 : 
 main 
 ( 
 googleads_client 
 , 
 args 
 . 
 customer_id 
 , 
 args 
 . 
 merchant_center_account_id 
 , 
 args 
 . 
 campaign_budget_id 
 , 
 args 
 . 
 user_list_id 
 , 
 ) 
 except 
 GoogleAdsException 
 as 
 ex 
 : 
 print 
 ( 
 f 
 "Request with ID ' 
 { 
 ex 
 . 
 request_id 
 } 
 ' failed with status " 
 f 
 "' 
 { 
 ex 
 . 
 error 
 . 
 code 
 () 
 . 
 name 
 } 
 ' and includes the following errors:" 
 ) 
 for 
 error 
 in 
 ex 
 . 
 failure 
 . 
 errors 
 : 
 print 
 ( 
 f 
 " 
 \t 
 Error with message ' 
 { 
 error 
 . 
 message 
 } 
 '." 
 ) 
 if 
 error 
 . 
 location 
 : 
 for 
 field_path_element 
 in 
 error 
 . 
 location 
 . 
 field_path_elements 
 : 
 print 
 ( 
 f 
 " 
 \t\t 
 On field: 
 { 
 field_path_element 
 . 
 field_name 
 } 
 " 
 ) 
 sys 
 . 
 exit 
 ( 
 1 
 ) 
  

Ruby

 #!/usr/bin/env ruby 
 # Encoding: utf-8 
 # 
 # Copyright 2020 Google LLC 
 # 
 # Licensed under the Apache License, Version 2.0 (the "License"); 
 # you may not use this file except in compliance with the License. 
 # You may obtain a copy of the License at 
 # 
 #     https://www.apache.org/licenses/LICENSE-2.0 
 # 
 # Unless required by applicable law or agreed to in writing, software 
 # distributed under the License is distributed on an "AS IS" BASIS, 
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
 # See the License for the specific language governing permissions and 
 # limitations under the License. 
 # 
 # This example creates a shopping campaign associated with an existing merchant 
 # center account, along with a related ad group and dynamic display ad, and 
 # targets a user list for remarketing purposes. 
 require 
  
 "optparse" 
 require 
  
 "date" 
 require 
  
 "open-uri" 
 require 
  
 "google/ads/google_ads" 
 def 
  
 add_merchant_center_dynamic_remarketing_campaign 
 ( 
  
 customer_id 
 , 
  
 merchant_center_id 
 , 
  
 campaign_budget_id 
 , 
  
 user_list_id 
 ) 
  
 # GoogleAdsClient will read a config file from 
  
 # ENV["HOME"]/google_ads_config.rb when called without parameters 
  
 client 
  
 = 
  
 Google 
 :: 
 Ads 
 :: 
 GoogleAds 
 :: 
 GoogleAdsClient 
 . 
 new 
  
 # Creates a shopping campaign associated with a given merchant center account. 
  
 campaign_resource_name 
  
 = 
  
 create_campaign 
 ( 
  
 client 
 , 
  
 customer_id 
 , 
  
 merchant_center_id 
 , 
  
 campaign_budget_id 
  
 ) 
  
 # Creates an ad group for the campaign. 
  
 ad_group_resource_name 
  
 = 
  
 create_ad_group 
 ( 
 client 
 , 
  
 customer_id 
 , 
  
 campaign_resource_name 
 ) 
  
 # Creates a dynamic display ad in the ad group. 
  
 create_ad 
 ( 
 client 
 , 
  
 customer_id 
 , 
  
 ad_group_resource_name 
 ) 
  
 # Targets a specific user list for remarketing. 
  
 attach_user_list 
 ( 
 client 
 , 
  
 customer_id 
 , 
  
 ad_group_resource_name 
 , 
  
 user_list_id 
 ) 
 end 
 # Creates a campaign linked to a Merchant Center product feed. 
 def 
  
 create_campaign 
 ( 
 client 
 , 
  
 customer_id 
 , 
  
 merchant_center_id 
 , 
  
 campaign_budget_id 
 ) 
  
 operation 
  
 = 
  
 client 
 . 
 operation 
 . 
 create_resource 
 . 
 campaign 
  
 do 
  
 | 
 c 
 | 
  
 c 
 . 
 name 
  
 = 
  
 "Shopping campaign # 
 #{ 
 ( 
 Time 
 . 
 new 
 . 
 to_f 
  
 * 
  
 1000 
 ) 
 . 
 to_i 
 } 
 " 
  
 # Dynamic remarketing campaigns are only available on the Google Display 
  
 # Network. 
  
 c 
 . 
 advertising_channel_type 
  
 = 
  
 :DISPLAY 
  
 c 
 . 
 status 
  
 = 
  
 :PAUSED 
  
 c 
 . 
 campaign_budget 
  
 = 
  
 client 
 . 
 path 
 . 
 campaign_budget 
 ( 
 customer_id 
 , 
  
 campaign_budget_id 
 ) 
  
 c 
 . 
 manual_cpc 
  
 = 
  
 client 
 . 
 resource 
 . 
 manual_cpc 
  
 # Declare whether or not this campaign serves political ads targeting the EU. 
  
 # Valid values are CONTAINS_EU_POLITICAL_ADVERTISING and 
  
 # DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING. 
  
 c 
 . 
 contains_eu_political_advertising 
  
 = 
  
 :DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING 
  
 # The settings for the shopping campaign. 
  
 # This connects the campaign to the merchant center account. 
  
 c 
 . 
 shopping_setting 
  
 = 
  
 client 
 . 
 resource 
 . 
 shopping_setting 
  
 do 
  
 | 
 ss 
 | 
  
 ss 
 . 
 campaign_priority 
  
 = 
  
 0 
  
 ss 
 . 
 merchant_id 
  
 = 
  
 merchant_center_id 
 . 
 to_i 
  
 ss 
 . 
 enable_local 
  
 = 
  
 true 
  
 end 
  
 end 
  
 response 
  
 = 
  
 client 
 . 
 service 
 . 
 campaign 
 . 
 mutate_campaigns 
 ( 
  
 customer_id 
 : 
  
 customer_id 
 , 
  
 operations 
 : 
  
 [ 
 operation 
 ] 
  
 ) 
  
 puts 
  
 "Created campaign: 
 #{ 
 response 
 . 
 results 
 . 
 first 
 . 
 resource_name 
 } 
 " 
  
 response 
 . 
 results 
 . 
 first 
 . 
 resource_name 
 end 
 # Creates an ad group for the remarketing campaign. 
 def 
  
 create_ad_group 
 ( 
 client 
 , 
  
 customer_id 
 , 
  
 campaign_resource_name 
 ) 
  
 # Creates the ad group. 
  
 ad_group 
  
 = 
  
 client 
 . 
 resource 
 . 
 ad_group 
  
 do 
  
 | 
 ag 
 | 
  
 ag 
 . 
 name 
  
 = 
  
 "Dynamic remarketing ad group 
 #{ 
 ( 
 Time 
 . 
 now 
 . 
 to_f 
  
 * 
  
 1000 
 ) 
 . 
 to_i 
 } 
 " 
  
 ag 
 . 
 campaign 
  
 = 
  
 campaign_resource_name 
  
 ag 
 . 
 status 
  
 = 
  
 :ENABLED 
  
 end 
  
 # Creates the ad group operation. 
  
 operation 
  
 = 
  
 client 
 . 
 operation 
 . 
 create_resource 
 . 
 ad_group 
 ( 
 ad_group 
 ) 
  
 response 
  
 = 
  
 client 
 . 
 service 
 . 
 ad_group 
 . 
 mutate_ad_groups 
 ( 
  
 customer_id 
 : 
  
 customer_id 
 , 
  
 operations 
 : 
  
 [ 
 operation 
 ] 
  
 ) 
  
 puts 
  
 "Created ad group: 
 #{ 
 response 
 . 
 results 
 . 
 first 
 . 
 resource_name 
 } 
 " 
  
 response 
 . 
 results 
 . 
 first 
 . 
 resource_name 
 end 
 # Creates the responsive display ad. 
 def 
  
 create_ad 
 ( 
 client 
 , 
  
 customer_id 
 , 
  
 ad_group_resource_name 
 ) 
  
 marketing_image_url 
  
 = 
  
 "https://gaagl.page.link/Eit5" 
  
 square_marketing_image_url 
  
 = 
  
 "https://gaagl.page.link/bjYi" 
  
 marketing_image_asset_resource_name 
  
 = 
  
 upload_asset 
 ( 
  
 client 
 , 
  
 customer_id 
 , 
  
 marketing_image_url 
 , 
  
 "Marketing Image" 
  
 ) 
  
 square_marketing_image_asset_resource_name 
  
 = 
  
 upload_asset 
 ( 
  
 client 
 , 
  
 customer_id 
 , 
  
 square_marketing_image_url 
 , 
  
 "Square Marketing Image" 
  
 ) 
  
 # Creates an ad group ad operation. 
  
 operation 
  
 = 
  
 client 
 . 
 operation 
 . 
 create_resource 
 . 
 ad_group_ad 
  
 do 
  
 | 
 aga 
 | 
  
 aga 
 . 
 ad_group 
  
 = 
  
 ad_group_resource_name 
  
 aga 
 . 
 status 
  
 = 
  
 :PAUSED 
  
 aga 
 . 
 ad 
  
 = 
  
 client 
 . 
 resource 
 . 
 ad 
  
 do 
  
 | 
 a 
 | 
  
 a 
 . 
 final_urls 
 << 
 "https://www.example.com" 
  
 # Creates the responsive display ad info object. 
  
 a 
 . 
 responsive_display_ad 
  
 = 
  
 client 
 . 
 resource 
 . 
 responsive_display_ad_info 
  
 do 
  
 | 
 rda 
 | 
  
 rda 
 . 
 headlines 
 << 
 client 
 . 
 resource 
 . 
 ad_text_asset 
  
 do 
  
 | 
 ata 
 | 
  
 ata 
 . 
 text 
  
 = 
  
 "Travel" 
  
 end 
  
 rda 
 . 
 long_headline 
  
 = 
  
 client 
 . 
 resource 
 . 
 ad_text_asset 
  
 do 
  
 | 
 ata 
 | 
  
 ata 
 . 
 text 
  
 = 
  
 "Travel the World" 
  
 end 
  
 rda 
 . 
 descriptions 
 << 
 client 
 . 
 resource 
 . 
 ad_text_asset 
  
 do 
  
 | 
 ata 
 | 
  
 ata 
 . 
 text 
  
 = 
  
 "Take to the air!" 
  
 end 
  
 rda 
 . 
 business_name 
  
 = 
  
 "Interplanetary Cruises" 
  
 rda 
 . 
 marketing_images 
 << 
 client 
 . 
 resource 
 . 
 ad_image_asset 
  
 do 
  
 | 
 aia 
 | 
  
 aia 
 . 
 asset 
  
 = 
  
 marketing_image_asset_resource_name 
  
 end 
  
 rda 
 . 
 square_marketing_images 
 << 
 client 
 . 
 resource 
 . 
 ad_image_asset 
  
 do 
  
 | 
 aia 
 | 
  
 aia 
 . 
 asset 
  
 = 
  
 square_marketing_image_asset_resource_name 
  
 end 
  
 # Optional: Call to action text. 
  
 # Valid texts: https://support.google.com/google-ads/answer/7005917 
  
 rda 
 . 
 call_to_action_text 
  
 = 
  
 "Apply Now" 
  
 # Optional: Sets the ad colors. 
  
 rda 
 . 
 main_color 
  
 = 
  
 "#0000ff" 
  
 rda 
 . 
 accent_color 
  
 = 
  
 "#ffff00" 
  
 # Optional: Sets to false to strictly render the ad using the colors. 
  
 rda 
 . 
 allow_flexible_color 
  
 = 
  
 false 
  
 # Optional: Sets the format setting that the ad will be served in. 
  
 rda 
 . 
 format_setting 
  
 = 
  
 :NON_NATIVE 
  
 # Optional: Creates a logo image and sets it to the ad. 
  
 # rda.logo_images << client.resource.ad_image_asset do |aia| 
  
 #   aia.asset = "INSERT_LOGO_IMAGE_RESOURCE_NAME_HERE" 
  
 # end 
  
 # Optional: Creates a square logo image and sets it to the ad. 
  
 # rda.square_logo_images << client.resource.ad_image_asset do |aia| 
  
 #   aia.asset = "INSERT_SQUARE_LOGO_IMAGE_RESOURCE_NAME_HERE" 
  
 # end 
  
 end 
  
 end 
  
 end 
  
 # Issues a mutate request to add the ad group ad. 
  
 response 
  
 = 
  
 client 
 . 
 service 
 . 
 ad_group_ad 
 . 
 mutate_ad_group_ads 
 ( 
  
 customer_id 
 : 
  
 customer_id 
 , 
  
 operations 
 : 
  
 [ 
 operation 
 ] 
  
 ) 
  
 # Prints out some information about the newly created ad. 
  
 resource_name 
  
 = 
  
 response 
 . 
 results 
 . 
 first 
 . 
 resource_name 
  
 puts 
  
 "Created ad group ad: 
 #{ 
 resource_name 
 } 
 " 
  
 resource_name 
 end 
 # Adds an image to the Google Ads account. 
 def 
  
 upload_asset 
 ( 
 client 
 , 
  
 customer_id 
 , 
  
 image_url 
 , 
  
 image_name 
 ) 
  
 # Creates an asset operation. 
  
 operation 
  
 = 
  
 client 
 . 
 operation 
 . 
 create_resource 
 . 
 asset 
  
 do 
  
 | 
 a 
 | 
  
 a 
 . 
 name 
  
 = 
  
 image_name 
  
 a 
 . 
 type 
  
 = 
  
 :IMAGE 
  
 a 
 . 
 image_asset 
  
 = 
  
 client 
 . 
 resource 
 . 
 image_asset 
  
 do 
  
 | 
 image 
 | 
  
 image 
 . 
 data 
  
 = 
  
 open 
 ( 
 image_url 
 ) 
  
 { 
  
 | 
 f 
 | 
  
 f 
 . 
 read 
  
 } 
  
 end 
  
 end 
  
 # Issues a mutate request to add the asset. 
  
 response 
  
 = 
  
 client 
 . 
 service 
 . 
 asset 
 . 
 mutate_assets 
 ( 
  
 customer_id 
 : 
  
 customer_id 
 , 
  
 operations 
 : 
  
 [ 
 operation 
 ] 
  
 ) 
  
 # Prints out information about the newly added asset. 
  
 resource_name 
  
 = 
  
 response 
 . 
 results 
 . 
 first 
 . 
 resource_name 
  
 puts 
  
 "Created image asset: 
 #{ 
 resource_name 
 } 
 " 
  
 resource_name 
 end 
 # Targets a user list. 
 def 
  
 attach_user_list 
 ( 
 client 
 , 
  
 customer_id 
 , 
  
 ad_group_resource_name 
 , 
  
 user_list_id 
 ) 
  
 user_list_resource_name 
  
 = 
  
 client 
 . 
 path 
 . 
 user_list 
 ( 
 customer_id 
 , 
  
 user_list_id 
 ) 
  
 # Creates the ad group criterion that targets the user list. 
  
 ad_group_criterion 
  
 = 
  
 client 
 . 
 resource 
 . 
 ad_group_criterion 
  
 do 
  
 | 
 agc 
 | 
  
 agc 
 . 
 ad_group 
  
 = 
  
 ad_group_resource_name 
  
 agc 
 . 
 user_list 
  
 = 
  
 client 
 . 
 resource 
 . 
 user_list_info 
  
 do 
  
 | 
 ul 
 | 
  
 ul 
 . 
 user_list 
  
 = 
  
 user_list_resource_name 
  
 end 
  
 end 
  
 # Creates the ad group criterion operation. 
  
 op 
  
 = 
  
 client 
 . 
 operation 
 . 
 create_resource 
 . 
 ad_group_criterion 
 ( 
 ad_group_criterion 
 ) 
  
 response 
  
 = 
  
 client 
 . 
 service 
 . 
 ad_group_criterion 
 . 
 mutate_ad_group_criteria 
 ( 
  
 customer_id 
 : 
  
 customer_id 
 , 
  
 operations 
 : 
  
 [ 
 op 
 ] 
  
 ) 
  
 puts 
  
 "Created ad group criterion: 
 #{ 
 response 
 . 
 results 
 . 
 first 
 . 
 resource_name 
 } 
 " 
 end 
 if 
  
 __FILE__ 
  
 == 
  
 $0 
  
 options 
  
 = 
  
 {} 
  
 # The following parameter(s) should be provided to run the example. You can 
  
 # either specify these by changing the INSERT_XXX_ID_HERE values below, or on 
  
 # the command line. 
  
 # 
  
 # Parameters passed on the command line will override any parameters set in 
  
 # code. 
  
 # 
  
 # Running the example with -h will print the command line usage. 
  
 options 
 [ 
 :customer_id 
 ] 
  
 = 
  
 "INSERT_CUSTOMER_ID_HERE" 
  
 options 
 [ 
 :merchant_center_id 
 ] 
  
 = 
  
 "INSERT_MERCHANT_CENTER_ACCOUNT_ID_HERE" 
  
 options 
 [ 
 :campaign_budget_id 
 ] 
  
 = 
  
 "INSERT_CAMPAIGN_BUDGET_ID_HERE" 
  
 options 
 [ 
 :user_list_id 
 ] 
  
 = 
  
 "INSERT_USER_LIST_ID_HERE" 
  
 OptionParser 
 . 
 new 
  
 do 
  
 | 
 opts 
 | 
  
 opts 
 . 
 banner 
  
 = 
  
 format 
 ( 
 "Usage: %s [options]" 
 , 
  
 File 
 . 
 basename 
 ( 
 __FILE__ 
 )) 
  
 opts 
 . 
 separator 
  
 "" 
  
 opts 
 . 
 separator 
  
 "Options:" 
  
 opts 
 . 
 on 
 ( 
 "-C" 
 , 
  
 "--customer-id CUSTOMER-ID" 
 , 
  
 String 
 , 
  
 "Customer ID" 
 ) 
  
 do 
  
 | 
 v 
 | 
  
 options 
 [ 
 :customer_id 
 ] 
  
 = 
  
 v 
  
 end 
  
 opts 
 . 
 on 
 ( 
 "-m" 
 , 
  
 "--merchant-center-account-id MERCHANT-CENTER-ACCOUNT-ID" 
 , 
  
 String 
 , 
  
 "Merchant Center Account ID" 
 ) 
  
 do 
  
 | 
 v 
 | 
  
 options 
 [ 
 :merchant_center_id 
 ] 
  
 = 
  
 v 
  
 end 
  
 opts 
 . 
 on 
 ( 
 "-b" 
 , 
  
 "--campaign-budget-id CAMPAIGN-BUDGET-ID" 
 , 
  
 String 
 , 
  
 "Campaign Budget ID" 
 ) 
  
 do 
  
 | 
 v 
 | 
  
 options 
 [ 
 :campaign_budget_id 
 ] 
  
 = 
  
 v 
  
 end 
  
 opts 
 . 
 on 
 ( 
 "-u" 
 , 
  
 "--user-list-id USER-LIST-ID" 
 , 
  
 String 
 , 
  
 "User List ID" 
 ) 
  
 do 
  
 | 
 v 
 | 
  
 options 
 [ 
 :user_list_id 
 ] 
  
 = 
  
 v 
  
 end 
  
 opts 
 . 
 separator 
  
 "" 
  
 opts 
 . 
 separator 
  
 "Help:" 
  
 opts 
 . 
 on_tail 
 ( 
 "-h" 
 , 
  
 "--help" 
 , 
  
 "Show this message" 
 ) 
  
 do 
  
 puts 
  
 opts 
  
 exit 
  
 end 
  
 end 
 . 
 parse! 
  
 begin 
  
 add_merchant_center_dynamic_remarketing_campaign 
 ( 
  
 options 
 . 
 fetch 
 ( 
 :customer_id 
 ) 
 . 
 tr 
 ( 
 "-" 
 , 
  
 "" 
 ), 
  
 options 
 . 
 fetch 
 ( 
 :merchant_center_id 
 ), 
  
 options 
 . 
 fetch 
 ( 
 :campaign_budget_id 
 ), 
  
 options 
 . 
 fetch 
 ( 
 :user_list_id 
 ) 
  
 ) 
  
 rescue 
  
 Google 
 :: 
 Ads 
 :: 
 GoogleAds 
 :: 
 Errors 
 :: 
 GoogleAdsError 
  
 = 
>  
 e 
  
 e 
 . 
 failure 
 . 
 errors 
 . 
 each 
  
 do 
  
 | 
 error 
 | 
  
 STDERR 
 . 
 printf 
 ( 
 "Error with message: %s 
 \n 
 " 
 , 
  
 error 
 . 
 message 
 ) 
  
 error 
 . 
 location 
& . 
 field_path_elements 
& . 
 each 
  
 do 
  
 | 
 field_path_element 
 | 
  
 STDERR 
 . 
 printf 
 ( 
 " 
 \t 
 On field: %s 
 \n 
 " 
 , 
  
 field_path_element 
 . 
 field_name 
 ) 
  
 end 
  
 error 
 . 
 error_code 
 . 
 to_h 
 . 
 each 
  
 do 
  
 | 
 k 
 , 
  
 v 
 | 
  
 next 
  
 if 
  
 v 
  
 == 
  
 :UNSPECIFIED 
  
 STDERR 
 . 
 printf 
 ( 
 " 
 \t 
 Type: %s 
 \n\t 
 Code: %s 
 \n 
 " 
 , 
  
 k 
 , 
  
 v 
 ) 
  
 end 
  
 end 
  
 raise 
  
 end 
 end 
  
  

Perl

 #!/usr/bin/perl -w 
 # 
 # Copyright 2019, Google LLC 
 # 
 # Licensed under the Apache License, Version 2.0 (the "License"); 
 # you may not use this file except in compliance with the License. 
 # You may obtain a copy of the License at 
 # 
 #     http://www.apache.org/licenses/LICENSE-2.0 
 # 
 # Unless required by applicable law or agreed to in writing, software 
 # distributed under the License is distributed on an "AS IS" BASIS, 
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
 # See the License for the specific language governing permissions and 
 # limitations under the License. 
 # 
 # This example creates a shopping campaign associated with an existing Merchant 
 # Center account, along with a related ad group and dynamic display ad, and 
 # targets a user list for remarketing purposes. 
 use 
  
 strict 
 ; 
 use 
  
 warnings 
 ; 
 use 
  
 utf8 
 ; 
 use 
  
 FindBin 
  
 qw($Bin) 
 ; 
 use 
  
 lib 
  
 "$Bin/../../lib" 
 ; 
 use 
  
 Google::Ads::GoogleAds::Client 
 ; 
 use 
  
 Google::Ads::GoogleAds::Utils::GoogleAdsHelper 
 ; 
 use 
  
 Google::Ads::GoogleAds::Utils::MediaUtils 
 ; 
 use 
  
 Google::Ads::GoogleAds::V23::Resources::Campaign 
 ; 
 use 
  
 Google::Ads::GoogleAds::V23::Resources::ShoppingSetting 
 ; 
 use 
  
 Google::Ads::GoogleAds::V23::Resources::AdGroup 
 ; 
 use 
  
 Google::Ads::GoogleAds::V23::Resources::AdGroupAd 
 ; 
 use 
  
 Google::Ads::GoogleAds::V23::Resources::Ad 
 ; 
 use 
  
 Google::Ads::GoogleAds::V23::Resources::Asset 
 ; 
 use 
  
 Google::Ads::GoogleAds::V23::Resources::AdGroupCriterion 
 ; 
 use 
  
 Google::Ads::GoogleAds::V23::Common::ManualCpc 
 ; 
 use 
  
 Google::Ads::GoogleAds::V23::Common::ResponsiveDisplayAdInfo 
 ; 
 use 
  
 Google::Ads::GoogleAds::V23::Common::AdImageAsset 
 ; 
 use 
  
 Google::Ads::GoogleAds::V23::Common::AdTextAsset 
 ; 
 use 
  
 Google::Ads::GoogleAds::V23::Common::ImageAsset 
 ; 
 use 
  
 Google::Ads::GoogleAds::V23::Common::UserListInfo 
 ; 
 use 
  
 Google::Ads::GoogleAds::V23::Enums::AdvertisingChannelTypeEnum 
  
 qw(DISPLAY) 
 ; 
 use 
  
 Google::Ads::GoogleAds::V23::Enums::CampaignStatusEnum 
 ; 
 use 
  
 Google::Ads::GoogleAds::V23::Enums::AdGroupStatusEnum 
 ; 
 use 
  
 Google::Ads::GoogleAds::V23::Enums::DisplayAdFormatSettingEnum 
  
 qw(NON_NATIVE) 
 ; 
 use 
  
 Google::Ads::GoogleAds::V23::Enums::AssetTypeEnum 
  
 qw(IMAGE) 
 ; 
 use 
  
 Google::Ads::GoogleAds::V23::Enums::EuPoliticalAdvertisingStatusEnum 
  
 qw(DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING) 
 ; 
 use 
  
 Google::Ads::GoogleAds::V23::Services::CampaignService::CampaignOperation 
 ; 
 use 
  
 Google::Ads::GoogleAds::V23::Services::AdGroupService::AdGroupOperation 
 ; 
 use 
  
 Google::Ads::GoogleAds::V23::Services::AdGroupAdService::AdGroupAdOperation 
 ; 
 use 
  
 Google::Ads::GoogleAds::V23::Services::AssetService::AssetOperation 
 ; 
 use 
  
 Google::Ads::GoogleAds::V23::Services::AdGroupCriterionService::AdGroupCriterionOperation 
 ; 
 use 
  
 Google::Ads::GoogleAds::V23::Utils::ResourceNames 
 ; 
 use 
  
 Getopt::Long 
  
 qw(:config auto_help) 
 ; 
 use 
  
 Pod::Usage 
 ; 
 use 
  
 Cwd 
  
 qw(abs_path) 
 ; 
 use 
  
 Data::Uniqid 
  
 qw(uniqid) 
 ; 
 # The following parameter(s) should be provided to run the example. You can 
 # either specify these by changing the INSERT_XXX_ID_HERE values below, or on 
 # the command line. 
 # 
 # Parameters passed on the command line will override any parameters set in 
 # code. 
 # 
 # Running the example with -h will print the command line usage. 
 my 
  
 $customer_id 
  
 = 
  
 "INSERT_CUSTOMER_ID_HERE" 
 ; 
 my 
  
 $merchant_center_account_id 
  
 = 
  
 "INSERT_MERCHANT_CENTER_ACCOUNT_ID_HERE" 
 ; 
 my 
  
 $campaign_budget_id 
  
 = 
  
 "INSERT_CAMPAIGN_BUDGET_ID_HERE" 
 ; 
 my 
  
 $user_list_id 
  
 = 
  
 "INSERT_USER_LIST_ID_HERE" 
 ; 
 sub 
  
 add_merchant_center_dynamic_remarketing_campaign 
  
 { 
  
 my 
  
 ( 
 $api_client 
 , 
  
 $customer_id 
 , 
  
 $merchant_center_account_id 
 , 
  
 $campaign_budget_id 
 , 
  
 $user_list_id 
 ) 
  
 = 
  
 @_ 
 ; 
  
 # Create a shopping campaign associated with a given Merchant Center account. 
  
 my 
  
 $campaign_resource_name 
  
 = 
  
 create_campaign 
 ( 
 $api_client 
 , 
  
 $customer_id 
 , 
  
 $merchant_center_account_id 
 , 
  
 $campaign_budget_id 
 ); 
  
 # Create an ad group for the campaign. 
  
 my 
  
 $ad_group_resource_name 
  
 = 
  
 create_ad_group 
 ( 
 $api_client 
 , 
  
 $customer_id 
 , 
  
 $campaign_resource_name 
 ); 
  
 # Create a dynamic display ad in the ad group. 
  
 create_ad 
 ( 
 $api_client 
 , 
  
 $customer_id 
 , 
  
 $ad_group_resource_name 
 ); 
  
 # Target a specific user list for remarketing. 
  
 attach_user_list 
 ( 
 $api_client 
 , 
  
 $customer_id 
 , 
  
 $ad_group_resource_name 
 , 
  
 $user_list_id 
 ); 
  
 return 
  
 1 
 ; 
 } 
 # Creates a campaign linked to a Merchant Center product feed. 
 sub 
  
 create_campaign 
  
 { 
  
 my 
  
 ( 
 $api_client 
 , 
  
 $customer_id 
 , 
  
 $merchant_center_account_id 
 , 
  
 $campaign_budget_id 
 ) 
  
 = 
  
 @_ 
 ; 
  
 # Configure the settings for the shopping campaign. 
  
 my 
  
 $shopping_settings 
  
 = 
  
 Google::Ads::GoogleAds::V23::Resources:: 
 ShoppingSetting 
 - 
> new 
 ({ 
  
 campaignPriority 
  
 = 
>  
 0 
 , 
  
 merchantId 
  
 = 
>  
 $merchant_center_account_id 
 , 
  
 enableLocal 
  
 = 
>  
 "true" 
  
 }); 
  
 # Create the campaign. 
  
 my 
  
 $campaign 
  
 = 
  
 Google::Ads::GoogleAds::V23::Resources:: 
 Campaign 
 - 
> new 
 ({ 
  
 name 
  
 = 
>  
 "Shopping campaign #" 
  
 . 
  
 uniqid 
 (), 
  
 # Dynamic remarketing campaigns are only available on the Google Display Network. 
  
 advertisingChannelType 
  
 = 
>  
 DISPLAY 
 , 
  
 status 
  
 = 
>  
 Google::Ads::GoogleAds::V23::Enums::CampaignStatusEnum:: 
 PAUSED 
 , 
  
 campaignBudget 
  
 = 
>  
 Google::Ads::GoogleAds::V23::Utils::ResourceNames:: 
 campaign_budget 
 ( 
  
 $customer_id 
 , 
  
 $campaign_budget_id 
  
 ), 
  
 manualCpc 
  
 = 
>  
 Google::Ads::GoogleAds::V23::Common:: 
 ManualCpc 
 - 
> new 
 (), 
  
 # This connects the campaign to the Merchant Center account. 
  
 shoppingSetting 
  
 = 
>  
 $shopping_settings 
 , 
  
 # Declare whether or not this campaign serves political ads targeting the EU. 
  
 # Valid values are CONTAINS_EU_POLITICAL_ADVERTISING and 
  
 # DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING. 
  
 containsEuPoliticalAdvertising 
  
 = 
>  
 DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING 
  
 }); 
  
 # Create a campaign operation. 
  
 my 
  
 $campaign_operation 
  
 = 
  
 Google::Ads::GoogleAds::V23::Services::CampaignService:: 
 CampaignOperation 
 - 
>  
 new 
 ({ 
 create 
  
 = 
>  
 $campaign 
 }); 
  
 # Issue a mutate request to add the campaign. 
  
 my 
  
 $campaigns_response 
  
 = 
  
 $api_client 
 - 
> CampaignService 
 () 
 - 
> mutate 
 ({ 
  
 customerId 
  
 = 
>  
 $customer_id 
 , 
  
 operations 
  
 = 
>  
 [ 
 $campaign_operation 
 ]}); 
  
 my 
  
 $campaign_resource_name 
  
 = 
  
 $campaigns_response 
 - 
> { 
 results 
 }[ 
 0 
 ]{ 
 resourceName 
 }; 
  
 printf 
  
 "Created campaign with resource name '%s'.\n" 
 , 
  
 $campaign_resource_name 
 ; 
  
 return 
  
 $campaign_resource_name 
 ; 
 } 
 # Creates an ad group for the remarketing campaign. 
 sub 
  
 create_ad_group 
  
 { 
  
 my 
  
 ( 
 $api_client 
 , 
  
 $customer_id 
 , 
  
 $campaign_resource_name 
 ) 
  
 = 
  
 @_ 
 ; 
  
 # Create the ad group. 
  
 my 
  
 $ad_group 
  
 = 
  
 Google::Ads::GoogleAds::V23::Resources:: 
 AdGroup 
 - 
> new 
 ({ 
  
 name 
  
 = 
>  
 "Dynamic remarketing ad group" 
 , 
  
 campaign 
  
 = 
>  
 $campaign_resource_name 
 , 
  
 status 
  
 = 
>  
 Google::Ads::GoogleAds::V23::Enums::AdGroupStatusEnum:: 
 ENABLED 
  
 }); 
  
 # Create an ad group operation. 
  
 my 
  
 $ad_group_operation 
  
 = 
  
 Google::Ads::GoogleAds::V23::Services::AdGroupService:: 
 AdGroupOperation 
 - 
>  
 new 
 ({ 
 create 
  
 = 
>  
 $ad_group 
 }); 
  
 # Issue a mutate request to add the ad group. 
  
 my 
  
 $ad_groups_response 
  
 = 
  
 $api_client 
 - 
> AdGroupService 
 () 
 - 
> mutate 
 ({ 
  
 customerId 
  
 = 
>  
 $customer_id 
 , 
  
 operations 
  
 = 
>  
 [ 
 $ad_group_operation 
 ]}); 
  
 my 
  
 $ad_group_resource_name 
  
 = 
  
 $ad_groups_response 
 - 
> { 
 results 
 }[ 
 0 
 ]{ 
 resourceName 
 }; 
  
 printf 
  
 "Created ad group with resource name '%s'.\n" 
 , 
  
 $ad_group_resource_name 
 ; 
  
 return 
  
 $ad_group_resource_name 
 ; 
 } 
 # Creates the responsive display ad. 
 sub 
  
 create_ad 
  
 { 
  
 my 
  
 ( 
 $api_client 
 , 
  
 $customer_id 
 , 
  
 $ad_group_resource_name 
 ) 
  
 = 
  
 @_ 
 ; 
  
 my 
  
 $marketing_image_resource_name 
  
 = 
  
 upload_asset 
 ( 
  
 $api_client 
 , 
  
 $customer_id 
 , 
  
 "https://gaagl.page.link/Eit5" 
 , 
  
 "Marketing Image" 
  
 ); 
  
 my 
  
 $square_marketing_image_resource_name 
  
 = 
  
 upload_asset 
 ( 
  
 $api_client 
 , 
  
 $customer_id 
 , 
  
 "https://gaagl.page.link/bjYi" 
 , 
  
 "Square Marketing Image" 
  
 ); 
  
 # Create the responsive display ad info object. 
  
 my 
  
 $responsive_display_ad_info 
  
 = 
  
 Google::Ads::GoogleAds::V23::Common:: 
 ResponsiveDisplayAdInfo 
 - 
> new 
 ({ 
  
 marketingImages 
  
 = 
>  
 [ 
  
 Google::Ads::GoogleAds::V23::Common:: 
 AdImageAsset 
 - 
> new 
 ({ 
  
 asset 
  
 = 
>  
 $marketing_image_resource_name 
  
 }) 
  
 ], 
  
 squareMarketingImages 
  
 = 
>  
 [ 
  
 Google::Ads::GoogleAds::V23::Common:: 
 AdImageAsset 
 - 
> new 
 ({ 
  
 asset 
  
 = 
>  
 $square_marketing_image_resource_name 
  
 }) 
  
 ], 
  
 headlines 
  
 = 
>  
 [ 
  
 Google::Ads::GoogleAds::V23::Common:: 
 AdTextAsset 
 - 
> new 
 ({ 
  
 text 
  
 = 
>  
 "Travel" 
  
 }) 
  
 ], 
  
 longHeadline 
  
 = 
>  
 Google::Ads::GoogleAds::V23::Common:: 
 AdTextAsset 
 - 
> new 
 ({ 
  
 text 
  
 = 
>  
 "Travel the World" 
  
 } 
  
 ), 
  
 descriptions 
  
 = 
>  
 [ 
  
 Google::Ads::GoogleAds::V23::Common:: 
 AdTextAsset 
 - 
> new 
 ({ 
  
 text 
  
 = 
>  
 "Take to the air!" 
  
 }) 
  
 ], 
  
 businessName 
  
 = 
>  
 "Interplanetary Cruises" 
 , 
  
 # Optional: Call to action text. 
  
 # Valid texts: https://support.google.com/google-ads/answer/7005917 
  
 callToActionText 
  
 = 
>  
 "Apply Now" 
 , 
  
 # Optional: Set the ad colors. 
  
 mainColor 
  
 = 
>  
 "#0000ff" 
 , 
  
 accentColor 
  
 = 
>  
 "#ffff00" 
 , 
  
 # Optional: Set to false to strictly render the ad using the colors. 
  
 allowFlexibleColor 
  
 = 
>  
 "false" 
 , 
  
 # Optional: Set the format setting that the ad will be served in. 
  
 formatSetting 
  
 = 
>  
 NON_NATIVE 
 , 
  
 # Optional: Create a logo image and set it to the ad. 
  
 # logoImages => [ 
  
 #   Google::Ads::GoogleAds::V23::Common::AdImageAsset->new({ 
  
 #       asset => "INSERT_LOGO_IMAGE_RESOURCE_NAME_HERE" 
  
 #     }) 
  
 # ], 
  
 # Optional: Create a square logo image and set it to the ad. 
  
 # squareLogoImages => [ 
  
 #   Google::Ads::GoogleAds::V23::Common::AdImageAsset->new({ 
  
 #       asset => "INSERT_SQUARE_LOGO_IMAGE_RESOURCE_NAME_HERE" 
  
 #     }) 
  
 # ] 
  
 }); 
  
 # Create an ad group ad. 
  
 my 
  
 $ad_group_ad 
  
 = 
  
 Google::Ads::GoogleAds::V23::Resources:: 
 AdGroupAd 
 - 
> new 
 ({ 
  
 adGroup 
  
 = 
>  
 $ad_group_resource_name 
 , 
  
 ad 
  
 = 
>  
 Google::Ads::GoogleAds::V23::Resources:: 
 Ad 
 - 
> new 
 ({ 
  
 responsiveDisplayAd 
  
 = 
>  
 $responsive_display_ad_info 
 , 
  
 finalUrls 
  
 = 
>  
 [ 
 "http://www.example.com/" 
 ]})}); 
  
 # Create an ad group ad operation. 
  
 my 
  
 $ad_group_ad_operation 
  
 = 
  
 Google::Ads::GoogleAds::V23::Services::AdGroupAdService:: 
 AdGroupAdOperation 
  
 - 
> new 
 ({ 
 create 
  
 = 
>  
 $ad_group_ad 
 }); 
  
 # Issue a mutate request to add the ad group ad. 
  
 my 
  
 $ad_group_ads_response 
  
 = 
  
 $api_client 
 - 
> AdGroupAdService 
 () 
 - 
> mutate 
 ({ 
  
 customerId 
  
 = 
>  
 $customer_id 
 , 
  
 operations 
  
 = 
>  
 [ 
 $ad_group_ad_operation 
 ]}); 
  
 printf 
  
 "Created ad group ad with resource name '%s'.\n" 
 , 
  
 $ad_group_ads_response 
 - 
> { 
 results 
 }[ 
 0 
 ]{ 
 resourceName 
 }; 
 } 
 # Adds an image asset to the Google Ads account. 
 sub 
  
 upload_asset 
  
 { 
  
 my 
  
 ( 
 $api_client 
 , 
  
 $customer_id 
 , 
  
 $image_url 
 , 
  
 $asset_name 
 ) 
  
 = 
  
 @_ 
 ; 
  
 my 
  
 $image_data 
  
 = 
  
 get_base64_data_from_url 
 ( 
 $image_url 
 ); 
  
 # Create an asset. 
  
 my 
  
 $asset 
  
 = 
  
 Google::Ads::GoogleAds::V23::Resources:: 
 Asset 
 - 
> new 
 ({ 
  
 name 
  
 = 
>  
 $asset_name 
 , 
  
 type 
  
 = 
>  
 IMAGE 
 , 
  
 imageAsset 
  
 = 
>  
 Google::Ads::GoogleAds::V23::Common:: 
 ImageAsset 
 - 
> new 
 ({ 
  
 data 
  
 = 
>  
 $image_data 
  
 })}); 
  
 # Create an asset operation. 
  
 my 
  
 $asset_operation 
  
 = 
  
 Google::Ads::GoogleAds::V23::Services::AssetService:: 
 AssetOperation 
 - 
> new 
 ({ 
  
 create 
  
 = 
>  
 $asset 
  
 }); 
  
 # Issue a mutate request to add the asset. 
  
 my 
  
 $assets_response 
  
 = 
  
 $api_client 
 - 
> AssetService 
 () 
 - 
> mutate 
 ({ 
  
 customerId 
  
 = 
>  
 $customer_id 
 , 
  
 operations 
  
 = 
>  
 [ 
 $asset_operation 
 ]}); 
  
 my 
  
 $image_asset_resource_name 
  
 = 
  
 $assets_response 
 - 
> { 
 results 
 }[ 
 0 
 ]{ 
 resourceName 
 }; 
  
 printf 
  
 "Created image asset with resource name '%s'.\n" 
 , 
  
 $image_asset_resource_name 
 ; 
  
 return 
  
 $image_asset_resource_name 
 ; 
 } 
 # Targets a user list. 
 sub 
  
 attach_user_list 
  
 { 
  
 my 
  
 ( 
 $api_client 
 , 
  
 $customer_id 
 , 
  
 $ad_group_resource_name 
 , 
  
 $user_list_id 
 ) 
  
 = 
  
 @_ 
 ; 
  
 # Create the ad group criterion that targets the user list. 
  
 my 
  
 $ad_group_criterion 
  
 = 
  
 Google::Ads::GoogleAds::V23::Resources:: 
 AdGroupCriterion 
 - 
> new 
 ({ 
  
 adGroup 
  
 = 
>  
 $ad_group_resource_name 
 , 
  
 userList 
  
 = 
>  
 Google::Ads::GoogleAds::V23::Common:: 
 UserListInfo 
 - 
> new 
 ({ 
  
 userList 
  
 = 
>  
 Google::Ads::GoogleAds::V23::Utils::ResourceNames:: 
 user_list 
 ( 
  
 $customer_id 
 , 
  
 $user_list_id 
  
 )})}); 
  
 # Create an ad group criterion operation. 
  
 my 
  
 $ad_group_criterion_operation 
  
 = 
  
 Google::Ads::GoogleAds::V23::Services::AdGroupCriterionService:: 
 AdGroupCriterionOperation 
  
 - 
> new 
 ({ 
 create 
  
 = 
>  
 $ad_group_criterion 
 }); 
  
 # Issue a mutate request to add the ad group criterion. 
  
 my 
  
 $ad_group_criteria_response 
  
 = 
  
 $api_client 
 - 
> AdGroupCriterionService 
 () 
 - 
> mutate 
 ({ 
  
 customerId 
  
 = 
>  
 $customer_id 
 , 
  
 operations 
  
 = 
>  
 [ 
 $ad_group_criterion_operation 
 ]}); 
  
 printf 
  
 "Created ad group criterion with resource name '%s'.\n" 
 , 
  
 $ad_group_criteria_response 
 - 
> { 
 results 
 }[ 
 0 
 ]{ 
 resourceName 
 }; 
 } 
 # Don't run the example if the file is being included. 
 if 
  
 ( 
 abs_path 
 ( 
 $0 
 ) 
  
 ne 
  
 abs_path 
 ( 
 __FILE__ 
 )) 
  
 { 
  
 return 
  
 1 
 ; 
 } 
 # Get Google Ads Client, credentials will be read from ~/googleads.properties. 
 my 
  
 $api_client 
  
 = 
  
 Google::Ads::GoogleAds:: 
 Client 
 - 
> new 
 (); 
 # By default examples are set to die on any server returned fault. 
 $api_client 
 - 
> set_die_on_faults 
 ( 
 1 
 ); 
 # Parameters passed on the command line will override any parameters set in code. 
 GetOptions 
 ( 
  
 "customer_id=s" 
  
 = 
>  
 \ 
 $customer_id 
 , 
  
 "merchant_center_account_id=i" 
  
 = 
>  
 \ 
 $merchant_center_account_id 
 , 
  
 "campaign_budget_id=i" 
  
 = 
>  
 \ 
 $campaign_budget_id 
 , 
  
 "user_list_id=i" 
  
 = 
>  
 \ 
 $user_list_id 
 ); 
 # Print the help message if the parameters are not initialized in the code nor 
 # in the command line. 
 pod2usage 
 ( 
 2 
 ) 
  
 if 
  
 not 
  
 check_params 
 ( 
 $customer_id 
 , 
  
 $merchant_center_account_id 
 , 
  
 $campaign_budget_id 
 , 
  
 $user_list_id 
 ); 
 # Call the example. 
 add_merchant_center_dynamic_remarketing_campaign 
 ( 
 $api_client 
 , 
  
 $customer_id 
  
 =~ 
  
 s/-//g 
 r 
 , 
  
 $merchant_center_account_id 
 , 
  
 $campaign_budget_id 
 , 
  
 $user_list_id 
 ); 
 =pod 
 =head1 NAME 
 add_merchant_center_dynamic_remarketing_campaign 
 =head1 DESCRIPTION 
 This example creates a shopping campaign associated with an existing Merchant 
 Center account, along with a related ad group and dynamic display ad, and 
 targets a user list for remarketing purposes. 
 =head1 SYNOPSIS 
 add_merchant_center_dynamic_remarketing_campaign.pl [options] 
 -help                           Show the help message. 
 -customer_id                    The Google Ads customer ID. 
 -merchant_center_account_id     The Merchant Center account ID. 
 -campaign_budget_id             The campaign budget ID. 
 -user_list_id                   The user list ID. 
 =cut 
  
  

curl

Design a Mobile Site
View Site in Mobile | Classic
Share by: