Performance Max for online sales with a product feed (retail)

Performance Max for retail helps you expand your reach and goals by offering the opportunity to serve on additional inventory.

You might need to create new assets —such as text, image, or video—to enable ads to be served on new formats and surfaces—such as text, Discover, YouTube in-stream, and Display.

If you have unique insights on which segments of your users are more likely to convert, you can also now use Audience signals to let Google know.

Here are some more enhancements that Performance Max campaigns offer over standard shopping campaigns:

  • Language targeting based on Merchant Center feed or campaign criteria
  • Final URL expansion
  • All stores are targeted when the Store Visit goal is selected
  • Ability to set conversion goals on a per-customer or per-campaign basis

In order to use Performance Max for retail, the Google Ads account must be linked to an existing Merchant Center account . By linking to Merchant Center, assets can be generated automatically for the campaign, but reach and performance will be limited.

Add asset groups

Adding an asset group enables Shopping and dynamic remarketing channels, and setting URL expansion enables Dynamic Search Ads. In general, the more assets you provide, the more ad formats the system can create to target additional inventory.

We recommend that each asset group target different products. Note that there are limits for listing groups . As a best practice, you should only target a certain set of products from an asset group—for example, Products A-L would be in Asset Group 1 and Products M-Z would be in Asset Group 2.

If you want to customize your asset messaging by audience, you can create multiple asset groups per campaign. In this way, you can create different asset groups for the same final URL.

See more optimization tips when setting up your Performance Max campaign.

Create a Performance Max retail campaign

Like other shopping campaigns , set the ShoppingSetting fields of the campaign.

Required

merchant_id
The Merchant Center ID of the account that contains the products to advertise.

Optional

feed_label

A string used for feed label as defined in your Merchant Center. This field should be used in the case that you need to select products from a specific Merchant Center feed . If not specified, then the campaign uses all available feeds in the Merchant Center.

If you previously used the deprecated sales_country , in the two-letter country code ( XX ) format, the feed_label should be used instead. For more information see the feed label support article.

Note that submitting a country code in a feed_label doesn't automatically enable ads to serve in that country; you must first set up geographic location targeting .

campaign_priority

The priority of the shopping campaign. Campaigns with numerically higher priorities take precedence over those with lower priorities.

enable_local

The option to enable ads for products sold in local stores for this campaign.

Local products are turned on by default if inventory is present. This can be filtered using listing groups.

language

You can select multiple languages to show your ads to specific sets of customers.

Conversion goals

You can override customer-level conversion goals by updating campaign-level conversion goals as illustrated in this example:

