Operator guideENreportingbonusesperformance

Reporting / Bonus Performance

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

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

Bonus Performance groups operator bonus outcomes by bonus item or backend bonus-performance tag. It combines activation counts, converted amounts, banking movement, and revenue fields in one grouped report.

When to use it

  • compare bonus items by activation and conversion results
  • inspect revenue after bonus and correction-style adjustments
  • segment by country, bonus type, or active status

How to read it

The visible summary cards show four headline totals for the current query:

  • Bonuses
  • Total Deposits
  • Total NGR
  • Total GGR

The table is grouped per bonus key. Important reading rules:

  • grouping falls back to bonus id when no dedicated bonus-performance tag exists
  • Marketing Expenses is visible separately and is not subtracted into NGR
  • Status and Bonus Type only constrain activation-side data, not every banking or casino stat in the row

Backend summary data also includes Total Activations and Total Withdrawals, but the current standalone FE does not render those two cards. The backend summary additionally returns total_bonus_amount, total_amount_converted, and total_correction_amount; those totals are API data only in the current standalone UI.

Known caveats

  • endDate is backend-exclusive
  • Active Only keeps only rows with activity in betting, deposits, or activations
  • withdrawal amount includes both SUCCESS and APPROVED statuses, while withdrawal count uses only SUCCESS
  • currency amounts are normalized in backend SQL before they reach the table
  • page subtitle talks about Bonus Performance Tag, but grouping still falls back to bonus_id when no tag exists
  • GGR is part of backend summary and ordering, but the current standalone table does not render a visible GGR column.
  • Bonus ID is not one identical predicate across all slices: banking and casino rows match bonus_performance_tag first and fall back to bonus_id, while activation rows match raw user_bonus.bonus_id.
  • Country, Status, and Bonus Type stay staged until Refresh; date changes, Order By, and Active Only update the active query immediately.
  • Refresh applies staged filters and also calls the SWR refetch helper; the state change is still the source of the new request key.
  • CSV export is visible. The FE sends limit=10000, but the backend export branch removes pagination and exports the full filtered result.

Filters that change the result

  • Start Date
  • End Date
  • Bonus ID
  • Country
  • Status
  • Bonus Type
  • Order By
  • Active Only
  • rows per page

Verification status

  • status: verified_backend
  • FE route, summary cards, grouped table, and export flow are mapped
  • gs-admin-backend owns grouping, activation filters, revenue math, normalization, and CSV generation
  • gs-casino-backend participates in source-tag lineage because bonus activation sets the user bonus-performance tag and payment/wallet writers carry that tag into transaction rows used by the report
  • nx-workspace is not required for the current operator meaning
Calculation notes

Calculations

calculation

Grouping key

Explains why one visible bonus row can represent more than one raw bonus id path.

Source Fields
bonus_performance_tag, bonus_id
Transform
Banking rows use `COALESCE(transaction_bankings.bonus_performance_tag, transaction_bankings.bonus_id::VARCHAR)`. Casino rows use `COALESCE(casino_transactions.bonus_performance_tag, user_bonus.bonus_id::VARCHAR)`. Activation rows use raw `user_bonus.bonus_id`.
calculation

Bonus ID filter scope

A search term can match tagged transaction movement and raw activation rows through different source columns.

Source Fields
bonusId, bonus_performance_tag, user_bonus.bonus_id
Transform
`Bonus ID` is an ILIKE filter over the coalesced tag/id key for banking and casino slices, but it is an ILIKE filter over raw `user_bonus.bonus_id` for activation rows.
calculation

GGR

Gross gaming revenue for the grouped bonus row.

Source Fields
bet_amount, win_amount
Transform
GGR is calculated as bet amount minus win amount.
calculation

NGR

Net gaming revenue for the grouped bonus row.

Source Fields
ggr, bonus_payout, cashback, rakeback_calendar, adjustment_amount, correction
Transform
NGR is calculated as GGR minus bonus payout, cashback, rakeback, adjustment amount, and correction.
calculation

Casino stat exclusions

Explains why report GGR and bonus-bet-like movement may not match raw casino transaction totals.

Source Fields
game_identifier, is_marketing, is_adjustment, is_freespins_payout
Transform
Base bet/win amounts exclude marketing rows and selected payout/rakeback identifiers. Bonus bet amount additionally excludes correction, adjustment, freespins payout, and marketing rows.
calculation

Banking status scope

Withdrawal amount can include approved withdrawals that are not counted in the successful withdrawal count.

