Operator guideENreportingrevenuegaming

Reporting / Gaming Revenue

Time-based revenue report for deposits, withdrawals, balances, and optional gaming totals across the selected period.

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

Gaming Revenue is a timeline-style report that combines banking movement with optional gaming totals. It groups the selected period by day, week, or month.

When to use it

  • compare deposits and withdrawals over time
  • inspect current balance alongside period movement
  • review gaming totals on the same time axis when the analytics-backed schema is active

How to read it

The always-visible summary cards are:

  • Total Non-Promotional Deposits
  • Total Non-Promotional Withdrawals
  • Current Player Account Balance

When the analytics-backed schema is active, the page can also expose:

  • Total GGR
  • Total NGR
  • Total Wagered
  • Active Players

Important reading rule:

  • Net Revenue on this page is banking net flow for the period (deposits - withdrawals)
  • it is not the same thing as gaming GGR or NGR
  • analytics-only summary cards are shown only when Use New Schema is active and the response includes summary.total_ggr

Ending Balance is the running cumulative balance over the generated time series, not a per-row wallet snapshot captured only on that date.

Filters that change the result

  • start date
  • end date
  • interval
  • group by
  • use new schema

Action and filter behavior

  • Refresh is the real apply action. It copies the currently edited date, interval, grouping, and schema-toggle controls into the active query state and then re-fetches the report.
  • Reset Filters restores the default view: no date range, Group By = Daily, and Use New Schema = ON.
  • Export CSV uses the active query snapshot, not the currently staged UI values.
  • The date pickers stay visible until an interval selection has actually been applied. Choosing MTD, YTD, or LTD in the UI does not hide the custom date inputs until Refresh updates the active state.

Why this page can differ from gaming-performance

This page is period-based and banking-led. It starts from deposits, withdrawals, and balance movement. Gaming Performance is dimension-based and gameplay-led. It starts from grouped gaming behavior by game-facing dimensions.

Known caveats

  • A custom range that starts and ends on today forces the legacy path even when Use New Schema is enabled.
  • The visible New Schema or Legacy Schema chip mirrors the active FE toggle state; it is not a separate backend confirmation badge.
  • reporting_currency is hardcoded to EUR in the backend summary response.
  • Legacy mode does not expose the analytics-backed gaming totals shown by the newer schema.
  • Current Player Account Balance is a current-wallet snapshot and does not respect the report date range the same way period rows do.
  • Even in analytics mode, the page renders only a subset of the enhanced response. Extra values such as Bonus Deposits, Total Won, Total Bets, and Total Sessions stay backend-only on the current standalone page.

Verification status

  • status: verified_backend
  • FE route, grouping, summary cards, and export flow are mapped
  • gs-admin-backend owns the timeline query, summary query, and schema-selection rules
  • no explicit nx-workspace dependency is required for the current report semantics
Calculation notes

Calculations

calculation

Net Revenue

Banking net flow for the row period.

Source Fields
deposits_amount, withdrawals_amount
Transform
The SQL timeline returns `net_revenue` as deposits amount minus withdrawals amount for each generated period.
Currency Basis
Reporting currency is EUR. Both legs are converted at the transaction-time rate stored on each transaction row (transaction_bankings.conversion_rate) via amount divided by COALESCE(conversion_rate, 1); a NULL/absent rate falls back to 1 (treated as already EUR). Refs getGamingRevenueReport.sql:32 deposits, getGamingRevenueReport.sql:55 withdrawals, getGamingRevenueReport.sql:84 net_revenue.
calculation

Ending Balance

Running balance progression across the period sequence, not a one-day wallet snapshot.

Source Fields
net_revenue, generated date series
Transform
The SQL builds a running cumulative balance over the generated date buckets.
Currency Basis
Reporting currency is EUR. This is a cumulative sum of per-period net_revenue, so it inherits the transaction-time conversion_rate basis of deposits and withdrawals; no separate FX is applied at the running-balance level. Refs getGamingRevenueReport.sql:89, getGamingRevenueReportUseAnalyticsSchema.sql:135.
calculation

Current Player Account Balance

Current total funds held in player accounts.

