Operator guideENreportingplayer-kpiexportbulkcsv

Reporting / Player KPI Report

Bulk player-level KPI export: one row per player with deposit, gameplay, bonus, and activity metrics for a chosen period, filterable and exportable to CSV.

Reader view

Clean portal guidance

This page keeps the operator explanation, field and action descriptions, and screenshots visible without exposing repo paths, raw sidecars, or editorial-only implementation details.

Narrative content

Page body

What this page shows

Player KPI Report is a bulk, player-by-player export. It returns one row per player, with each player's deposit, withdrawal, gameplay, bonus, and activity figures for the period you choose. It is built for pulling a wide spreadsheet across many players at once, then exporting it to CSV.

This is not the same as two similar-sounding screens:

  • The dashboard KPI summary shows brand-wide totals as a few headline cards. It does not break results down per player.
  • The player KPI summary on a single player's profile shows the same kinds of metrics for one player only.
  • This page is the bulk version: many players, one row each, with full filtering and a CSV export.

When to use it

  • pull a period KPI extract across all depositors or all active players
  • build a marketing, VIP, or finance list with deposit, turnover, GGR, NGR, and activity columns
  • export a filtered player segment to CSV for offline analysis
  • look up KPI figures for a specific set of players by entering their player IDs

How to read it

Each row is one player. The table is paginated and the header text shows how many players matched the current filters. The default period is the previous calendar month.

Money columns are shown in the platform reporting currency, not in each player's own wallet currency. The Currency column tells you which currency that player's account uses, but the deposit, withdrawal, turnover, GGR, NGR, and bonus amounts are all converted to one common reporting currency before they are summed, using the exchange rate captured on each individual transaction at the time it happened. Because every transaction is converted at its own recorded rate, totals reflect transaction-time value, not a single period-average or today's-rate conversion.

Two columns are averages:

  • Avg Deposit is total deposit amount divided by deposit count. A player with no deposits shows 0.00.
  • Avg Bet is total turnover divided by bet count. A player with no bets shows 0.00.

GGR is turnover minus wins. NGR is GGR minus bonus winnings. Bonus bet and bonus win columns are always computed over bonus-funded play, even when the Include bonus bets toggle is off.

Filters that change the result

  • Start Date and End Date set the period. They default to the previous calendar month.
  • Player Selection decides which players appear:
    • Depositors in period (default) keeps only players with at least one successful deposit in the period.
    • Players with period activity keeps players with any deposit, withdrawal, bet, or recorded activity in the period.
  • Include bonus bets decides whether bonus-funded bets count toward turnover, GGR, and the gameplay columns. It does not change the dedicated bonus columns.
  • Product, Provider, and Game Identifier narrow gameplay to that product, provider, or game. When any of these is set, only players with matching bets in the period are returned.
  • Country, Currency, VIP Level, Registration Source, Device Type, and Player Status filter on player attributes.
  • Player IDs limits the report to a specific comma-separated list of player IDs.

How the export works

Export CSV runs the same query with no page limit and downloads a CSV file. The file is generated on the backend and streamed to the browser, where transaction timestamps are reformatted for readability before the file is saved. The export is capped at 100,000 rows; if the filtered result is larger, the export is rejected and you are asked to narrow the filters. The on-screen table and the export always use the same filters and sort order, so the CSV matches what you see, just without pagination.

Why this page can differ from other reports

  • Money totals are in the reporting currency, converted per transaction, so a player's figures here will not match raw wallet-currency amounts shown elsewhere.
  • Depositors in period is the default, so players with activity but no deposit are hidden unless you switch to Players with period activity.
  • Turnover and GGR change with the Include bonus bets toggle, but the bonus columns and NGR's bonus-win subtraction do not.
  • Setting a product, provider, or game filter silently drops players who have no matching bets, even if they deposited.

Known caveats

  • The CSV export is hard-capped at 100,000 rows and the query has a 60-second timeout; very broad date ranges across all players can hit either limit.
  • Per-player averages use a zero-safe denominator: zero deposits or zero bets resolve to 0.00, never an error.
  • Player Status filter values and the displayed Player Status column are derived from account flags (self-exclusion window, active/disabled state, VIP level), not a single stored status field.
  • FTD Flag reflects whether the player's first-ever deposit landed inside the selected period, not whether they have ever deposited.

Verification status

  • status: verified_backend
  • FE route, filters, columns, and export flow are mapped
  • gs-admin-backend owns the single aggregating SQL query, the CSV serialization, and the row/count shape
  • the cross-currency conversion uses a per-transaction stored rate (transaction-time basis), confirmed against the report SQL and a sibling BI view that labels the same basis
  • no nx-workspace core dependency participates in this surface
