Рекомендации могут улучшить ваши кампании несколькими способами:
- Внедряйте новые и актуальные функции
- Получите больше от вашего бюджета с улучшенными ставками, ключевыми словами и объявлениями
- Повысьте общую производительность и эффективность ваших кампаний
Чтобы повысить показатели оптимизации, вы можете использовать RecommendationService
для получения рекомендаций, а затем применить или отклонить их соответствующим образом.
Оценка оптимизации
Показатель оптимизации — это оценка того, насколько хорошо настроена ваша учетная запись Google Реклама, и она доступна на уровнях « Customer
» и Campaign
.
Customer.optimization_score_weight
доступен только для неуправляющих аккаунтов и используется для вычисления общего показателя оптимизации нескольких аккаунтов. Получите показатель оптимизации и вес показателя оптимизации для учетных записей и перемножьте их вместе ( Customer.optimization_score * Customer.optimization_score_weight
), чтобы вычислить общий показатель оптимизации.
Для отчетов о customer
и campaign
доступны показатели, связанные с оптимизацией:
-
metrics.optimization_score_url
предоставляет прямую ссылку на учетную запись для просмотра информации о соответствующих рекомендациях в пользовательском интерфейсе Google Ads. -
metrics.optimization_score_uplift
показывает, насколько увеличится показатель оптимизации, если будут применены все соответствующие рекомендации.
optimization_score_uplift
— это оценка, основанная на всех доступных рекомендациях в целом, а не только на сумме оценок повышения для каждой рекомендации.
Типы рекомендаций
Google Ads API полностью поддерживает следующие типы рекомендаций :
Тип рекомендации | Описание |
---|---|
CAMPAIGN_BUDGET | Исправление кампаний, ограниченных бюджетом |
KEYWORD | Добавить новые ключевые слова |
TEXT_AD | Добавить варианты объявлений |
TARGET_CPA_OPT_IN | Ставка с целевой ценой за конверсию |
MAXIMIZE_CONVERSIONS_OPT_IN | Делайте ставки с максимальным количеством конверсий |
ENHANCED_CPC_OPT_IN | Ставка с Оптимизатором цены за конверсию |
SEARCH_PARTNERS_OPT_IN | Расширяйте охват с помощью поисковых партнеров Google |
MAXIMIZE_CLICKS_OPT_IN | Делайте ставки с максимальным количеством кликов |
OPTIMIZE_AD_ROTATION | Используйте оптимизированную ротацию объявлений |
CALLOUT_EXTENSION | Добавьте уточнения в кампанию |
SITELINK_EXTENSION | Добавьте дополнительные ссылки в кампанию |
CALL_EXTENSION | Добавьте номера телефонов в кампанию |
KEYWORD_MATCH_TYPE (deprecated) | Изменить типы соответствия ключевых слов |
MOVE_UNUSED_BUDGET | Переместите неиспользованные в ограниченные бюджеты |
TARGET_ROAS_OPT_IN | Ставка с целевой рентабельностью инвестиций |
FORECASTING_CAMPAIGN_BUDGET | Исправьте кампании, бюджет которых, как ожидается, в будущем станет ограниченным. |
RESPONSIVE_SEARCH_AD | Добавить новое адаптивное поисковое объявление |
MARGINAL_ROI_CAMPAIGN_BUDGET | Скорректируйте бюджет кампании, чтобы повысить рентабельность инвестиций |
USE_BROAD_MATCH_KEYWORD | Используйте широкое соответствие для кампаний на основе конверсий с автоматическим назначением ставок. |
RESPONSIVE_SEARCH_AD_ASSET | Добавление объектов адаптивного поискового объявления в объявление |
UPGRADE_SMART_SHOPPING_CAMPAIGN_TO_PERFORMANCE_MAX | Обновите умную торговую кампанию до кампании Performance Max |
RESPONSIVE_SEARCH_AD_IMPROVE_AD_STRENGTH | Улучшите качество адаптивного поискового объявления |
DISPLAY_EXPANSION_OPT_IN | Обновите кампанию, чтобы использовать расширение контекстно-медийной сети |
UPGRADE_LOCAL_CAMPAIGN_TO_PERFORMANCE_MAX | Обновите устаревшую локальную кампанию до кампании Performance Max |
RAISE_TARGET_CPA_BID_TOO_LOW | Рекомендация повышать целевую цену за конверсию, когда она слишком низкая и конверсий очень мало или совсем нет. |
FORECASTING_SET_TARGET_ROAS | Рекомендуется увеличить бюджет перед сезонным событием, которое, по прогнозам, приведет к увеличению трафика, и изменить стратегию назначения ставок с максимальной ценности конверсии на целевую рентабельность инвестиций в рекламу. |
Обработка неподдерживаемых типов
Получить рекомендации
Как и большинство других сущностей в Google Ads API, объекты Recommendation
извлекаются с помощью GoogleAdsService.SearchStream
с запросом на языке запросов Google Ads.
Для каждого типа рекомендации сведения о рекомендации представлены в определенном поле recommendation
с определенным типом:
Пример кода
В следующем примере кода извлекаются все доступные и отклоненные рекомендации типа TEXT_AD
из учетной записи и выводятся некоторые сведения о них:
Джава
private void runExample(GoogleAdsClient googleAdsClient, long customerId) { try (GoogleAdsServiceClient googleAdsServiceClient = googleAdsClient.getLatestVersion().createGoogleAdsServiceClient()) { String query = "SELECT recommendation.type, " + "recommendation.campaign, " + "recommendation.text_ad_recommendation " + "FROM recommendation " + "WHERE recommendation.type = TEXT_AD"; // Creates a request that will retrieve all recommendations using pages of the // specified page size. SearchGoogleAdsRequest request = SearchGoogleAdsRequest.newBuilder() .setCustomerId(Long.toString(customerId)) .setPageSize(PAGE_SIZE) .setQuery(query) .build(); // Issues the search request. SearchPagedResponse searchPagedResponse = googleAdsServiceClient.search(request); // Iterates over all rows in all pages and prints the requested field values for the // recommendation in each row. for (GoogleAdsRow googleAdsRow : searchPagedResponse.iterateAll()) { Recommendation recommendation = googleAdsRow.getRecommendation(); Ad recommendedAd = recommendation.getTextAdRecommendation().getAd(); System.out.printf( "Recommendation ('%s') was found for campaign '%s':%n", recommendation.getResourceName(), recommendation.getCampaign()); if (recommendedAd.hasExpandedTextAd()) { ExpandedTextAdInfo eta = recommendedAd.getExpandedTextAd(); System.out.printf( "\tHeadline 1 = '%s'%n" + "\tHeadline 2 = '%s'%n" + "\tDescription = '%s'%n", eta.getHeadlinePart1(), eta.getHeadlinePart2(), eta.getDescription()); } if (recommendedAd.getDisplayUrl() != null) { System.out.printf("\tDisplay URL = '%s'%n", recommendedAd.getDisplayUrl()); } for (String url : recommendedAd.getFinalUrlsList()) { System.out.printf("\tFinal URL = '%s'%n", url); } for (String url : recommendedAd.getFinalMobileUrlsList()) { System.out.printf("\tFinal Mobile URL = '%s'%n", url); } } } }
С#
public void Run(GoogleAdsClient client, long customerId) { // Get the GoogleAdsServiceClient . GoogleAdsServiceClient service = client.GetService(Services.V12.GoogleAdsService); string query = @"SELECT recommendation.type, recommendation.campaign, recommendation.text_ad_recommendation FROM recommendation WHERE recommendation.type = TEXT_AD"; // Create a request that will retrieve all recommendations using pages of the // specified page size. SearchGoogleAdsRequest request = new SearchGoogleAdsRequest() { CustomerId = customerId.ToString(), PageSize = PAGE_SIZE, Query = query }; try { // Issue the search request. PagedEnumerable<SearchGoogleAdsResponse, GoogleAdsRow> searchPagedResponse = service.Search(customerId.ToString(), query); // Iterates over all rows in all pages and prints the requested field values // for the recommendation in each row. foreach (GoogleAdsRow googleAdsRow in searchPagedResponse) { Recommendation recommendation = googleAdsRow.Recommendation; // ... } } catch (GoogleAdsException e) { Console.WriteLine("Failure:"); Console.WriteLine($"Message: {e.Message}"); Console.WriteLine($"Failure: {e.Failure}"); Console.WriteLine($"Request ID: {e.RequestId}"); throw; } }
PHP
public static function runExample(GoogleAdsClient $googleAdsClient, int $customerId) { $googleAdsServiceClient = $googleAdsClient->getGoogleAdsServiceClient(); // Creates a query that retrieves recommendations for text ads. $query = 'SELECT recommendation.type, recommendation.campaign, ' . 'recommendation.text_ad_recommendation ' . 'FROM recommendation ' . 'WHERE recommendation.type = TEXT_AD'; // Issues a search request by specifying page size. $response = $googleAdsServiceClient->search($customerId, $query, ['pageSize' => self::PAGE_SIZE]); // Iterates over all rows in all pages and prints the requested field values for // the recommendation in each row. foreach ($response->iterateAllElements() as $googleAdsRow) { /** @var GoogleAdsRow $googleAdsRow */ $recommendation = $googleAdsRow->getRecommendation(); printf( "Recommendation with resource name '%s' was found for campaign " . "with resource name '%s':%s", $recommendation->getResourceName(), $recommendation->getCampaign(), PHP_EOL ); $recommendedAd = $recommendation->getTextAdRecommendation()->getAd(); if (!is_null($recommendedAd->getExpandedTextAd())) { $recommendedExpandedTextAd = $recommendedAd->getExpandedTextAd(); printf( "\tHeadline part 1 is '%s'.%s", $recommendedExpandedTextAd->getHeadlinePart1(), PHP_EOL ); printf( "\tHeadline part 2 is '%s'.%s", $recommendedExpandedTextAd->getHeadlinePart2(), PHP_EOL ); printf( "\tDescription is '%s'%s", $recommendedExpandedTextAd->getDescription(), PHP_EOL ); } if (!is_null($recommendedAd->getDisplayUrl())) { printf("\tDisplay URL is '%s'.%s", $recommendedAd->getDisplayUrl(), PHP_EOL); } foreach ($recommendedAd->getFinalUrls() as $finalUrl) { /** @var string $finalUrl */ printf("\tFinal URL is '%s'.%s", $finalUrl, PHP_EOL); } foreach ($recommendedAd->getFinalMobileUrls() as $finalMobileUrl) { /** @var string $finalMobileUrl */ printf("\tFinal Mobile URL is '%s'.%s", $finalMobileUrl, PHP_EOL); } } }
Питон
def main(client, customer_id): ga_service = client.get_service("GoogleAdsService") query = """ SELECT recommendation.type, recommendation.campaign, recommendation.text_ad_recommendation FROM recommendation WHERE recommendation.type = TEXT_AD""" search_request = client.get_type("SearchGoogleAdsStreamRequest") search_request.customer_id = customer_id search_request.query = query stream = ga_service.search_stream(request=search_request) for batch in stream: for row in batch.results: recommendation = row.recommendation recommended_ad = recommendation.text_ad_recommendation.ad print( f'Recommendation ("{recommendation.resource_name}") ' f'was found for campaign "{recommendation.campaign}".' ) if recommended_ad.display_url: print(f'\tDisplay URL = "{recommended_ad.display_url}"') for url in recommended_ad.final_urls: print(f'\tFinal URL = "{url}"') for url in recommended_ad.final_mobile_urls: print(f'\tFinal Mobile URL = "{url}"')
Рубин
def get_text_ad_recommendations(customer_id) # GoogleAdsClient will read a config file from # ENV['HOME']/google_ads_config.rb when called without parameters client = Google::Ads::GoogleAds::GoogleAdsClient.new ga_service = client.service.google_ads query = <<~QUERY SELECT recommendation.type, recommendation.campaign, recommendation.text_ad_recommendation FROM recommendation WHERE recommendation.type = TEXT_AD QUERY response = ga_service.search( customer_id: customer_id, query: query, page_size: PAGE_SIZE, ) response.each do |row| recommendation = row.recommendation recommended_ad = recommendation.text_ad_recommendation.ad puts "Recommendation ('#{recommendation.resource_name}') was found for "\ "campaign '#{recommendation.campaign}'." if recommended_ad.expanded_text_ad eta = recommended_ad.expanded_text_ad puts "\tHeadline 1 = '#{eta.headline_part1}'\n\tHeadline2 = '#{eta.headline_part2}'\n" + "\tDescription = '#{eta.description}'" end if recommended_ad.display_url puts "\tDisplay URL = '#{recommended_ad.display_url}'" end recommended_ad.final_urls.each do |url| puts "\tFinal Url = '#{url}'" end recommended_ad.final_mobile_urls.each do |url| puts "\tFinal Mobile Url = '#{url}'" end end end
Перл
sub get_text_ad_recommendations { my ($api_client, $customer_id) = @_; # Creates the search query. my $search_query = "SELECT recommendation.type, recommendation.campaign, " . "recommendation.text_ad_recommendation " . "FROM recommendation WHERE recommendation.type = TEXT_AD"; # Create a search Google Ads request that will retrieve all recommendations for # text ads using pages of the specified page size. my $search_request = Google::Ads::GoogleAds::V12::Services::GoogleAdsService::SearchGoogleAdsRequest ->new({ customerId => $customer_id, query => $search_query, pageSize => PAGE_SIZE }); # Get the GoogleAdsService. my $google_ads_service = $api_client->GoogleAdsService(); my $iterator = Google::Ads::GoogleAds::Utils::SearchGoogleAdsIterator->new({ service => $google_ads_service, request => $search_request }); # Iterate over all rows in all pages and print the requested field values for # the recommendation in each row. while ($iterator->has_next) { my $google_ads_row = $iterator->next; my $recommendation = $google_ads_row->{recommendation}; printf "Recommendation '%s' was found for campaign '%s':\n", $recommendation->{resourceName}, $recommendation->{campaign}; my $recommended_ad = $recommendation->{textAdRecommendation}{ad}; if ($recommended_ad->{expandedTextAd}) { my $recommended_expanded_text_ad = $recommended_ad->{expandedTextAd}; printf "\tHeadline part 1 is '%s'.\n" . "\tHeadline part 2 is '%s'.\n" . "\tDescription is '%s'.\n", $recommended_expanded_text_ad->{headlinePart1}, $recommended_expanded_text_ad->{headlinePart2}, $recommended_expanded_text_ad->{description}; } if ($recommended_ad->{displayUrl}) { printf "\tDisplay URL is '%s'.\n", $recommended_ad->{displayUrl}; } foreach my $final_url (@{$recommended_ad->{finalUrls}}) { printf "\tFinal URL is '%s'.\n", $final_url; } foreach my $final_mobile_url (@{$recommended_ad->{finalMobileUrls}}) { printf "\tFinal Mobile URL is '%s'.\n", $final_mobile_url; } } return 1; }
Принимать меры
Любую полученную рекомендацию можно применить или отклонить.
В зависимости от типа рекомендации рекомендации могут меняться ежедневно или даже несколько раз в день. Когда это происходит, resource_name
объекта может стать устаревшим после извлечения рекомендации.
Хорошей практикой является принятие мер по рекомендациям вскоре после получения.
Применить рекомендации
Видео: применение рекомендаций
Настройка учетных записей для автоматического применения рекомендаций не поддерживается в Google Ads API, однако вы можете реализовать аналогичное поведение для типов рекомендаций, полностью поддерживаемых Google Ads API. Дополнительные сведения см. в примере кода DetectAndApplyRecommendations
.
Вы можете применить активные или отклоненные рекомендации с помощью метода ApplyRecommendation
службы RecommendationService
.
Типы рекомендаций могут иметь обязательные или необязательные параметры. Большинство рекомендаций содержат рекомендованные значения, которые используются по умолчанию; см. подробности рекомендации .
Используйте поле apply_parameters
ApplyRecommendationOperation
, чтобы применить рекомендации с определенными значениями параметров. Каждый подходящий тип рекомендации имеет свое поле. Любой тип рекомендации, отсутствующий в таблице, не использует эти значения параметров.
Тип рекомендации | применить_параметры | Тип |
---|---|---|
CAMPAIGN_BUDGET | campaign_budget | CampaignBudgetParameters |
KEYWORD | keyword | KeywordParameters |
TEXT_AD | text_ad | TextAdParameters |
TARGET_CPA_OPT_IN | target_cpa_opt_in | TargetCpaOptInParameters |
CALLOUT_EXTENSION | callout_extension | CalloutExtensionParameters |
SITELINK_EXTENSION | sitelink_extension | SitelinkExtensionParameters |
CALL_EXTENSION | call_extension | CallExtensionParameters |
MOVE_UNUSED_BUDGET | move_unused_budget | MoveUnusedBudgetParameters |
TARGET_ROAS_OPT_IN | target_roas_opt_in | TargetRoasOptInParameters |
FORECASTING_CAMPAIGN_BUDGET | campaign_budget | CampaignBudgetParameters |
RESPONSIVE_SEARCH_AD | responsive_search_ad | ResponsiveSearchAdParameters |
MARGINAL_ROI_CAMPAIGN_BUDGET | campaign_budget | CampaignBudgetParameters |
USE_BROAD_MATCH_KEYWORD | use_broad_match_keyword | UseBroadMatchKeywordRecommendation |
RESPONSIVE_SEARCH_AD_ASSET | responsive_search_ad_asset | ResponsiveSearchAdAssetParameters |
Пример кода
В следующем примере кода показано, как применить рекомендацию с рекомендуемыми параметрами применения.
Джава
private void runExample( GoogleAdsClient googleAdsClient, long customerId, String recommendationId) { String recommendationResourceName = ResourceNames.recommendation(customerId, recommendationId); ApplyRecommendationOperation.Builder operationBuilder = ApplyRecommendationOperation.newBuilder().setResourceName(recommendationResourceName); // Each recommendation types has optional parameters to override the recommended values. // This is an example to override a recommended ad when a TextAdRecommendation is applied. // Please read // https://developers.google.com/google-ads/api/reference/rpc/latest/ApplyRecommendationOperation // for details. // Note that additional import statements are needed for this example to work. And also, please // replace INSERT_AD_ID_HERE with a valid ad ID below. // // Ad overrideAd = Ad.newBuilder().setId(Long.parseLong("INSERT_AD_ID_HERE")).build(); // operationBuilder.setTextAd(TextAdParameters.newBuilder(). // setAd(overrideAd).build()).build(); List<ApplyRecommendationOperation> operations = new ArrayList<>(); operations.add(operationBuilder.build()); try (RecommendationServiceClient recommendationServiceClient = googleAdsClient.getLatestVersion().createRecommendationServiceClient()) { ApplyRecommendationResponse response = recommendationServiceClient.applyRecommendation(Long.toString(customerId), operations); System.out.printf("Applied %d recommendation:%n", response.getResultsCount()); for (ApplyRecommendationResult result : response.getResultsList()) { System.out.println(result.getResourceName()); } } }
С#
public void Run(GoogleAdsClient client, long customerId, long recommendationId) { // Get the RecommendationServiceClient. RecommendationServiceClient service = client.GetService( Services.V12.RecommendationService); ApplyRecommendationOperation operation = new ApplyRecommendationOperation() { ResourceName = ResourceNames.Recommendation(customerId, recommendationId), // Each recommendation types has optional parameters to override the recommended // values. For example, you can override a recommended ad when a // TextAdRecommendation is applied, as shown below. // Please read https://developers.google.com/google-ads/api/reference/rpc/latest/ApplyRecommendationOperation // for details. // TextAd = new TextAdParameters() { // Ad = new Ad() { // Id = long.Parse("INSERT_AD_ID_HERE") // } // } }; try { ApplyRecommendationResponse response = service.ApplyRecommendation( customerId.ToString(), new ApplyRecommendationOperation[] { operation }); Console.WriteLine($"Applied {0} recommendation(s):", response.Results.Count); foreach (ApplyRecommendationResult result in response.Results) { Console.WriteLine($"- {result.ResourceName}"); } } catch (GoogleAdsException e) { Console.WriteLine("Failure:"); Console.WriteLine($"Message: {e.Message}"); Console.WriteLine($"Failure: {e.Failure}"); Console.WriteLine($"Request ID: {e.RequestId}"); throw; } }
PHP
public static function runExample( GoogleAdsClient $googleAdsClient, int $customerId, string $recommendationId ) { $recommendationResourceName = ResourceNames::forRecommendation($customerId, $recommendationId); $applyRecommendationOperation = new ApplyRecommendationOperation(); $applyRecommendationOperation->setResourceName($recommendationResourceName); // Each recommendation type has optional parameters to override the recommended values. // This is an example to override a recommended ad when a TextAdRecommendation is applied. // For details, please read // https://developers.google.com/google-ads/api/reference/rpc/latest/ApplyRecommendationOperation. /* $overridingAd = new Ad([ 'id' => 'INSERT_AD_ID_AS_INTEGER_HERE' ]); $applyRecommendationOperation->setTextAd(new TextAdParameters(['ad' => $overridingAd])); */ // Issues a mutate request to apply the recommendation. $recommendationServiceClient = $googleAdsClient->getRecommendationServiceClient(); $response = $recommendationServiceClient->applyRecommendation( $customerId, [$applyRecommendationOperation] ); /** @var Recommendation $appliedRecommendation */ $appliedRecommendation = $response->getResults()[0]; printf( "Applied recommendation with resource name: '%s'.%s", $appliedRecommendation->getResourceName(), PHP_EOL ); }
Питон
def main(client, customer_id, recommendation_id): recommendation_service = client.get_service("RecommendationService") apply_recommendation_operation = client.get_type( "ApplyRecommendationOperation" ) apply_recommendation_operation.resource_name = ( recommendation_service.recommendation_path( customer_id, recommendation_id ) ) # This is where we override the recommended ad when a TextAdRecommendation is applied. # override_ad = client.get_type("Ad") # override_ad.resource_name = "INSERT_AD_ID_HERE" # apply_recommendation_operation.text_ad.ad = override_ad recommendation_response = recommendation_service.apply_recommendation( customer_id=customer_id, operations=[apply_recommendation_operation] ) print( "Applied recommendation with resource name: " f"'{recommendation_response.results[0].resource_name}'" )
Рубин
def apply_recommendation(customer_id, recommendation_id) # GoogleAdsClient will read a config file from # ENV['HOME']/google_ads_config.rb when called without parameters client = Google::Ads::GoogleAds::GoogleAdsClient.new recommendation_resource = client.path.recommendation(customer_id, recommendation_id) apply_recommendation_operation = client.operation.apply_recommendation apply_recommendation_operation.resource_name = recommendation_resource # Each recommendation type has optional parameters to override the recommended # values. This is an example to override a recommended ad when a # TextAdRecommendation is applied. # For details, please read # https://developers.google.com/google-ads/api/reference/rpc/google.ads.google_ads.v1.services#google.ads.google_ads.v1.services.ApplyRecommendationOperation # # text_ad_parameters = client.resource.text_ad_parameters do |tap| # tap.ad = client.resource.ad do |ad| # ad.id = "INSERT_AD_ID_AS_INTEGER_HERE" # end # end # apply_recommendation_operation.text_ad = text_ad_parameters # Issues a mutate request to apply the recommendation. recommendation_service = client.service.recommendation response = recommendation_service.apply_recommendation( customer_id: customer_id, operations: [apply_recommendation_operation], ) applied_recommendation = response.results.first puts "Applied recommendation with resource name: '#{applied_recommendation.resource_name}'." end
Перл
sub apply_recommendation { my ($api_client, $customer_id, $recommendation_id) = @_; my $recommendation_resource_name = Google::Ads::GoogleAds::V12::Utils::ResourceNames::recommendation( $customer_id, $recommendation_id); # Create an apply recommendation operation. my $apply_recommendation_operation = Google::Ads::GoogleAds::V12::Services::RecommendationService::ApplyRecommendationOperation ->new({ resourceName => $recommendation_resource_name }); # Each recommendation type has optional parameters to override the recommended values. # This is an example to override a recommended ad when a TextAdRecommendation is applied. # For details, please read # https://developers.google.com/google-ads/api/reference/rpc/latest/ApplyRecommendationOperation. # # my $overriding_ad = Google::Ads::GoogleAds::V12::Resources::Ad->new({ # id => "INSERT_AD_ID_AS_INTEGER_HERE" # }); # my $text_ad_parameters = # Google::Ads::GoogleAds::V12::Services::RecommendationService::TextAdParameters # ->new({ad => $overriding_ad}); # $apply_recommendation_operation->{textAd} = $text_ad_parameters; # Apply the recommendation. my $apply_recommendation_response = $api_client->RecommendationService()->apply({ customerId => $customer_id, operations => [$apply_recommendation_operation]}); printf "Applied recommendation with resource name: '%s'.\n", $apply_recommendation_response->{results}[0]{resourceName}; return 1; }
Посмотрите эти видео, чтобы узнать больше
Применить параметры
Масса
Ошибки
Тесты
Отклонить рекомендации
Вы можете отклонить рекомендации с помощью RecommendationService
. Структура кода аналогична применению рекомендаций , но вместо этого вы используете DismissRecommendationOperation
и RecommendationService.DismissRecommendation
.