Operator guideENreportingcohortretentionrevenue-qualityftd

Reporting / FTD Cohort Retention

Long-term retention and revenue-quality report that groups players by their first deposit date and measures D7 and D30 activity and deposit retention plus deposits, GGR, and NGR per cohort.

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

FTD Cohort Retention groups players by the date of their first deposit and then measures, for each cohort, how well those players stayed engaged over the long term and how much revenue they produced.

It is a different report from FTD Cohort. This page answers two questions side by side:

  • did the cohort keep playing and keep depositing after a fixed number of days, and
  • what was the cohort worth in deposits, gross gaming revenue, and net gaming revenue.

When to use it

  • judge the long-term quality of first-time depositors, not just early activity
  • compare retention at fixed day-7 and day-30 thresholds across cohorts
  • separate players who only stayed active from players who actually deposited again
  • compare cohorts by country, by traffic source, or by first-deposit period
  • size the deposit and revenue value behind each cohort in one place

How to read it

Each row is one cohort. The cohort label depends on the selected cohort mode:

  • Daily shows the first-deposit day
  • Weekly shows an ISO week label such as 2026-W12
  • Monthly shows a month label such as March 2026
  • Selected period (single cohort) collapses the whole date range into one cohort row labelled with the start and end dates

The retention columns are read as percentages of the cohort:

  • D7 Activity Ret. % is the share of the cohort with any user activity on or after day 7 from their first deposit
  • D7 Deposit Ret. % is the share of the cohort that made a repeat deposit on or after day 7
  • D30 Activity Ret. % and D30 Deposit Ret. % are the same two measures at the 30-day threshold

The revenue-quality columns show the cohort total of player deposits in the reporting currency, gross gaming revenue, and net gaming revenue.

Important reading rules:

  • a blank cell shown as a dash means the threshold has not been reached yet for that cohort, so the value is not available rather than zero
  • activity retention and deposit retention are independent measures; a cohort can keep activity high while repeat deposits fall
  • retention cells are colour-coded by the page: green at 30 percent or more, amber from 10 up to 30 percent, red below 10 percent
  • the deposit column is labelled in EUR because deposits are normalised to the reporting currency before they are summed

Filters that change the result

  • FTD From and FTD To bound the first-deposit date window; the default window is the last six months
  • Cohort Mode controls how cohort rows are bucketed
  • Traffic Source limits the cohort to Affiliate, Referral, or Direct players, or keeps All
  • PID limits cohorts to specific affiliate PIDs
  • Country limits cohorts to specific player country codes
  • rows per page

Action and filter behaviour

  • Apply Filters copies the currently edited filter controls into the active query and resets the table to the first page.
  • Refresh re-runs the last applied query only; it does not pick up staged edits that were not applied.
  • Pressing Enter in the PID field also applies the staged filters.
  • Typing a PID and leaving the PID field stages it as a chip, but the active query still waits for Apply Filters or Enter.
  • Export CSV uses the active filter snapshot and ignores table pagination by requesting up to 10,000 cohort rows.

Known caveats

  • The cohort is defined only by the first successful deposit. A player belongs to exactly one cohort.
  • Retention thresholds are inclusive: day 7 means on or after the 7th day from the first deposit, and the same applies to day 30.
  • Activity retention counts user-driven activity events, not gaming-summary rows, so it can differ from how the original FTD Cohort report measures later activity.
  • Deposit retention counts repeat successful deposits and does not require the same amount as the first deposit.
  • Traffic Source classifies a player by whether they have an affiliate PID link, otherwise an active referral, otherwise direct; this is mutually exclusive in that priority order.
  • GGR and NGR exclude correction, bonus payout, rakeback calendar, and referral rakeback entries so they reflect gameplay revenue rather than adjustments.
  • Streamer accounts and deleted players are excluded from every cohort.
  • This report has no summary or total row; each row stands on its own.

