Operator guideEN

Players / Session Report

Per-session view of wagering, wins, deposits, withdrawals, balances, geolocation, and termination reasons for one player.

How to use this guide

Start with the main guide

Follow the explanation and examples first. Extra definitions and formulas are available below when you need them.

What this page shows

Player Session Report shows one row per detected session for the selected player and period. It combines gaming and banking activity into one session-oriented view and surfaces row-level balances, timing, location, and termination context.

When to use it

Use this tab when you need to understand:

  • how often the player sessions
  • how much the player wagered, won, deposited, and withdrew in a session
  • how balances changed across one session
  • which sessions ended by logout or timeout in the currently traced source flow
  • where the best available recent player location was resolved

How to read it

The page has two layers:

  1. Summary layer with a total-sessions chip plus cards for total wagered, total won, net result, and average session duration.
  2. Session table with one row per session, including player id, session timing, duration, location, monetary totals, balance change, and termination.

The summary is computed by the page from the returned session rows, while the session grouping itself comes from the source. Because the table is paginated, the summary reduces only the currently returned page of session rows, not the full result set behind the pagination count. The table also skips rendering rows whose start and end timestamps are identical, so the summary chip or pagination count can include a returned row that is not visible in the table.

Why this page is different from a simple activity log

This page does not list individual events. It groups records into sessions using session_date and merges activity from:

  • user_activities
  • transaction_bankings
  • casino_system.casino_transactions
  • user_bonus

Currency and EUR helper values

Money cells show the row currency first. When the row currency is not EUR, the page shows a second EUR helper value returned by the source. The source does not use a current FX rate here; it divides the stored original amount by the stored transaction conversion_rate when that rate is positive and rounds to 2 decimals. If the rate is zero or missing, the EUR helper value is 0.

This applies to wagered, won, deposited, withdrawn, and balance helper values. Net Result EUR subtracts source totalWageredEUR from totalWonEUR.

Known caveats

  • The summary cards are page reductions over the returned rows, so changing the pagination or filters changes the summary.
  • Rows whose start and end timestamps are identical are returned by the source but skipped by table rendering; summary and pagination can still include them.
  • Net Result is shown as Total Won - Total Wagered in the page summary layer.
  • Avg. Session Duration is calculated by the page from (sessionEndTime - sessionStartTime) over the returned rows only.
  • Export uses the same report source with csvDownload=true.
  • Export does not send the current table page or limit. The source falls back to pageNo=1 and limit=25, so the CSV represents the first source page for the selected player/date range, not necessarily the currently mounted table page.
  • CSV export adds derived fields such as sessionDurationMinutes, balanceChange, balanceChangeEUR, netResult, and netResultEUR even though those helper values are not separate columns in the mounted table.
  • The source exposes a session-details route, but the current page does not render a details panel from it.
  • Geolocation can fall back to the latest known user activity with an IP when the selected session itself has no mapped IP.
  • The traced source currently maps termination to LOGOUT or TIMEOUT; labels for MANUAL and SYSTEM are present but not emitted by the traced controller path.
  • Starting and ending balances come only from transaction_bankings rows attached to the session, so sessions without traced banking rows can fall back to 0 or to the first detected banking balance.
  • The Last updated label in the table header is browser render time, not a source-generated report timestamp.
More details

Definitions and formulas

Open only the section you need. The relevant section opens automatically when you request help for a specific item on screen.

Calculations8 topicsOpen details

Summary scope

How It Works
All page summary cards reduce only the current `sessionReport` page returned by the source hook.
What To Check
Summary cards change with pagination because the page does not recompute them from the source pagination total. Rows with identical start/end timestamps can be skipped by table rendering after the summary is calculated.

Avg. Session Duration

How It Works
`Math.floor(sum(sessionEndTime - sessionStartTime) / totalSessions / 1000 / 60)`.
What To Check
Computed by the page from returned session rows only, using source-provided start/end timestamps.

Net Result

How It Works
`sum(totalWon) - sum(totalWagered)` across the returned session rows.
What To Check
Page summary calculation over the returned session rows, using source-provided per-session totals.

