feat: revenue tracking

* wip

* wip

* wip

* wip

* show revenue better on overview

* align realtime and overview counters

* update revenue docs

* always return device id

* add project settings, improve projects charts,

* fix: comments

* fixes

* fix migration

* ignore sql files

* fix comments
This commit is contained in:
Carl-Gerhard Lindesvärd
2025-11-19 14:27:34 +01:00
committed by GitHub
parent d61cbf6f2c
commit 790801b728
58 changed files with 2191 additions and 23691 deletions

View File

@@ -12,72 +12,91 @@ const PROFILE_METRICS = [
key: 'totalEvents',
unit: '',
inverted: false,
hideOnZero: false,
},
{
title: 'Sessions',
key: 'sessions',
unit: '',
inverted: false,
hideOnZero: false,
},
{
title: 'Page Views',
key: 'screenViews',
unit: '',
inverted: false,
hideOnZero: false,
},
{
title: 'Avg Events/Session',
key: 'avgEventsPerSession',
unit: '',
inverted: false,
hideOnZero: false,
},
{
title: 'Bounce Rate',
key: 'bounceRate',
unit: '%',
inverted: true,
hideOnZero: false,
},
{
title: 'Session Duration (Avg)',
key: 'durationAvg',
unit: 'min',
inverted: false,
hideOnZero: false,
},
{
title: 'Session Duration (P90)',
key: 'durationP90',
unit: 'min',
inverted: false,
hideOnZero: false,
},
{
title: 'First seen',
key: 'firstSeen',
unit: 'timeAgo',
inverted: false,
hideOnZero: false,
},
{
title: 'Last seen',
key: 'lastSeen',
unit: 'timeAgo',
inverted: false,
hideOnZero: false,
},
{
title: 'Days Active',
key: 'uniqueDaysActive',
unit: '',
inverted: false,
hideOnZero: false,
},
{
title: 'Conversion Events',
key: 'conversionEvents',
unit: '',
inverted: false,
hideOnZero: false,
},
{
title: 'Avg Time Between Sessions (h)',
key: 'avgTimeBetweenSessions',
unit: 'min',
inverted: false,
hideOnZero: false,
},
{
title: 'Revenue',
key: 'revenue',
unit: 'currency',
inverted: false,
hideOnZero: true,
},
] as const;
@@ -85,7 +104,12 @@ export const ProfileMetrics = ({ data }: Props) => {
return (
<div className="relative col-span-6 -m-4 mb-0 mt-0 md:m-0">
<div className="card grid grid-cols-2 overflow-hidden rounded-md md:grid-cols-4 lg:grid-cols-6">
{PROFILE_METRICS.map((metric) => (
{PROFILE_METRICS.filter((metric) => {
if (metric.hideOnZero && data[metric.key] === 0) {
return false;
}
return true;
}).map((metric) => (
<OverviewMetricCard
key={metric.key}
id={metric.key}