Operator guideENdashboardkpisummarycalculated

Dashboard / KPI Summary

Comparison table for high-level KPI rows across today, yesterday, month-to-date, and the selected period, with frontend trend chips and data-source badges.

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 widget shows

KPI Summary is a comparison table. Each row is a KPI metric, and each column shows the value for a different time bucket.

For a backoffice user, this widget is the fastest place to answer:

  • how key KPIs look today
  • how today compares with yesterday
  • how the month is trending
  • what the same KPI looks like for a selected period

When to use it

Use this widget when you want a quick KPI comparison without opening a separate report page.

It is especially useful for:

  • revenue and betting totals
  • new registrations and new depositors
  • deposit conversion rate
  • pending withdrawal amounts

How to read it

The rows are provided by the backend. The exact row inventory is backend-owned and may grow over time. For the currently verified mapper, visible examples include New Registration, New Depositors, GGR, NGR, Total GGR, Marketing, Correction, User Challenge, and the KYC-split pending-withdrawal rows.

The columns are controlled by the frontend:

  • Today
  • Yesterday
  • This month
  • Selected date

If Selected Date Only is turned on, the widget hides Today, Yesterday, and This month and keeps only the selected period. This is presented as a performance mode for large date ranges.

Filters that change the result

  • Date option
  • Start date
  • End date
  • Streamer data
  • Selected Date Only

Date option supports the current frontend presets:

  • Today
  • Yesterday
  • Week to date
  • Month to date
  • Last 7 days
  • Last 30 days
  • Last 90 days
  • Year to date
  • Previous month
  • Previous year
  • Custom

The frontend also displays a source badge:

  • Optimized
  • Live Data

For the current backend implementation, KPI Summary returns optimized when the normal comparison mode is used and live when Selected Date Only is enabled. The frontend type still includes aggregated, but that state is not emitted by the verified widget service path.

How calculated values are shown

The KPI values themselves come from the backend. The main frontend calculation in this widget is the trend chip.

  • On the Today column, the chip compares Today against Yesterday.
  • On the This month column, the chip compares This month against Selected date.
  • No chip is shown when the comparison value is missing, zero, or the absolute change is below 1%.

This means the month chip is not comparing against Previous month to date in the frontend. It uses the current selected period as the comparison baseline.

Metric dictionary

GGR

GGR in KPI Summary is the backend-owned gross gaming revenue row for the current filter set and comparison bucket.

For the verified backend path, GGR is based on:

  • bet amount
  • minus win amount

In plain terms, it shows how much gaming revenue remains before bonus, cashback, rakeback, and correction-style costs are applied.

NGR

NGR in KPI Summary is the backend-owned net gaming revenue row for the current filter set and comparison bucket.

For the verified backend path, the response mapper computes:

  • NGR = GGR + marketing

The important nuance is that the backend marketing bucket is already negative for deduction-style costs. This is why NGR is usually lower than GGR even though the mapper adds the value mathematically.

If you need the expanded deduction story, trace the upstream marketing bucket rather than assuming the widget recomputes NGR from the visible rows.

Marketing

Marketing is its own backend-owned KPI row. In the reporting/export mapping, the backend labels it as:

  • Marketing (Marketing = Bonus Payout + Correction + Cashback+ Referral Rakeback + Rakeback Calendar)

For operators this means:

  • it is the combined marketing-cost bucket used by KPI Summary
  • it already absorbs several deduction-style components
  • it is the row that feeds the verified NGR = GGR + marketing response-mapper formula

So if someone asks why NGR is lower than GGR, Marketing is the first supporting row to inspect.

Correction

Correction is also a backend-owned row. In the export/report-row mapping, the backend expands its meaning to:

  • Correction (Bonus Payout Auto Correction)

For operators this means the row is not a generic manual note or arbitrary accounting label. In the current KPI Summary path it is the correction component inside the broader marketing-cost story.

Referral Rakeback

Referral Rakeback is also a dedicated backend-owned KPI row in KPI Summary.

For operators, treat it as:

  • a standalone backend amount returned directly by the KPI Summary mapper
  • one specific deduction-style component that can also appear inside the broader Marketing explanation
  • not a frontend subtotal invented from other visible rows

User Challenge

User Challenge is a dedicated backend row in KPI Summary. The widget does not compute it from other visible values and does not turn it into a tooltip-only explanation.

For operators, treat it as:

  • a standalone challenge-cost / challenge-amount row returned by the backend
  • one input that can coexist with the other deduction-style rows
  • not the same thing as the CMS content block label General - User Challenges