Java

 /** Retrieves the list of customer conversion goals. */ 
 private 
  
 static 
  
 List<CustomerConversionGoal> 
  
 getCustomerConversionGoals 
 ( 
  
 GoogleAdsClient 
  
 googleAdsClient 
 , 
  
 long 
  
 customerId 
 ) 
  
 { 
  
 String 
  
 query 
  
 = 
  
 "SELECT customer_conversion_goal.category, customer_conversion_goal.origin " 
  
 + 
  
 "FROM customer_conversion_goal" 
 ; 
  
 List<CustomerConversionGoal> 
  
 customerConversionGoals 
  
 = 
  
 new 
  
 ArrayList 
<> (); 
  
 try 
  
 ( 
 GoogleAdsServiceClient 
  
 googleAdsServiceClient 
  
 = 
  
 googleAdsClient 
 . 
 getLatestVersion 
 (). 
 createGoogleAdsServiceClient 
 ()) 
  
 { 
  
 // The number of conversion goals is typically less than 50, so we use 
  
 // GoogleAdsService.search instead of search_stream. 
  
 SearchPagedResponse 
  
 response 
  
 = 
  
 googleAdsServiceClient 
 . 
 search 
 ( 
 Long 
 . 
 toString 
 ( 
 customerId 
 ), 
  
 query 
 ); 
  
 for 
  
 ( 
 GoogleAdsRow 
  
 googleAdsRow 
  
 : 
  
 response 
 . 
 iterateAll 
 ()) 
  
 { 
  
 customerConversionGoals 
 . 
 add 
 ( 
 googleAdsRow 
 . 
 getCustomerConversionGoal 
 ()); 
  
 } 
  
 } 
  
 return 
  
 customerConversionGoals 
 ; 
 } 
 /** Creates a list of MutateOperations that override customer conversion goals. */ 
 private 
  
 static 
  
 List<MutateOperation> 
  
 createConversionGoalOperations 
 ( 
  
 long 
  
 customerId 
 , 
  
 List<CustomerConversionGoal> 
  
 customerConversionGoals 
 ) 
  
 { 
  
 List<MutateOperation> 
  
 mutateOperations 
  
 = 
  
 new 
  
 ArrayList 
<> (); 
  
 // To override the customer conversion goals, we will change the 
  
 // biddability of each of the customer conversion goals so that only 
  
 // the desired conversion goal is biddable in this campaign. 
  
 for 
  
 ( 
 CustomerConversionGoal 
  
 customerConversionGoal 
  
 : 
  
 customerConversionGoals 
 ) 
  
 { 
  
 ConversionActionCategory 
  
 category 
  
 = 
  
 customerConversionGoal 
 . 
 getCategory 
 (); 
  
 ConversionOrigin 
  
 origin 
  
 = 
  
 customerConversionGoal 
 . 
 getOrigin 
 (); 
  
 String 
  
 campaignConversionGoalResourceName 
  
 = 
  
 ResourceNames 
 . 
 campaignConversionGoal 
 ( 
  
 customerId 
 , 
  
 PERFORMANCE_MAX_CAMPAIGN_TEMPORARY_ID 
 , 
  
 category 
 , 
  
 origin 
 ); 
  
 CampaignConversionGoal 
 . 
 Builder 
  
 campaignConversionGoalBuilder 
  
 = 
  
 CampaignConversionGoal 
 . 
 newBuilder 
 (). 
 setResourceName 
 ( 
 campaignConversionGoalResourceName 
 ); 
  
 // Change the biddability for the campaign conversion goal. 
  
 // Set biddability to True for the desired (category, origin). 
  
 // Set biddability to False for all other conversion goals. 
  
 // Note: 
  
 //  1- It is assumed that this Conversion Action 
  
 //     (category=PURCHASE, origin=WEBSITE) exists in this account. 
  
 //  2- More than one goal can be biddable if desired. This example 
  
 //     shows only one. 
  
 if 
  
 ( 
 category 
  
 == 
  
 ConversionActionCategory 
 . 
 PURCHASE 
 && 
 origin 
  
 == 
  
 ConversionOrigin 
 . 
 WEBSITE 
 ) 
  
 { 
  
 campaignConversionGoalBuilder 
 . 
 setBiddable 
 ( 
 true 
 ); 
  
 } 
  
 else 
  
 { 
  
 campaignConversionGoalBuilder 
 . 
 setBiddable 
 ( 
 false 
 ); 
  
 } 
  
 CampaignConversionGoal 
  
 campaignConversionGoal 
  
 = 
  
 campaignConversionGoalBuilder 
 . 
 build 
 (); 
  
 CampaignConversionGoalOperation 
  
 campaignConversionGoalOperation 
  
 = 
  
 CampaignConversionGoalOperation 
 . 
 newBuilder 
 () 
  
 . 
 setUpdate 
 ( 
 campaignConversionGoal 
 ) 
  
 . 
 setUpdateMask 
 ( 
 FieldMasks 
 . 
 allSetFieldsOf 
 ( 
 campaignConversionGoal 
 )) 
  
 . 
 build 
 (); 
  
 mutateOperations 
 . 
 add 
 ( 
  
 MutateOperation 
 . 
 newBuilder 
 () 
  
 . 
 setCampaignConversionGoalOperation 
 ( 
 campaignConversionGoalOperation 
 ) 
  
 . 
 build 
 ()); 
  
 } 
  
 return 
  
 mutateOperations 
 ; 
 } 
  
  