Source Fields
transaction_type, status_enum
Transform
Deposit amount/count use `transaction_type = deposit` and `status_enum = SUCCESS`. Withdrawal amount uses `transaction_type = withdraw` and status `SUCCESS` or `APPROVED`. Withdrawal count uses only `SUCCESS`.
calculation

Active Only

Filters out completely inactive bonus rows.

Source Fields
bet_amount, deposit_amount, activations
Transform
`Active Only` keeps rows where the backend sees betting, deposits, or activations greater than zero.
calculation

Status and type filter scope

The row can still contain banking or casino movement for the same grouped key even when status/type filters mainly constrain activation data.

Source Fields
bonusStatus, bonusType, user_bonus.status, user_bonus.bonus_type
Transform
`Status` and `Bonus Type` are applied inside `activation_stats` against `user_bonus`; they do not directly filter the banking or casino transaction CTEs.
calculation

Mixed filter apply model

The filter card mixes immediate selectors and staged controls, so not every UI change updates the table instantly.

Source Fields
bonusId, country, bonusStatus, bonusType, startDate, endDate, orderBy, showOnlyActive
Transform
`Start Date`, `End Date`, `Order By`, and `Active Only` update the active query state immediately. `Bonus ID`, `Country`, `Status`, and `Bonus Type` remain staged until `Refresh` or Enter in the bonus-id field applies them.
calculation

Currency normalization

Explains why amounts are comparable across currencies inside the same report.

Source Fields
conversion_rate, exchange_rate
Transform
Amounts are normalized in SQL by dividing source amounts by conversion or exchange rate before grouping.
calculation

End Date exclusive bound

The selected end date is the exclusive upper boundary, not an inclusive end-of-day expansion.

Source Fields
endDate, created_at
Transform
Backend SQL applies `created_at < TIMESTAMPTZ :endDate` for banking, casino, and activation slices.
calculation

Export pagination override

CSV export is not limited to the currently visible table page.

Source Fields
exportCsv, limit, offset
Transform
FE export sends `limit=10000`, `pageNo=1`, and `exportCsv=true`. The backend export branch sets size to `1000000`, offset to `0`, removes SQL `LIMIT/OFFSET`, and generates CSV from the full filtered result set.
Grid columns

Columns

field

Bonus ID

Group key produced by `COALESCE(bonus_performance_tag, bonus_id)`.

field

Bonus Name

field

Bonus Type

field

Activations

field

Bonus Amount

field

Winning Amount

field

Amount Converted

field

Correction Amount

field

Deposits

field

Withdrawals

field

NGR

field

Marketing Expenses

Filter dictionary

Filters

field

Start Date

Immediately-applied date start because the FE updates the active query state on date selection.

Type
date
Default Value
last 30 days
field

End Date

Immediately-applied date end because the FE updates the active query state on date selection; backend treats it as an exclusive upper bound.

Type
date
Default Value
today
field

Bonus ID

Staged text filter applied through `Refresh` or `Enter`; banking/casino slices search bonus-performance tag or fallback id, while activation rows search raw bonus id.

Type
text
field

Country

Staged country selector applied through `Refresh`; the backend filters users by `country_code`.

Type
select
Options Source
useCountryList(limit=300,pageNo=1,ignoreLimit=true)
field

Status

Staged activation-side `user_bonus.status` filter applied through `Refresh`.

Type
select
Options
All, Active, Expired, Win, Cancelled
field

Bonus Type

Staged activation-side `user_bonus.bonus_type` filter applied through `Refresh`.

Type
select
Options
All, Deposit Bonus, Free Spins, No Deposit, Promotion, Instant Cashback
field

Order By

Immediately-applied ranking selector.

Type
select
Options
Activations, Deposits, NGR, GGR
field

Active Only

Immediately-applied toggle for active rows.

Type
boolean
Summary cards

Summary cards

field

Bonuses

Visible count of grouped bonus rows in the active report query.

field

Total Deposits

Visible total deposit amount for the active report query.

field

Total NGR

Visible grouped NGR total for the active report query.

field

Total GGR

Visible grouped GGR total for the active report query.

Widget map

Widgets

item

Filter Bonus Performance

Filter card with mixed immediate and staged controls.

item

Bonus Performance Report

Grouped bonus-performance table for the active query.

item

Loading bar

Linear progress shown while the active SWR request is loading.

item

No data found

Empty table state when the backend returns no grouped rows for the active filters.

item

Table pagination

Backend pagination with row-size options 10, 20, 50, and 100.

item

Showing range summary

FE footer text showing current visible row range out of `totalCount`.

item

Export CSV

CSV export for the active report query.