Calculation notes

Calculations

calculation

Player Selection gate

Applies To
which players appear as rows
Logic
depositors: keep rows where COALESCE(deposit_count, 0) > 0., active: keep rows with any deposit_count > 0, withdrawal_count > 0, bet_count > 0, or a non-null last_activity_date., all: no selection gate (FE does not expose this option)., When a product, provider, or game filter is set, an additional gate requires COALESCE(bet_count, 0) > 0, so non-bettors drop out even if they deposited.
Verification Status
verified_backend
calculation

Player Status (derived)

Applies To
player_status column and Player Status filter
Logic
Self-excluded when self_exclusion is not null and self_exclusion > NOW()., Inactive when is_active = false or disabled_at is not null., VIP when level > 1., Active otherwise., Evaluated in that priority order, so self-exclusion and inactivity win over VIP.
Verification Status
verified_backend
calculation

FTD Flag (derived)

Applies To
ftd_flag column
Logic
BOOL_OR(is_first_deposit = true) over the player's SUCCESS deposits in the period., Yes when the first-ever deposit (is_first_deposit) occurred inside the selected period; otherwise No., Reflects first-deposit-in-period, not whether the player has ever deposited.
Verification Status
verified_backend
calculation

Active Days

Applies To
active_days column
Logic
Distinct count of calendar dates from the UNION of: casino bet/win dates (toggle-respecting metric set), banking deposit/withdraw dates with SUCCESS/APPROVED status, and user_activities dates with triggered_method = USER., Each source is filtered to the period and to the selected device type.
Verification Status
verified_backend
calculation

Favorite Product

Applies To
favorite_product column
Logic
Per player, product with the highest summed bet turnover (cash_amount / conversion_rate)., Ties broken by product name ascending; NULL turnover sorts last.
Verification Status
verified_backend
calculation

Favorite Provider

Applies To
favorite_provider column
Logic
Per player, provider with the highest summed bet turnover., Ties broken by provider name ascending; NULL turnover sorts last.
Verification Status
verified_backend
calculation

Top Game

Applies To
top_game column
Logic
Per player, game with the most bet rows in the period., Falls back to game_identifier when game_name is null; ties broken by name ascending.
Verification Status
verified_backend
calculation

Last Bet Product

Applies To
last_bet_product column
Logic
Product of the most recent bet (DISTINCT ON user ordered by created_at DESC) in the period.
Verification Status
verified_backend
calculation

Last Activity Date

Applies To
last_activity_date column
Logic
GREATEST of last activity date, last deposit date, last withdrawal date, last bet date, and last login date.
Verification Status
verified_backend
calculation

Registration Source filter

Applies To
registrationSource filter
Logic
affiliate: keep players whose lateral affiliate_links lookup found a non-empty pid., direct: keep players whose pid lookup is null., pid itself comes from the affiliate_links payload pid field, trimmed and de-blanked.
Verification Status
verified_backend
Grid columns

Columns

field

Player ID

Type
number
Definition
users.user_id.
field

PID

Type
string
Definition
Affiliate pid from nx.affiliate_links payload; null when none.
field

Registration Date

Type
datetime
Definition
users.created_at.
field

First Deposit Date

Type
datetime
Definition
Earliest successful deposit within the period.
field

Last Deposit Date

Type
datetime
Definition
Latest successful deposit within the period.
field

Deposit Count

Type
number
Definition
Count of SUCCESS deposits in the period.
field

Deposit Amount

Type
money
Definition
Sum of SUCCESS deposit amounts converted to reporting currency. See metrics.yaml.
field

Avg Deposit

Type
money
Definition
deposit_amount / deposit_count; zero deposits resolve to 0.00. See calculations.yaml.
field

Withdrawal Count

Type
number
Definition
Count of SUCCESS/APPROVED withdrawals in the period.
field

Withdrawal Amount

Type
money
Definition
Sum of SUCCESS/APPROVED withdrawal amounts converted to reporting currency.
field

Net Deposits

Type
money
Definition
deposit_amount minus withdrawal_amount. See metrics.yaml.
field

First Withdrawal Date

Type
datetime
Definition
Earliest SUCCESS/APPROVED withdrawal in the period.
field

Last Withdrawal Date

Type
datetime
Definition
Latest SUCCESS/APPROVED withdrawal in the period.
field

Bet Count

Type
number
Definition
Count of bet rows in the period, respecting the Include bonus bets toggle.
field

Turnover