Total GGR

Total GGR is a separate backend row, not a frontend sum built from the visible table.

The response mapper exposes it as totalggr, and the monthly/export mapping labels the same measure as Total GGR (Bonus + Real). For backoffice users, the practical meaning is:

  • it is the combined total-GGR figure returned by the KPI Summary backend path
  • it should not be assumed to mean exactly the same thing as the plain GGR row
  • if you are reconciling it with another report, compare like with like and check whether the other report is using provider/game-level breakdowns or a different aggregation path

If you are looking for Total NGR

Backoffice users sometimes search for Total NGR by analogy with Total GGR.

For the backend path verified on 2026-04-14, KPI Summary exposes:

  • NGR
  • Total GGR

It does not expose a separate Total NGR row in the verified createKpiSummaryResponse2 mapper. If someone asks for Total NGR in this widget, the first thing to check is whether they actually mean:

  • the normal NGR row in KPI Summary
  • or an NGR figure from another report such as KPI Reports or Game Reports

Common questions

Why do I only see one numeric column?

Because Selected Date Only is enabled. In that mode the widget is intentionally reduced to the selected range.

Why is there no trend chip?

The frontend hides the chip when:

  • the baseline value is empty
  • the baseline value is 0
  • the absolute percentage change is under 1%

Why can the month trend look surprising?

Because the visible chip compares This month with Selected date, not with a previous-month column.

Where is the rebuild action?

This widget does not expose a rebuild action. The mounted surface is read-only and only offers filter changes, refresh, and CSV export.

Why can GGR and NGR differ a lot?

Because NGR is not just a reformatted GGR. In the verified backend path, the widget response mapper uses GGR + marketing, and the marketing bucket is already negative for deduction-style costs.

What is the practical difference between the deduction-style KPI rows?

  • Marketing is the combined deduction bucket used in the NGR formula.
  • Correction is a specific correction component inside that deduction story.
  • User Challenge is a separate backend-owned KPI row, not a synonym for Marketing or Correction.
  • Referral Rakeback is another separate backend-owned KPI row that the export mapping also names explicitly inside the broader Marketing expansion.

Why can Total GGR differ from GGR?

Because Total GGR is its own backend-provided row. It is not computed in the frontend from the visible GGR cells.

Known caveats

  • Row labels are backend-owned, not hardcoded in the frontend.
  • Some row descriptions come from the backend and are shown through tooltips.
  • The visible trend chip logic is frontend-only and should not be confused with a backend KPI delta field.
  • The current verified backend mapper exposes NGR and Total GGR, but not a separate Total NGR row.
  • The TypeScript layer still allows a dataSource = aggregated branch, but the verified dashboard widget currently emits only optimized or live.
Calculation notes

Frontend calculations

calculation

trend_chip

Applies To
today, month_to_date
Formula
((current_value - baseline_value) / abs(baseline_value)) * 100
Today Baseline
yesterday
Month To Date Baseline
selected_date
Hidden When
baseline value is empty, baseline value is 0, absolute percent change is below 1
calculation

selected_date_only_mode

Effect
hides today, hides yesterday, hides this month, keeps selected date
Backend Effect
frontend requests live selected-period mode only
Calculation notes

Backend calculations

calculation

ggr

Formula
bet_amount - win_amount
Notes
Verified against the action-backed SQL loaded by GetKPISummaryService from app/db/sql/aggregateCasinoTransactionsByPeriod.sql
calculation

ngr

Formula
GGR + marketing
Notes
Response mapper builds NGR as GGR plus the marketing bucket, where the marketing value is already negative., Treat the expanded deduction chain as upstream meaning of the marketing bucket, not as a second frontend formula., Verified against the action-backed SQL loaded by GetKPISummaryService from app/db/sql/aggregateCasinoTransactionsByPeriod.sql
calculation

total_ggr

Formula
KPISummary.betCountsAndAmounts.<bucket>.totalggr
Notes
Monthly/export mapping labels the same figure as Total GGR (Bonus + Real).
calculation

correction

Formula
KPISummary.betCountsAndAmounts.<bucket>.correction
Notes
The report/export row mapping labels the same row as `Correction (Bonus Payout Auto Correction)`.
calculation

marketing

Formula
KPISummary.betCountsAndAmounts.<bucket>.marketing
Notes
The report/export mapping expands this bucket as `Bonus Payout + Correction + Cashback + Referral Rakeback + Rakeback Calendar`., This is the exact bucket referenced by the verified `NGR = GGR + marketing` mapper formula.
calculation

