Migrate the best sellers report
This document helps you migrate from the older version of the best sellers reports to its newer version. The older version of the report that exports the BestSellers_TopBrands_
, BestSellers_TopProducts_
, and BestSellers_TopProducts_Inventory_
tables will be deprecated on September 1, 2025.
The new best sellers report offers the following:
Parity with the older version of the report and improved consistency with other similar Google products—for example, the BestSellersBrandView and BestSellerProductClusterView fields from Content API for Shopping.
Additional insights about the popular products in Google Merchant Center Analytics.
Extended backfilling capability (2 years instead of 14 days).
Tables exported by old and new reports
The following table compares the tables exported by the old and new reports:
Old report | New report |
---|---|
BestSellers_TopBrands | BestSellersBrandWeekly and BestSellersBrandMonthly |
BestSellers_TopProducts | BestSellersProductClusterWeekly and BestSellersProductClusterMonthly |
BestSellers_TopProducts_Inventory | BestSellersEntityProductMapping |
The old report contains a single aggregation of best sellers data over an unspecified time window. The new report provides both the latest weekly and monthly aggregations of this data at the time of the request.
Compare BestSellers_TopBrands
with BestSellersBrandWeekly
and BestSellersBrandMonthly
The following table helps you identify fields in the BestSellers_TopBrands
table that have equivalent replacements in the BestSellersBrandWeekly
and BestSellersBrandMonthly
tables. Replacements for some fields from the old table aren't available.
BestSellers_TopBrands (old) | BestSellersBrandWeekly and BestSellersBrandMonthly (new) |
---|---|
rank_timestamp | _PARTITIONDATE and _PARTITIONTIME |
brand | brand |
google_brand_id | |
ranking_category | category_id |
ranking_category_path.locale | |
ranking_category_path.name | |
ranking_country | country_code |
rank_id | |
rank | rank |
previous_rank | previous_rank |
relative_demand.bucket | relative_demand |
relative_demand.min | |
relative_demand.max | |
previous_relative_demand.bucket | previous_relative_demand |
previous_relative_demand.min | |
previous_relative_demand.max | |
relative_demand_change |
Compare BestSellers_TopProducts
with BestSellersProductClusterWeekly
and BestSellersProductClusterMonthly
The following table helps you identify fields in the BestSellers_TopProducts
table that have equivalent replacements in the BestSellersProductClusterWeekly
and BestSellersProductClusterMonthly
tables. Replacements for some fields from the old table aren't available.
BestSellers_TopProducts (old) | BestSellersProductClusterWeekly and BestSellersProductClusterMonthly (new) |
---|---|
rank_timestamp | _PARTITIONDATE and _PARTITIONTIME |
rank_id | entity_id |
rank | rank |
previous_rank | previous_rank |
ranking_country | country_code |
ranking_category | report_category_id |
ranking_category_path.locale | |
ranking_category_path.name | |
relative_demand.bucket | relative_demand |
relative_demand.min | |
relative_demand.max | |
previous_relative_demand.bucket | previous_relative_demand |
previous_relative_demand.min | |
previous_relative_demand.max | |
relative_demand_change | |
product_title.locale | |
product_title.name | title (single title instead of an array for every locale) |
gtins | variant_gtins |
google_brand_id | |
brand | brand |
google_product_category | |
category_l1 , category_l2 , category_l3 , category_l4 , category_l5 | |
google_product_category_path.locale | |
google_product_category_path.name | |
price_range.min | price_range.min_amount_micros |
price_range.max | price_range.max_amount_micros |
price_range.currency | price_range.currency_code |
product_inventory_status | |
brand_inventory_status |
Inventory mapping of best sellers data
In the old best sellers report, the best sellers data is mapped to the merchant's inventory data in a new generated table, using the rank_id
column from the TopProducts
table.
In the new best sellers report, the entity_id
column is exported in the BestSellersProductCluster
tables, which is mapped to all the product IDs from the merchant's inventory in the BestSellersEntityProductMapping
table.
BestSellers_TopProductsInventory (old) | BestSellersEntityProductMapping (new) |
---|---|
rank_id (found in BestSellers_TopProducts ) | entity_id (found in the BestSellersProductClustersWeekly and BestSellersProductClustersMonthly tables) |
product_id | product_id |
merchant_id | |
aggregator_id |
Example queries
This section highlights changes in example queries that are used to retrieve best sellers data.
Example 1: Retrieve top products for a given category and country
The following queries return top products for a given category and country.
Use the BestSellers_TopProducts
table (old)
SELECT rank, previous_rank, relative_demand.bucket, (SELECT name FROM top_products.product_title WHERE locale = 'en-US') AS product_title, brand, price_range, google_product_category FROM `DATASET.BestSellers_TopProducts_MERCHANT_ID` AS top_products WHERE _PARTITIONDATE = 'DATE' AND ranking_category = 267 /*Smartphones*/ AND ranking_country = 'US' ORDER BY rank;
Use the BestSellersProductClusterWeekly
or BestSellersProductClusterMonthly
table (new)
SELECT rank, previous_rank, relative_demand, title AS product_title, brand, price_range, category_l1, category_l2 FROM `DATASET.BestSellersProductClusterWeekly_MERCHANT_ID` AS top_products WHERE _PARTITIONDATE = 'DATE' AND report_category_id = 267 /*Smartphones*/ AND country_code = 'US' ORDER BY rank;
Example 2: Retrieve top products in your inventory
The following queries return a list of top products in your inventory.
Use the BestSellers_TopProducts
table (old)
WITH latest_top_products AS ( SELECT * FROM `DATASET.BestSellers_TopProducts_MERCHANT_ID` WHERE _PARTITIONDATE = 'DATE' ), latest_top_products_inventory AS ( SELECT * FROM `DATASET.BestSellers_TopProducts_Inventory_MERCHANT_ID` WHERE _PARTITIONDATE = 'DATE' ) SELECT top_products.rank, inventory.product_id, (SELECT ANY_VALUE(name) FROM top_products.product_title) AS product_title, top_products.brand, top_products.gtins FROM latest_top_products AS top_products INNER JOIN latest_top_products_inventory AS inventory USING (rank_id);
Use the BestSellersProductClusterWeekly
or BestSellersProductClusterMonthly
table (new)
WITH latest_top_products AS ( SELECT * FROM `DATASET.BestSellersProductClusterWeekly_MERCHANT_ID` WHERE _PARTITIONDATE = 'DATE' ), latest_top_products_inventory AS ( SELECT * FROM `DATASET.BestSellersEntityProductMapping_MERCHANT_ID` WHERE _PARTITIONDATE = 'DATE' ) SELECT top_products.rank, inventory.product_id, top_products.title AS product_title, top_products.brand, top_products.variant_gtins FROM latest_top_products AS top_products INNER JOIN latest_top_products_inventory AS inventory USING (entity_id);
Moreover, if you want find the number of best selling products or brands in your inventory, run a query on the BestSellerProductClusterWeekly
or BestSellerProductClusterMonthly
tables using the product_inventory_status
or brand_inventory_status
columns. See the following example query:
SELECT * FROM `DATASET.BestSellersProductClusterMonthly_MERCHANT_ID` WHERE _PARTITIONDATE = 'DATE' AND product_inventory_status != 'NOT_IN_INVENTORY' ORDER BY rank;
Example 3: Retrieve top brands for a given category and country
The following queries return a list of top brands for a given category and country.
Use the BestSellers_TopBrands
table (old)
SELECT rank, previous_rank, brand FROM `DATASET.BestSellers_TopBrands_MERCHANT_ID` WHERE _PARTITIONDATE = 'DATE' AND ranking_category = 267 /*Smartphones*/ AND ranking_country = 'US' ORDER BY rank;
Use the BestSellersTopBrandsWeekly
or BestSellersTopBrandsMonthly
table (new)
SELECT rank, previous_rank, brand FROM `DATASET.BestSellersTopBrandsWeekly_MERCHANT_ID` WHERE _PARTITIONDATE = 'DATE' AND report_category_id = 267 /*Smartphones*/ AND country_code = 'US' ORDER BY rank;
Example 4: Retrieve products of top brands in your inventory
The following queries return a list of products of top brands in your inventory.
Use the BestSellers_TopBrands
table (old)
WITH latest_top_brands AS ( SELECT * FROM `DATASET.BestSellers_TopBrands_MERCHANT_ID` WHERE _PARTITIONDATE = 'DATE' ), latest_products AS ( SELECT product.*, product_category_id FROM `DATASET.Products_MERCHANT_ID` AS product, UNNEST(product.google_product_category_ids) AS product_category_id, UNNEST(destinations) AS destination, UNNEST(destination.approved_countries) AS approved_country WHERE _PARTITIONDATE = 'DATE' ) SELECT top_brands.brand, (SELECT name FROM top_brands.ranking_category_path WHERE locale = 'en-US') AS ranking_category, top_brands.ranking_country, top_brands.rank, products.product_id, products.title FROM latest_top_brands AS top_brands INNER JOIN latest_products AS products ON top_brands.google_brand_id = products.google_brand_id AND top_brands.ranking_category = product_category_id AND top_brands.ranking_country = products.approved_country;
Use the BestSellersTopBrandsWeekly
or BestSellersTopBrandsMonthly
table (new)
WITH latest_top_brands AS ( SELECT * FROM `DATASET.BestSellersBrandMonthly_MERCHANT_ID` WHERE _PARTITIONDATE = 'DATE' ), latest_products AS ( SELECT product.*, product_category_id FROM `DATASET.Products_MERCHANT_ID` AS product, UNNEST(product.google_product_category_ids) AS product_category_id, UNNEST(destinations) AS destination, UNNEST(destination.approved_countries) AS approved_country WHERE _PARTITIONDATE = 'DATE' ) SELECT top_brands.brand, –- The full category name is not supported in the new BestSellersTopBrands tables. –- (SELECT name FROM top_brands.ranking_category_path –- WHERE locale = 'en-US') AS ranking_category, top_brands.category_id, top_brands.rank, products.product_id, products.title FROM latest_top_brands AS top_brands INNER JOIN latest_products AS products ON top_brands.brand = products.brand AND top_brands.category_id = product_category_id AND top_brands.country_code = products.approved_country;
In these queries, replace the following:
DATASET
: the name of your datasetMERCHANT_ID
: the merchant account IDDATE
: the date in theYYYY-MM-DD
format
What's next
- For more information about the new best sellers report, see Google Merchant Center best sellers table.