CSV-only derived fields

How It Works
Export adds `sessionDurationMinutes`, `balanceChange`, `balanceChangeEUR`, `netResult`, and `netResultEUR` on top of the source session rows before CSV conversion.
What To Check
These helper values are generated for CSV output and are not mounted as separate table columns in the page. The export hook does not send page or limit, so the source uses default `pageNo=1` and `limit=25` before creating CSV.

Session grouping

How It Works
Source groups by `DATE_TRUNC('second', session_date)` across `user_activities`, `transaction_bankings`, `casino_system.casino_transactions`, and `user_bonus`, then enriches each discovered session with per-session totals and balances.
What To Check
This determines which rows are treated as a single session before page summaries are calculated.

EUR helper values

How It Works
For wagered/won rows the source uses `ROUND(SUM(CASE WHEN conversion_rate > 0 THEN cash_amount / conversion_rate ELSE 0 END)::numeric, 2)`. For deposits/withdrawals it uses the same pattern with `amount / conversion_rate`. Balance helpers use `before_balance / conversion_rate` and `(before_balance + amount) / conversion_rate`.
What To Check
If `conversion_rate` is zero or missing, the EUR helper value is `0`; the report does not fall back to original amount or current FX rates.

Rendered row skip

How It Works
The page returns `null` for a table row when `session.sessionStartTime === session.sessionEndTime`.
What To Check
Pagination and summary cards can still include that returned source row because this skip happens in table rendering.

Termination mapping

How It Works
The traced source maps activity `145` to `LOGOUT`, activity `146` to `TIMEOUT`, and otherwise falls back to `TIMEOUT`.
What To Check
The page includes extra label variants (`MANUAL`, `SYSTEM`), but the current controller path does not emit them.
Columns12 topicsOpen details

Session ID

Technical session identifier row key.

Data Type
string

Session Start

First timestamp included in the grouped session.

Data Type
datetime

Session End

Last timestamp included in the grouped session.

Data Type
datetime

Player ID

Player identifier repeated in the table for export and cross-checking.

Data Type
string

Duration

Page-rendered session length derived from the grouped start and end timestamps.

Data Type
duration

Location

Best available recent location resolved from session activity IPs, with fallback to the latest known user activity IP when the selected session has no mapped IP.

Data Type
string

Wagered

Total wagered amount in the session row. Source sums casino bet `cash_amount`, excluding `points_conversion`, and the page shows a source EUR helper value for non-EUR rows.

Data Type
amount

Won

Total won amount in the session row. Source sums casino win `cash_amount`, excluding `points_conversion`, and the page shows a source EUR helper value for non-EUR rows.

Data Type
amount

Deposited

Total successful deposits attached to the session. Source filters `transaction_bankings.is_success = true` and transaction type deposit.

Data Type
amount

Withdrawn

Total successful withdrawals attached to the session. Source filters `transaction_bankings.is_success = true` and transaction type withdraw.

Data Type
amount

Balance Change

Page-derived balance delta between the first and last traced banking balance in the session. EUR helper line subtracts source `endingBalanceEUR - startingBalanceEUR`.

Data Type
amount

Termination

Why the session ended in the traced source flow; currently the controller maps sessions to `LOGOUT` or `TIMEOUT`.

Data Type
enum
Filters4 topicsOpen details

From Date

Lower bound for session discovery and reporting. The page sends an ISO timestamp; source filters `session_date >= startDate`.

Type
date
Source Query Param
startDate
Default
today minus 30 days

To Date

Upper bound for session discovery and reporting. The page sends an ISO timestamp; source filters `session_date <= endDate`.

Type
date
Source Query Param
endDate
Default
today

Page

Controls which page of discovered sessions is returned. Summary cards recalculate from the returned page.

Type
pagination-state
Source Query Param
pageNo
Default
0 in page state, sent as 1 to source

Rows per page

Controls how many session rows are requested from the backend.

Type
pagination-state
Source Query Param
limit
Default
25
Options
10, 25, 50, 100
Summary cards5 topicsOpen details

Total Sessions