referral_rakeback

Formula
KPISummary.betCountsAndAmounts.<bucket>.referral_rakeback
Notes
This is a dedicated backend row in KPI Summary, not just a phrase inside the expanded `Marketing` export label., The frontend formats the row but does not derive it from `Marketing` or from other visible deduction rows.
calculation

user_challenge

Formula
KPISummary.betCountsAndAmounts.<bucket>.user_challenge
Notes
This is a dedicated backend row, not a frontend recomputation and not a CMS content-block concept.
calculation

deposit_conversion_rate

Formula
(new_depositors / new_players) * 100
Zero Rule
returns 0.00 when register count is 0
calculation

pending_withdrawals_globally

Formula
KPISummary.withdraw.<bucket>.total_pending_witdraw_sum
Notes
This is the backend-owned umbrella amount for pending withdrawals across KYC buckets., `<bucket>` is one of `today`, `yesterday`, `month`, or `custom` depending on the displayed column.
calculation

pending_withdrawals_kyc_requested

Formula
KPISummary.withdraw.<bucket>.requested_kyc_witdraw_sum
Notes
KYC requested subset of pending withdrawals., The backend injects the row directly into KPI Summary; the FE only formats the amount.
calculation

pending_withdrawals_kyc_approved

Formula
KPISummary.withdraw.<bucket>.approved_kyc_witdraw_sum
Notes
KYC approved subset of pending withdrawals., The FE does not compute this from other visible rows.
calculation

pending_withdrawals_kyc_pending

Formula
KPISummary.withdraw.<bucket>.pending_kyc_witdraw_sum
Notes
KYC pending subset of pending withdrawals., This is the exact backend field behind `Pending Withdrawals (Kyc Pending)`., The backend field name contains the historical typo `witdraw`; docs keep the exact key only in source/formula references.
Reference rules

Date option ranges

calculation

Today

same calendar day, 00:00:00 to 23:59:59.999

calculation

Yesterday

previous calendar day, 00:00:00 to 23:59:59.999

calculation

Monthtodate

first day of current month through current day

calculation

Last7days

current day plus previous 6 days

calculation

Last30days

current day plus previous 29 days

calculation

Last90days

current day plus previous 89 days

calculation

Weektodate

Monday of current week through current day

calculation

Yeartodate

January 1 of current year through current day

calculation

Previousmonth

first through last day of previous month

calculation

Previousyear

January 1 through December 31 of previous year

calculation

Custom

frontend leaves custom start/end under operator control

Reference rules

Data source rules

calculation

Default Mode

optimized

calculation

Selected Date Only Mode

live

calculation

Aggregated Type Note

The frontend type still allows `aggregated`, but the verified widget service path does not emit that state.

Grid columns

Columns

field

Metric

Name of the KPI row returned by the backend response.

Visual Type
row-label
Transform
none
field

Today

Current-day value for the KPI row.

Visual Type
comparison-value
Transform
currency_or_count_display
field

Yesterday

Previous-day value for the KPI row.

Visual Type
comparison-value
Transform
currency_or_count_display
field

This month

Month-to-date value for the KPI row.

Visual Type
comparison-value
Transform
currency_or_count_display
field

Selected date

Value for the manually selected period.

Visual Type
comparison-value
Transform
currency_or_count_display
Filter dictionary

Filters

field

Date option

Chooses the comparison window before any custom dates are applied.

Type
preset-range
Affects
displayed_columns, backend_period_selection
Preset Values
today, yesterday, weektodate, monthtodate, last7days, last30days, last90days, yeartodate, previousmonth, previousyear, custom
field

Start date

Start of the manually selected period.

Type
date
Affects
selected_date_column
field

End date

End of the manually selected period.

Type
date
Affects
selected_date_column
field

Streamer data

Restricts the widget to streamer-tagged data only.

Type
boolean
Affects
all_rows
field

Selected Date Only

Switches the widget into a single-period mode focused on the selected custom range.

Type
boolean
Affects
column_layout, backend_data_source
Metric dictionary

Metrics

metric

GGR

Gross gaming revenue in KPI Summary. In the verified backend path it is based on bet amount minus win amount for the selected period and current filters.

Aliases
kpi summary ggr, dashboard ggr, gross gaming revenue, what is ggr
Filter Dependencies
date_options, start_date, end_date, is_streamer_data, is_selected_date_only
Backend Method
GetKPISummaryService -> createKpiSummaryResponse2
Backend Formula
bet_amount - win_amount
Frontend Transforms
currency/count formatting, today trend chip compares Today with Yesterday, month trend chip compares This month with Selected date
Comparison Notes
This is the plain GGR row. It should not be assumed to be identical to the separate Total GGR row.
Verification Status
verified_backend
Last Verified At
2026-04-14
metric

