Historical metrics provide metrics on how keywords have previously performed on Google Search including:
- Average monthly searches (past 12 months)
- Approximate monthly search volume (per month)
- Competition level
- Competition index
- 20th percentile of bids
- 80th percentile of bids
You can use historical metrics to reduce a large set of keywords to a more manageable size based on the performance. If you already know the keywords you want to use, you can skip historical metrics and go straight to forecast metrics .
Generate metrics
To generate historical metrics call KeywordPlanIdeaService.GenerateKeywordHistoricalMetrics
with the parameters you would like to include.
Java
private void runExample ( GoogleAdsClient googleAdsClient , Long customerId ) { GenerateKeywordHistoricalMetricsRequest request = GenerateKeywordHistoricalMetricsRequest . newBuilder () . setCustomerId ( String . valueOf ( customerId )) . addAllKeywords ( Arrays . asList ( "mars cruise" , "cheap cruise" , "jupiter cruise" )) // See https://developers.google.com/google-ads/api/reference/data/geotargets for the // list of geo target IDs. // Geo target constant 2840 is for USA. . addGeoTargetConstants ( ResourceNames . geoTargetConstant ( 2840 )) . setKeywordPlanNetwork ( KeywordPlanNetwork . GOOGLE_SEARCH ) // See // https://developers.google.com/google-ads/api/reference/data/codes-formats#languages // for the list of language constant IDs. // Language constant 1000 is for English. . setLanguage ( ResourceNames . languageConstant ( 1000 )) . build (); try ( KeywordPlanIdeaServiceClient keywordPlanIdeaServiceClient = googleAdsClient . getLatestVersion (). createKeywordPlanIdeaServiceClient ()) { GenerateKeywordHistoricalMetricsResponse response = keywordPlanIdeaServiceClient . generateKeywordHistoricalMetrics ( request ); for ( GenerateKeywordHistoricalMetricsResult result : response . getResultsList ()) { KeywordPlanHistoricalMetrics metrics = result . getKeywordMetrics (); System . out . printf ( "The search query: %s%n" , result . getText ()); System . out . printf ( "and the following variants: %s%n" , Joiner . on ( "," ). join ( result . getCloseVariantsList ())); System . out . println ( "generated the following historical metrics:" ); // Approximate number of monthly searches on this query averaged for the past 12 // months. System . out . printf ( "Approximate monthly searches: %s%n" , metrics . hasAvgMonthlySearches () ? metrics . getAvgMonthlySearches () : null ); // The competition level for this search query. System . out . printf ( "Competition level: %s%n" , metrics . getCompetition ()); // The competition index for the query in the range [0,100]. This shows how // competitive ad placement is for a keyword. The level of competition from 0-100 is // determined by the number of ad slots filled divided by the total number of slots // available. If not enough data is available, null will be returned. System . out . printf ( "Competition index: %s%n" , metrics . hasCompetitionIndex () ? metrics . getCompetitionIndex () : null ); // Top of page bid low range (20th percentile) in micros for the keyword. System . out . printf ( "Top of page bid low range: %s%n" , metrics . hasLowTopOfPageBidMicros () ? metrics . getLowTopOfPageBidMicros () : null ); // Top of page bid high range (80th percentile) in micros for the keyword. System . out . printf ( "Top of page bid high range: %s%n" , metrics . hasHighTopOfPageBidMicros () ? metrics . getHighTopOfPageBidMicros () : null ); // Approximate number of searches on this query for the past twelve months. metrics . getMonthlySearchVolumesList (). stream () // Orders the monthly search volumes by descending year, then descending month. . sorted ( ( a , b ) - > ComparisonChain . start () . compare ( b . getYear (), a . getYear ()) . compare ( b . getMonth (), a . getMonth ()) . result ()) // Prints each monthly search volume. . forEachOrdered ( monthlySearchVolume - > System . out . printf ( "Approximately %d searches in %s, %s%n" , monthlySearchVolume . getMonthlySearches (), monthlySearchVolume . getMonth (), monthlySearchVolume . getYear ())); } } }
C#
public void Run ( GoogleAdsClient client , long customerId ) { KeywordPlanIdeaServiceClient keywordPlanIdeaService = client . GetService ( Services . V21 . KeywordPlanIdeaService ); GenerateKeywordHistoricalMetricsRequest request = new GenerateKeywordHistoricalMetricsRequest () { CustomerId = customerId . ToString (), Keywords = { "mars cruise" , "cheap cruise" , "jupiter cruise" }, // See https://developers.google.com/google-ads/api/reference/data/geotargets // for the list of geo target IDs. // Geo target constant 2840 is for USA. GeoTargetConstants = { ResourceNames . GeoTargetConstant ( 2840 ) }, KeywordPlanNetwork = KeywordPlanNetwork . GoogleSearch , // See https://developers.google.com/google-ads/api/reference/data/codes-formats#languages // for the list of language constant IDs. // Language constant 1000 is for English. Language = ResourceNames . LanguageConstant ( 1000 ) }; try { GenerateKeywordHistoricalMetricsResponse response = keywordPlanIdeaService . GenerateKeywordHistoricalMetrics ( request ); foreach ( GenerateKeywordHistoricalMetricsResult result in response . Results ) { KeywordPlanHistoricalMetrics metrics = result . KeywordMetrics ; Console . WriteLine ( $"The search query {result.Text}" ); Console . WriteLine ( "and the following variants: " + $"{String.Join(" , ", result.CloseVariants)}" ); Console . WriteLine ( "Generated the following historical metrics:" ); // Approximate number of monthly searches on this query averaged for the past 12 // months. Console . WriteLine ( $"Approximate monthly searches: {metrics.AvgMonthlySearches}" ); // The competition level for this search query. Console . WriteLine ( $"Competition level: {metrics.Competition}" ); // The competition index for the query in the range [0,100]. This shows how // competitive ad placement is for a keyword. The level of competition from 0-100 is // determined by the number of ad slots filled divided by the total number of slots // available. If not enough data is available, null will be returned. Console . WriteLine ( $"Competition index: {metrics.CompetitionIndex}" ); // Top of page bid low range (20th percentile) in micros for the keyword. Console . WriteLine ( $"Top of page bid low range: {metrics.LowTopOfPageBidMicros}" ); // Top of page bid high range (80th percentile) in micros for the keyword. Console . WriteLine ( $"Top of page bid high range: {metrics.HighTopOfPageBidMicros}" ); // Approximate number of searches on this query for the past twelve months. foreach ( MonthlySearchVolume month in metrics . MonthlySearchVolumes ) { Console . WriteLine ( $"Approximately {month.MonthlySearches} searches in " + $"{month.Month}, {month.Year}" ); } } } 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 ): void { $keywordPlanIdeaServiceClient = $googleAdsClient->getKeywordPlanIdeaServiceClient(); // Generates keyword historical metrics based on the specified parameters. $response = $keywordPlanIdeaServiceClient->generateKeywordHistoricalMetrics( new GenerateKeywordHistoricalMetricsRequest([ 'customer_id' => $customerId, 'keywords' => ['mars cruise', 'cheap cruise', 'jupiter cruise'], // See https://developers.google.com/google-ads/api/reference/data/geotargets for // the list of geo target IDs. // Geo target constant 2840 is for USA. 'geo_target_constants' => [ResourceNames::forGeoTargetConstant(2840)], 'keyword_plan_network' => KeywordPlanNetwork::GOOGLE_SEARCH, // https://developers.google.com/google-ads/api/reference/data/codes-formats#languages // for the list of language constant IDs. // Language constant 1000 is for English. 'language' => ResourceNames::forLanguageConstant(1000) ]) ); // Iterates over the results and print its detail. foreach ($response->getResults() as $result) { /** @var GenerateKeywordHistoricalMetricsResult $result */ $metrics = $result->getKeywordMetrics(); printf("The search query: '%s' ", $result->getText()); printf( "and the following variants: '%s' ", implode(',', iterator_to_array($result->getCloseVariants()->getIterator())) ); print "generated the following historical metrics:" . PHP_EOL; // Approximate number of monthly searches on this query averaged for the past 12 months. printf( "Approximate monthly searches: %s%s", $metrics->hasAvgMonthlySearches() ? sprintf("%d", $metrics->getAvgMonthlySearches()) : "'none'", PHP_EOL ); // The competition level for this search query. printf( "Competition level: '%s'%s", KeywordPlanCompetitionLevel::name($metrics->getCompetition()), PHP_EOL ); // The competition index for the query in the range [0,100]. This shows how // competitive ad placement is for a keyword. The level of competition from 0-100 is // determined by the number of ad slots filled divided by the total number of slots // available. If not enough data is available, null will be returned. printf( "Competition index: %s%s", $metrics->hasCompetitionIndex() ? sprintf("%d", $metrics->getCompetitionIndex()) : "'none'", PHP_EOL ); // Top of page bid low range (20th percentile) in micros for the keyword. printf( "Top of page bid low range: %s%s", $metrics->hasLowTopOfPageBidMicros() ? sprintf("%d", $metrics->getLowTopOfPageBidMicros()) : "'none'", PHP_EOL ); // Top of page bid high range (80th percentile) in micros for the keyword. printf( "Top of page bid high range: %s%s", $metrics->hasHighTopOfPageBidMicros() ? sprintf("%d", $metrics->getHighTopOfPageBidMicros()) : "'none'", PHP_EOL ); // Approximate number of searches on this query for the past twelve months. $monthlySearchVolumes = iterator_to_array($metrics->getMonthlySearchVolumes()->getIterator()); usort( $monthlySearchVolumes, // Orders the monthly search volumes by descending year, then descending month. function (MonthlySearchVolume $volume1, MonthlySearchVolume $volume2) { $yearsCompared = $volume2->getYear() <=> $volume1->getYear(); if ($yearsCompared != 0) { return $yearsCompared; } else { return $volume2->getMonth() <=> $volume1->getMonth(); } } ); // Prints each monthly search volume. array_walk($monthlySearchVolumes, function (MonthlySearchVolume $monthlySearchVolume) { printf( "Approximately %d searches in %s, %s.%s", $monthlySearchVolume->getMonthlySearches(), MonthOfYear::name($monthlySearchVolume->getMonth()), $monthlySearchVolume->getYear(), PHP_EOL ); }); print PHP_EOL; } }