Verification status

  • status: verified_backend
  • FE route, filters, columns, retention colour bands, and CSV export are mapped to source
  • gs-admin-backend owns the cohort definition, the retention thresholds, and the deposit and revenue aggregation
  • the deposit column is converted to the reporting currency inside the report; GGR and NGR are read from already-converted base columns materialised by the upstream analytics pipeline, so the report itself applies no further currency conversion to them
Calculation notes

Calculations

calculation

Cohort membership

Each player belongs to exactly one cohort, set by the first deposit.

Source Fields
transaction_bankings.transaction_type, transaction_bankings.status, transaction_bankings.is_first_deposit, transaction_bankings.created_at, users.deleted_at, users.is_streamer
Transform
A player joins a cohort only through their first successful deposit, identified by transaction_type = deposit, status = 1, and is_first_deposit = true, within the FTD date window. Deleted players and streamer accounts are excluded. The first-deposit date is the ftd_date used by every later threshold.
calculation

Cohort date bucketing

Defines which cohort row each first-time depositor falls into.

Source Fields
cohortMode, transaction_bankings.created_at
Transform
Daily uses the first-deposit date. Weekly and monthly use DATE_TRUNC on the first-deposit date. Custom mode produces a single cohort with a NULL cohort date and a label built from the start and end dates of the window.
calculation

D7 and D30 retention thresholds

Activity and deposit retention are independent. The threshold is inclusive of the Nth day, and uses repeat deposits for deposit retention rather than gaming activity.

Source Fields
user_activities.triggered_method, user_activities.created_at, transaction_bankings.created_at, ftd_users.ftd_date
Transform
Activity retention counts distinct cohort users with a user_activities row where triggered_method = USER and created_at::date is on or after ftd_date plus the threshold days. Deposit retention counts distinct cohort users with a later successful deposit on or after ftd_date plus the threshold days. Each count is divided by ftd_players and multiplied by 100.
calculation

Future-threshold blanking

A dash means the threshold has not been reached yet, not that retention was zero.

Source Fields
ftd_users.cohort_date, cohortMode
Transform
The service computes whether ftd_date plus the threshold days is still after today. When the threshold is in the future the retention value is set to null. The FE renders null as a dash so it is not confused with a real 0 percent.
calculation

Zero-denominator guard

Cohorts with no players show 0 percent rather than an error.

Source Fields
ftd_users.user_id
Transform
Each retention percentage uses the pattern ftdPlayers > 0 ? (count / ftdPlayers * 100) : 0, so a cohort with zero FTD players returns 0 percent instead of a divide-by-zero error.
calculation

Deposit currency normalisation

Deposits are summed in the reporting currency using the rate captured at the time of each deposit; a missing rate leaves the original amount unconverted.

Source Fields
transaction_bankings.amount, transaction_bankings.conversion_rate
Transform
Total Deposits is SUM(amount / COALESCE(NULLIF(conversion_rate, 0), 1)) over all successful deposits of cohort players. The conversion_rate is the transaction-time rate stored on each banking row, so deposits are converted to the reporting currency at posting time. A null or zero rate falls back to 1.
calculation

GGR and NGR aggregation

Revenue reflects gameplay only and is already in the reporting currency before it is summed.

Source Fields
analytics.player_game_daily_summary.ggr_base, analytics.player_game_daily_summary.ngr_base, analytics.player_game_daily_summary.game_identifier
Transform
GGR sums ggr_base and NGR sums ngr_base from the analytics daily summary for cohort players, excluding game_identifier in (correction, bonus_payout, rakeback_calendar, referral_rakeback). Both base columns are already in the reporting currency, so the report applies no further currency conversion.
calculation

Traffic source classification

A player is classified into a single channel in the priority order affiliate, then referral, then direct.

Source Fields
nx.affiliate_links.affiliate_link_payload, public.user_referrals.is_active
Transform
Affiliate matches players who own an affiliate link with a non-empty pid payload. Referral matches players with no affiliate link but an active user_referrals row. Direct matches players with neither. All applies no channel condition.
calculation

