Show bounce rate in Detail view of Top Entry Pages (#5747)

* Show bounce rate in Detail view of Top Entry Pages

* Update tests and test fixtures

* Update CHANGELOG.md
This commit is contained in:
Adrian Gruntkowski 2025-09-23 13:38:20 +02:00 committed by GitHub
parent 26285a0636
commit 49cff303f4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 57 additions and 25 deletions

View File

@ -22,6 +22,7 @@ All notable changes to this project will be documented in this file.
- All dropmenus on dashboard are navigable with Tab (used to be a mix between tab and arrow keys), and no two dropmenus can be open at once on the dashboard
- Special path-based events like "404" don't need `event.props.path` to be explicitly defined when tracking: it is set to be the same as `event.pathname` in event ingestion. If it is explicitly defined, it is not overridden for backwards compatibility.
- Main graph no longer shows empty values after current time for `day`, `month` and `year` periods.
- Include `bounce_rate` metric in Entry Pages breakdown.
### Fixed

View File

@ -73,6 +73,7 @@ function EntryPagesModal() {
renderLabel: (_query) => 'Total Entrances',
width: 'w-36'
}),
metrics.createBounceRate(),
metrics.createVisitDuration()
]
}

View File

@ -897,7 +897,7 @@ 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])
metrics = breakdown_metrics(query, [:visits, :visit_duration, :bounce_rate])
%{results: results, meta: meta} = Stats.breakdown(site, query, metrics, pagination)
@ -913,10 +913,11 @@ defmodule PlausibleWeb.Api.StatsController do
:conversion_rate
])
else
to_csv(entry_pages, [:name, :visitors, :visits, :visit_duration], [
to_csv(entry_pages, [:name, :visitors, :visits, :bounce_rate, :visit_duration], [
:name,
:unique_entrances,
:total_entrances,
:bounce_rate,
:visit_duration
])
end

View File

@ -1,2 +1,2 @@
name,unique_entrances,total_entrances,visit_duration
/,1,1,60
name,unique_entrances,total_entrances,bounce_rate,visit_duration
/,1,1,0,60

1 name unique_entrances total_entrances bounce_rate visit_duration
2 / 1 1 0 60

View File

@ -1,3 +1,3 @@
name,unique_entrances,total_entrances,visit_duration
/,3,3,20
/signup,1,1,60
name,unique_entrances,total_entrances,bounce_rate,visit_duration
/,3,3,67,20
/signup,1,1,0,60

1 name unique_entrances total_entrances bounce_rate visit_duration
2 / 3 3 67 20
3 /signup 1 1 0 60

View File

@ -1,3 +1,3 @@
name,unique_entrances,total_entrances,visit_duration
/,4,4,15
/signup,1,1,60
name,unique_entrances,total_entrances,bounce_rate,visit_duration
/,4,4,75,15
/signup,1,1,0,60

1 name unique_entrances total_entrances bounce_rate visit_duration
2 / 4 4 75 15
3 /signup 1 1 0 60

View File

@ -2185,13 +2185,15 @@ defmodule PlausibleWeb.Api.StatsController.PagesTest do
"visitors" => 2,
"visits" => 2,
"name" => "/page1",
"visit_duration" => 0
"visit_duration" => 0,
"bounce_rate" => 100
},
%{
"visitors" => 1,
"visits" => 2,
"name" => "/page2",
"visit_duration" => 450
"visit_duration" => 450,
"bounce_rate" => 50
}
]
end
@ -2241,13 +2243,15 @@ defmodule PlausibleWeb.Api.StatsController.PagesTest do
"visitors" => 1,
"visits" => 1,
"name" => "/blog",
"visit_duration" => 60
"visit_duration" => 60,
"bounce_rate" => 0
},
%{
"visitors" => 1,
"visits" => 1,
"name" => "/blog/john-2",
"visit_duration" => 0
"visit_duration" => 0,
"bounce_rate" => 100
}
]
end
@ -2296,13 +2300,15 @@ defmodule PlausibleWeb.Api.StatsController.PagesTest do
"visitors" => 2,
"visits" => 2,
"name" => "/page1",
"visit_duration" => 0
"visit_duration" => 0,
"bounce_rate" => 100
},
%{
"visitors" => 1,
"visits" => 2,
"name" => "/page2",
"visit_duration" => 450
"visit_duration" => 450,
"bounce_rate" => 50
}
]
@ -2317,13 +2323,15 @@ defmodule PlausibleWeb.Api.StatsController.PagesTest do
"visitors" => 3,
"visits" => 5,
"name" => "/page2",
"visit_duration" => 240.0
"visit_duration" => 240.0,
"bounce_rate" => 20
},
%{
"visitors" => 2,
"visits" => 2,
"name" => "/page1",
"visit_duration" => 0
"visit_duration" => 0,
"bounce_rate" => 100
}
]
end
@ -2376,8 +2384,20 @@ defmodule PlausibleWeb.Api.StatsController.PagesTest do
# We're going to only join sessions where the exit hostname matches the filter
assert json_response(conn, 200)["results"] == [
%{"name" => "/page1", "visit_duration" => 0, "visitors" => 1, "visits" => 1},
%{"name" => "/page2", "visit_duration" => 0, "visitors" => 1, "visits" => 1}
%{
"name" => "/page1",
"visit_duration" => 0,
"visitors" => 1,
"visits" => 1,
"bounce_rate" => 100
},
%{
"name" => "/page2",
"visit_duration" => 0,
"visitors" => 1,
"visits" => 1,
"bounce_rate" => 100
}
]
end
@ -2534,19 +2554,22 @@ defmodule PlausibleWeb.Api.StatsController.PagesTest do
"visit_duration" => 100.0,
"name" => "/a",
"visits" => 10,
"visitors" => 6
"visitors" => 6,
"bounce_rate" => 10
},
%{
"visit_duration" => 50.0,
"name" => "/bbb",
"visits" => 2,
"visitors" => 2
"visitors" => 2,
"bounce_rate" => 0
},
%{
"visit_duration" => 0,
"name" => "/aaa",
"visits" => 1,
"visitors" => 1
"visitors" => 1,
"bounce_rate" => 100
}
]
end

View File

@ -751,8 +751,14 @@ defmodule PlausibleWeb.StatsControllerTest do
{~c"entry_pages.csv", data} ->
assert parse_csv(data) == [
["name", "unique_entrances", "total_entrances", "visit_duration"],
["/test", "1", "1", "10.0"],
[
"name",
"unique_entrances",
"total_entrances",
"bounce_rate",
"visit_duration"
],
["/test", "1", "1", "0.0", "10.0"],
[""]
]