diff --git a/CHANGELOG.md b/CHANGELOG.md index 32ceb6f6f9ed..88ad92913c3b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ All notable changes to this project will be documented in this file. - Internal stats API routes no longer support legacy dashboard filter format. - Dashboard no longer shows "Unique visitors" in top stats when filtering by a goal which used to count all users including ones who didn't complete the goal. "Unique conversions" shows the number of unique visitors who completed the goal. +- Dashboard no longer shows "Total visitors" in breakdown details modals. ### Changed diff --git a/assets/js/dashboard/stats/modals/devices/choose-metrics.js b/assets/js/dashboard/stats/modals/devices/choose-metrics.js index b2ca3b8a04ee..486a275d3b07 100644 --- a/assets/js/dashboard/stats/modals/devices/choose-metrics.js +++ b/assets/js/dashboard/stats/modals/devices/choose-metrics.js @@ -4,7 +4,6 @@ import * as metrics from '../../reports/metrics' export default function chooseMetrics(query) { if (hasConversionGoalFilter(query)) { return [ - metrics.createTotalVisitors(), metrics.createVisitors({ renderLabel: (_query) => 'Conversions', width: 'w-28' }), metrics.createConversionRate() ] diff --git a/assets/js/dashboard/stats/modals/entry-pages.js b/assets/js/dashboard/stats/modals/entry-pages.js index 77c5364dd117..4a4675a6b4a3 100644 --- a/assets/js/dashboard/stats/modals/entry-pages.js +++ b/assets/js/dashboard/stats/modals/entry-pages.js @@ -35,7 +35,6 @@ function EntryPagesModal() { function chooseMetrics() { if (hasConversionGoalFilter(query)) { return [ - metrics.createTotalVisitors(), metrics.createVisitors({ renderLabel: (_query) => 'Conversions', width: 'w-28' }), metrics.createConversionRate() ] diff --git a/assets/js/dashboard/stats/modals/exit-pages.js b/assets/js/dashboard/stats/modals/exit-pages.js index 57e6568d859b..d2125281fa55 100644 --- a/assets/js/dashboard/stats/modals/exit-pages.js +++ b/assets/js/dashboard/stats/modals/exit-pages.js @@ -35,7 +35,6 @@ function ExitPagesModal() { function chooseMetrics() { if (hasConversionGoalFilter(query)) { return [ - metrics.createTotalVisitors(), metrics.createVisitors({ renderLabel: (_query) => 'Conversions', width: 'w-28' }), metrics.createConversionRate() ] diff --git a/assets/js/dashboard/stats/modals/locations-modal.js b/assets/js/dashboard/stats/modals/locations-modal.js index 5563484e73d9..e9eea3a3638f 100644 --- a/assets/js/dashboard/stats/modals/locations-modal.js +++ b/assets/js/dashboard/stats/modals/locations-modal.js @@ -38,7 +38,6 @@ function LocationsModal({ currentView }) { function chooseMetrics() { if (hasConversionGoalFilter(query)) { return [ - metrics.createTotalVisitors(), metrics.createVisitors({ renderLabel: (_query) => 'Conversions', width: 'w-28' }), metrics.createConversionRate() ] diff --git a/assets/js/dashboard/stats/modals/pages.js b/assets/js/dashboard/stats/modals/pages.js index 79485a794628..157344063dbd 100644 --- a/assets/js/dashboard/stats/modals/pages.js +++ b/assets/js/dashboard/stats/modals/pages.js @@ -35,7 +35,6 @@ function PagesModal() { function chooseMetrics() { if (hasConversionGoalFilter(query)) { return [ - metrics.createTotalVisitors(), metrics.createVisitors({renderLabel: (_query) => 'Conversions', width: 'w-28'}), metrics.createConversionRate() ] diff --git a/assets/js/dashboard/stats/modals/referrer-drilldown.js b/assets/js/dashboard/stats/modals/referrer-drilldown.js index 23ee6ec5f35a..56f42edc5621 100644 --- a/assets/js/dashboard/stats/modals/referrer-drilldown.js +++ b/assets/js/dashboard/stats/modals/referrer-drilldown.js @@ -39,7 +39,6 @@ function ReferrerDrilldownModal() { function chooseMetrics() { if (hasConversionGoalFilter(query)) { return [ - metrics.createTotalVisitors(), metrics.createVisitors({ renderLabel: (_query) => 'Conversions', width: 'w-28' }), metrics.createConversionRate() ] diff --git a/assets/js/dashboard/stats/modals/sources.js b/assets/js/dashboard/stats/modals/sources.js index d78cec9382de..9ffd64a569bf 100644 --- a/assets/js/dashboard/stats/modals/sources.js +++ b/assets/js/dashboard/stats/modals/sources.js @@ -63,7 +63,6 @@ function SourcesModal({ currentView }) { function chooseMetrics() { if (hasConversionGoalFilter(query)) { return [ - metrics.createTotalVisitors(), metrics.createVisitors({ renderLabel: (_query) => 'Conversions', width: 'w-28' }), metrics.createConversionRate() ] diff --git a/assets/js/dashboard/stats/reports/metric-formatter.ts b/assets/js/dashboard/stats/reports/metric-formatter.ts index d43ae200857e..296185bb4111 100644 --- a/assets/js/dashboard/stats/reports/metric-formatter.ts +++ b/assets/js/dashboard/stats/reports/metric-formatter.ts @@ -12,7 +12,6 @@ import { export type FormattableMetric = | Metric - | 'total_visitors' | 'current_visitors' | 'exit_rate' | 'conversions' @@ -26,7 +25,6 @@ export const MetricFormatterShort: Record< > = { events: nullable(numberShortFormatter), pageviews: numberShortFormatter, - total_visitors: numberShortFormatter, current_visitors: numberShortFormatter, views_per_visit: numberShortFormatter, visitors: numberShortFormatter, @@ -54,7 +52,6 @@ export const MetricFormatterLong: Record< > = { events: nullable(numberLongFormatter), pageviews: numberLongFormatter, - total_visitors: numberLongFormatter, current_visitors: numberShortFormatter, views_per_visit: numberLongFormatter, visitors: numberLongFormatter, diff --git a/assets/js/dashboard/stats/reports/metrics.js b/assets/js/dashboard/stats/reports/metrics.js index b906e5018ab8..be17f2d20abf 100644 --- a/assets/js/dashboard/stats/reports/metrics.js +++ b/assets/js/dashboard/stats/reports/metrics.js @@ -143,17 +143,6 @@ export const createAverageRevenue = (props) => { }) } -export const createTotalVisitors = (props) => { - const renderLabel = (_query) => 'Total Visitors' - return new Metric({ - width: 'w-28', - ...props, - key: 'total_visitors', - renderLabel, - sortable: false - }) -} - export const createVisits = (props) => { return new Metric({ width: 'w-24', sortable: true, ...props, key: 'visits' }) } diff --git a/lib/plausible/stats/sql/expression.ex b/lib/plausible/stats/sql/expression.ex index 9445a51f045b..33229b309e31 100644 --- a/lib/plausible/stats/sql/expression.ex +++ b/lib/plausible/stats/sql/expression.ex @@ -249,7 +249,6 @@ defmodule Plausible.Stats.SQL.Expression do def event_metric(:conversion_rate), do: %{} def event_metric(:scroll_depth), do: %{} def event_metric(:group_conversion_rate), do: %{} - def event_metric(:total_visitors), do: %{} def event_metric(unknown), do: raise("Unknown metric: #{unknown}") diff --git a/lib/plausible/stats/table_decider.ex b/lib/plausible/stats/table_decider.ex index 5f40a32645e5..a0a03be4c4e8 100644 --- a/lib/plausible/stats/table_decider.ex +++ b/lib/plausible/stats/table_decider.ex @@ -116,7 +116,6 @@ defmodule Plausible.Stats.TableDecider do # Calculated metrics - handled on callsite separately from other metrics. defp metric_partitioner(_, :time_on_page), do: :other - defp metric_partitioner(_, :total_visitors), do: :other # Sample percentage is included in both tables if queried. defp metric_partitioner(_, :sample_percent), do: :sample_percent diff --git a/lib/plausible_web/controllers/api/stats_controller.ex b/lib/plausible_web/controllers/api/stats_controller.ex index 1456c86c76d7..de01afa1c103 100644 --- a/lib/plausible_web/controllers/api/stats_controller.ex +++ b/lib/plausible_web/controllers/api/stats_controller.ex @@ -1637,7 +1637,7 @@ defmodule PlausibleWeb.Api.StatsController do defp breakdown_metrics(query, extra_metrics \\ []) do if toplevel_goal_filter?(query) do - [:visitors, :conversion_rate, :total_visitors] + [:visitors, :conversion_rate] else [:visitors] ++ extra_metrics end diff --git a/test/plausible/stats/table_decider_test.exs b/test/plausible/stats/table_decider_test.exs index 81445df17668..1879a6a38427 100644 --- a/test/plausible/stats/table_decider_test.exs +++ b/test/plausible/stats/table_decider_test.exs @@ -79,8 +79,8 @@ defmodule Plausible.Stats.TableDeciderTest do test "other metrics put in its own result" do query = make_query([]) - assert partition_metrics([:time_on_page, :percentage, :total_visitors], query) == - {[], [:percentage], [:time_on_page, :total_visitors]} + assert partition_metrics([:time_on_page, :percentage], query) == + {[], [:percentage], [:time_on_page]} end test "metrics that can be calculated on either when event-only metrics" do diff --git a/test/plausible_web/controllers/api/stats_controller/browsers_test.exs b/test/plausible_web/controllers/api/stats_controller/browsers_test.exs index 04319216d39c..fbb24482b1a9 100644 --- a/test/plausible_web/controllers/api/stats_controller/browsers_test.exs +++ b/test/plausible_web/controllers/api/stats_controller/browsers_test.exs @@ -104,7 +104,6 @@ defmodule PlausibleWeb.Api.StatsController.BrowsersTest do assert json_response(conn, 200)["results"] == [ %{ "name" => "Chrome", - "total_visitors" => 2, "visitors" => 1, "conversion_rate" => 50.0 } @@ -309,7 +308,6 @@ defmodule PlausibleWeb.Api.StatsController.BrowsersTest do "browser" => "Chrome", "conversion_rate" => 66.7, "version" => "110", - "total_visitors" => 3, "visitors" => 2 } == List.first(json_response) @@ -318,7 +316,6 @@ defmodule PlausibleWeb.Api.StatsController.BrowsersTest do "browser" => "Firefox", "conversion_rate" => 100.0, "version" => "121", - "total_visitors" => 1, "visitors" => 1 } == List.last(json_response) end diff --git a/test/plausible_web/controllers/api/stats_controller/countries_test.exs b/test/plausible_web/controllers/api/stats_controller/countries_test.exs index cd298ec7b78f..911defd61aec 100644 --- a/test/plausible_web/controllers/api/stats_controller/countries_test.exs +++ b/test/plausible_web/controllers/api/stats_controller/countries_test.exs @@ -98,7 +98,6 @@ defmodule PlausibleWeb.Api.StatsController.CountriesTest do "alpha_3" => "EST", "name" => "Estonia", "flag" => "🇪🇪", - "total_visitors" => 2, "visitors" => 1, "conversion_rate" => 50.0 }, @@ -107,7 +106,6 @@ defmodule PlausibleWeb.Api.StatsController.CountriesTest do "alpha_3" => "GBR", "name" => "United Kingdom", "flag" => "🇬🇧", - "total_visitors" => 1, "visitors" => 1, "conversion_rate" => 100.0 } @@ -148,7 +146,6 @@ defmodule PlausibleWeb.Api.StatsController.CountriesTest do "alpha_3" => "GBR", "name" => "United Kingdom", "flag" => "🇬🇧", - "total_visitors" => 1, "visitors" => 1, "conversion_rate" => 100.0 }, @@ -157,7 +154,6 @@ defmodule PlausibleWeb.Api.StatsController.CountriesTest do "alpha_3" => "EST", "name" => "Estonia", "flag" => "🇪🇪", - "total_visitors" => 2, "visitors" => 1, "conversion_rate" => 50.0 } diff --git a/test/plausible_web/controllers/api/stats_controller/operating_systems_test.exs b/test/plausible_web/controllers/api/stats_controller/operating_systems_test.exs index 303575e11223..e71b7fc850d3 100644 --- a/test/plausible_web/controllers/api/stats_controller/operating_systems_test.exs +++ b/test/plausible_web/controllers/api/stats_controller/operating_systems_test.exs @@ -79,7 +79,6 @@ defmodule PlausibleWeb.Api.StatsController.OperatingSystemsTest do assert json_response(conn, 200)["results"] == [ %{ "name" => "Mac", - "total_visitors" => 2, "visitors" => 1, "conversion_rate" => 50.0 } @@ -206,7 +205,6 @@ defmodule PlausibleWeb.Api.StatsController.OperatingSystemsTest do assert json_response(conn, 200)["results"] == [ %{ "name" => "Mac", - "total_visitors" => 2, "visitors" => 1, "conversion_rate" => 50.0 } diff --git a/test/plausible_web/controllers/api/stats_controller/pages_test.exs b/test/plausible_web/controllers/api/stats_controller/pages_test.exs index 05b9d9b21ac1..ec92c528da61 100644 --- a/test/plausible_web/controllers/api/stats_controller/pages_test.exs +++ b/test/plausible_web/controllers/api/stats_controller/pages_test.exs @@ -1167,14 +1167,12 @@ defmodule PlausibleWeb.Api.StatsController.PagesTest do %{ "visitors" => 2, "name" => "/blog/post-1", - "conversion_rate" => 100.0, - "total_visitors" => 2 + "conversion_rate" => 100.0 }, %{ "visitors" => 1, "name" => "/blog", - "conversion_rate" => 100.0, - "total_visitors" => 1 + "conversion_rate" => 100.0 } ] end @@ -1509,7 +1507,7 @@ defmodule PlausibleWeb.Api.StatsController.PagesTest do conn = get(conn, "/api/stats/#{site.domain}/pages?period=day&filters=#{filters}") assert json_response(conn, 200)["results"] == [ - %{"total_visitors" => 3, "visitors" => 1, "name" => "/", "conversion_rate" => 33.3} + %{"visitors" => 1, "name" => "/", "conversion_rate" => 33.3} ] end @@ -2067,13 +2065,11 @@ defmodule PlausibleWeb.Api.StatsController.PagesTest do assert json_response(conn, 200)["results"] == [ %{ - "total_visitors" => 2, "visitors" => 1, "name" => "/page1", "conversion_rate" => 50.0 }, %{ - "total_visitors" => 1, "visitors" => 1, "name" => "/page2", "conversion_rate" => 100.0 @@ -2408,13 +2404,11 @@ defmodule PlausibleWeb.Api.StatsController.PagesTest do %{ "name" => "/exit1", "visitors" => 1, - "total_visitors" => 1, "conversion_rate" => 100.0 }, %{ "name" => "/exit2", "visitors" => 1, - "total_visitors" => 1, "conversion_rate" => 100.0 } ] diff --git a/test/plausible_web/controllers/api/stats_controller/screen_sizes_test.exs b/test/plausible_web/controllers/api/stats_controller/screen_sizes_test.exs index d5795f0dde40..ce21b69cce56 100644 --- a/test/plausible_web/controllers/api/stats_controller/screen_sizes_test.exs +++ b/test/plausible_web/controllers/api/stats_controller/screen_sizes_test.exs @@ -288,7 +288,6 @@ defmodule PlausibleWeb.Api.StatsController.ScreenSizesTest do assert json_response(conn, 200)["results"] == [ %{ "name" => "Desktop", - "total_visitors" => 2, "visitors" => 1, "conversion_rate" => 50.0 } diff --git a/test/plausible_web/controllers/api/stats_controller/sources_test.exs b/test/plausible_web/controllers/api/stats_controller/sources_test.exs index 6bff2c857a96..6477f4baf742 100644 --- a/test/plausible_web/controllers/api/stats_controller/sources_test.exs +++ b/test/plausible_web/controllers/api/stats_controller/sources_test.exs @@ -1489,7 +1489,6 @@ defmodule PlausibleWeb.Api.StatsController.SourcesTest do assert json_response(conn, 200)["results"] == [ %{ "name" => "Twitter", - "total_visitors" => 2, "visitors" => 1, "conversion_rate" => 50.0 } @@ -1573,7 +1572,6 @@ defmodule PlausibleWeb.Api.StatsController.SourcesTest do %{ "conversion_rate" => 100.0, "name" => "Facebook", - "total_visitors" => 1, "visitors" => 1 } ] @@ -1629,8 +1627,7 @@ defmodule PlausibleWeb.Api.StatsController.SourcesTest do %{ "name" => "DuckDuckGo", "visitors" => 1, - "conversion_rate" => 50.0, - "total_visitors" => 2 + "conversion_rate" => 50.0 } ] end @@ -1686,14 +1683,12 @@ defmodule PlausibleWeb.Api.StatsController.SourcesTest do %{ "name" => "DuckDuckGo", "visitors" => 1, - "conversion_rate" => 100.0, - "total_visitors" => 1 + "conversion_rate" => 100.0 }, %{ "name" => "Google", "visitors" => 1, - "conversion_rate" => 50.0, - "total_visitors" => 2 + "conversion_rate" => 50.0 } ] end @@ -1728,7 +1723,6 @@ defmodule PlausibleWeb.Api.StatsController.SourcesTest do assert json_response(conn, 200)["results"] == [ %{ "name" => "Twitter", - "total_visitors" => 2, "visitors" => 1, "conversion_rate" => 50.0 } @@ -1912,7 +1906,6 @@ defmodule PlausibleWeb.Api.StatsController.SourcesTest do assert json_response(conn, 200)["results"] == [ %{ "name" => "10words.com", - "total_visitors" => 2, "conversion_rate" => 50.0, "visitors" => 1 } @@ -1952,7 +1945,6 @@ defmodule PlausibleWeb.Api.StatsController.SourcesTest do assert json_response(conn, 200)["results"] == [ %{ "name" => "10words.com", - "total_visitors" => 2, "conversion_rate" => 50.0, "visitors" => 1 }