C#

 /// <summary> 
 /// Creates a MutateOperation that links an asset to an asset group. 
 /// </summary> 
 /// <param name="fieldType">The field type of the asset to be linked.</param> 
 /// <param name="linkedEntityResourceName">The resource name of the entity (asset group or 
 /// campaign) to link the asset to.</param> 
 /// <param name="assetResourceName">The resource name of the text asset to be 
 /// linked.</param> 
 /// <param name="brandGuidelinesEnabled">Whether or not to enable brand guidelines.</param> 
 /// <returns>A MutateOperation that links an asset to an asset group.</returns> 
 private 
  
 MutateOperation 
  
 CreateLinkAssetOperation 
 ( 
  
 AssetFieldType 
  
 fieldType 
 , 
  
 string 
  
 linkedEntityResourceName 
 , 
  
 string 
  
 assetResourceName 
 , 
  
 bool 
  
 brandGuidelinesEnabled 
  
 = 
  
 false 
 ) 
 { 
  
 if 
  
 ( 
 brandGuidelinesEnabled 
 ) 
  
 { 
  
 return 
  
 new 
  
 MutateOperation 
 () 
  
 { 
  
 CampaignAssetOperation 
  
 = 
  
 new 
  
 CampaignAssetOperation 
 () 
  
 { 
  
 Create 
  
 = 
  
 new 
  
 CampaignAsset 
 () 
  
 { 
  
 FieldType 
  
 = 
  
 fieldType 
 , 
  
 Campaign 
  
 = 
  
 linkedEntityResourceName 
 , 
  
 Asset 
  
 = 
  
 assetResourceName 
  
 } 
  
 } 
  
 }; 
  
 } 
  
 else 
  
 { 
  
 return 
  
 new 
  
 MutateOperation 
 () 
  
 { 
  
 AssetGroupAssetOperation 
  
 = 
  
 new 
  
 AssetGroupAssetOperation 
 () 
  
 { 
  
 Create 
  
 = 
  
 new 
  
 AssetGroupAsset 
 () 
  
 { 
  
 FieldType 
  
 = 
  
 fieldType 
 , 
  
 AssetGroup 
  
 = 
  
 linkedEntityResourceName 
 , 
  
 Asset 
  
 = 
  
 assetResourceName 
  
 } 
  
 } 
  
 }; 
  
 } 
 } 
  
  

