diff --git a/sql/2025/ecommerce/core_web_vitals_by_platform-yoy.sql b/sql/2025/ecommerce/core_web_vitals_by_platform-yoy.sql new file mode 100644 index 00000000000..4f888034294 --- /dev/null +++ b/sql/2025/ecommerce/core_web_vitals_by_platform-yoy.sql @@ -0,0 +1,78 @@ +#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 + date, + 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 DISTINCT + date, + client, + root_page, + tech.technology AS ecomm + FROM + `httparchive.crawl.pages`, + UNNEST(technologies) AS tech, + UNNEST(tech.categories) AS category + WHERE + date = '2025-07-01' AND + category = 'Ecommerce' AND + ( + tech.technology != 'Cart Functionality' AND + tech.technology != 'Google Analytics Enhanced eCommerce' + ) +) +ON + CONCAT(origin, '/') = root_page AND + IF(device = 'desktop', 'desktop', 'mobile') = client AND + date +WHERE + date = '2025-07-01' +GROUP BY + client, + ecomm +ORDER BY + origins DESC 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..6b2a781ccd1 --- /dev/null +++ b/sql/2025/ecommerce/core_web_vitals_by_platform.sql @@ -0,0 +1,75 @@ +#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 DISTINCT + client, + root_page, + tech.technology AS ecomm + FROM + `httparchive.crawl.pages`, + UNNEST(technologies) AS tech, + UNNEST(tech.categories) AS category + WHERE + date = '2025-07-01' AND + category = 'Ecommerce' AND + ( + tech.technology != 'Cart Functionality' AND + tech.technology != 'Google Analytics Enhanced eCommerce' + ) +) +ON + CONCAT(origin, '/') = root_page 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/core_web_vitals_passingmetrics_byvendor_bydevice.sql b/sql/2025/ecommerce/core_web_vitals_passingmetrics_byvendor_bydevice.sql new file mode 100644 index 00000000000..42293ebb384 --- /dev/null +++ b/sql/2025/ecommerce/core_web_vitals_passingmetrics_byvendor_bydevice.sql @@ -0,0 +1,75 @@ +#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 DISTINCT + client, + root_page, + app AS ecomm + FROM + `httparchive.crawl.pages`, + UNNEST(technologies) AS tech, + UNNEST(categories) AS category + WHERE + date = '2025-07-01' AND + category = 'Ecommerce' AND + ( + technology != 'Cart Functionality' AND + technology != 'Google Analytics Enhanced eCommerce' + ) +) +ON + CONCAT(origin, '/') = root_page 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/counts.sql b/sql/2025/ecommerce/counts.sql new file mode 100644 index 00000000000..ef304b803d6 --- /dev/null +++ b/sql/2025/ecommerce/counts.sql @@ -0,0 +1,49 @@ +SELECT + client, + date, + EXTRACT(YEAR FROM date) AS year, + rank_grouping, + CASE + WHEN rank_grouping = 100000000 THEN 'all' + ELSE FORMAT("%'d", rank_grouping) + END AS ranking, + COUNT(DISTINCT root_page) AS ecommerce_sites, + total, + COUNT(DISTINCT root_page) / total AS pct_ecommerce +FROM + `httparchive.crawl.pages`, + UNNEST(technologies) AS technologies, + UNNEST(technologies.categories) AS cats, + UNNEST([1000, 10000, 100000, 1000000, 10000000, 100000000]) AS rank_grouping +JOIN ( + SELECT + date, + client, + rank_grouping, + COUNT(DISTINCT root_page) AS total + FROM + `httparchive.crawl.pages`, + UNNEST([1000, 10000, 100000, 1000000, 10000000, 100000000]) AS rank_grouping + WHERE + date IN ('2025-07-01', '2024-06-01', '2023-07-01', '2022-06-01', '2025-07-01') AND + rank <= rank_grouping + GROUP BY + date, + client, + rank_grouping +) +USING (date, client, rank_grouping) +WHERE + date IN ('2025-07-01', '2024-06-01', '2023-07-01', '2022-06-01', '2025-07-01') AND + rank <= rank_grouping AND + cats = 'Ecommerce' AND + technologies.technology NOT IN ('Cart Functionality', 'Google Analytics Enhanced eCommerce') +GROUP BY + date, + client, + rank_grouping, + total +ORDER BY + date DESC, + client, + rank_grouping 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..83e4779b68c --- /dev/null +++ b/sql/2025/ecommerce/median_lighthouse_score_ecommsites.sql @@ -0,0 +1,44 @@ +WITH totals AS ( + SELECT + client, + COUNT(DISTINCT page) AS total_webpages, + COUNT(DISTINCT root_page) AS total_websites + FROM + `httparchive.crawl.pages` + WHERE + date = '2025-07-01' + GROUP BY + client +) + +SELECT + client, + technology, + ARRAY_AGG(DISTINCT category) AS categories, + APPROX_QUANTILES(CAST(JSON_VALUE(lighthouse.categories.performance.score) AS NUMERIC) * 100, 1000)[OFFSET(500)] AS median_performance, + APPROX_QUANTILES(CAST(JSON_VALUE(lighthouse.categories.accessibility.score) AS NUMERIC) * 100, 1000)[OFFSET(500)] AS median_accessibility, + APPROX_QUANTILES(CAST(JSON_VALUE(lighthouse.categories.seo.score) AS NUMERIC) * 100, 1000)[OFFSET(500)] AS median_seo, + APPROX_QUANTILES(CAST(JSON_VALUE(lighthouse.categories.`best-practices`.score) AS NUMERIC) * 100, 1000)[OFFSET(500)] AS median_best_practices, + ANY_VALUE(total_websites) AS total_websites, + COUNT(DISTINCT root_page) AS number_of_websites, + COUNT(DISTINCT root_page) / ANY_VALUE(total_websites) AS percent_of_websites +FROM + `httparchive.crawl.pages`, + UNNEST(technologies) AS tech, + UNNEST(categories) AS category +INNER JOIN + totals +USING (client) +WHERE + date = '2025-07-01' AND + category = 'Ecommerce' AND + ( + technology != 'Cart Functionality' AND + technology != 'Google Analytics Enhanced eCommerce' + ) +GROUP BY + client, + 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..f427f4b7336 --- /dev/null +++ b/sql/2025/ecommerce/top_ecommerce.sql @@ -0,0 +1,165 @@ +#standardSQL +# Top Ecommerce platforms, compared to 2021 +# top_ecommerce.sql +SELECT + client, + 2025 AS year, + technologies.technology AS ecommerce, + COUNT(DISTINCT root_page) AS freq, + total, + COUNT(DISTINCT root_page) / total AS pct +FROM + `httparchive.crawl.pages`, + UNNEST(technologies) AS technologies, + UNNEST(technologies.categories) AS cats +JOIN ( + SELECT + client, + COUNT(0) AS total + FROM + `httparchive.crawl.pages` + WHERE + date = '2025-07-01' + GROUP BY + client +) +USING (client) +WHERE + cats = 'Ecommerce' AND + date = '2025-07-01' 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 root_page) AS freq, + total, + COUNT(DISTINCT root_page) / total AS pct +FROM + `httparchive.crawl.pages`, + UNNEST(technologies) AS technologies, + UNNEST(technologies.categories) AS cats +JOIN ( + SELECT + client, + COUNT(0) AS total + FROM + `httparchive.crawl.pages` + WHERE + date = '2024-06-01' + GROUP BY + client +) +USING (client) +WHERE + cats = 'Ecommerce' AND + date = '2024-06-01' 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 root_page) AS freq, + total, + COUNT(DISTINCT root_page) / total AS pct +FROM + `httparchive.crawl.pages`, + UNNEST(technologies) AS technologies, + UNNEST(technologies.categories) AS cats +JOIN ( + SELECT + client, + COUNT(0) AS total + FROM + `httparchive.crawl.pages` + WHERE + date = '2023-06-01' + GROUP BY + client +) +USING (client) +WHERE + cats = 'Ecommerce' AND + date = '2023-06-01' 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 root_page) AS freq, + total, + COUNT(DISTINCT root_page) / total AS pct +FROM + `httparchive.crawl.pages`, + UNNEST(technologies) AS technologies, + UNNEST(technologies.categories) AS cats +JOIN ( + SELECT + client, + COUNT(0) AS total + FROM + `httparchive.crawl.pages` + WHERE + date = '2022-06-01' + GROUP BY + client +) +USING (client) +WHERE + cats = 'Ecommerce' AND + date = '2022-06-01' 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 root_page) AS freq, + total, + COUNT(DISTINCT root_page) / total AS pct +FROM + `httparchive.crawl.pages`, + UNNEST(technologies) AS technologies, + UNNEST(technologies.categories) AS cats +JOIN ( + SELECT + client, + COUNT(0) AS total + FROM + `httparchive.crawl.pages` + WHERE + date = '2021-07-01' + GROUP BY + client +) +USING (client) +WHERE + cats = 'Ecommerce' AND + date = '2021-07-01' 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_by_geo.sql b/sql/2025/ecommerce/top_payment_by_geo.sql new file mode 100644 index 00000000000..0014ab36d5f --- /dev/null +++ b/sql/2025/ecommerce/top_payment_by_geo.sql @@ -0,0 +1,63 @@ +#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, + CONCAT(origin, '/') AS root_page, + COUNT(DISTINCT origin) OVER (PARTITION BY country_code, IF(device = 'desktop', 'desktop', 'mobile')) AS total + FROM + `chrome-ux-report.materialized.country_summary` + WHERE + yyyymm = 202507 + UNION ALL + SELECT + 'ALL' AS geo, + IF(device = 'desktop', 'desktop', 'mobile') AS client, + CONCAT(origin, '/') AS root_page, + COUNT(DISTINCT origin) OVER (PARTITION BY IF(device = 'desktop', 'desktop', 'mobile')) AS total + FROM + `chrome-ux-report.materialized.device_summary` + WHERE + yyyymm = 202507 +) + +SELECT + * +FROM ( + SELECT + client, + geo, + payment, + COUNT(DISTINCT root_page) AS sites, + ANY_VALUE(total) AS total, + COUNT(DISTINCT root_page) / ANY_VALUE(total) AS pct + FROM + geo_summary + JOIN ( + SELECT DISTINCT + client, + cats, + technologies.technology AS payment, + page, + root_page + FROM + `httparchive.crawl.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' + ) USING (client, root_page) + GROUP BY + client, + geo, + payment +) +WHERE + sites > 1000 +ORDER BY + sites DESC diff --git a/sql/2025/ecommerce/top_payment_yoy.sql b/sql/2025/ecommerce/top_payment_yoy.sql new file mode 100644 index 00000000000..208d45f9d55 --- /dev/null +++ b/sql/2025/ecommerce/top_payment_yoy.sql @@ -0,0 +1,163 @@ +#standardSQL +# Top payment processors, compared to 2021 +# top_payment_providers.sql +SELECT + client, + 2025 AS year, + technologies.technology AS payment, + COUNT(DISTINCT root_page) AS freq, + total, + COUNT(DISTINCT root_page) / total AS pct +FROM + `httparchive.crawl.pages`, + UNNEST(technologies) AS technologies, + UNNEST(technologies.categories) AS cats +JOIN ( + SELECT + client, + COUNT(0) AS total + FROM + `httparchive.crawl.pages` + WHERE + date = '2025-07-01' + GROUP BY + client +) +USING (client) +WHERE + cats = 'Payment processors' AND + date = '2025-07-01' +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.crawl.pages`, + UNNEST(technologies) AS technologies, + UNNEST(technologies.categories) AS cats +JOIN ( + SELECT + client, + COUNT(DISTINCT root_page) AS total + FROM + `httparchive.crawl.pages` + WHERE + date = '2024-06-01' + GROUP BY + client +) +USING (client) +WHERE + cats = 'Payment processors' AND + date = '2024-06-01' +GROUP BY + client, + total, + payment +UNION ALL +SELECT + client, + 2023 AS year, + technologies.technology AS payment, + COUNT(DISTINCT root_page) AS freq, + total, + COUNT(DISTINCT root_page) / total AS pct +FROM + `httparchive.crawl.pages`, + UNNEST(technologies) AS technologies, + UNNEST(technologies.categories) AS cats +JOIN ( + SELECT + client, + COUNT(DISTINCT root_page) AS total + FROM + `httparchive.crawl.pages` + WHERE + date = '2023-06-01' + GROUP BY + client +) +USING (client) +WHERE + cats = 'Payment processors' AND + date = '2023-06-01' +GROUP BY + client, + total, + payment +UNION ALL +SELECT + client, + 2022 AS year, + technologies.technology AS payment, + COUNT(DISTINCT root_page) AS freq, + total, + COUNT(DISTINCT root_page) / total AS pct +FROM + `httparchive.crawl.pages`, + UNNEST(technologies) AS technologies, + UNNEST(technologies.categories) AS cats +JOIN ( + SELECT + client, + COUNT(DISTINCT root_page) AS total + FROM + `httparchive.crawl.pages` + WHERE + date = '2022-06-01' + GROUP BY + client +) +USING (client) +WHERE + cats = 'Payment processors' AND + date = '2022-06-01' AND + 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.crawl.pages`, + UNNEST(technologies) AS technologies, + UNNEST(technologies.categories) AS cats +JOIN ( + SELECT + client, + COUNT(0) AS total + FROM + `httparchive.crawl.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_shipping_by_geo.sql b/sql/2025/ecommerce/top_shipping_by_geo.sql new file mode 100644 index 00000000000..09ebbc2e34d --- /dev/null +++ b/sql/2025/ecommerce/top_shipping_by_geo.sql @@ -0,0 +1,59 @@ +#standardSQL +# shipping popularity per geo +# top_shipping_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, + CONCAT(origin, '/') AS root_page, + COUNT(DISTINCT origin) OVER (PARTITION BY country_code, IF(device = 'desktop', 'desktop', 'mobile')) AS total + FROM + `chrome-ux-report.materialized.country_summary` + WHERE + yyyymm = 202507 + UNION ALL + SELECT + 'ALL' AS geo, + IF(device = 'desktop', 'desktop', 'mobile') AS client, + CONCAT(origin, '/') AS root_page, + COUNT(DISTINCT origin) OVER (PARTITION BY IF(device = 'desktop', 'desktop', 'mobile')) AS total + FROM + `chrome-ux-report.materialized.device_summary` + WHERE + yyyymm = 202507 +) + +SELECT + client, + geo, + shipping, + COUNT(DISTINCT root_page) AS sites, + ANY_VALUE(total) AS total, + COUNT(DISTINCT root_page) / ANY_VALUE(total) AS pct +FROM + geo_summary +JOIN ( + SELECT DISTINCT + client, + cats, + technologies.technology AS shipping, + page, + root_page + FROM + `httparchive.crawl.pages`, + UNNEST(technologies) AS technologies, + UNNEST(technologies.categories) AS cats + WHERE + technologies.technology IS NOT NULL AND + cats = 'Shipping carriers' AND + technologies.technology != '' AND + date = '2025-07-01' +) USING (client, root_page) +GROUP BY + client, + geo, + shipping +HAVING + sites > 1000 +ORDER BY + sites DESC diff --git a/sql/2025/ecommerce/top_shipping_yoy.sql b/sql/2025/ecommerce/top_shipping_yoy.sql new file mode 100644 index 00000000000..c7552b496f4 --- /dev/null +++ b/sql/2025/ecommerce/top_shipping_yoy.sql @@ -0,0 +1,170 @@ +#standardSQL +# Top Shipping carriers platforms, compared to 2021 +# top_shipping.sql +SELECT + client, + 2024 AS year, + technologies.technology AS shipping, + COUNT(DISTINCT root_page) AS freq, + total, + COUNT(DISTINCT root_page) / total AS pct +FROM + `httparchive.crawl.pages`, + UNNEST(technologies) AS technologies, + UNNEST(technologies.categories) AS cats +JOIN ( + SELECT + client, + COUNT(0) AS total + FROM + `httparchive.crawl.pages` + WHERE + date = '2025-07-01' AND + is_root_page + GROUP BY + client +) +USING (client) +WHERE + cats = 'Shipping carriers' AND + date = '2025-07-01' AND + is_root_page +GROUP BY + client, + total, + shipping +UNION ALL +SELECT + client, + 2023 AS year, + technologies.technology AS shipping, + COUNT(DISTINCT root_page) AS freq, + total, + COUNT(DISTINCT root_page) / total AS pct +FROM + `httparchive.crawl.pages`, + UNNEST(technologies) AS technologies, + UNNEST(technologies.categories) AS cats +JOIN ( + SELECT + client, + COUNT(0) AS total + FROM + `httparchive.crawl.pages` + WHERE + date = '2024-06-01' AND + is_root_page + GROUP BY + client +) +USING (client) +WHERE + cats = 'Shipping carriers' AND + date = '2024-06-01' AND + is_root_page +GROUP BY + client, + total, + shipping +UNION ALL +SELECT + client, + 2023 AS year, + technologies.technology AS shipping, + COUNT(DISTINCT root_page) AS freq, + total, + COUNT(DISTINCT root_page) / total AS pct +FROM + `httparchive.crawl.pages`, + UNNEST(technologies) AS technologies, + UNNEST(technologies.categories) AS cats +JOIN ( + SELECT + client, + COUNT(0) AS total + FROM + `httparchive.crawl.pages` + WHERE + date = '2023-07-01' AND + is_root_page + GROUP BY + client +) +USING (client) +WHERE + cats = 'Shipping carriers' AND + date = '2023-07-01' AND + is_root_page +GROUP BY + client, + total, + shipping +UNION ALL +SELECT + client, + 2022 AS year, + technologies.technology AS shipping, + COUNT(DISTINCT root_page) AS freq, + total, + COUNT(DISTINCT root_page) / total AS pct +FROM + `httparchive.crawl.pages`, + UNNEST(technologies) AS technologies, + UNNEST(technologies.categories) AS cats +JOIN ( + SELECT + client, + COUNT(0) AS total + FROM + `httparchive.crawl.pages` + WHERE + date = '2022-06-01' AND + is_root_page + GROUP BY + client +) +USING (client) +WHERE + cats = 'Shipping carriers' AND + date = '2022-06-01' AND + is_root_page +GROUP BY + client, + total, + shipping +UNION ALL +SELECT + client, + 2021 AS year, + technologies.technology AS shipping, + COUNT(DISTINCT root_page) AS freq, + total, + COUNT(DISTINCT root_page) / total AS pct +FROM + `httparchive.crawl.pages`, + UNNEST(technologies) AS technologies, + UNNEST(technologies.categories) AS cats +JOIN ( + SELECT + client, + COUNT(0) AS total + FROM + `httparchive.crawl.pages` + WHERE + date = '2021-07-01' AND + is_root_page + GROUP BY + client +) +USING (client) +WHERE + cats = 'Shipping carriers' AND + date = '2021-07-01' AND + is_root_page +GROUP BY + client, + total, + shipping +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..3578c0abf99 --- /dev/null +++ b/sql/2025/ecommerce/top_shopsystem_by_geo.sql @@ -0,0 +1,65 @@ +#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, + CONCAT(origin, '/') AS root_page, + COUNT(DISTINCT origin) OVER (PARTITION BY country_code, IF(device = 'desktop', 'desktop', 'mobile')) AS total + FROM + `chrome-ux-report.materialized.country_summary` + WHERE + yyyymm = 202507 + UNION ALL + SELECT + 'ALL' AS geo, + IF(device = 'desktop', 'desktop', 'mobile') AS client, + CONCAT(origin, '/') AS root_page, + COUNT(DISTINCT origin) OVER (PARTITION BY IF(device = 'desktop', 'desktop', 'mobile')) AS total + FROM + `chrome-ux-report.materialized.device_summary` + WHERE + yyyymm = 202507 +) + +SELECT + * +FROM ( + SELECT + client, + geo, + app, + COUNT(DISTINCT root_page) AS sites, + ANY_VALUE(total) AS total, + COUNT(DISTINCT root_page) / ANY_VALUE(total) AS pct + FROM + geo_summary + JOIN ( + SELECT DISTINCT + client, + cats, + technologies.technology AS app, + page, + root_page + FROM + `httparchive.crawl.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' + ) USING (client, root_page) + GROUP BY + client, + geo, + app +) +WHERE + sites > 1000 +ORDER BY + sites 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..50e0fd7363b --- /dev/null +++ b/sql/2025/ecommerce/top_vendors_crux_rank.sql @@ -0,0 +1,56 @@ +#standardSQL +# Ecommerce adoption per rank +# top_ecommerce_by_rank.sql + +SELECT + client, + ecommerce, + rank_grouping, + CASE + WHEN rank_grouping = 100000000 THEN 'all' + ELSE FORMAT("%'d", rank_grouping) + END AS ranking, + COUNT(DISTINCT root_page) AS sites, + ANY_VALUE(total) AS total, + COUNT(DISTINCT root_page) / ANY_VALUE(total) AS pct +FROM ( + SELECT DISTINCT + client, + page, + root_page, + rank_grouping, + technologies.technology AS ecommerce + FROM + `httparchive.crawl.pages`, + UNNEST(technologies) AS technologies, + UNNEST(technologies.categories) AS cats, + UNNEST([1000, 10000, 100000, 1000000, 10000000, 100000000]) AS rank_grouping + WHERE + cats = 'Ecommerce' AND + rank <= rank_grouping AND + date = '2025-07-01' AND + technologies.technology NOT IN ('Cart Functionality', 'Google Analytics Enhanced eCommerce') +) +JOIN ( + SELECT + client, + rank_grouping, + COUNT(DISTINCT root_page) AS total + FROM + `httparchive.crawl.pages`, + UNNEST([1000, 10000, 100000, 1000000, 10000000, 100000000]) AS rank_grouping + WHERE + rank <= rank_grouping AND + date = '2025-07-01' + GROUP BY + client, + rank_grouping +) +USING (client, rank_grouping) +GROUP BY + client, + ecommerce, + rank_grouping +ORDER BY + rank_grouping, + sites DESC diff --git a/src/config/2025.json b/src/config/2025.json index 7b8d067ed2a..a556ba9f7bc 100644 --- a/src/config/2025.json +++ b/src/config/2025.json @@ -97,8 +97,7 @@ "part": "III", "chapter_number": "12", "title": "Ecommerce", - "slug": "ecommerce", - "todo": true + "slug": "ecommerce" } ] }, diff --git a/src/config/contributors.json b/src/config/contributors.json index 247ac18ef66..56dba6e9c74 100644 --- a/src/config/contributors.json +++ b/src/config/contributors.json @@ -451,6 +451,20 @@ ] } }, + "AmandeepSingh": { + "avatar_url": "456173", + "github": "amandeepsinghvirdi", + "linkedin": "amandeepsinghvirdi", + "name": "Amandeep Singh", + "teams": { + "2025": [ + "authors", + "analysts" + ] + }, + "twitter": "amanvirdi", + "website": "https://byaman.com/" + }, "cyberandy": { "avatar_url": "837037", "github": "cyberandy", diff --git a/src/content/en/2025/ecommerce.md b/src/content/en/2025/ecommerce.md index a6d65be6a4e..27166d7e7fb 100644 --- a/src/content/en/2025/ecommerce.md +++ b/src/content/en/2025/ecommerce.md @@ -1,20 +1,960 @@ --- #See https://github.com/HTTPArchive/almanac.httparchive.org/wiki/Authors'-Guide#metadata-to-add-at-the-top-of-your-chapters title: Ecommerce -description: This chapter explores trends in the ecommerce ecosystem, examining platform popularity, performance metrics, and regional differences. Covering Core Web Vitals, Lighthouse scores, and accessibility, it highlights how platforms like WooCommerce and Shopify dominate, while newer players gain traction in specific regions and niches. -hero_alt: Hero image of a Web Almanac character at a super market checkout loading items from a shopping basket onto the conveyor belt while another character payes with a credit card. -authors: [] -reviewers: [] -analysts: [] -editors: [] +description: This chapter explores trends in the ecommerce ecosystem, covering platform adoption, Core Web Vitals, Lighthouse metrics, payments, and regional differences. It highlights how platforms like WooCommerce and Shopify lead while newer players grow in specific markets. +hero_alt: Hero image of a Web Almanac character at a supermarket checkout loading items from a shopping basket onto the conveyor belt while another character pays with a credit card. +authors: [AmandeepSingh] +reviewers: [tunetheweb] +analysts: [AmandeepSingh] +editors: [tunetheweb] translators: [] -results: https://docs.google.com/spreadsheets/d/1tbbH4q4wzj4bpTj8ctRJ_8-NyS5KPBBcNInkemfxcR8/edit -featured_quote: ... -featured_stat_1: ... -featured_stat_label_1: ... -featured_stat_2: ... -featured_stat_label_2: ... -featured_stat_3: ... -featured_stat_label_3: ... -doi: ... +results: https://docs.google.com/spreadsheets/d/1tbbH4q4wzj4bpTj8ctRJ_8-NyS5KPBBcNInkemfxcR8 +AmandeepSingh_bio: Amandeep Singh has been developing for the web since 2009 and writes about front end development, UI/UX, Shopify, BigCommerce, WordPress, and programming at byaman.com. He is a writer, mentor, and speaker. +featured_quote: While ecommerce platforms are diverse and well distributed among different providers, a few key players dominate technologies like payment systems. +featured_stat_1: 19% +featured_stat_label_1: Mobile sites that are ecommerce +featured_stat_2: 44% +featured_stat_label_2: Mobile ecommerce sites built with WooCommerce +featured_stat_3: 3.5% +featured_stat_label_3: Mobile sites offering PayPal as a payment method +doi: 10.5281/zenodo.18258559 --- + +## Introduction + +Ecommerce is no longer a special case on the web-it _is_ the web. In 2025, buying journeys start in search results, social feeds, and live streams; they continue in voice assistants, messaging apps, and lean‑back surfaces like smart TVs; and increasingly, they can be completed by AI agents acting on a shopper's behalf. An ecommerce website is still an online store that sells physical or digital products, but it now sits at the intersection of product pages, payments, performance, accessibility, and trust. + +When building an online store, there are a few common platform models: + +1. **Software-as-a-Service (SaaS)** platforms (e.g., Shopify) minimize the technical knowledge required to run a store by controlling the codebase and abstracting hosting. +2. **Platform-as-a-Service (PaaS)** solutions (e.g., Adobe Commerce / Magento) provide an optimized technology stack and hosting environment while still allowing full code access. +3. **Self-hosted** platforms (e.g., WooCommerce, OpenCart) run on infrastructure managed by the merchant or their agency. +4. **Headless / API-first** platforms (e.g., Commercetools, Medusa) provide the commerce backend as a service, while the merchant owns the frontend experience and hosting. +5. **Agentic commerce (agent-ready commerce)** layers sit alongside (or on top of) the storefront: structured product data, inventory, policies, identity, and payment flows exposed through APIs and standards so assistants and AI agents can safely discover products and execute purchases-with clear user consent and guardrails. + +Platforms may fall into more than one category. For example, some vendors offer SaaS, PaaS, and self-hosted options, and many headless builds still rely on SaaS backends under the hood. The important variables are who controls hosting, who controls the runtime and upgrade path, and how much freedom you have to change the frontend and backend. + +## Platform detection + +We used a tool called Wappalyzer to detect technologies used by websites. It can detect ecommerce platforms, content management systems, JavaScript frameworks, analytics, and more. + +For this analysis, we considered a site to be ecommerce if we detected either: + +- Use of a known ecommerce platform, or +- Use of a technology that strongly implies an online store (for example, enhanced ecommerce analytics). + +### Limitations in recognizing ecommerce sites + +Our methodology has limitations that affect accuracy. + +- We can only recognize ecommerce sites when Wappalyzer detects an ecommerce platform or a strong ecommerce signal. +- Detecting a payment processor alone (for example, PayPal) is not sufficient to classify a site as ecommerce, because many non‑store sites also take payments. +- If the store is hosted in a subdirectory, it may be missed. We crawl the home page and one other page (the largest internal link) per site and per client (desktop and mobile). +- Headless implementations reduce platform detectability because the traditional fingerprints in HTML/JS often disappear. +- Apparent trends can be influenced by improvements or regressions in detection, not just industry shifts. +- Crawl geography matters: results may differ when sites redirect based on location. +- The underlying site set is drawn from Chrome's field data ecosystem, which biases toward sites visited by Chrome users. + +## Overall adoption + +{{ figure_markup( + caption="Percent of mobile pages that are ecommerce sites.", + content="19.2%", + classes="big-number", + sheets_gid="1784928999", + sql_file="counts.sql" + ) +}} + +In the 2025 dataset, we detected 19.9% of all analyzed desktop sites and 19.2% of all analyzed mobile sites where ecommerce sites. + +That headline number is the first reminder that ecommerce is not just "a vertical"-it's a major slice of what real users experience on the open web. + +### Adoption by rank + +In general, the most popular sites are more likely to be professionally engineered, heavily optimized, and backed by larger budgets. + +{{ figure_markup( + image="adoption-by-rank.png", + caption="Ecommerce adoption by rank.", + description="Bar chart showing how the adoption of ecommerce platforms varies significantly depending on a website's global traffic rank. Adoption is lowest among the top 1,000 most-visited sites at just 1% but as the rank expands to include less-trafficked sites, adoption rates climb steadily, peaking at 22% for desktop and 21% for mobile within the top 10 million sites. Across all rank groups, desktop adoption consistently remains 1–2 percentage points higher than mobile.", + chart_url="https://docs.google.com/spreadsheets/d/e/2PACX-1vRlrzXpWshCjsSpSxJnhK5A732UtlRUtWfbtSt39JlV1rbI1YRoA1fRLWUr05vJBKNsS-i7ReTMudhN/pubchart?oid=1753144638&format=interactive", + sheets_gid="1784928999", + sql_file="counts.sql" + ) +}} + +The pattern is consistent: + +- Share of sites that are ecommerce increases as we include less‑popular sites. +- At the very top of the web (top 1,000), ecommerce is present but rare. +- This grows over each rank. +- By the time you reach the top 10 million, roughly one in five sites is an online store. + +### Adoption trend + +{{ figure_markup( + image="adoption-by-year.png", + caption="Ecommerce adoption by year.", + description="Bar chart showing that overall ecommerce adoption over the years. Between 2024 and 2025, the percentage of desktop sites identified as ecommerce remained flat at 20%, while mobile adoption also held steady at 19%. This follows a period of gradual expansion from 2022, where both platforms started at 17% adoption.", + chart_url="https://docs.google.com/spreadsheets/d/e/2PACX-1vRlrzXpWshCjsSpSxJnhK5A732UtlRUtWfbtSt39JlV1rbI1YRoA1fRLWUr05vJBKNsS-i7ReTMudhN/pubchart?oid=1949187093&format=interactive", + sheets_gid="1784928999", + sql_file="counts.sql" + ) +}} + +Looking at the trend over time we see a gradual increase year on year. + +## Platform market share + +Across both desktop and mobile, the platform landscape remains top-heavy: a small set of systems account for the majority of detected stores, while a long tail of niche and regional platforms fills the rest. + +The following tables show the share of detected ecommerce sites within ecommerce (platform market share), and also how often each platform appears across all sites in the dataset. + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Platform% ecommerce sites% all sites
WooCommerce35.4%7.1%
Shopify21.5%4.3%
Squarespace Commerce9.1%1.8%
Wix eCommerce7.8%1.6%
PrestaShop3.2%0.6%
1C-Bitrix2.2%0.5%
Magento2.1%0.4%
OpenCart1.1%0.2%
Cafe241.0%0.2%
BigCommerce0.8%0.2%
+
+ {{ figure_link( + caption="Most popular ecommerce platforms on desktop.", + sheets_gid="1752605080", + sql_file="top_ecommerce.sql", + ) }} +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Platform% ecommerce sites% all sites
WooCommerce44.4%7.0%
Shopify25.3%4.0%
Wix eCommerce11.1%1.8%
Squarespace Commerce9.9%1.6%
PrestaShop3.7%0.6%
1C-Bitrix3.3%0.5%
Magento2.2%0.3%
OpenCart1.4%0.2%
Tiendanube1.0%0.2%
Square Online0.9%0.1%
+
+ {{ figure_link( + caption="Most popular ecommerce platforms on mobile.", + sheets_gid="1752605080", + sql_file="top_ecommerce.sql", + ) }} +
+
+ +### Trends since 2024 + +If you zoom out to the last few years, the story is less about disruption and more about slow consolidation + +- WooCommerce remains the largest ecosystem, staying roughly flat (about 36% → 36% of ecommerce sites from 2024 to 2025). +- Shopify continues to gain share (about 20% → 21%). +- Wix eCommerce is the fastest climber in the top 5 (about 7% → 8%). +- PrestaShop continues to trend down in share (about 4% → 3%). + +In other words: the default choices are getting more default, and smaller open‑source ecosystems are having to compete harder on developer experience, hosting simplicity, and performance out of the box. + +### Top platforms by tier + +Different tiers have different top platforms. + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PositionTop 1,000Top 10,000Top 100,000Top 1,000,000Top 10,000,000All
1Amazon WebstoreAmazon WebstoreShopifyShopifyWooCommerceWooCommerce
2MagentoSalesforce Commerce CloudMagentoWooCommerceShopifyShopify
3Pattern by EtsySAP Commerce CloudSalesforce Commerce CloudMagentoSquarespace CommerceSquarespace Commerce
4MagentoAmazon WebstorePrestaShopPrestaShopWix eCommerce
5Shopify/td> + WooCommerce/td> + 1C-Bitrix/td> + Wix eCommerce/td> + PrestaShop
+
+ {{ figure_link( + caption="Top platforms by rank tier (desktop).", + sheets_gid="301153684", + sql_file="top_vendors_crux_rank.sql", + ) }} +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PositionTop 1,000Top 10,000Top 100,000Top 1,000,000Top 10,000,000All
1MagentoAmazon WebstoreShopifyShopifyWooCommerceWooCommerce
2Amazon WebstoreSalesforce Commerce CloudMagentoWooCommerceShopifyShopify
3Pattern by EtsySAP Commerce CloudSalesforce Commerce ClousMagentoSquarespace CommerceWix eCommerce
4MagentoAmazon WebstorePrestaShopPrestaShopSquarespace Commerce
5Shopify/td> + WooCommerce/td> + 1C-Bitrix/td> + Wix eCommerce/td> + PrestaShop
+
+ {{ figure_link( + caption="Top platforms by rank tier (mobile).", + sheets_gid="301153684", + sql_file="top_vendors_crux_rank.sql", + ) }} +
+
+ +- In the very top ranks, enterprise and bespoke ecosystems show up more often. +- In the broader web, the long‑tail winners (especially WooCommerce) dominate by volume. + +### Top platforms by geography + +Platform dominance changes by region because of language, local payment rails, agency ecosystems, and the historical footprint of vendors. + +{{ figure_markup( + image="top-ecommerce-platform-by-country.png", + caption="Top ecommerce platform by country in 2025.", + description="Map showing the most popular ecommerce platform by country in 2025. WooCommerce leads in most regions, with Shopify and 1C-Bitrix leading in several markets, and regional leaders including Tiendanube, Shoptet, Cafe24, and Salla.", + chart_url="https://docs.google.com/spreadsheets/d/e/2PACX-1vRlrzXpWshCjsSpSxJnhK5A732UtlRUtWfbtSt39JlV1rbI1YRoA1fRLWUr05vJBKNsS-i7ReTMudhN/pubchart?oid=571594362&format=interactive", + sheets_gid="2084734046", + sql_file="top_shopsystem_by_geo.sql" + ) +}} + +The three leading platforms take the top spot in most countries: WooCommerce (violet), Shopify (green), and 1C-Bitrix (red). + +- On desktop, WooCommerce is the most common platform in 42 of 59 geographies in our country‑level view (excluding the ALL aggregate). +- On mobile, WooCommerce leads even more often: 71 of 89 (excluding the ALL aggregate). + +There are also meaningful regional exceptions: + +- 1C‑Bitrix leads in parts of Eastern Europe and Central Asia (e.g., Russian Federation, Belarus, Kazakhstan, Kyrgyzstan). +- Tiendanube stands out in Argentina. +- Shoptet appears as a leader in Czechia. +- Cafe24 leads in South Korea. +- Salla shows up strongly in Saudi Arabia. + +## Core Web Vitals in ecommerce + +Ecommerce sites are unusually sensitive to performance because every extra second compounds: slower category pages reduce product views; slower product pages reduce add‑to‑carts; slower checkout flows reduce conversion. + +We use Core Web Vitals (CWV) field metrics to summarize real‑user experience: + +- **LCP (Largest Contentful Paint):** measures _loading_ performance. It captures how quickly the main content becomes visible. In ecommerce, it often maps to hero imagery, product grids, and critical CSS/JS that blocks rendering. +- **INP (Interaction to Next Paint):** measures _responsiveness_. It captures the delay between a user action (tap/click) and the next visual update. It is sensitive to heavy JavaScript, third-party tags, and main-thread contention. +- **CLS (Cumulative Layout Shift):** measures _visual stability_. It captures how much content shifts as the page loads. It's especially relevant to ecommerce because late-loading product images, personalization widgets, and promo banners can cause mis-clicks. + +A site is considered "good" on CWV when it passes all three thresholds. + +{{ figure_markup( + image="top-ecommerce-passes-cwv-rates.png", + caption="Top ecommerce platform CWV pass rates.", + description="Bar chart showing the share of desktop ecommerce origins with good Core Web Vitals across leading platforms in 2025.", + chart_url="https://docs.google.com/spreadsheets/d/e/2PACX-1vRlrzXpWshCjsSpSxJnhK5A732UtlRUtWfbtSt39JlV1rbI1YRoA1fRLWUr05vJBKNsS-i7ReTMudhN/pubchart?oid=1694550596&format=interactive", + sheets_gid="755277706", + sql_file="core_web_vitals_by_platform.sql", + width="600", + height="525" + ) +}} + +### CWV by platform + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PlatformOriginsGood LCPGood INPGood CLSGood CWV
WooCommerce394,46245%99%68%33%
Shopify289,88592%99%82%76%
Squarespace Commerce80,90090%100%78%69%
Wix eCommerce55,70677%99%91%70%
PrestaShop45,25674%99%72%54%
Magento36,98859%99%55%36%
1C-Bitrix31,15086%99%80%68%
OpenCart14,45287%99%80%70%
Cafe2413,66198%100%46%45%
BigCommerce12,37691%99%60%55%
+
+ {{ figure_link( + caption="Top eCommerce platforms Core Web Vitals good rates (desktop).", + sheets_gid="755277706", + sql_file="core_web_vitals_by_platform.sql", + ) }} +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PlatformOriginsGood LCPGood INPGood CLSGood CWV
WooCommerce995,78239%88%85%35%
Shopify567,93286%90%92%76%
Wix eCommerce234,05576%85%95%66%
Squarespace Commerce209,65076%96%89%69%
PrestaShop87,48665%89%81%50%
1C-Bitrix76,08071%71%86%50%
Magento50,98352%87%64%35%
OpenCart32,91480%93%88%68%
Tiendanube21,83660%95%84%51%
Square Online18,8120%39%0%0%
+
+ {{ figure_link( + caption="Top eCommerce platforms Core Web Vitals good rates (mobile).", + sheets_gid="755277706", + sql_file="core_web_vitals_by_platform.sql", + ) }} +
+
+ +A few patterns show up repeatedly: + +- INP is generally strong on desktop across most major platforms, suggesting that modern JS stacks and browser improvements are helping responsiveness. +- LCP is the biggest differentiator-platforms that ship fast themes and tightly controlled app ecosystems tend to score better. +- WooCommerce has scale, but not automatic speed: its CWV pass rates lag behind SaaS-heavy ecosystems, which is consistent with its infinite customization nature. + +## Lighthouse + +Lighthouse is the HTTP Archive's lab-based audit. Unlike Core Web Vitals (field data), it runs in a controlled environment (simulated device, throttled network/CPU) and produces scores for Performance, Accessibility, SEO, and Best Practices: + +- **Performance**: Lighthouse Performance is a lab score (0–100) summarizing load and responsiveness under a controlled test profile. It's most useful for relative comparisons across platforms. +- **Accessibility**: Lighthouse Accessibility is based on automated checks (it cannot catch everything), but it's a useful baseline signal for common issues like missing labels, low contrast, and incorrect semantics. +- **SEO**: The Lighthouse SEO score reflects technical SEO fundamentals (e.g., title/meta, basic crawlability signals). High medians are common because these checks are straightforward to pass. +- **Best Practices**: Best Practices is a grab bag of security and reliability checks (HTTPS, safe JS patterns, modern APIs). It often reflects platform defaults and theme quality. + +Lighthouse is useful for comparisons across large sets of sites because it standardizes the test profile, but it won't perfectly match what real users experience since field data reflects the real mix of devices, networks, geographies, and user behavior. + +### Median Lighthouse scores by platform + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Platform% all sitesPerformance (median)Accessibility (median)SEO (median)Best Practices (median)
WooCommerce7.10%61879278
Shopify4.32%71909274
Squarespace Commerce1.84%65949296
Wix eCommerce1.57%889610078
PrestaShop0.64%59789281
1C-Bitrix0.47%58759259
Magento0.41%60789274
OpenCart0.23%63799178
Cafe240.20%39698556
BigCommerce0.15%72819274
+
+ {{ figure_link( + caption="Most popular ecommerce platforms Lighthouse scores (desktop).", + sheets_gid="1765174321", + sql_file="median_lighthouse_score_ecommsites.sql", + ) }} +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Platform% all sitesPerformance (median)Accessibility (median)SEO (median)Best Practices (median)
WooCommerce7.03%38879279
Shopify4.01%55919275
Wix eCommerce1.75%649510079
Squarespace Commerce1.56%30949296
PrestaShop0.59%36799279
1C-Bitrix0.53%35759261
Magento0.34%34799275
OpenCart0.23%43789179
Tiendanube0.15%50929275
Square Online0.14%13859257
+
+ {{ figure_link( + caption="Most popular ecommerce platforms Lighthouse scores (mobile).", + sheets_gid="1765174321", + sql_file="median_lighthouse_score_ecommsites.sql", + ) }} +
+
+ +A few high-level patterns: + +- SaaS storefronts tend to cluster higher on the Performance category (especially on desktop), consistent with tighter control over themes and defaults. +- Accessibility medians are generally strong across top platforms, but medians can hide long-tail variance. +- SEO and Best Practices scores are high for most platforms-where teams usually win or lose is performance and implementation discipline, not basic technical SEO. + +## Payment providers + +Payments are where ecommerce becomes real. They also represent a major dependency surface area: third‑party scripts, redirects, fraud tooling, and compliance constraints. + +{{ figure_markup( + image="payment-provider-distribution.png", + caption="Payment provider distribution on ecommerce sites in 2025.", + description="Bar chart which identifies PayPal as the dominant payment provider, appearing on 2.2% of desktop sites and over 2.0% of mobile sites. Other major digital wallets like Apple Pay (1.5%) and Shop Pay (1.4%) follow closely, reflecting a broader 2025 trend where digital wallets are projected to drive 65% of ecommerce growth. Interestingly, traditional card networks like Visa and Mastercard show lower direct site integration at 1.2%, as consumers increasingly prefer to use these cards through more secure, \"one-click\" digital wallet interfaces. Specialist services like Venmo (0.3%) and Klarna Checkout (0.2%) maintain smaller but significant niches, particularly as Buy Now, Pay Later (BNPL) options continue to boost conversion rates for specific retail verticals.", + chart_url="https://docs.google.com/spreadsheets/d/e/2PACX-1vRlrzXpWshCjsSpSxJnhK5A732UtlRUtWfbtSt39JlV1rbI1YRoA1fRLWUr05vJBKNsS-i7ReTMudhN/pubchart?oid=2038208870&format=interactive", + sheets_gid="2028626432", + sql_file="top_payment_providers.sql" + ) +}} + +The top 10 payment technologies account for the bulk of payment detections on both devices-another reminder that payments consolidate quickly. However it's worth noting that no single provider or two stands out as overall dominant. + +### What changed since 2022? + +The most noticeable trend is that PayPal's share of payment detections declines, while wallets and processor‑first ecosystems grow: + +- PayPal falls from ~39% of payment detections in 2022 to ~30% in 2025 (desktop and mobile both show this pattern). +- Stripe and Google Pay gain share over the same period. +- Apple Pay and Shop Pay stay relatively stable at high levels. + +This does not mean PayPal is dying. It means the payment layer is becoming more diversified-especially as native wallets, link-based checkout, and platform-native accelerators become standard. + +### Payment providers by geography + +{{ figure_markup( + caption="Countries in which PayPal is the top payment provider.", + content="70 out of 83", + classes="big-number", + sheets_gid="732986771", + sql_file="top_payment_by_geo.sql" + ) +}} + +- On mobile, PayPal is the top payment provider in 70 of 83 geographies. +- On desktop, leadership is more split: Stripe leads in 31 geographies while PayPal leads in 22. + +Notable examples: + +- Apple Pay leads in New Zealand (both desktop and mobile). +- Braintree stands out in Taiwan. +- Several African and Middle Eastern markets show Stripe as the most common top provider in this dataset (e.g., Nigeria, Kenya, UAE). + +## Conclusion + +Ecommerce in 2025 remains both concentrated and diverse. A handful of platforms account for most detected ecommerce sites-led by WooCommerce and Shopify-while a long tail of regional and niche systems continues to matter in specific markets. Website rank adds another layer: enterprise-oriented platforms show up disproportionately in higher-traffic tiers, while long-tail sites skew toward easier-to-adopt and lower-cost solutions. + +Performance remains a differentiator, not a footnote. Field metrics (Core Web Vitals) and lab audits (Lighthouse) both show that tighter platform control can correlate with better median outcomes, but the gap is not destiny-self-hosted and heavily customized stacks can perform well when engineering discipline is strong. Payment technologies also consolidate quickly: a small set of providers dominates detections, while wallets and processor-first ecosystems keep gaining share. + +The next chapter of ecommerce is not just which platform, but which channels: voice, live commerce, and agentic commerce are pushing stores to become faster, more accessible, and more machine-consumable. The winners will be the ones who treat catalog quality, performance, and trust as product features-because increasingly, the shopper may not be a human clicking around a page at all. diff --git a/src/static/images/2025/ecommerce/adoption-by-rank.png b/src/static/images/2025/ecommerce/adoption-by-rank.png new file mode 100644 index 00000000000..6ddd2fd0542 Binary files /dev/null and b/src/static/images/2025/ecommerce/adoption-by-rank.png differ diff --git a/src/static/images/2025/ecommerce/adoption-by-year.png b/src/static/images/2025/ecommerce/adoption-by-year.png new file mode 100644 index 00000000000..35c466cbdcb Binary files /dev/null and b/src/static/images/2025/ecommerce/adoption-by-year.png differ diff --git a/src/static/images/2025/ecommerce/payment-provider-distribution.png b/src/static/images/2025/ecommerce/payment-provider-distribution.png new file mode 100644 index 00000000000..131cf5336ba Binary files /dev/null and b/src/static/images/2025/ecommerce/payment-provider-distribution.png differ diff --git a/src/static/images/2025/ecommerce/top-ecommerce-passes-cwv-rates.png b/src/static/images/2025/ecommerce/top-ecommerce-passes-cwv-rates.png new file mode 100644 index 00000000000..8fad5f1582c Binary files /dev/null and b/src/static/images/2025/ecommerce/top-ecommerce-passes-cwv-rates.png differ diff --git a/src/static/images/2025/ecommerce/top-ecommerce-platform-by-country.png b/src/static/images/2025/ecommerce/top-ecommerce-platform-by-country.png new file mode 100644 index 00000000000..a6182f20978 Binary files /dev/null and b/src/static/images/2025/ecommerce/top-ecommerce-platform-by-country.png differ