Type
money
Definition
Sum of bet cash_amount converted to reporting currency. See metrics.yaml.
field

Avg Bet

Type
money
Definition
turnover / bet_count; zero bets resolve to 0.00. See calculations.yaml.
field

GGR

Type
money
Definition
turnover minus wins. See metrics.yaml.
field

NGR

Type
money
Definition
GGR minus bonus winnings. See metrics.yaml.
field

Bonus Bet Amount

Type
money
Definition
Sum of bonus-funded bet amounts; always computed over bonus rows regardless of the toggle.
field

Bonus Win Amount

Type
money
Definition
Sum of bonus-funded win amounts; always computed over bonus rows regardless of the toggle.
field

Active Days

Type
number
Definition
Distinct calendar days with any bet/win, deposit/withdrawal, or activity. See calculations.yaml.
field

Last Activity Date

Type
datetime
Definition
Greatest of last activity, last deposit, last withdrawal, last bet, and last login dates.
field

Last Login Date

Type
datetime
Definition
users.last_login_date.
field

Last Bet Date

Type
datetime
Definition
Latest bet timestamp in the period.
field

Last Bet Product

Type
string
Definition
Product of the most recent bet in the period.
field

Favorite Product

Type
string
Definition
Product with the highest bet turnover. See calculations.yaml.
field

Favorite Provider

Type
string
Definition
Provider with the highest bet turnover. See calculations.yaml.
field

Top Game

Type
string
Definition
Game with the most bets in the period. See calculations.yaml.
field

Player Status

Type
string
Definition
Derived status: Self-excluded / Inactive / VIP / Active. See calculations.yaml.
field

FTD Flag

Type
string
Definition
Yes when the player's first-ever deposit landed in the period, else No. See calculations.yaml.
field

KYC Status

Type
string
Definition
users.kyc_status.
field

Currency

Type
string
Definition
Player wallet currency_code; not the unit of the money columns.
field

Player Country

Type
string
Definition
users.country_code.
Filter dictionary

Filters

field

Start Date

Type
date
Default
first day of previous calendar month
Backend Query Param
startDate
Behavior
Applied on Apply; serialized to YYYY-MM-DD. Backend expands to start-of-day UTC (T00:00:00.000Z).
field

End Date

Type
date
Default
last day of previous calendar month
Backend Query Param
endDate
Behavior
Applied on Apply; serialized to YYYY-MM-DD. Backend expands to end-of-day UTC (T23:59:59.999Z).
field

Player Selection

Type
select
Default
depositors
Backend Query Param
playerSelection
Options
0: Value: depositors | Label: Depositors in period | 1: Value: active | Label: Players with period activity
Behavior
Backend also accepts 'all' (no selection gate), but the FE exposes only depositors and active. depositors requires deposit_count > 0; active requires any deposit, withdrawal, bet, or activity in the period.
field

Include bonus bets

Type
toggle
Default
true
Backend Query Param
includeBonusBets
Behavior
When off, bonus-funded casino rows are excluded from turnover, bet_count, GGR, and the gameplay columns. The dedicated bonus_bet_amount / bonus_win_amount columns are unaffected.
field

Product

Type
select
Default
empty = All products
Backend Query Param
product
Options
Slots, Live Casino, Instant, Sportsbook, Casino
Behavior
Matched case-insensitively against the game product category. Setting it requires matching bets in the period (player must have casino activity to appear).
field

Provider

Type
select
Default
empty = All providers
Backend Query Param
providerId
Behavior
Options from useProviders (masterCasinoProviderId). Setting it requires matching bets in the period.
field

Game Identifier

Type
text
Backend Query Param
gameIdentifier
Behavior
Exact match on casino_transactions.game_identifier. Setting it requires matching bets in the period.
field

Country

Type
select
Default
empty = All countries
Backend Query Param
playerCountry
Behavior
Matched against users.country_code.
field

Currency

Type
select
Default
empty = All currencies
Backend Query Param
currency
Behavior
Matched against users.currency_code (the player wallet currency, not the reporting currency).
field

VIP Level

Type
number
Backend Query Param
vipLevel
Behavior
Matched against users.level.
field

Registration Source

Type
select
Default
empty = All sources
Backend Query Param
registrationSource
Options
0: Value: affiliate | Label: Affiliate | 1: Value: direct | Label: Direct
Behavior
affiliate keeps players with an affiliate_links pid; direct keeps players without one.
field

Device Type

Type
select
Default
empty = All devices
Backend Query Param
deviceType
Options
0: Value: desktop | Label: Desktop | 1: Value: mobile | Label: Mobile | 2: Value: tablet | Label: Tablet | 3: Value: pos | Label: POS
Behavior
Lower-cased and matched against transaction/activity device-type columns. Filters which deposits, bets, and activity rows count toward the period figures.
field