PHP

 private static function getCustomerConversionGoals( 
 GoogleAdsClient $googleAdsClient, 
 int $customerId 
 ): array { 
 $customerConversionGoals = []; 
 $googleAdsServiceClient = $googleAdsClient->getGoogleAdsServiceClient(); 
 // Creates a query that retrieves all customer conversion goals. 
 $query = 'SELECT customer_conversion_goal.category, customer_conversion_goal.origin ' . 
 'FROM customer_conversion_goal'; 
 // The number of conversion goals is typically less than 50 so we use a search request 
 // instead of search stream. 
 $response = 
 $googleAdsServiceClient->search(SearchGoogleAdsRequest::build($customerId, $query)); 
 // Iterates over all rows in all pages and builds the list of conversion goals. 
 foreach ($response->iterateAllElements() as $googleAdsRow) { 
 /** @var GoogleAdsRow $googleAdsRow */ 
 $customerConversionGoals[] = [ 
 'category' => $googleAdsRow->getCustomerConversionGoal()->getCategory(), 
 'origin' => $googleAdsRow->getCustomerConversionGoal()->getOrigin() 
 ]; 
 } 
 return $customerConversionGoals; 
 } 
 /** 
 * Creates a list of MutateOperations that override customer conversion goals. 
 * 
 * @param int $customerId the customer ID 
 * @param array $customerConversionGoals the list of customer conversion goals that will be 
 *      overridden 
 * @return MutateOperation[] a list of MutateOperations that update campaign conversion goals 
 */ 
 private static function createConversionGoalOperations( 
 int $customerId, 
 array $customerConversionGoals 
 ): array { 
 $operations = []; 
 // To override the customer conversion goals, we will change the biddability of each of the 
 // customer conversion goals so that only the desired conversion goal is biddable in this 
 // campaign. 
 foreach ($customerConversionGoals as $customerConversionGoal) { 
 $campaignConversionGoal = new CampaignConversionGoal([ 
 'resource_name' => ResourceNames::forCampaignConversionGoal( 
 $customerId, 
 self::PERFORMANCE_MAX_CAMPAIGN_TEMPORARY_ID, 
 ConversionActionCategory::name($customerConversionGoal['category']), 
 ConversionOrigin::name($customerConversionGoal['origin']) 
 ) 
 ]); 
 // Changes the biddability for the campaign conversion goal. 
 // Sets biddability to true for the desired (category, origin). 
 // Sets biddability to false for all other conversion goals. 
 // Note: 
 //  1- It is assumed that this Conversion Action 
 //     (category=PURCHASE, origin=WEBSITE) exists in this account. 
 //  2- More than one goal can be biddable if desired. This example 
 //     shows only one. 
 if ( 
 $customerConversionGoal["category"] === ConversionActionCategory::PURCHASE 
 && $customerConversionGoal["origin"] === ConversionOrigin::WEBSITE 
 ) { 
 $campaignConversionGoal->setBiddable(true); 
 } else { 
 $campaignConversionGoal->setBiddable(false); 
 } 
 $operations[] = new MutateOperation([ 
 'campaign_conversion_goal_operation' => new CampaignConversionGoalOperation([ 
 'update' => $campaignConversionGoal, 
 // Sets the update mask on the operation. Here the update mask will be a list 
 // of all the fields that were set on the update object. 
 'update_mask' => FieldMasks::allSetFieldsOf($campaignConversionGoal) 
 ]) 
 ]); 
 } 
 return $operations; 
 }  
 

Python

 def 
  
 get_customer_conversion_goals 
 ( 
 client 
 : 
 GoogleAdsClient 
 , 
 customer_id 
 : 
 str 
 ) 
 - 
> List 
 [ 
 Dict 
 [ 
 str 
 , 
 Union 
 [ 
 ConversionActionCategoryEnum 
 . 
 ConversionActionCategory 
 , 
 ConversionOriginEnum 
 . 
 ConversionOrigin 
 , 
 ], 
 ] 
 ]: 
  
 """Retrieves the list of customer conversion goals. 
 Args: 
 client: an initialized GoogleAdsClient instance. 
 customer_id: a client customer ID. 
 Returns: 
 a list of dicts containing the category and origin of customer 
 conversion goals. 
 """ 
 ga_service 
 : 
 GoogleAdsServiceClient 
 = 
 client 
 . 
 get_service 
 ( 
 "GoogleAdsService" 
 ) 
 customer_conversion_goals 
 : 
 List 
 [ 
 Dict 
 [ 
 str 
 , 
 Union 
 [ 
 ConversionActionCategoryEnum 
 . 
 ConversionActionCategory 
 , 
 ConversionOriginEnum 
 . 
 ConversionOrigin 
 , 
 ], 
 ] 
 ] 
 = 
 [] 
 query 
 : 
 str 
 = 
 """ 
 SELECT 
 customer_conversion_goal.category, 
 customer_conversion_goal.origin 
 FROM customer_conversion_goal 
 """ 
 # The number of conversion goals is typically less than 50 so we use 
 # GoogleAdsService.search instead of search_stream. 
 search_request 
 : 
 SearchGoogleAdsRequest 
 = 
 client 
 . 
 get_type 
 ( 
 "SearchGoogleAdsRequest" 
 ) 
 search_request 
 . 
 customer_id 
 = 
 customer_id 
 search_request 
 . 
 query 
 = 
 query 
 results 
 : 
 SearchGoogleAdsResponse 
 = 
 ga_service 
 . 
 search 
 ( 
 request 
 = 
 search_request 
 ) 
 # Iterate over the results and build the list of conversion goals. 
 for 
 row 
 in 
 results 
 : 
 customer_conversion_goals 
 . 
 append 
 ( 
 { 
 "category" 
 : 
 row 
 . 
 customer_conversion_goal 
 . 
 category 
 , 
 "origin" 
 : 
 row 
 . 
 customer_conversion_goal 
 . 
 origin 
 , 
 } 
 ) 
 return 
 customer_conversion_goals 
 def 
  
 create_conversion_goal_operations 
 ( 
 client 
 : 
 GoogleAdsClient 
 , 
 customer_id 
 : 
 str 
 , 
 customer_conversion_goals 
 : 
 List 
 [ 
 Dict 
 [ 
 str 
 , 
 Union 
 [ 
 ConversionActionCategoryEnum 
 . 
 ConversionActionCategory 
 , 
 ConversionOriginEnum 
 . 
 ConversionOrigin 
 , 
 ], 
 ] 
 ], 
 ) 
 - 