Active filter snapshot

Unapplied changes in the filter card do not affect the table or export until Apply Filters is used.

Source Fields
staged filter controls, activePidList, activeCountries, activeCohortMode, activeTrafficSource, activeStartDate, activeEndDate
Transform
The FE keeps editable filter state separate from the active query state. Apply Filters copies the staged controls into the active state and resets pagination to page 1. Refresh only re-fetches the active state.
calculation

CSV export formatting

The export covers the full active result set, not just the visible page, and blanks future thresholds.

Source Fields
cohortData rows
Transform
Export requests limit 10000 and pageNo 1 with exportCsv true, and the backend returns a CSV whose retention and money columns are written with 2-decimal formatting. Future-threshold retention values are written as empty cells.
Grid columns

Columns

field

Cohort

Cohort bucket built from the first-deposit date. The label format changes by mode: a day, an ISO week, a month name, or a start-to-end range for custom mode.

field

FTD Players

Count of distinct first-time depositors in the cohort. This is the denominator for all four retention percentages.

field

D7 Activity Ret. %

Share of the cohort with any user-driven activity on or after day 7 from first deposit. Blank when the 7-day threshold has not been reached yet.

field

D7 Deposit Ret. %

Share of the cohort that made a repeat successful deposit on or after day 7 from first deposit. Blank when the threshold is in the future.

field

D30 Activity Ret. %

Share of the cohort with any user-driven activity on or after day 30 from first deposit. Blank when the 30-day threshold has not been reached yet.

field

D30 Deposit Ret. %

Share of the cohort that made a repeat successful deposit on or after day 30 from first deposit. Blank when the threshold is in the future.

field

Total Deposits (EUR)

Sum of all successful deposits made by cohort players, normalised to the reporting currency. Includes deposits after the first one, not just the FTD.

field

GGR

Gross gaming revenue for the cohort from the analytics daily summary base column, excluding correction, bonus payout, rakeback calendar, and referral rakeback entries.

field

NGR

Net gaming revenue for the cohort from the analytics daily summary base column, with the same game-identifier exclusions as GGR.

Filter dictionary

Filters

field

FTD From

Staged lower bound for the first-deposit date. Active only after Apply Filters or Enter. Backend compares against the first successful deposit created_at.

Type
date
Default Value
today - 6 months
field

FTD To

Staged upper bound for the first-deposit date. Backend uses an exclusive upper bound of endDate + 1 day.

Type
date
Default Value
today
field

Cohort Mode

Controls cohort bucketing. Daily, weekly, and monthly truncate the first-deposit date; custom collapses the whole window into one cohort row with a NULL cohort date and a start-to-end label.

Type
select
Default Value
monthly
Options
Daily, Weekly, Monthly, Selected period (single cohort)
field

Traffic Source

Limits the cohort by acquisition channel. Affiliate requires an affiliate PID link; Referral requires no affiliate link but an active referral; Direct requires neither. All applies no channel filter.

Type
select
Default Value
All
Options
All, Affiliate, Referral, Direct
field

PID

Free-solo staged PID chips matched against nx.user_kpi_summary.affiliate_pid for the cohort players.

Type
multi-select
field

Country

Staged country-code chips matched against users.country_code.

Type
multi-select
Options Source
useCountryList(limit=300,pageNo=1,ignoreLimit=true)
Widget map

Widgets

item

FTD Cohort Retention Report

Header card explaining the cohort definition and the D7 and D30 retention chips, including that a dash cell means the threshold is not yet reached.

item

Filters

Filter card with staged inputs. Changes become active only after Apply Filters or Enter in the PID field.

item

Failed to load report. Try narrowing the date range or filters, then refresh.

Error banner shown when the report query fails.

item

Cohort table

Main grid with one row per cohort and fixed retention and revenue-quality columns.

item

Retention cell colour bands

Each retention cell is coloured green at 30 percent or more, amber from 10 up to 30 percent, and red below 10 percent. A NULL value renders as a dash.

