// [END add_smart_campaign_1] // [START add_smart_campaign_10] /// <summary> /// Retrieves creative suggestions for a Smart campaign ad. /// /// Using the SmartCampaignSuggestService to suggest creatives for new /// and existing Smart campaigns is highly recommended because it helps /// the campaigns achieve optimal performance. /// </summary> /// <param name="client"></param> /// <param name="customerId">The Google Ads customer ID.</param> /// <param name="suggestionInfo">a SmartCampaignSuggestionInfo instance /// with details about the business being advertised.</param> /// <returns>A SmartCampaignAdInfo instance with suggested headlines and /// descriptions.</returns> private SmartCampaignAdInfo GetAdSuggestions(GoogleAdsClient client, long customerId, SmartCampaignSuggestionInfo suggestionInfo) { SmartCampaignSuggestServiceClient smartCampaignSuggestService = client.GetService(Services.V10.SmartCampaignSuggestService); SuggestSmartCampaignAdRequest request = new SuggestSmartCampaignAdRequest { CustomerId = customerId.ToString(), // Unlike the SuggestSmartCampaignBudgetOptions method, it's only possible to // use suggestion_info to retrieve ad creative suggestions. SuggestionInfo = suggestionInfo }; // Issue a request to retrieve ad creative suggestions. SuggestSmartCampaignAdResponse response = smartCampaignSuggestService.SuggestSmartCampaignAd(request); // The SmartCampaignAdInfo object in the response contains a list of up to // three headlines and two descriptions. Note that some of the suggestions // may have empty strings as text. Before setting these on the ad you should // review them and filter out any empty values. SmartCampaignAdInfo adSuggestions = response.AdInfo; if (adSuggestions != null) { Console.WriteLine($"The following headlines were suggested:"); foreach (AdTextAsset headline in adSuggestions.Headlines) { Console.WriteLine($"\t{headline.Text}"); } Console.WriteLine($"And the following descriptions were suggested:"); foreach (AdTextAsset description in adSuggestions.Descriptions) { Console.WriteLine($"\t{description.Text}"); } } else { Console.WriteLine("No ad suggestions were found."); adSuggestions = new SmartCampaignAdInfo(); } return(adSuggestions); }
// [END add_smart_campaign_5] // [START add_smart_campaign_6] /// <summary> /// Creates a MutateOperation that creates a new ad group ad. /// A temporary ID will be used in the ad group resource name for this ad group ad to /// associate it with the ad group created in earlier steps. /// </summary> /// <param name="customerId">The Google Ads customer ID.</param> /// <param name="adSuggestions">SmartCampaignAdInfo with ad creative /// suggestions.</param> /// <returns>A MutateOperation that creates a new ad group ad.</returns> private MutateOperation CreateAdGroupAdOperation(long customerId, SmartCampaignAdInfo adSuggestions) { AdGroupAd adGroupAd = new AdGroupAd { AdGroup = ResourceNames.AdGroup(customerId, AD_GROUP_TEMPORARY_ID), Ad = new Ad { SmartCampaignAd = new SmartCampaignAdInfo(), }, }; SmartCampaignAdInfo ad = adGroupAd.Ad.SmartCampaignAd; // The SmartCampaignAdInfo object includes headlines and descriptions // retrieved from the SmartCampaignSuggestService.SuggestSmartCampaignAd // method. It's recommended that users review and approve or update these // creatives before they're set on the ad. It's possible that some or all of // these assets may contain empty texts, which should not be set on the ad // and instead should be replaced with meaninful texts from the user. Below // we just accept the creatives that were suggested while filtering out empty // assets. If no headlines or descriptions were suggested, then we manually // add some, otherwise this operation will generate an INVALID_ARGUMENT // error. Individual workflows will likely vary here. ad.Headlines.Add(adSuggestions.Headlines); ad.Descriptions.Add(adSuggestions.Descriptions); // If there are fewer headlines than are required, we manually add additional // headlines to make up for the difference. if (adSuggestions.Headlines.Count() < NUM_REQUIRED_HEADLINES) { for (int i = 0; i < NUM_REQUIRED_HEADLINES - adSuggestions.Headlines.Count(); i++) { ad.Headlines.Add(new AdTextAsset() { Text = $"Placeholder headline {i + 1}" }); } } // If there are fewer descriptions than are required, we manually add // additional descriptions to make up for the difference. if (adSuggestions.Descriptions.Count() < NUM_REQUIRED_DESCRIPTIONS) { for (int i = 0; i < NUM_REQUIRED_DESCRIPTIONS - adSuggestions.Descriptions.Count(); i++) { ad.Descriptions.Add(new AdTextAsset() { Text = $"Placeholder description {i + 1}" }); } } return(new MutateOperation { AdGroupAdOperation = new AdGroupAdOperation { Create = adGroupAd } }); }
/// <summary> /// Runs the code example. /// </summary> /// <param name="client">The Google Ads client.</param> /// <param name="customerId">The Google Ads customer ID.</param> /// <param name="keywordText">A keyword string used for generating keyword themes.</param> /// <param name="freeFormKeywordText">A keyword used to create a free-form keyword theme. /// </param> /// <param name="businessLocationId">The ID of a Business Profile location.</param> /// <param name="businessName">The name of a Business Profile business.</param> public void Run(GoogleAdsClient client, long customerId, string keywordText, string freeFormKeywordText, ulong?businessLocationId, string businessName) { GoogleAdsServiceClient googleAdsServiceClient = client.GetService(Services.V10.GoogleAdsService); try { // [START add_smart_campaign_12] // Gets the SmartCampaignSuggestionInfo object which acts as the basis for many // of the entities necessary to create a Smart campaign. It will be reused a number // of times to retrieve suggestions for keyword themes, budget amount, ad //creatives, and campaign criteria. SmartCampaignSuggestionInfo suggestionInfo = GetSmartCampaignSuggestionInfo(client, businessLocationId, businessName); // Generates a list of keyword themes using the SuggestKeywordThemes method on the // SmartCampaignSuggestService. It is strongly recommended that you use this // strategy for generating keyword themes. List <KeywordThemeConstant> keywordThemeConstants = GetKeywordThemeSuggestions(client, customerId, suggestionInfo); // Optionally retrieves auto-complete suggestions for the given keyword text and // adds them to the list of keyWordThemeConstants. if (keywordText != null) { keywordThemeConstants.AddRange(GetKeywordTextAutoCompletions( client, keywordText)); } // Converts the KeywordThemeConstants to KeywordThemeInfos. List <KeywordThemeInfo> keywordThemeInfos = keywordThemeConstants.Select( constant => new KeywordThemeInfo { KeywordThemeConstant = constant.ResourceName }) .ToList(); // Optionally includes any freeform keywords verbatim. if (freeFormKeywordText != null) { keywordThemeInfos.Add(new KeywordThemeInfo() { FreeFormKeywordTheme = freeFormKeywordText }); } // Includes the keyword suggestions in the overall SuggestionInfo object. // [START add_smart_campaign_13] suggestionInfo.KeywordThemes.Add(keywordThemeInfos); // [END add_smart_campaign_13] // [END add_smart_campaign_12] SmartCampaignAdInfo adSuggestions = GetAdSuggestions(client, customerId, suggestionInfo); long suggestedBudgetAmount = GetBudgetSuggestion(client, customerId, suggestionInfo); // [START add_smart_campaign_7] // The below methods create and return MutateOperations that we later provide to // the GoogleAdsService.Mutate method in order to create the entities in a single // request. Since the entities for a Smart campaign are closely tied to one-another // it's considered a best practice to create them in a single Mutate request; the // entities will either all complete successfully or fail entirely, leaving no // orphaned entities. See: // https://developers.google.com/google-ads/api/docs/mutating/overview MutateOperation campaignBudgetOperation = CreateCampaignBudgetOperation(customerId, suggestedBudgetAmount); MutateOperation smartCampaignOperation = CreateSmartCampaignOperation(customerId); MutateOperation smartCampaignSettingOperation = CreateSmartCampaignSettingOperation(customerId, businessLocationId, businessName); IEnumerable <MutateOperation> campaignCriterionOperations = CreateCampaignCriterionOperations(customerId, keywordThemeInfos, suggestionInfo); MutateOperation adGroupOperation = CreateAdGroupOperation(customerId); MutateOperation adGroupAdOperation = CreateAdGroupAdOperation(customerId, adSuggestions); // Send the operations in a single mutate request. MutateGoogleAdsRequest mutateGoogleAdsRequest = new MutateGoogleAdsRequest { CustomerId = customerId.ToString() }; // It's important to create these entities in this order because they depend on // each other, for example the SmartCampaignSetting and ad group depend on the // campaign, and the ad group ad depends on the ad group. mutateGoogleAdsRequest.MutateOperations.Add(campaignBudgetOperation); mutateGoogleAdsRequest.MutateOperations.Add(smartCampaignOperation); mutateGoogleAdsRequest.MutateOperations.Add(smartCampaignSettingOperation); mutateGoogleAdsRequest.MutateOperations.Add(campaignCriterionOperations); mutateGoogleAdsRequest.MutateOperations.Add(adGroupOperation); mutateGoogleAdsRequest.MutateOperations.Add(adGroupAdOperation); MutateGoogleAdsResponse response = googleAdsServiceClient.Mutate(mutateGoogleAdsRequest); PrintResponseDetails(response); // [END add_smart_campaign_7] } catch (GoogleAdsException e) { Console.WriteLine("Failure:"); Console.WriteLine($"Message: {e.Message}"); Console.WriteLine($"Failure: {e.Failure}"); Console.WriteLine($"Request ID: {e.RequestId}"); throw; } }