> List 
 [ 
 MutateOperation 
 ]: 
  
 """Creates a list of MutateOperations that override customer conversion goals. 
 Args: 
 client: an initialized GoogleAdsClient instance. 
 customer_id: a client customer ID. 
 customer_conversion_goals: the list of customer conversion goals that 
 will be overridden. 
 Returns: 
 MutateOperations that update campaign conversion goals. 
 """ 
 campaign_conversion_goal_service 
 : 
 CampaignConversionGoalServiceClient 
 = 
 ( 
 client 
 . 
 get_service 
 ( 
 "CampaignConversionGoalService" 
 ) 
 ) 
 operations 
 : 
 List 
 [ 
 MutateOperation 
 ] 
 = 
 [] 
 # To override the customer conversion goals, we will change the 
 # biddability of each of the customer conversion goals so that only 
 # the desired conversion goal is biddable in this campaign. 
 for 
 customer_goal_dict 
 in 
 customer_conversion_goals 
 : 
 mutate_operation 
 : 
 MutateOperation 
 = 
 client 
 . 
 get_type 
 ( 
 "MutateOperation" 
 ) 
 campaign_conversion_goal 
 : 
 CampaignConversionGoal 
 = 
 ( 
 mutate_operation 
 . 
 campaign_conversion_goal_operation 
 . 
 update 
 ) 
 category_enum_value 
 : 
 ( 
 ConversionActionCategoryEnum 
 . 
 ConversionActionCategory 
 ) 
 = 
 customer_goal_dict 
 [ 
 "category" 
 ] 
 origin_enum_value 
 : 
 ConversionOriginEnum 
 . 
 ConversionOrigin 
 = 
 ( 
 customer_goal_dict 
 [ 
 "origin" 
 ] 
 ) 
 campaign_conversion_goal 
 . 
 resource_name 
 = 
 ( 
 campaign_conversion_goal_service 
 . 
 campaign_conversion_goal_path 
 ( 
 customer_id 
 , 
 _PERFORMANCE_MAX_CAMPAIGN_TEMPORARY_ID 
 , 
 category_enum_value 
 . 
 name 
 , 
 origin_enum_value 
 . 
 name 
 , 
 ) 
 ) 
 # Change the biddability for the campaign conversion goal. 
 # Set biddability to True for the desired (category, origin). 
 # Set biddability to False for all other conversion goals. 
 # Note: 
 #  1- It is assumed that this Conversion Action 
 #     (category=PURCHASE, origin=WEBSITE) exists in this account. 
 #  2- More than one goal can be biddable if desired. This example 
 #     shows only one. 
 if 
 ( 
 category_enum_value 
 == 
 client 
 . 
 enums 
 . 
 ConversionActionCategoryEnum 
 . 
 PURCHASE 
 and 
 origin_enum_value 
 == 
 client 
 . 
 enums 
 . 
 ConversionOriginEnum 
 . 
 WEBSITE 
 ): 
 biddable 
 = 
 True 
 else 
 : 
 biddable 
 = 
 False 
 campaign_conversion_goal 
 . 
 biddable 
 = 
 biddable 
 field_mask 
 = 
 protobuf_helpers 
 . 
 field_mask 
 ( 
 None 
 , 
 campaign_conversion_goal 
 . 
 _pb 
 ) 
 client 
 . 
 copy_from 
 ( 
 mutate_operation 
 . 
 campaign_conversion_goal_operation 
 . 
 update_mask 
 , 
 field_mask 
 , 
 ) 
 operations 
 . 
 append 
 ( 
 mutate_operation 
 ) 
 return 
 operations  
 
 . 
 py 