Source Fields
wallets.amount, currencies.exchange_rate
Transform
The summary query sums current wallet balances normalized by currency exchange rate.
Currency Basis
Reporting currency is EUR. Unlike the deposit/withdrawal metrics, the balance uses the live reference rate on the currencies row at query time (currencies.exchange_rate, joined by currency_code), not the per-transaction booking rate: each wallet amount divided by COALESCE(exchange_rate, 1), with a NULL/absent rate falling back to 1 (treated as already EUR). This is a current-snapshot basis, so a rate revaluation moves the metric without new wallet activity. Refs getGamingRevenueReport.js:207 analytics summary, getGamingRevenueReport.js:285 legacy summary, currencies.js:30 exchange_rate column.
calculation

Schema selection

Explains why gaming totals may disappear even when the toggle is enabled.

Source Fields
useNewSchema, startDate, endDate, interval
Transform
The service uses the analytics-backed schema when allowed, but forces the legacy path for a custom range that starts and ends on today.
calculation

Active filter snapshot

Unapplied UI edits do not affect the table, summary cards, schema chip, or export.

Source Fields
startDate, endDate, interval, groupBy, useNewSchema, activeStartDate, activeEndDate, activeInterval, activeGroupBy, activeUseNewSchema
Transform
The FE keeps editable controls separate from the active query state. `Refresh` copies the staged values into the active state, resets pagination to page 1, and re-fetches the report and export hook inputs.
calculation

Interval and date-input visibility

The filter card can temporarily show both the staged interval choice and the custom date inputs.

Source Fields
interval, activeInterval
Transform
The date pickers are hidden only when `activeInterval` is non-empty. Selecting a preset interval in the UI does not immediately hide the date inputs until the choice has been applied with `Refresh`.
calculation

Analytics-only summary cards

Explains why the banking cards can stay visible while gaming cards disappear after a schema fallback.

Source Fields
useNewSchema, summary.total_ggr, total_ggr, total_ngr, total_wagered, total_active_players
Transform
The page only exposes GGR, NGR, total wagered, and active-player summary cards when the analytics-backed schema path is active and the response includes `summary.total_ggr`.
Grid columns

Columns

field

Date

field

Deposits Count

field

Deposits Amount

field

Withdrawals Count

field

Withdrawals Amount

field

Net Revenue

field

Ending Balance

field

Unique Depositors

field

Unique Withdrawers

field

Total Wagered

field

GGR

field

NGR

field

Active Players

Filter dictionary

Filters

field

Start date

Custom range start date. This input remains visible until the interval change has been applied.

Type
date
field

End date

Custom range end date. This input remains visible until the interval change has been applied.

Type
date
field

Interval

Preset range selector with `Custom`, `Month to Date`, `Year to Date`, and `Life to Date`.

Type
select
field

Group By

Controls whether the generated time series is bucketed by day, week, or month.

Type
select
field

Use new schema

Enables the analytics-backed schema when the selected date window allows it.

Type
boolean
Summary cards

Summary cards

field

Total Non-Promotional Deposits

field

Total Non-Promotional Withdrawals

field

Current Player Account Balance

field

Total GGR

field

Total NGR

field

Total Wagered

field

Active Players

Widget map

Widgets

item

Filter Gaming Revenue

Filter card with staged controls that only affect the report after `Refresh`.

item

Revenue table

Main time-series table for banking rows and optional analytics columns.

item

CSV export

CSV export for the active report query.

Metric dictionary

Metrics

metric

Total Non-Promotional Deposits

Sum of successful non-promotional deposits in the selected period.

Aliases
gaming revenue total deposits, total deposits
Currency Basis
Reporting Currency: EUR | Exchange Rate Source: transaction_bankings.conversion_rate (per-transaction column) | Rate Timing: transaction-time | Conversion: each transaction amount divided by COALESCE(conversion_rate, 1) | Missing Rate Fallback: A NULL or absent conversion_rate is replaced with 1 via COALESCE, so the amount is treated as already in EUR; a stored zero rate is not separately guarded in the report SQL and would error on divide-by-zero. | Backend Refs: gs-admin-backend/app/services/reports/getGamingRevenueReport.js:173 (analytics summary), gs-admin-backend/app/services/reports/getGamingRevenueReport.js:260 (legacy summary), gs-admin-backend/app/db/sql/getGamingRevenueReport.sql:32 (per-row deposits_amount), gs-admin-backend/app/db/models/transactionBankings.js:33 (conversion_rate column)
Verification Status
verified_backend
Last Verified At
2026-06-29
metric

