diff --git a/assets/js/dashboard/stats/modals/devices/browser-versions-modal.js b/assets/js/dashboard/stats/modals/devices/browser-versions-modal.js index 7fa8bfb48f38..f95ead72f647 100644 --- a/assets/js/dashboard/stats/modals/devices/browser-versions-modal.js +++ b/assets/js/dashboard/stats/modals/devices/browser-versions-modal.js @@ -52,7 +52,7 @@ function BrowserVersionsModal() { 'Conversions', width: 'w-28' }), - metrics.createConversionRate() - ] + metrics.createConversionRate(), + showRevenueMetrics && metrics.createTotalRevenue(), + showRevenueMetrics && metrics.createAverageRevenue() + ].filter((metric) => !!metric) } if (isRealTimeDashboard(query)) { diff --git a/assets/js/dashboard/stats/modals/devices/operating-system-versions-modal.js b/assets/js/dashboard/stats/modals/devices/operating-system-versions-modal.js index 0749cc84de0f..782bb10bb4b8 100644 --- a/assets/js/dashboard/stats/modals/devices/operating-system-versions-modal.js +++ b/assets/js/dashboard/stats/modals/devices/operating-system-versions-modal.js @@ -49,7 +49,7 @@ function OperatingSystemVersionsModal() { 'Conversions', width: 'w-28' }), - metrics.createConversionRate() - ] + metrics.createConversionRate(), + showRevenueMetrics && metrics.createTotalRevenue(), + showRevenueMetrics && metrics.createAverageRevenue() + ].filter((metric) => !!metric) } if (query.period === 'realtime') { diff --git a/assets/js/dashboard/stats/modals/pages.js b/assets/js/dashboard/stats/modals/pages.js index 18c679c938b7..84467dc6eac4 100644 --- a/assets/js/dashboard/stats/modals/pages.js +++ b/assets/js/dashboard/stats/modals/pages.js @@ -4,7 +4,7 @@ import { hasConversionGoalFilter, isRealTimeDashboard } from '../../util/filters' -import { addFilter } from '../../query' +import { addFilter, revenueAvailable } from '../../query' import BreakdownModal from './breakdown-modal' import * as metrics from '../reports/metrics' import * as url from '../../util/url' @@ -16,6 +16,9 @@ function PagesModal() { const { query } = useQueryContext() const site = useSiteContext() + /*global BUILD_EXTRA*/ + const showRevenueMetrics = BUILD_EXTRA && revenueAvailable(query, site) + const reportInfo = { title: 'Top Pages', dimension: 'page', @@ -54,8 +57,10 @@ function PagesModal() { renderLabel: (_query) => 'Conversions', width: 'w-28' }), - metrics.createConversionRate() - ] + metrics.createConversionRate(), + showRevenueMetrics && metrics.createTotalRevenue(), + showRevenueMetrics && metrics.createAverageRevenue() + ].filter((metric) => !!metric) } if (isRealTimeDashboard(query)) { diff --git a/assets/js/dashboard/stats/modals/referrer-drilldown.js b/assets/js/dashboard/stats/modals/referrer-drilldown.js index 023c63cfb62d..15b762abe403 100644 --- a/assets/js/dashboard/stats/modals/referrer-drilldown.js +++ b/assets/js/dashboard/stats/modals/referrer-drilldown.js @@ -9,7 +9,7 @@ import { import BreakdownModal from './breakdown-modal' import * as metrics from '../reports/metrics' import * as url from '../../util/url' -import { addFilter } from '../../query' +import { addFilter, revenueAvailable } from '../../query' import { useQueryContext } from '../../query-context' import { useSiteContext } from '../../site-context' import { SortDirection } from '../../hooks/use-order-by' @@ -19,6 +19,9 @@ function ReferrerDrilldownModal() { const { query } = useQueryContext() const site = useSiteContext() + /*global BUILD_EXTRA*/ + const showRevenueMetrics = BUILD_EXTRA && revenueAvailable(query, site) + const reportInfo = { title: 'Referrer Drilldown', dimension: 'referrer', @@ -60,8 +63,10 @@ function ReferrerDrilldownModal() { renderLabel: (_query) => 'Conversions', width: 'w-28' }), - metrics.createConversionRate() - ] + metrics.createConversionRate(), + showRevenueMetrics && metrics.createTotalRevenue(), + showRevenueMetrics && metrics.createAverageRevenue() + ].filter((metric) => !!metric) } if (isRealTimeDashboard(query)) { diff --git a/assets/js/dashboard/stats/modals/sources.js b/assets/js/dashboard/stats/modals/sources.js index ea0d9313eb58..9945df085a78 100644 --- a/assets/js/dashboard/stats/modals/sources.js +++ b/assets/js/dashboard/stats/modals/sources.js @@ -7,7 +7,7 @@ import { import BreakdownModal from './breakdown-modal' import * as metrics from '../reports/metrics' import * as url from '../../util/url' -import { addFilter } from '../../query' +import { addFilter, revenueAvailable } from '../../query' import { useQueryContext } from '../../query-context' import { useSiteContext } from '../../site-context' import { SortDirection } from '../../hooks/use-order-by' @@ -91,6 +91,9 @@ function SourcesModal({ currentView }) { const { query } = useQueryContext() const site = useSiteContext() + /*global BUILD_EXTRA*/ + const showRevenueMetrics = BUILD_EXTRA && revenueAvailable(query, site) + let reportInfo = VIEWS[currentView].info reportInfo = { ...reportInfo, @@ -127,8 +130,10 @@ function SourcesModal({ currentView }) { renderLabel: (_query) => 'Conversions', width: 'w-28' }), - metrics.createConversionRate() - ] + metrics.createConversionRate(), + showRevenueMetrics && metrics.createTotalRevenue(), + showRevenueMetrics && metrics.createAverageRevenue() + ].filter((metric) => !!metric) } if (isRealTimeDashboard(query)) { diff --git a/lib/plausible_web/controllers/api/stats_controller.ex b/lib/plausible_web/controllers/api/stats_controller.ex index 468eebb1778b..a853f2345f8a 100644 --- a/lib/plausible_web/controllers/api/stats_controller.ex +++ b/lib/plausible_web/controllers/api/stats_controller.ex @@ -477,7 +477,11 @@ defmodule PlausibleWeb.Api.StatsController do extra_metrics = if params["detailed"], do: [:bounce_rate, :visit_duration], else: [] - metrics = breakdown_metrics(query, extra_metrics) + metrics = + breakdown_metrics(query, + extra_metrics: extra_metrics, + include_revenue?: !!params["detailed"] + ) %{results: results, meta: meta} = Stats.breakdown(site, query, metrics, pagination) @@ -511,7 +515,11 @@ defmodule PlausibleWeb.Api.StatsController do extra_metrics = if params["detailed"], do: [:bounce_rate, :visit_duration], else: [] - metrics = breakdown_metrics(query, extra_metrics) + metrics = + breakdown_metrics(query, + extra_metrics: extra_metrics, + include_revenue?: !!params["detailed"] + ) %{results: results, meta: meta} = Stats.breakdown(site, query, metrics, pagination) @@ -595,7 +603,12 @@ defmodule PlausibleWeb.Api.StatsController do params = Map.put(params, "property", "visit:utm_medium") query = Query.from(site, params, debug_metadata(conn)) pagination = parse_pagination(params) - metrics = breakdown_metrics(query, [:bounce_rate, :visit_duration]) + + metrics = + breakdown_metrics(query, + extra_metrics: [:bounce_rate, :visit_duration], + include_revenue?: !!params["detailed"] + ) %{results: results, meta: meta} = Stats.breakdown(site, query, metrics, pagination) @@ -625,7 +638,12 @@ defmodule PlausibleWeb.Api.StatsController do params = Map.put(params, "property", "visit:utm_campaign") query = Query.from(site, params, debug_metadata(conn)) pagination = parse_pagination(params) - metrics = breakdown_metrics(query, [:bounce_rate, :visit_duration]) + + metrics = + breakdown_metrics(query, + extra_metrics: [:bounce_rate, :visit_duration], + include_revenue?: !!params["detailed"] + ) %{results: results, meta: meta} = Stats.breakdown(site, query, metrics, pagination) @@ -655,7 +673,12 @@ defmodule PlausibleWeb.Api.StatsController do params = Map.put(params, "property", "visit:utm_content") query = Query.from(site, params, debug_metadata(conn)) pagination = parse_pagination(params) - metrics = breakdown_metrics(query, [:bounce_rate, :visit_duration]) + + metrics = + breakdown_metrics(query, + extra_metrics: [:bounce_rate, :visit_duration], + include_revenue?: !!params["detailed"] + ) %{results: results, meta: meta} = Stats.breakdown(site, query, metrics, pagination) @@ -685,7 +708,12 @@ defmodule PlausibleWeb.Api.StatsController do params = Map.put(params, "property", "visit:utm_term") query = Query.from(site, params, debug_metadata(conn)) pagination = parse_pagination(params) - metrics = breakdown_metrics(query, [:bounce_rate, :visit_duration]) + + metrics = + breakdown_metrics(query, + extra_metrics: [:bounce_rate, :visit_duration], + include_revenue?: !!params["detailed"] + ) %{results: results, meta: meta} = Stats.breakdown(site, query, metrics, pagination) @@ -715,7 +743,12 @@ defmodule PlausibleWeb.Api.StatsController do params = Map.put(params, "property", "visit:utm_source") query = Query.from(site, params, debug_metadata(conn)) pagination = parse_pagination(params) - metrics = breakdown_metrics(query, [:bounce_rate, :visit_duration]) + + metrics = + breakdown_metrics(query, + extra_metrics: [:bounce_rate, :visit_duration], + include_revenue?: !!params["detailed"] + ) %{results: results, meta: meta} = Stats.breakdown(site, query, metrics, pagination) @@ -745,7 +778,12 @@ defmodule PlausibleWeb.Api.StatsController do params = Map.put(params, "property", "visit:referrer") query = Query.from(site, params, debug_metadata(conn)) pagination = parse_pagination(params) - metrics = breakdown_metrics(query, [:bounce_rate, :visit_duration]) + + metrics = + breakdown_metrics(query, + extra_metrics: [:bounce_rate, :visit_duration], + include_revenue?: !!params["detailed"] + ) %{results: results, meta: meta} = Stats.breakdown(site, query, metrics, pagination) @@ -837,7 +875,11 @@ defmodule PlausibleWeb.Api.StatsController do extra_metrics = if params["detailed"], do: [:bounce_rate, :visit_duration], else: [] - metrics = breakdown_metrics(query, extra_metrics) + metrics = + breakdown_metrics(query, + extra_metrics: extra_metrics, + include_revenue?: !!params["detailed"] + ) %{results: results, meta: meta} = Stats.breakdown(site, query, metrics, pagination) @@ -865,7 +907,12 @@ defmodule PlausibleWeb.Api.StatsController do [] end - metrics = breakdown_metrics(query, extra_metrics) + metrics = + breakdown_metrics(query, + extra_metrics: extra_metrics, + include_revenue?: !!params["detailed"] + ) + pagination = parse_pagination(params) %{results: results, meta: meta} = Stats.breakdown(site, query, metrics, pagination) @@ -897,7 +944,12 @@ defmodule PlausibleWeb.Api.StatsController do params = Map.put(params, "property", "visit:entry_page") query = Query.from(site, params, debug_metadata(conn)) pagination = parse_pagination(params) - metrics = breakdown_metrics(query, [:visits, :visit_duration, :bounce_rate]) + + metrics = + breakdown_metrics(query, + extra_metrics: [:visits, :visit_duration, :bounce_rate], + include_revenue?: true + ) %{results: results, meta: meta} = Stats.breakdown(site, query, metrics, pagination) @@ -943,7 +995,7 @@ defmodule PlausibleWeb.Api.StatsController do [:visits, :exit_rate] end - metrics = breakdown_metrics(query, extra_metrics) + metrics = breakdown_metrics(query, extra_metrics: extra_metrics) %{results: results, meta: meta} = Stats.breakdown(site, query, metrics, {limit, page}) @@ -980,7 +1032,12 @@ defmodule PlausibleWeb.Api.StatsController do params = Map.put(params, "property", "visit:country") query = Query.from(site, params, debug_metadata(conn)) pagination = parse_pagination(params) - metrics = breakdown_metrics(query, [:percentage]) + + metrics = + breakdown_metrics(query, + extra_metrics: [:percentage], + include_revenue?: !!params["detailed"] + ) %{results: results, meta: meta} = Stats.breakdown(site, query, metrics, pagination) @@ -1038,7 +1095,7 @@ defmodule PlausibleWeb.Api.StatsController do params = Map.put(params, "property", "visit:region") query = Query.from(site, params, debug_metadata(conn)) pagination = parse_pagination(params) - metrics = breakdown_metrics(query) + metrics = breakdown_metrics(query, include_revenue?: !!params["detailed"]) %{results: results, meta: meta} = Stats.breakdown(site, query, metrics, pagination) @@ -1079,7 +1136,7 @@ defmodule PlausibleWeb.Api.StatsController do params = Map.put(params, "property", "visit:city") query = Query.from(site, params, debug_metadata(conn)) pagination = parse_pagination(params) - metrics = breakdown_metrics(query) + metrics = breakdown_metrics(query, include_revenue?: !!params["detailed"]) %{results: results, meta: meta} = Stats.breakdown(site, query, metrics, pagination) @@ -1129,7 +1186,11 @@ defmodule PlausibleWeb.Api.StatsController do extra_metrics = if params["detailed"], do: [:bounce_rate, :visit_duration], else: [] - metrics = breakdown_metrics(query, extra_metrics ++ [:percentage]) + metrics = + breakdown_metrics(query, + extra_metrics: extra_metrics ++ [:percentage], + include_revenue?: !!params["detailed"] + ) %{results: results, meta: meta} = Stats.breakdown(site, query, metrics, pagination) @@ -1163,7 +1224,11 @@ defmodule PlausibleWeb.Api.StatsController do extra_metrics = if params["detailed"], do: [:bounce_rate, :visit_duration], else: [] - metrics = breakdown_metrics(query, extra_metrics ++ [:percentage]) + metrics = + breakdown_metrics(query, + extra_metrics: extra_metrics ++ [:percentage], + include_revenue?: !!params["detailed"] + ) %{results: results, meta: meta} = Stats.breakdown(site, query, metrics, pagination) @@ -1206,7 +1271,11 @@ defmodule PlausibleWeb.Api.StatsController do extra_metrics = if params["detailed"], do: [:bounce_rate, :visit_duration], else: [] - metrics = breakdown_metrics(query, extra_metrics ++ [:percentage]) + metrics = + breakdown_metrics(query, + extra_metrics: extra_metrics ++ [:percentage], + include_revenue?: !!params["detailed"] + ) %{results: results, meta: meta} = Stats.breakdown(site, query, metrics, pagination) @@ -1240,7 +1309,11 @@ defmodule PlausibleWeb.Api.StatsController do extra_metrics = if params["detailed"], do: [:bounce_rate, :visit_duration], else: [] - metrics = breakdown_metrics(query, extra_metrics ++ [:percentage]) + metrics = + breakdown_metrics(query, + extra_metrics: extra_metrics ++ [:percentage], + include_revenue?: !!params["detailed"] + ) %{results: results, meta: meta} = Stats.breakdown(site, query, metrics, pagination) @@ -1283,7 +1356,11 @@ defmodule PlausibleWeb.Api.StatsController do extra_metrics = if params["detailed"], do: [:bounce_rate, :visit_duration], else: [] - metrics = breakdown_metrics(query, extra_metrics ++ [:percentage]) + metrics = + breakdown_metrics(query, + extra_metrics: extra_metrics ++ [:percentage], + include_revenue?: !!params["detailed"] + ) %{results: results, meta: meta} = Stats.breakdown(site, query, metrics, pagination) @@ -1614,9 +1691,18 @@ defmodule PlausibleWeb.Api.StatsController do end end - defp breakdown_metrics(query, extra_metrics \\ []) do + defp breakdown_metrics(query, opts) do + extra_metrics = Keyword.get(opts, :extra_metrics, []) + include_revenue? = Keyword.get(opts, :include_revenue?, false) + if toplevel_goal_filter?(query) do - [:visitors, :conversion_rate, :total_visitors] + metrics = [:visitors, :conversion_rate, :total_visitors] + + if ee?() and include_revenue? do + metrics ++ [:average_revenue, :total_revenue] + else + metrics + end else [:visitors] ++ extra_metrics end