Ruby

 def 
  
 _get_customer_conversion_goals 
 ( 
 client 
 , 
  
 customer_id 
 ) 
  
 query 
  
 = 
  
<< ~ 
 EOD 
  
 SELECT 
  
 customer_conversion_goal 
 . 
 category 
 , 
  
 customer_conversion_goal 
 . 
 origin 
  
 FROM 
  
 customer_conversion_goal 
  
 EOD 
  
 customer_conversion_goals 
  
 = 
  
 [] 
  
 ga_service 
  
 = 
  
 client 
 . 
 service 
 . 
 google_ads 
  
 # The number of conversion goals is typically less than 50 so we use 
  
 # GoogleAdsService.search instead of search_stream. 
  
 response 
  
 = 
  
 ga_service 
 . 
 search 
 ( 
  
 customer_id 
 : 
  
 customer_id 
 , 
  
 query 
 : 
  
 query 
 , 
  
 ) 
  
 # Iterate over the results and build the list of conversion goals. 
  
 response 
 . 
 each 
  
 do 
  
 | 
 row 
 | 
  
 customer_conversion_goals 
 << 
 { 
  
 "category" 
  
 = 
>  
 row 
 . 
 customer_conversion_goal 
 . 
 category 
 , 
  
 "origin" 
  
 = 
>  
 row 
 . 
 customer_conversion_goal 
 . 
 origin 
  
 } 
  
 end 
  
 customer_conversion_goals 
 end 
 def 
  
 create_conversion_goal_operations 
 ( 
 client 
 , 
  
 customer_id 
 , 
  
 customer_conversion_goals 
 ) 
  
 campaign_conversion_goal_service 
  
 = 
  
 client 
 . 
 service 
 . 
 campaign_conversion_goal 
  
 operations 
  
 = 
  
 [] 
  
 # To override the customer conversion goals, we will change the 
  
 # biddability of each of the customer conversion goals so that only 
  
 # the desired conversion goal is biddable in this campaign. 
  
 customer_conversion_goals 
 . 
 each 
  
 do 
  
 | 
 customer_conversion_goal 
 | 
  
 operations 
 << 
 client 
 . 
 operation 
 . 
 mutate 
  
 do 
  
 | 
 m 
 | 
  
 m 
 . 
 campaign_conversion_goal_operation 
  
 = 
  
 client 
 . 
 operation 
 . 
 campaign_conversion_goal 
  
 do 
  
 | 
 op 
 | 
  
 op 
 . 
 update 
  
 = 
  
 client 
 . 
 resource 
 . 
 campaign_conversion_goal 
  
 do 
  
 | 
 ccg 
 | 
  
 ccg 
 . 
 resource_name 
  
 = 
  
 client 
 . 
 path 
 . 
 campaign_conversion_goal 
 ( 
  
 customer_id 
 , 
  
 PERFORMANCE_MAX_CAMPAIGN_TEMPORARY_ID 
 , 
  
 customer_conversion_goal 
 [ 
 "category" 
 ]. 
 to_s 
 , 
  
 customer_conversion_goal 
 [ 
 "origin" 
 ]. 
 to_s 
 ) 
  
 # Change the biddability for the campaign conversion goal. 
  
 # Set biddability to True for the desired (category, origin). 
  
 # Set biddability to False for all other conversion goals. 
  
 # Note: 
  
 #  1- It is assumed that this Conversion Action 
  
 #     (category=PURCHASE, origin=WEBSITE) exists in this account. 
  
 #  2- More than one goal can be biddable if desired. This example 
  
 #     shows only one. 
  
 ccg 
 . 
 biddable 
  
 = 
  
 ( 
 customer_conversion_goal 
 [ 
 "category" 
 ] 
  
 == 
  
 :PURCHASE 
  
&&  
 customer_conversion_goal 
 [ 
 "origin" 
 ] 
  
 == 
  
 :WEBSITE 
 ) 
  
 end 
  
 op 
 . 
 update_mask 
  
 = 
  
 Google 
 :: 
 Ads 
 :: 
 GoogleAds 
 :: 
 FieldMaskUtil 
 . 
 all_set_fields_of 
 ( 
 op 
 . 
 update 
 ) 
  
 end 
  
 end 
  
 end 
  
 operations 
 end  
 
 . 
 rb 
  