Count of returned session rows in the current page, calculated before render-time table row skipping.

Total Wagered

Sum of returned `totalWagered` values in the current page. Shows an EUR helper line when the player currency is not EUR.

Total Won

Sum of returned `totalWon` values in the current page. Shows an EUR helper line when the player currency is not EUR.

Net Result

Returned session-level win minus wager total for the current page. Shows an EUR helper line when the player currency is not EUR.

Avg. Session Duration

Average session duration in whole minutes across the returned session rows.

Metrics5 topicsOpen details

Total Sessions

Page-derived count of returned session rows on the currently mounted page.

Aliases
total sessions, player session count
Source Basis
Source discovers sessions by distinct `DATE_TRUNC('second', session_date)` across `user_activities`, `transaction_bankings`, `casino_system.casino_transactions`, and `user_bonus`, with the same player and date filters used by the table query.

Total Wagered

Page-derived sum of returned `totalWagered` values across the currently loaded page of session rows.

Aliases
total wagered, player session wagered
Source Basis
Each row's `totalWagered` is source-summed from `casino_system.casino_transactions.cash_amount` where `action_type = 'bet'`, excluding `game_identifier = 'points_conversion'`, grouped by currency for the exact session timestamp.
Currency Basis
Display Currency: Player/session currency from the row, with EUR helper value shown when the player currency is not EUR. | Eur Conversion: Source computes `ROUND(SUM(CASE WHEN conversion_rate > 0 THEN cash_amount / conversion_rate ELSE 0 END)::numeric, 2)`. | Missing Or Zero Rate: EUR helper value contributes `0` when `conversion_rate <= 0` or is missing.

Total Won

Page-derived sum of returned `totalWon` values across the currently loaded page of session rows.

Aliases
total won, player session won
Source Basis
Each row's `totalWon` is source-summed from `casino_system.casino_transactions.cash_amount` where `action_type = 'win'`, excluding `game_identifier = 'points_conversion'`, grouped by currency for the exact session timestamp.
Currency Basis
Display Currency: Player/session currency from the row, with EUR helper value shown when the player currency is not EUR. | Eur Conversion: Source computes `ROUND(SUM(CASE WHEN conversion_rate > 0 THEN cash_amount / conversion_rate ELSE 0 END)::numeric, 2)`. | Missing Or Zero Rate: EUR helper value contributes `0` when `conversion_rate <= 0` or is missing.

Net Result

Page-derived summary card for the returned page of session rows.

Aliases
net result, player session net result
Source Basis
Uses source-provided per-row `totalWon`, `totalWonEUR`, `totalWagered`, and `totalWageredEUR`; the page subtracts wagered from won for the currently returned page.
Currency Basis
Display Currency: Player/session currency. | Eur Conversion: Page computes `sum(totalWonEUR) - sum(totalWageredEUR)` using source EUR helper values. | Missing Or Zero Rate: Missing-rate handling is inherited from the row-level source EUR helper values.

Avg. Session Duration

Page-derived duration metric reduced from the returned page of session rows.

Aliases
average session duration, avg session duration
Source Basis
Source returns `sessionStartTime = MIN(created_at)` and `sessionEndTime = MAX(created_at)` for each discovered session group.
More help

Related pages

Players / Banking

Banking tab inside the player workspace with transaction filters, a paginated banking grid, analytics cards, CSV export, and automatic-withdrawal availability.

Players / Detail Workspace

Main player workbench at `/player/[playerId]` with tabbed sections, player-level actions, and modal-based operator workflows.

Players / Fraud Detection

Fraud-detection tab inside the player workspace with MaxMind risk assessment, related fraud-account reports, IP analysis, and Identity Graph filtering.

Players / Game Report

Per-player game or provider report inside the player workspace, filtered by date option and grouped either by game or by provider.

Players / Inbox

Inbox tab inside the player workspace for reviewing delivered notifications, filtering by read state or notification type, and resending or soft-deleting message deliveries.

Players / KPI Summary

Grouped player-level KPI snapshot inside the player workspace, covering player info, deposits, withdrawals, casino totals, bonus cost, and predictive metrics.