Total Non-Promotional Withdrawals

Sum of successful or approved non-promotional withdrawals in the selected period.

Aliases
gaming revenue total withdrawals, total withdrawals
Currency Basis
Reporting Currency: EUR | Exchange Rate Source: transaction_bankings.conversion_rate (per-transaction column) | Rate Timing: transaction-time | Conversion: each transaction amount divided by COALESCE(conversion_rate, 1) | Missing Rate Fallback: A NULL or absent conversion_rate is replaced with 1 via COALESCE, so the amount is treated as already in EUR; a stored zero rate is not separately guarded in the report SQL and would error on divide-by-zero. | Backend Refs: gs-admin-backend/app/services/reports/getGamingRevenueReport.js:182 (analytics summary), gs-admin-backend/app/services/reports/getGamingRevenueReport.js:269 (legacy summary), gs-admin-backend/app/db/sql/getGamingRevenueReport.sql:55 (per-row withdrawals_amount), gs-admin-backend/app/db/models/transactionBankings.js:33 (conversion_rate column)
Verification Status
verified_backend
Last Verified At
2026-06-29
metric

Current Player Account Balance

Current wallet balance snapshot across eligible users, normalized to EUR.

Aliases
gaming revenue current balance, total current balance
Comparison Notes
This is a current snapshot from wallets, not a period-end snapshot taken only on the selected report dates.
Currency Basis
Reporting Currency: EUR | Exchange Rate Source: currencies.exchange_rate (reference table, joined to wallets by currency_code) | Rate Timing: current-snapshot | Conversion: each wallet amount divided by COALESCE(exchange_rate, 1) | Missing Rate Fallback: A NULL or absent exchange_rate is replaced with 1 via COALESCE, so the wallet amount is treated as already in EUR; a stored zero rate is not separately guarded in the report SQL and would error on divide-by-zero. | Notes: Unlike deposits and withdrawals, the balance uses the live reference rate on the currencies row at query time, not the per-transaction booking rate. A revaluation of currencies.exchange_rate moves this metric without any new wallet activity. | Backend Refs: gs-admin-backend/app/services/reports/getGamingRevenueReport.js:207 (analytics summary), gs-admin-backend/app/services/reports/getGamingRevenueReport.js:285 (legacy summary), gs-admin-backend/app/db/models/currencies.js:30 (exchange_rate column)
Verification Status
verified_backend
Last Verified At
2026-06-29
metric

Total GGR

Analytics-backed total GGR shown only when the newer schema path is active.

Aliases
gaming revenue ggr, total ggr
Currency Basis
Reporting Currency: EUR | Exchange Rate Source: pre-converted analytics.player_game_daily_summary.ggr_base (no rate applied in this report) | Rate Timing: upstream analytics pipeline (conversion is not performed by this report) | Conversion: SUM of ggr_base; the report applies no further FX, it only sums the already-converted base-currency column | Missing Rate Fallback: Not applied at report level; the report sums base-currency values as stored. The EUR labeling of these base columns is asserted by the hardcoded reporting_currency and the analytics pipeline, not proven by this report SQL. | Backend Refs: gs-admin-backend/app/db/sql/getGamingRevenueReportUseAnalyticsSchema.sql:100 (ggr_base), gs-admin-backend/app/services/reports/getGamingRevenueReport.js:223 (summary ggr_base), gs-admin-backend/app/services/reports/getGamingRevenueReport.js:245 (reporting_currency hardcoded EUR)
Verification Status
verified_backend
Last Verified At
2026-06-29
metric

Total NGR

Analytics-backed total NGR shown only when the newer schema path is active.