Metric dictionary

Metrics

metric

Bonuses

Number of grouped bonus rows in the current report.

Aliases
bonus performance bonuses, grouped bonuses
Backend Formula
COUNT(*) over the grouped `stats` result set after filters and before pagination.
Verification Status
verified_backend
Last Verified At
2026-05-05
metric

Total Activations

Sum of bonus activations in the current query.

Aliases
bonus performance activations
Backend Formula
SUM(activations) over the grouped `stats` result set.
Verification Status
verified_backend
Last Verified At
2026-05-05
Comparison Notes
Returned by the backend summary object, but not rendered as a visible card on the current standalone page.
metric

Total Deposits

Total deposit amount attributed to the grouped bonus rows.

Aliases
bonus performance deposits
Backend Formula
SUM(deposit_amount); deposit rows use `transaction_type = deposit` and `status_enum = SUCCESS`.
Verification Status
verified_backend
Last Verified At
2026-05-05
metric

Total Withdrawals

Total withdrawal amount attributed to the grouped bonus rows in the current query.

Aliases
bonus performance withdrawals, total withdrawals
Backend Formula
SUM(withdrawal_amount); withdrawal amount includes `SUCCESS` and `APPROVED`.
Verification Status
verified_backend
Last Verified At
2026-05-05
Comparison Notes
Returned by the backend summary object, but not rendered as a visible card on the current standalone page.
metric

Total GGR

Gross gaming revenue for the current bonus-performance query.

Aliases
bonus performance ggr
Backend Formula
SUM(bet_amount - win_amount), excluding marketing rows and selected bonus payout/rakeback identifiers from base bet/win amounts.
Verification Status
verified_backend
Last Verified At
2026-05-05
metric

Total NGR

Net gaming revenue for the current bonus-performance query.

Aliases
bonus performance ngr
Backend Formula
SUM(ggr - bonus_payout - cashback - rakeback_calendar - adjustment_amount - correction).
Verification Status
verified_backend
Last Verified At
2026-05-05
metric

Marketing Expenses

Separate marketing-cost field returned for the grouped bonus row.

Aliases
bonus performance marketing expenses, marketing amount
Backend Formula
SUM(cash_amount * sign) for casino rows where `is_marketing = TRUE`; win rows add and bet rows subtract.
Verification Status
verified_backend
Last Verified At
2026-05-05
Comparison Notes
Rendered as a row column, not as a summary card, and not subtracted in the backend NGR formula.
metric

Total Bonus Amount

Backend summary sum of grouped bonus amount values.

Aliases
bonus performance total bonus amount
Backend Formula
SUM(bonus_amount) over the grouped `stats` result set.
Verification Status
verified_backend
Last Verified At
2026-05-05
Comparison Notes
Returned by the backend summary object, but not rendered as a visible card on the current standalone page.
metric

Total Amount Converted

Backend summary sum of converted bonus amount values.

Aliases
bonus performance total converted amount, total converted bonus amount
Backend Formula
SUM(amount_converted) over the grouped `stats` result set.
Verification Status
verified_backend
Last Verified At
2026-05-05
Comparison Notes
Returned by the backend summary object, but not rendered as a visible card on the current standalone page.
metric

Total Correction Amount

Backend summary sum of grouped correction amount values.

Aliases
bonus performance correction total
Backend Formula
SUM(correction_amount) over the grouped `stats` result set.
Verification Status
verified_backend
Last Verified At
2026-05-05
Comparison Notes
Returned by the backend summary object, but not rendered as a visible card on the current standalone page.
Operational notes

Notes

item

Grouping uses `bonus_performance_tag` when present and falls back to `bonus_id`.

item

`Bonus ID` search is slice-specific: banking/casino search the coalesced tag/id key, while activation rows search raw `user_bonus.bonus_id`.

item

`bonusStatus` and `bonusType` filter activation-side rows only; they do not fully constrain every banking and casino stat in the grouped result.

item

The FE mixes immediate and staged filters: date range, `orderBy`, and `showOnlyActive` update active query state immediately; `bonusId`, `country`, `bonusStatus`, and `bonusType` wait for `Refresh`.

item

The backend summary returns totals for activations, withdrawals, bonus amount, converted amount, and correction amount, but the current standalone FE only renders four cards: bonuses, deposits, NGR, and GGR.

item

CSV export is visible; FE sends `limit=10000`, but backend export removes pagination and emits the full filtered result.

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 / 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.

pageReporting / Control Verification

Monitoring workspace for integrity verification runs, compliance scoring, baseline control, and component-by-component failure review.