NGR

Net gaming revenue in KPI Summary. In the verified backend path it starts from GGR and then applies marketing-style deductions.

Aliases
kpi summary ngr, dashboard ngr, net gaming revenue, what is ngr
Filter Dependencies
date_options, start_date, end_date, is_streamer_data, is_selected_date_only
Backend Method
GetKPISummaryService -> createKpiSummaryResponse2
Backend Formula
GGR + marketing
Frontend Transforms
currency/count formatting, today trend chip compares Today with Yesterday, month trend chip compares This month with Selected date
Comparison Notes
In the response mapper NGR is built from GGR plus the backend marketing bucket, where the marketing value is already negative for deduction-style costs. Do not read this widget as a frontend recomputation from visible deduction rows.
Verification Status
verified_backend
Last Verified At
2026-04-18
metric

Total GGR

Separate backend-owned total-GGR row returned by KPI Summary. It is not a frontend sum built from the visible GGR cells.

Aliases
kpi summary total ggr, dashboard total ggr, total ggr bonus real, total gross gaming revenue
Filter Dependencies
date_options, start_date, end_date, is_streamer_data, is_selected_date_only
Backend Method
GetKPISummaryService -> createKpiSummaryResponse2
Backend Formula
backend field KPISummary.betCountsAndAmounts.<bucket>.totalggr
Comparison Notes
This row is distinct from the plain GGR row. If another report uses provider or game breakdowns, do not assume the labels reconcile one-to-one without checking that report's aggregation path.
Verification Status
verified_backend
Last Verified At
2026-04-14
metric

Total NGR

Search clarification for backoffice users. In the backend path verified for KPI Summary, there is no separate Total NGR row in createKpiSummaryResponse2.

Aliases
kpi summary total ngr, dashboard total ngr, total net gaming revenue, what is total ngr
Availability Note
Verified backend mapper exposes NGR and Total GGR, but not a dedicated Total NGR row.
Backend Method
GetKPISummaryService -> createKpiSummaryResponse2
Comparison Notes
Use this entry as a search and support clarification record, not as proof that the widget renders a visible Total NGR row.
Verification Status
verified_backend
Last Verified At
2026-04-14
metric

Deposit Conv Rate

Share of new registrations that became new depositors for the same comparison bucket.

Aliases
deposit conversion rate, kpi summary deposit conv rate, deposit conv
Backend Method
GetKPISummaryService -> createDepositConvRate
Backend Formula
(new_depositors / new_players) * 100
Zero Rule
returns 0.00 when register count is 0
Comparison Notes
The visible KPI row is `New Registration`, while the backend bucket behind the formula still lives under `newPlayers.total_user_count`.
Verification Status
verified_backend
Last Verified At
2026-04-18
metric

Pending Withdrawals (Globally)

Sum of all withdrawal requests that are still pending, regardless of the user's KYC stage.

Aliases
pending withdrawals globally, kpi summary pending withdrawals, total pending withdrawals
Filter Dependencies
date_options, start_date, end_date, is_streamer_data, is_selected_date_only
Backend Method
GetKPISummaryService -> buildPendingWithdrawalRows
Backend Formula
KPISummary.withdraw.<bucket>.total_pending_witdraw_sum
Comparison Notes
This is the umbrella pending-withdrawal amount. The KYC-specific rows are subsets and should not be added on top of this row without checking for overlap.
Verification Status
verified_backend
Last Verified At
2026-04-17
metric

Pending Withdrawals (Kyc Requested)

Pending withdrawal amount for users whose KYC state is in the requested bucket.

Aliases
pending withdrawals kyc requested, kyc requested withdrawals
Filter Dependencies
date_options, start_date, end_date, is_streamer_data, is_selected_date_only
Backend Method
GetKPISummaryService -> buildPendingWithdrawalRows
Backend Formula
KPISummary.withdraw.<bucket>.requested_kyc_witdraw_sum
Verification Status
verified_backend
Last Verified At
2026-04-17
metric

Pending Withdrawals (Kyc Approved)

Pending withdrawal amount for users whose KYC state is in the approved bucket.