Perl

 sub 
  
 get_customer_conversion_goals 
  
 { 
  
 my 
  
 ( 
 $api_client 
 , 
  
 $customer_id 
 ) 
  
 = 
  
 @_ 
 ; 
  
 my 
  
 $customer_conversion_goals 
  
 = 
  
 [] 
 ; 
  
 # Create a query that retrieves all customer conversion goals. 
  
 my 
  
 $query 
  
 = 
  
 "SELECT customer_conversion_goal.category, customer_conversion_goal.origin " 
  
 . 
  
 "FROM customer_conversion_goal" 
 ; 
  
 # The number of conversion goals is typically less than 50 so we use 
  
 # GoogleAdsService->search() method instead of search_stream(). 
  
 my 
  
 $search_response 
  
 = 
  
 $api_client 
 - 
> GoogleAdsService 
 () 
 - 
> search 
 ({ 
  
 customerId 
  
 = 
>  
 $customer_id 
 , 
  
 query 
  
 = 
>  
 $query 
  
 }); 
  
 # Iterate over the results and build the list of conversion goals. 
  
 foreach 
  
 my 
  
 $google_ads_row 
  
 ( 
 @ 
 { 
 $search_response 
 - 
> { 
 results 
 }}) 
  
 { 
  
 push 
  
 @$customer_conversion_goals 
 , 
  
 { 
  
 category 
  
 = 
>  
 $google_ads_row 
 - 
> { 
 customerConversionGoal 
 }{ 
 category 
 }, 
  
 origin 
  
 = 
>  
 $google_ads_row 
 - 
> { 
 customerConversionGoal 
 }{ 
 origin 
 }}; 
  
 } 
  
 return 
  
 $customer_conversion_goals 
 ; 
 } 
 # Creates a list of MutateOperations that override customer conversion goals. 
 sub 
  
 create_conversion_goal_operations 
  
 { 
  
 my 
  
 ( 
 $customer_id 
 , 
  
 $customer_conversion_goals 
 ) 
  
 = 
  
 @_ 
 ; 
  
 my 
  
 $operations 
  
 = 
  
 [] 
 ; 
  
 # To override the customer conversion goals, we will change the biddability of 
  
 # each of the customer conversion goals so that only the desired conversion goal 
  
 # is biddable in this campaign. 
  
 foreach 
  
 my 
  
 $customer_conversion_goal 
  
 ( 
 @$customer_conversion_goals 
 ) 
  
 { 
  
 my 
  
 $campaign_conversion_goal 
  
 = 
  
 Google::Ads::GoogleAds::V21::Resources:: 
 CampaignConversionGoal 
 - 
> new 
 ({ 
  
 resourceName 
  
 = 
>  
 Google::Ads::GoogleAds::V21::Utils::ResourceNames:: 
 campaign_conversion_goal 
 ( 
  
 $customer_id 
 , 
  
 PERFORMANCE_MAX_CAMPAIGN_TEMPORARY_ID 
 , 
  
 $customer_conversion_goal 
 - 
> { 
 category 
 }, 
  
 $customer_conversion_goal 
 - 
> { 
 origin 
 })}); 
  
 # Change the biddability for the campaign conversion goal. 
  
 # Set biddability to true for the desired (category, origin). 
  
 # Set biddability to false for all other conversion goals. 
  
 # Note: 
  
 #  1- It is assumed that this Conversion Action 
  
 #     (category=PURCHASE, origin=WEBSITE) exists in this account. 
  
 #  2- More than one goal can be biddable if desired. This example 
  
 #     shows only one. 
  
 if 
  
 ( 
  
 $customer_conversion_goal 
 - 
> { 
 category 
 } 
  
 eq 
  
 PURCHASE 
 && 
 $customer_conversion_goal 
 - 
> { 
 origin 
 } 
  
 eq 
  
 WEBSITE 
 ) 
  
 { 
  
 $campaign_conversion_goal 
 - 
> { 
 biddable 
 } 
  
 = 
  
 "true" 
 ; 
  
 } 
  
 else 
  
 { 
  
 $campaign_conversion_goal 
 - 
> { 
 biddable 
 } 
  
 = 
  
 "false" 
 ; 
  
 } 
  
 push 
  
 @$operations 
 , 
  
 Google::Ads::GoogleAds::V21::Services::GoogleAdsService:: 
 MutateOperation 
  
 - 
> new 
 ({ 
  
 campaignConversionGoalOperation 
  
 = 
>  
 Google::Ads::GoogleAds::V21::Services::CampaignConversionGoalService:: 
 CampaignConversionGoalOperation 
  
 - 
> new 
 ({ 
  
 update 
  
 = 
>  
 $campaign_conversion_goal 
 , 
  
 # Set the update mask on the operation. Here the update mask will be 
  
 # a list of all the fields that were set on the update object. 
  
 updateMask 
  
 = 
>  
 all_set_fields_of 
 ( 
 $campaign_conversion_goal 
 )})}); 
  
 } 
  
 return 
  
 $operations 
 ; 
 } 
  
  