Aliases
gaming revenue ngr, total ngr
Currency Basis
Reporting Currency: EUR | Exchange Rate Source: pre-converted analytics.player_game_daily_summary.ngr_base (no rate applied in this report) | Rate Timing: upstream analytics pipeline (conversion is not performed by this report) | Conversion: SUM of ngr_base; the report applies no further FX, it only sums the already-converted base-currency column | Missing Rate Fallback: Not applied at report level; the report sums base-currency values as stored. The EUR labeling of these base columns is asserted by the hardcoded reporting_currency and the analytics pipeline, not proven by this report SQL. | Backend Refs: gs-admin-backend/app/db/sql/getGamingRevenueReportUseAnalyticsSchema.sql:101 (ngr_base), gs-admin-backend/app/services/reports/getGamingRevenueReport.js:224 (summary ngr_base), gs-admin-backend/app/services/reports/getGamingRevenueReport.js:245 (reporting_currency hardcoded EUR)
Verification Status
verified_backend
Last Verified At
2026-06-29
metric

Total Wagered

Analytics-backed total wagered shown only when the newer schema path is active.

Aliases
gaming revenue total wagered, revenue report wagered
Currency Basis
Reporting Currency: EUR | Exchange Rate Source: pre-converted analytics.player_game_daily_summary.bet_amount_base (no rate applied in this report) | Rate Timing: upstream analytics pipeline (conversion is not performed by this report) | Conversion: SUM of bet_amount_base; the report applies no further FX, it only sums the already-converted base-currency column | Missing Rate Fallback: Not applied at report level; the report sums base-currency values as stored. The EUR labeling of these base columns is asserted by the hardcoded reporting_currency and the analytics pipeline, not proven by this report SQL. | Backend Refs: gs-admin-backend/app/db/sql/getGamingRevenueReportUseAnalyticsSchema.sql:98 (bet_amount_base), gs-admin-backend/app/services/reports/getGamingRevenueReport.js:221 (summary bet_amount_base), gs-admin-backend/app/services/reports/getGamingRevenueReport.js:245 (reporting_currency hardcoded EUR)
Verification Status
verified_backend
Last Verified At
2026-06-29
metric

Active Players

Analytics-backed distinct active-player count shown only when the newer schema path is active.

Aliases
gaming revenue active players, revenue report active players
Verification Status
verified_backend
Last Verified At
2026-06-29
metric

Net Revenue

Banking net flow for the grouped period row.

Aliases
gaming revenue net revenue, deposits minus withdrawals
Backend Formula
deposits_amount - withdrawals_amount
Comparison Notes
This is not gaming GGR or NGR.
Currency Basis
Reporting Currency: EUR | Exchange Rate Source: transaction_bankings.conversion_rate (per-transaction column), inherited from the deposit and withdrawal legs | Rate Timing: transaction-time | Conversion: computed after each leg is converted by amount divided by COALESCE(conversion_rate, 1); no separate net-level FX is applied | Missing Rate Fallback: A NULL or absent conversion_rate on a leg is replaced with 1 via COALESCE, so that leg is treated as already in EUR; a stored zero rate is not separately guarded in the report SQL and would error on divide-by-zero. | Backend Refs: gs-admin-backend/app/db/sql/getGamingRevenueReport.sql:84 (net_revenue = deposits_amount - withdrawals_amount), gs-admin-backend/app/db/sql/getGamingRevenueReportUseAnalyticsSchema.sql:119 (net_revenue analytics path), gs-admin-backend/app/db/sql/getGamingRevenueReport.sql:32 (deposits leg conversion), gs-admin-backend/app/db/sql/getGamingRevenueReport.sql:55 (withdrawals leg conversion)
Verification Status
verified_backend
Last Verified At
2026-06-29
Operational notes

Notes

item

The period rows come from SQL files, while count and summary logic remain inline in the service.

item

The report can switch between legacy and analytics-backed schemas through `useNewSchema`, but today's custom range forces the legacy path.

item

`Net Revenue` is period deposits minus period withdrawals.

item

`Current Player Account Balance` is read from current wallets and is not a historical date-window aggregate.

item

The FE unwraps the backend success envelope as `result?.data?.data || result?.data || result`; the JSON response shape is `{ data, message }` unless CSV export is requested.

item

Analytics-mode responses also carry extra values such as `total_bonus_deposits`, `total_won`, `total_bets`, `total_sessions`, `bonus_deposits_count`, and `bonus_deposits_amount`, but the current standalone page does not render those fields.

item

The FE keeps staged controls separate from `active*` query state. `Refresh` applies the staged state and also drives the export hook inputs.

item

CSV export forwards the active interval, groupBy, and schema-toggle state in addition to the active date range.

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.