Player Status

Type
select
Default
empty = All statuses
Backend Query Param
playerStatus
Options
0: Value: active | Label: Active | 1: Value: vip | Label: VIP | 2: Value: self_excluded | Label: Self-excluded | 3: Value: inactive | Label: Inactive
Behavior
Derived from account flags: active = is_active and not disabled and no active self-exclusion; inactive = not active or disabled; self_excluded = self-exclusion in the future; vip = level > 1.
field

Player IDs

Type
text
Backend Query Param
playerIds
Behavior
Comma-separated player IDs; parsed to a de-duplicated integer list and applied as user_id IN (...).
Metric dictionary

Metrics

metric

Deposit Amount

Per player, total of successful deposits in the period, expressed in the reporting currency.

Aliases
player kpi deposit amount, total deposits per player
Backend Formula
SUM(amount / NULLIF(conversion_rate, 0)) over transaction_bankings rows with transaction_type = deposit and status_enum = SUCCESS in the period; ROUND to 2 decimals.
Currency Basis
Reporting Currency: platform base/reporting currency | Exchange Rate Source: per-transaction conversion_rate stored on each transaction_bankings row | Basis: transaction-time (each deposit converted at its own recorded rate; not period-average, not current snapshot) | Zero Rate Handling: NULLIF(conversion_rate, 0) excludes a row with a zero rate from the converted sum
Verification Status
verified_backend
Last Verified At
2026-06-29
metric

Withdrawal Amount

Per player, total of successful/approved withdrawals in the period, in reporting currency.

Aliases
player kpi withdrawal amount, total withdrawals per player
Backend Formula
SUM(amount / NULLIF(conversion_rate, 0)) over withdraw rows with status_enum in (SUCCESS, APPROVED) in the period; ROUND to 2 decimals.
Currency Basis
Reporting Currency: platform base/reporting currency | Exchange Rate Source: per-transaction conversion_rate on each transaction_bankings row | Basis: transaction-time
Verification Status
verified_backend
Last Verified At
2026-06-29
metric

Net Deposits

Deposit amount minus withdrawal amount for the player, in reporting currency. Can be negative.

Aliases
net deposits per player, deposits minus withdrawals
Backend Formula
ROUND(deposit_amount - withdrawal_amount, 2), where both sides are the converted period sums above.
Currency Basis
Reporting Currency: platform base/reporting currency | Exchange Rate Source: per-transaction conversion_rate (inherited from deposit and withdrawal sums) | Basis: transaction-time
Verification Status
verified_backend
Last Verified At
2026-06-29
metric

Turnover

Total bet stake for the player in the period, in reporting currency. Includes bonus-funded bets only when Include bonus bets is on.

Aliases
player kpi turnover, total stakes per player, wagering per player
Backend Formula
SUM(cash_amount / NULLIF(conversion_rate, 0)) over casino_transactions rows with action_type = bet and status = 1 in the period; bonus rows excluded when includeBonusBets is false; ROUND to 2 decimals.
Currency Basis
Reporting Currency: platform base/reporting currency | Exchange Rate Source: per-transaction conversion_rate stored on each casino_transactions row | Basis: transaction-time
Verification Status
verified_backend
Last Verified At
2026-06-29
metric

GGR

Gross gaming revenue for the player: stakes minus wins. Positive means the house won.

Aliases
gross gaming revenue per player, player kpi ggr
Backend Formula
ROUND(turnover - win_amount, 2), where win_amount is SUM(cash_amount / NULLIF(conversion_rate, 0)) over action_type = win rows under the same Include-bonus-bets gate as turnover.
Currency Basis
Reporting Currency: platform base/reporting currency | Exchange Rate Source: per-transaction conversion_rate on each casino_transactions row | Basis: transaction-time
Verification Status
verified_backend
Last Verified At
2026-06-29
metric

NGR

Net gaming revenue for the player: GGR minus bonus winnings.

Aliases
net gaming revenue per player, player kpi ngr
Backend Formula
ROUND(turnover - win_amount - bonus_win_amount, 2). bonus_win_amount is computed over all bonus-funded win rows regardless of the Include bonus bets toggle, so the bonus subtraction is constant while turnover/win move with the toggle.
Currency Basis
Reporting Currency: platform base/reporting currency | Exchange Rate Source: per-transaction conversion_rate on each casino_transactions row | Basis: transaction-time
Caveats
When Include bonus bets is off, turnover and win exclude bonus rows but the bonus_win subtraction still applies, which can push NGR below GGR-minus-cash-wins. This is an intentional asymmetry in the current SQL.
Verification Status
verified_backend
Last Verified At
2026-06-29
metric

