diff --git a/sql/2025/ecommerce/core_web_vitals_by_platform.sql b/sql/2025/ecommerce/core_web_vitals_by_platform.sql new file mode 100644 index 00000000000..3b29d25c8cf --- /dev/null +++ b/sql/2025/ecommerce/core_web_vitals_by_platform.sql @@ -0,0 +1,72 @@ +#standardSQL +# CrUX Core Web Vitals performance of Ecommerce vendors by device (fid was upated to inp, and is non optinal now) +CREATE TEMP FUNCTION IS_GOOD(good FLOAT64, needs_improvement FLOAT64, poor FLOAT64) RETURNS BOOL AS ( + good / (good + needs_improvement + poor) >= 0.75 +); + +CREATE TEMP FUNCTION IS_NON_ZERO(good FLOAT64, needs_improvement FLOAT64, poor FLOAT64) RETURNS BOOL AS ( + good + needs_improvement + poor > 0 +); + + +SELECT + client, + ecomm, + COUNT(DISTINCT origin) AS origins, + # Origins with good LCP divided by origins with any LCP. + SAFE_DIVIDE( + COUNT(DISTINCT IF(IS_GOOD(fast_lcp, avg_lcp, slow_lcp), origin, NULL)), + COUNT(DISTINCT IF(IS_NON_ZERO(fast_lcp, avg_lcp, slow_lcp), origin, NULL)) + ) AS pct_good_lcp, + + # Origins with good INP divided by origins with any inp. + SAFE_DIVIDE( + COUNT(DISTINCT IF(IS_GOOD(fast_inp, avg_inp, slow_inp), origin, NULL)), + COUNT(DISTINCT IF(IS_NON_ZERO(fast_inp, avg_inp, slow_inp), origin, NULL)) + ) AS pct_good_inp, + + # Origins with good CLS divided by origins with any CLS. + SAFE_DIVIDE( + COUNT(DISTINCT IF(IS_GOOD(small_cls, medium_cls, large_cls), origin, NULL)), + COUNT(DISTINCT IF(IS_NON_ZERO(small_cls, medium_cls, large_cls), origin, NULL)) + ) AS pct_good_cls, + + # Origins with good LCP, inp, and CLS divided by origins with any LCP, inp, and CLS. + SAFE_DIVIDE( + COUNT(DISTINCT IF( + IS_GOOD(fast_lcp, avg_lcp, slow_lcp) AND + IS_GOOD(fast_inp, avg_inp, slow_inp) AND + IS_GOOD(small_cls, medium_cls, large_cls), origin, NULL + )), + COUNT(DISTINCT IF( + IS_NON_ZERO(fast_lcp, avg_lcp, slow_lcp) AND + IS_NON_ZERO(fast_inp, avg_inp, slow_inp) AND + IS_NON_ZERO(small_cls, medium_cls, large_cls), origin, NULL + )) + ) AS pct_good_cwv +FROM + `chrome-ux-report.materialized.device_summary` +JOIN ( + SELECT + _TABLE_SUFFIX AS client, + url, + app AS ecomm + FROM + `httparchive.technologies.2025_06_01_*` + WHERE + category = 'Ecommerce' AND + ( + app != 'Cart Functionality' AND + app != 'Google Analytics Enhanced eCommerce' + ) +) +ON + CONCAT(origin, '/') = url AND + IF(device = 'desktop', 'desktop', 'mobile') = client +WHERE + date = '2025-07-01' +GROUP BY + client, + ecomm +ORDER BY + origins DESC diff --git a/sql/2025/ecommerce/median_lighthouse_score_ecommsites.sql b/sql/2025/ecommerce/median_lighthouse_score_ecommsites.sql new file mode 100644 index 00000000000..a660ff80c59 --- /dev/null +++ b/sql/2025/ecommerce/median_lighthouse_score_ecommsites.sql @@ -0,0 +1,43 @@ +WITH technologies AS ( + SELECT + client, + page, + category, + technology, + rank, + lighthouse, + COUNT(DISTINCT page) OVER (PARTITION BY client) AS total_websites + FROM `httparchive.all.pages`, + UNNEST(technologies) AS tech, + UNNEST(categories) AS category + WHERE + date = '2025-07-01' AND + is_root_page = TRUE +) + +SELECT + client, + rank, + technology, + ARRAY_AGG(DISTINCT category) AS categories, + APPROX_QUANTILES(CAST(JSON_EXTRACT_SCALAR(lighthouse, '$.categories.performance.score') AS NUMERIC), 1000)[OFFSET(500)] AS median_performance, + APPROX_QUANTILES(CAST(JSON_EXTRACT_SCALAR(lighthouse, '$.categories.accessibility.score') AS NUMERIC), 1000)[OFFSET(500)] AS median_accessibility, + APPROX_QUANTILES(CAST(JSON_EXTRACT_SCALAR(lighthouse, '$.categories.seo.score') AS NUMERIC), 1000)[OFFSET(500)] AS median_seo, + APPROX_QUANTILES(CAST(JSON_EXTRACT_SCALAR(lighthouse, '$.categories.best-practices.score') AS NUMERIC), 1000)[OFFSET(500)] AS median_best_practices, + ANY_VALUE(total_websites) AS total_websites, + COUNT(DISTINCT page) AS number_of_websites, + COUNT(DISTINCT page) / ANY_VALUE(total_websites) AS percent_of_websites +FROM technologies +WHERE + category = 'Ecommerce' AND + ( + technology != 'Cart Functionality' AND + technology != 'Google Analytics Enhanced eCommerce' + ) +GROUP BY + client, + rank, + technology +ORDER BY + client, + number_of_websites DESC diff --git a/sql/2025/ecommerce/top_ecommerce.sql b/sql/2025/ecommerce/top_ecommerce.sql new file mode 100644 index 00000000000..35ae50b63e9 --- /dev/null +++ b/sql/2025/ecommerce/top_ecommerce.sql @@ -0,0 +1,175 @@ +#standardSQL +# Top Ecommerce platforms, compared to 2021 +# top_ecommerce.sql +SELECT + client, + 2025 AS year, + technologies.technology AS ecommerce, + COUNT(DISTINCT page) AS freq, + total, + COUNT(DISTINCT page) / total AS pct +FROM + `httparchive.all.pages`, + UNNEST(technologies) AS technologies, + UNNEST(technologies.categories) AS cats +JOIN ( + SELECT + client, + COUNT(0) AS total + FROM + `httparchive.all.pages` + WHERE + date = '2025-07-01' AND + is_root_page + GROUP BY + client +) +USING (client) +WHERE + cats = 'Ecommerce' AND + date = '2025-07-01' AND + is_root_page AND + technologies.technology NOT IN ('Cart Functionality', 'Google Analytics Enhanced eCommerce') +GROUP BY + client, + total, + ecommerce +UNION ALL +SELECT + client, + 2024 AS year, + technologies.technology AS ecommerce, + COUNT(DISTINCT page) AS freq, + total, + COUNT(DISTINCT page) / total AS pct +FROM + `httparchive.all.pages`, + UNNEST(technologies) AS technologies, + UNNEST(technologies.categories) AS cats +JOIN ( + SELECT + client, + COUNT(0) AS total + FROM + `httparchive.all.pages` + WHERE + date = '2024-06-01' AND + is_root_page + GROUP BY + client +) +USING (client) +WHERE + cats = 'Ecommerce' AND + date = '2024-06-01' AND + is_root_page AND + technologies.technology NOT IN ('Cart Functionality', 'Google Analytics Enhanced eCommerce') +GROUP BY + client, + total, + ecommerce +UNION ALL +SELECT + client, + 2023 AS year, + technologies.technology AS ecommerce, + COUNT(DISTINCT page) AS freq, + total, + COUNT(DISTINCT page) / total AS pct +FROM + `httparchive.all.pages`, + UNNEST(technologies) AS technologies, + UNNEST(technologies.categories) AS cats +JOIN ( + SELECT + client, + COUNT(0) AS total + FROM + `httparchive.all.pages` + WHERE + date = '2023-06-01' AND + is_root_page + GROUP BY + client +) +USING (client) +WHERE + cats = 'Ecommerce' AND + date = '2023-06-01' AND + is_root_page AND + technologies.technology NOT IN ('Cart Functionality', 'Google Analytics Enhanced eCommerce') +GROUP BY + client, + total, + ecommerce +UNION ALL +SELECT + client, + 2022 AS year, + technologies.technology AS ecommerce, + COUNT(DISTINCT page) AS freq, + total, + COUNT(DISTINCT page) / total AS pct +FROM + `httparchive.all.pages`, + UNNEST(technologies) AS technologies, + UNNEST(technologies.categories) AS cats +JOIN ( + SELECT + client, + COUNT(0) AS total + FROM + `httparchive.all.pages` + WHERE + date = '2022-08-01' AND -- noqa: CV09 + is_root_page + GROUP BY + client +) +USING (client) +WHERE + cats = 'Ecommerce' AND + date = '2022-08-01' AND -- noqa: CV09 + is_root_page AND + technologies.technology NOT IN ('Cart Functionality', 'Google Analytics Enhanced eCommerce') +GROUP BY + client, + total, + ecommerce +UNION ALL +SELECT + client, + 2021 AS year, + technologies.technology AS ecommerce, + COUNT(DISTINCT page) AS freq, + total, + COUNT(DISTINCT page) / total AS pct +FROM + `httparchive.all.pages`, + UNNEST(technologies) AS technologies, + UNNEST(technologies.categories) AS cats +JOIN ( + SELECT + client, + COUNT(0) AS total + FROM + `httparchive.all.pages` + WHERE + date = '2021-07-01' AND + is_root_page + GROUP BY + client +) +USING (client) +WHERE + cats = 'Ecommerce' AND + date = '2021-07-01' AND + is_root_page AND + technologies.technology NOT IN ('Cart Functionality', 'Google Analytics Enhanced eCommerce') +GROUP BY + client, + total, + ecommerce +ORDER BY + year DESC, + pct DESC diff --git a/sql/2025/ecommerce/top_payment_provider_by_geo.sql b/sql/2025/ecommerce/top_payment_provider_by_geo.sql new file mode 100644 index 00000000000..827419a9a30 --- /dev/null +++ b/sql/2025/ecommerce/top_payment_provider_by_geo.sql @@ -0,0 +1,69 @@ +#standardSQL +# payment popularity per geo +# top_payment_provider_by_geo.sql +WITH geo_summary AS ( + SELECT + `chrome-ux-report`.experimental.GET_COUNTRY(country_code) AS geo, + IF(device = 'desktop', 'desktop', 'mobile') AS client, + origin, + COUNT(DISTINCT origin) OVER (PARTITION BY country_code, IF(device = 'desktop', 'desktop', 'mobile')) AS total + FROM + `chrome-ux-report.materialized.country_summary` + WHERE + yyyymm = 202506 + UNION ALL + SELECT + 'ALL' AS geo, + IF(device = 'desktop', 'desktop', 'mobile') AS client, + origin, + COUNT(DISTINCT origin) OVER (PARTITION BY IF(device = 'desktop', 'desktop', 'mobile')) AS total + FROM + `chrome-ux-report.materialized.device_summary` + WHERE + yyyymm = 202506 +) + +SELECT + * +FROM ( + SELECT + client, + geo, + payment, + COUNT(0) AS pages, + ANY_VALUE(total) AS total, + COUNT(DISTINCT url) / ANY_VALUE(total) AS pct + FROM ( + SELECT DISTINCT + geo, + client, + CONCAT(origin, '/') AS url, + total + FROM + geo_summary + ) JOIN ( + SELECT DISTINCT + client, + cats, + technologies.technology AS payment, + page AS url + FROM + `httparchive.all.pages`, + UNNEST(technologies) AS technologies, + UNNEST(technologies.categories) AS cats + WHERE + technologies.technology IS NOT NULL AND + cats = 'Payment processors' AND + technologies.technology != '' AND + date = '2025-07-01' AND + is_root_page + ) USING (client, url) + GROUP BY + client, + geo, + payment +) +WHERE + pages > 1000 +ORDER BY + pages DESC diff --git a/sql/2025/ecommerce/top_payment_providers.sql b/sql/2025/ecommerce/top_payment_providers.sql new file mode 100644 index 00000000000..a9ad5c0959a --- /dev/null +++ b/sql/2025/ecommerce/top_payment_providers.sql @@ -0,0 +1,170 @@ +#standardSQL +# Top payment processors, compared to 2021 +# top_payment_providers.sql +SELECT + client, + 2025 AS year, + technologies.technology AS payment, + COUNT(DISTINCT page) AS freq, + total, + COUNT(DISTINCT page) / total AS pct +FROM + `httparchive.all.pages`, + UNNEST(technologies) AS technologies, + UNNEST(technologies.categories) AS cats +JOIN ( + SELECT + client, + COUNT(0) AS total + FROM + `httparchive.all.pages` + WHERE + date = '2025-07-01' AND + is_root_page + GROUP BY + client +) +USING (client) +WHERE + cats = 'Payment processors' AND + date = '2025-07-01' AND + is_root_page +GROUP BY + client, + total, + payment +UNION ALL +SELECT + client, + 2024 AS year, + technologies.technology AS payment, + COUNT(DISTINCT page) AS freq, + total, + COUNT(DISTINCT page) / total AS pct +FROM + `httparchive.all.pages`, + UNNEST(technologies) AS technologies, + UNNEST(technologies.categories) AS cats +JOIN ( + SELECT + client, + COUNT(0) AS total + FROM + `httparchive.all.pages` + WHERE + date = '2024-06-01' AND + is_root_page + GROUP BY + client +) +USING (client) +WHERE + cats = 'Payment processors' AND + date = '2024-06-01' AND + is_root_page +GROUP BY + client, + total, + payment +UNION ALL +SELECT + client, + 2023 AS year, + technologies.technology AS payment, + COUNT(DISTINCT page) AS freq, + total, + COUNT(DISTINCT page) / total AS pct +FROM + `httparchive.all.pages`, + UNNEST(technologies) AS technologies, + UNNEST(technologies.categories) AS cats +JOIN ( + SELECT + client, + COUNT(0) AS total + FROM + `httparchive.all.pages` + WHERE + date = '2023-06-01' AND + is_root_page + GROUP BY + client +) +USING (client) +WHERE + cats = 'Payment processors' AND + date = '2023-06-01' AND + is_root_page +GROUP BY + client, + total, + payment +UNION ALL +SELECT + client, + 2022 AS year, + technologies.technology AS payment, + COUNT(DISTINCT page) AS freq, + total, + COUNT(DISTINCT page) / total AS pct +FROM + `httparchive.all.pages`, + UNNEST(technologies) AS technologies, + UNNEST(technologies.categories) AS cats +JOIN ( + SELECT + client, + COUNT(0) AS total + FROM + `httparchive.all.pages` + WHERE + date = '2022-08-01' AND -- noqa: CV09 + is_root_page + GROUP BY + client +) +USING (client) +WHERE + cats = 'Payment processors' AND + date = '2022-08-01' AND -- noqa: CV09 + is_root_page +GROUP BY + client, + total, + payment +UNION ALL +SELECT + client, + 2021 AS year, + technologies.technology AS payment, + COUNT(DISTINCT page) AS freq, + total, + COUNT(DISTINCT page) / total AS pct +FROM + `httparchive.all.pages`, + UNNEST(technologies) AS technologies, + UNNEST(technologies.categories) AS cats +JOIN ( + SELECT + client, + COUNT(0) AS total + FROM + `httparchive.all.pages` + WHERE + date = '2021-07-01' AND + is_root_page + GROUP BY + client +) +USING (client) +WHERE + cats = 'Payment processors' AND + date = '2021-07-01' AND + is_root_page +GROUP BY + client, + total, + payment +ORDER BY + year DESC, + pct DESC diff --git a/sql/2025/ecommerce/top_shopsystem_by_geo.sql b/sql/2025/ecommerce/top_shopsystem_by_geo.sql new file mode 100644 index 00000000000..8d8a062d92b --- /dev/null +++ b/sql/2025/ecommerce/top_shopsystem_by_geo.sql @@ -0,0 +1,71 @@ +#standardSQL +# Shopsystem popularity per geo +# top_shopsystem_by_geo.sql +WITH geo_summary AS ( + SELECT + `chrome-ux-report`.experimental.GET_COUNTRY(country_code) AS geo, + IF(device = 'desktop', 'desktop', 'mobile') AS client, + origin, + COUNT(DISTINCT origin) OVER (PARTITION BY country_code, IF(device = 'desktop', 'desktop', 'mobile')) AS total + FROM + `chrome-ux-report.materialized.country_summary` + WHERE + yyyymm = 202506 + UNION ALL + SELECT + 'ALL' AS geo, + IF(device = 'desktop', 'desktop', 'mobile') AS client, + origin, + COUNT(DISTINCT origin) OVER (PARTITION BY IF(device = 'desktop', 'desktop', 'mobile')) AS total + FROM + `chrome-ux-report.materialized.device_summary` + WHERE + yyyymm = 202506 +) + +SELECT + * +FROM ( + SELECT + client, + geo, + app, + COUNT(0) AS pages, + ANY_VALUE(total) AS total, + COUNT(DISTINCT url) / ANY_VALUE(total) AS pct + FROM ( + SELECT DISTINCT + geo, + client, + CONCAT(origin, '/') AS url, + total + FROM + geo_summary + ) JOIN ( + SELECT DISTINCT + client, + cats, + technologies.technology AS app, + page AS url + FROM + `httparchive.all.pages`, + UNNEST(technologies) AS technologies, + UNNEST(technologies.categories) AS cats + WHERE + technologies.technology IS NOT NULL AND + cats = 'Ecommerce' AND + technologies.technology != 'Cart Functionality' AND + technologies.technology != 'Google Analytics Enhanced eCommerce' AND + technologies.technology != '' AND + date = '2025-07-01' AND + is_root_page + ) USING (client, url) + GROUP BY + client, + geo, + app +) +WHERE + pages > 1000 +ORDER BY + pages DESC diff --git a/sql/2025/ecommerce/top_vendors_crux_rank.sql b/sql/2025/ecommerce/top_vendors_crux_rank.sql new file mode 100644 index 00000000000..d3e93accd50 --- /dev/null +++ b/sql/2025/ecommerce/top_vendors_crux_rank.sql @@ -0,0 +1,64 @@ +#standardSQL +# Ecommerce adoption per rank +# top_ecommerce_by_rank.sql + +SELECT + client, + ecommerce, + rank, + COUNT(DISTINCT url) AS pages, + ANY_VALUE(total) AS total, + COUNT(DISTINCT url) / ANY_VALUE(total) AS pct +FROM ( + SELECT DISTINCT + client, + page AS url, + technologies.technology AS ecommerce + FROM + `httparchive.all.pages`, + UNNEST(technologies) AS technologies, + UNNEST(technologies.categories) AS cats + WHERE + cats = 'Ecommerce' AND + date = '2025-07-01' AND + is_root_page AND + technologies.technology NOT IN ('Cart Functionality', 'Google Analytics Enhanced eCommerce') +) +JOIN ( + SELECT + client, + page AS url, + rank_magnitude AS rank + FROM + `httparchive.all.pages`, + UNNEST([1e3, 1e4, 1e5, 1e6, 1e7]) AS rank_magnitude + WHERE + rank <= rank_magnitude AND + date = '2025-07-01' AND + is_root_page +) +USING (client, url) +JOIN ( + SELECT + client, + rank_magnitude AS rank, + COUNT(0) AS total + FROM + `httparchive.all.pages`, + UNNEST([1e3, 1e4, 1e5, 1e6, 1e7]) AS rank_magnitude + WHERE + rank <= rank_magnitude AND + date = '2025-07-01' AND + is_root_page + GROUP BY + client, + rank_magnitude +) +USING (client, rank) +GROUP BY + client, + ecommerce, + rank +ORDER BY + rank, + pages DESC