Aliases
pending withdrawals kyc approved, kyc approved withdrawals
Filter Dependencies
date_options, start_date, end_date, is_streamer_data, is_selected_date_only
Backend Method
GetKPISummaryService -> buildPendingWithdrawalRows
Backend Formula
KPISummary.withdraw.<bucket>.approved_kyc_witdraw_sum
Verification Status
verified_backend
Last Verified At
2026-04-17
metric

Pending Withdrawals (Kyc Pending)

Pending withdrawal amount for users whose KYC status is still in the pending bucket.

Aliases
pending withdrawals kyc pending, kyc pending withdrawals, pending withdrawals pending kyc
Filter Dependencies
date_options, start_date, end_date, is_streamer_data, is_selected_date_only
Backend Method
GetKPISummaryService -> buildPendingWithdrawalRows
Backend Formula
KPISummary.withdraw.<bucket>.pending_kyc_witdraw_sum
Comparison Notes
Read this as a KYC-status subset of pending withdrawals, not as a separate non-overlapping payment state.
Verification Status
verified_backend
Last Verified At
2026-04-17
metric

Correction

Backend-owned correction row in KPI Summary. In the report/export mapping the same row is labeled `Correction (Bonus Payout Auto Correction)`.

Aliases
correction, bonus payout auto correction, kpi summary correction
Backend Method
GetKPISummaryService -> createKpiSummaryResponse2
Backend Formula
KPISummary.betCountsAndAmounts.<bucket>.correction
Comparison Notes
KPI Summary exposes Correction as its own visible row, but the reporting/export label makes clear that this value is specifically tied to bonus-payout auto-correction semantics.
Verification Status
verified_backend
Last Verified At
2026-04-18
metric

Marketing

Combined backend-owned marketing-cost bucket used by KPI Summary. This is the same bucket the response mapper uses in the verified `NGR = GGR + marketing` path.

Aliases
marketing, marketing expenses, kpi summary marketing
Backend Method
GetKPISummaryService -> createKpiSummaryResponse2
Backend Formula
KPISummary.betCountsAndAmounts.<bucket>.marketing
Comparison Notes
The mapper adds this row to GGR mathematically because the marketing bucket is already negative for deduction-style costs. Do not re-subtract the visible support rows in the frontend.
Verification Status
verified_backend
Last Verified At
2026-04-18
metric

Referral Rakeback

Dedicated backend-owned KPI row for referral rakeback value in KPI Summary.

Aliases
referral rakeback, referral cashback rakeback, kpi summary referral rakeback
Backend Method
GetKPISummaryService -> createKpiSummaryResponse2
Backend Formula
KPISummary.betCountsAndAmounts.<bucket>.referral_rakeback
Comparison Notes
This is a visible backend row of its own. Do not collapse it into `Marketing` unless the operator is explicitly asking about the expanded deduction chain behind the marketing bucket.
Verification Status
verified_backend
Last Verified At
2026-04-21
metric

User Challenge

Dedicated backend-owned KPI row for challenge-related value in KPI Summary.

Aliases
user challenge, challenge amount, kpi summary user challenge
Backend Method
GetKPISummaryService -> createKpiSummaryResponse2
Backend Formula
KPISummary.betCountsAndAmounts.<bucket>.user_challenge
Comparison Notes
This row is emitted directly by the backend mapper. The widget does not derive it from other visible deduction rows.
Verification Status
verified_backend
Last Verified At
2026-04-18
Operational notes

Notes

item

Selected Date Only uses the backend live-only path.

item

Normal comparison mode uses the optimized branch, which mixes pre-aggregated and live SQL inputs before the response mapper builds rows.

item

Verified KPI rows for this widget include GGR, NGR, and Total GGR.

item

The verified mapper does not expose a separate Total NGR row.

item

No rebuild action is wired into this mounted dashboard widget.

item

No confirmed `nx-workspace` dependency participates in the current runtime path.

Related references

Related pages

pageDashboard / Bonus Payouts

Shared comparison widget rendered for tournament, challenge, and no-deposit bonus payout groups.

pageDashboard / Game Reports

Deep comparison widget for Games and Providers with separate backend paths, multiple grouping options, search, and a mix of backend and frontend summary logic.

pageDashboard / GGR Chart

Revenue trend chart with frontend summary cards derived from the loaded time series.

pageDashboard / KPI Reports

Sortable KPI table for games or providers, used to compare betting and GGR-style metrics by entity rather than by time bucket.

pageDashboard / Live Player Report

Card-based snapshot of today's GGR, total players, conversion rates, active players, and merchant balance.

pageDashboard / Performance Overview

Container widget for Casino, Banking, and Registrations charts with shared date-range and streamer-data controls.