Bonus Bet Amount

Total bonus-funded bet stake for the player in the period, in reporting currency.

Aliases
bonus wagering per player, bonus stakes per player
Backend Formula
SUM(cash_amount / NULLIF(conversion_rate, 0)) over bet rows where user_bonus_id is not null or amount_type <> 0; always over all bonus rows regardless of the toggle; ROUND to 2 decimals.
Currency Basis
Reporting Currency: platform base/reporting currency | Exchange Rate Source: per-transaction conversion_rate on each casino_transactions row | Basis: transaction-time
Verification Status
verified_backend
Last Verified At
2026-06-29
metric

Bonus Win Amount

Total bonus-funded win amount for the player in the period, in reporting currency.

Aliases
bonus winnings per player
Backend Formula
SUM(cash_amount / NULLIF(conversion_rate, 0)) over win rows where user_bonus_id is not null or amount_type <> 0; always over all bonus rows regardless of the toggle; ROUND to 2 decimals.
Currency Basis
Reporting Currency: platform base/reporting currency | Exchange Rate Source: per-transaction conversion_rate on each casino_transactions row | Basis: transaction-time
Verification Status
verified_backend
Last Verified At
2026-06-29
metric

Avg Deposit

Average value of the player's deposits in the period.

Aliases
average deposit per player, mean deposit value
Backend Formula
ROUND(deposit_amount / NULLIF(deposit_count, 0), 2).
Numerator
converted deposit_amount (reporting currency)
Denominator
deposit_count
Zero Denominator Behavior
deposit_count = 0 makes NULLIF return NULL, the division yields NULL, and the row normalizer coerces NULL to 0, so the column shows 0.00.
Currency Basis
Reporting Currency: platform base/reporting currency | Basis: transaction-time
Verification Status
verified_backend
Last Verified At
2026-06-29
metric

Avg Bet

Average stake per bet for the player in the period.

Aliases
average bet per player, mean stake value
Backend Formula
ROUND(turnover / NULLIF(bet_count, 0), 2).
Numerator
converted turnover (reporting currency)
Denominator
bet_count
Zero Denominator Behavior
bet_count = 0 makes NULLIF return NULL, the division yields NULL, and the row normalizer coerces NULL to 0, so the column shows 0.00.
Currency Basis
Reporting Currency: platform base/reporting currency | Basis: transaction-time
Verification Status
verified_backend
Last Verified At
2026-06-29
Operational notes

Notes

item

One backend service owns the whole surface; there is no separate count endpoint or separate export endpoint. The same route and service produce the paginated list, the total count, and the CSV.

item

The CSV branch is selected by the exportCsv query flag. The controller sets text/csv headers and sends the serialized rows; the FE hook downloads the response as a blob and reformats ISO timestamps before saving.

item

Export is capped at MAX_EXPORT_ROWS = 100000; the service queries 100001 rows and rejects the export when the result exceeds the cap.

item

The query runs inside a transaction with SET LOCAL jit = off and SET LOCAL statement_timeout = 60000 ms.

item

orderBy is whitelisted against ORDER_BY_COLUMNS and orderBySort is whitelisted to ASC/DESC; the order clause always appends a player_id tiebreaker with NULLS LAST.

item

This surface is distinct from dashboard.kpi-summary (brand-wide aggregate cards) and players/reports/kpi-summary (single-player KPI on the player profile). This one is the bulk per-player export.

item

No nx-workspace core dependency participates; all data comes from gs-admin-backend Postgres schemas.

Related references

Related pages

pageReporting

Canonical entrypoint for standalone reporting pages outside the main Dashboard widgets.

pageReporting / Affiliate Events Report

Audit log of the events and saved amounts the platform sent to the affiliate system, with per-currency successful totals and a CSV export.

pageReporting / Bonus Performance

Grouped bonus performance report for activations, amounts, deposits, withdrawals, GGR, and NGR by bonus item.

pageReporting / Card Approval Rates

Snapshot report of card deposit approval rates for NetworxPay, Paydex, and Carouseller, split by Trusted and NonTrusted players, with today versus the previous 30 days and today top decline reasons.

pageReporting / Change Notification Detail

Detail page for one audit entry, including actor metadata, description, and before/after comparison views.

pageReporting / Change Notifications

Audit list for recorded configuration, administrator, and system change entries with filters for actor, entity, and change type.