Shopping reports

Use the shopping_performance_view to retrieve metrics summarized by product segments such as segments.product_item_id .

  SELECT 
  
 segments 
 . 
 product_item_id 
 , 
  
 metrics 
 . 
 clicks 
 , 
  
 metrics 
 . 
 cost_micros 
 , 
  
 metrics 
 . 
 impressions 
 , 
  
 metrics 
 . 
 conversions 
 , 
  
 metrics 
 . 
 all_conversions 
 , 
  
 campaign 
 . 
 advertising_channel_type 
 FROM 
  
 shopping_performance_view 
 WHERE 
  
 campaign 
 . 
 advertising_channel_type 
  
 = 
  
 'PERFORMANCE_MAX' 
  
 AND 
  
 segments 
 . 
 date 
  
 DURING 
  
 LAST_30_DAYS 
  
 AND 
  
 metrics 
 . 
 clicks 
 > 
 0 
 ORDER 
  
 BY 
  
 metrics 
 . 
 all_conversions 
  
 DESC 
 , 
  
 metrics 
 . 
 conversions 
  
 DESC 
 , 
  
 metrics 
 . 
 clicks 
  
 DESC 
 , 
  
 metrics 
 . 
 cost_micros 
  
 DESC 
 , 
  
 metrics 
 . 
 impressions 
  
 DESC 
 

Use the asset_group_product_group_view to retrieve metrics such as clicks, conversions, and impressions of the listing group associated with this asset group.

Vehicle ads

Advertisers can use vehicle ads to promote their vehicle inventory by uploading a vehicle data feed to Merchant Center, then using Performance Max campaigns with vehicle feeds to manage ads.

To create a Performance Max campaign with a vehicle feed using the Google Ads API, follow create a retail campaign , and set the campaign's listing_type to VEHICLES .

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