item

No data found for the selected filters.

Empty table row shown when the backend returns no cohort rows.

item

Export CSV

Exports the active cohort result set as CSV.

item

Table pagination

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

Metric dictionary

Metrics

metric

FTD Players

Distinct first-time depositors in the cohort. Denominator for all retention percentages.

Aliases
cohort ftd players, first time depositors in cohort
Backend Formula
COUNT(DISTINCT ftd_users.user_id) per cohort_date, where ftd_users are transaction_bankings rows with transaction_type = deposit, status = 1, and is_first_deposit = true within the FTD window.
Verification Status
verified_backend
Last Verified At
2026-06-29
metric

D7 Activity Retention %

Share of the cohort with any user-driven activity on or after day 7 from first deposit.

Aliases
day 7 activity retention, d7 activity ret, early activity retention
Numerator
COUNT(DISTINCT user_id) from user_activities where triggered_method = USER and created_at::date >= ftd_date + 7 days.
Denominator
ftd_players (distinct cohort users)
Zero Denominator Behavior
When ftd_players is 0 the backend returns 0, not null and not a divide error (ftdPlayers > 0 ? ratio : 0).
Future Threshold Behavior
When ftd_date + 7 days is still in the future the value is null and the FE renders a dash, distinct from a real 0 percent.
Rounding
Ratio multiplied by 100 and rounded to 2 decimals.
Verification Status
verified_backend
Last Verified At
2026-06-29
metric

D7 Deposit Retention %

Share of the cohort that made a repeat successful deposit on or after day 7 from first deposit.

Aliases
day 7 deposit retention, repeat deposit retention d7, d7 deposit ret
Numerator
COUNT(DISTINCT user_id) from transaction_bankings where transaction_type = deposit, status = 1, and created_at::date >= ftd_date + 7 days.
Denominator
ftd_players (distinct cohort users)
Zero Denominator Behavior
Returns 0 when ftd_players is 0.
Future Threshold Behavior
Returns null (rendered as a dash) when the 7-day threshold is in the future.
Rounding
Ratio multiplied by 100 and rounded to 2 decimals.
Verification Status
verified_backend
Last Verified At
2026-06-29
metric

D30 Activity Retention %

Share of the cohort with any user-driven activity on or after day 30 from first deposit.

Aliases
day 30 activity retention, d30 activity ret, long term activity retention
Numerator
COUNT(DISTINCT user_id) from user_activities where triggered_method = USER and created_at::date >= ftd_date + 30 days.
Denominator
ftd_players (distinct cohort users)
Zero Denominator Behavior
Returns 0 when ftd_players is 0.
Future Threshold Behavior
Returns null (rendered as a dash) when the 30-day threshold is in the future.
Rounding
Ratio multiplied by 100 and rounded to 2 decimals.
Verification Status
verified_backend
Last Verified At
2026-06-29
metric

D30 Deposit Retention %

Share of the cohort that made a repeat successful deposit on or after day 30 from first deposit.

Aliases
day 30 deposit retention, repeat deposit retention d30, long term deposit retention
Numerator
COUNT(DISTINCT user_id) from transaction_bankings where transaction_type = deposit, status = 1, and created_at::date >= ftd_date + 30 days.
Denominator
ftd_players (distinct cohort users)
Zero Denominator Behavior
Returns 0 when ftd_players is 0.
Future Threshold Behavior
Returns null (rendered as a dash) when the 30-day threshold is in the future.
Rounding
Ratio multiplied by 100 and rounded to 2 decimals.
Verification Status
verified_backend
Last Verified At
2026-06-29
metric

Total Deposits (EUR)

Sum of all successful deposits made by cohort players, in the reporting currency. Includes repeat deposits, not only the first deposit.

Aliases
cohort total deposits, cohort deposit volume, revenue quality deposits
Backend Formula
SUM(tb.amount / COALESCE(NULLIF(tb.conversion_rate, 0), 1)) over all successful deposits of cohort players, grouped by cohort_date.
Currency Basis
Reporting Currency: EUR (base / reporting currency; the FE column is labelled Total Deposits (EUR)). | Original Amount Source: transaction_bankings.amount in the transaction currency | Exchange Rate Source: transaction_bankings.conversion_rate stored per banking row | Basis: Transaction-time (posting-time) rate stored on each deposit row; no period-average or closing rate is applied. | Missing Rate Behavior: COALESCE(NULLIF(conversion_rate, 0), 1) means a null or zero rate falls back to 1, so the original amount is summed as if already in the reporting currency. This can distort the total when a real rate was missing. | Rounding: Cohort sum rounded to 2 decimals.
Verification Status
verified_backend
Last Verified At
2026-06-29
metric

GGR

Gross gaming revenue produced by the cohort, in the reporting currency.

Aliases
cohort gross gaming revenue, cohort ggr, revenue quality ggr
Backend Formula
SUM(pgds.ggr_base) from analytics.player_game_daily_summary for cohort players, excluding game_identifier in (correction, bonus_payout, rakeback_calendar, referral_rakeback), grouped by cohort_date.
Currency Basis
Reporting Currency: EUR (base currency); ggr_base is the base-currency generated column (bet_amount_base - win_amount_base). | Basis: The report sums already-converted base values and applies no further FX. The base amounts are materialised upstream by the analytics pipeline (nx-analytics-engine) using per-transaction conversion rates; the exact upstream rate basis is owned by that pipeline and is not re-derived in this report. | Rounding: Cohort sum rounded to 2 decimals.
Verification Status
verified_backend
Last Verified At
2026-06-29
Comparison Notes
GGR here excludes adjustment-style game identifiers, so it can differ from a raw GGR total that includes corrections or bonus payouts.
metric

NGR

Net gaming revenue produced by the cohort, in the reporting currency.

Aliases
cohort net gaming revenue, cohort ngr, revenue quality ngr
Backend Formula
SUM(pgds.ngr_base) from analytics.player_game_daily_summary for cohort players, with the same game-identifier exclusions as GGR, grouped by cohort_date.
Currency Basis
Reporting Currency: EUR (base currency); ngr_base is the base-currency generated column that adds marketing and adjustment base amounts to gross revenue. | Basis: The report sums already-converted base values and applies no further FX. Base amounts are materialised upstream by the analytics pipeline; the upstream rate basis is owned by that pipeline. | Rounding: Cohort sum rounded to 2 decimals.
Verification Status
verified_backend
Last Verified At
2026-06-29
Operational notes

Notes

item

The cohort is defined from first successful deposit rows in transaction_bankings with is_first_deposit = true and status = 1.

item

Activity retention is measured from user_activities rows with triggered_method = USER on or after the threshold day; deposit retention is measured from later successful deposits on or after the threshold day.

item

Retention denominators are the distinct FTD player count per cohort; the service guards against zero with ftdPlayers > 0 ? ratio : 0.

item

Future thresholds return null and the FE renders a dash; this is distinct from a real 0 percent.

item

Total Deposits is converted with the transaction-time conversion_rate stored per banking row using COALESCE(NULLIF(conversion_rate, 0), 1), so a missing rate falls back to 1.

item

GGR and NGR exclude game_identifier in correction, bonus_payout, rakeback_calendar, and referral_rakeback.

item

Traffic source is classified in priority order affiliate, then referral, then direct, using nx.affiliate_links payload and active user_referrals.

item

Apply Filters copies staged FE controls into a separate active-query state; Refresh only re-fetches that active snapshot.

item

CSV export requests limit 10000 and pageNo 1 and returns 2-decimal formatted values with future-threshold retention left blank.

item

This report has no summary or total row.

item

GGR, NGR, and Total Deposits aggregate each cohort player's full transaction and gaming history with no post-FTD time bound, so they reflect lifetime cohort value rather than a fixed retention window.

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.