Skip to main content

Players

A player is one casino account. UCRM's player CDP handles identity merge, anonymous-to-identified promotion, multi-wallet, KYC + responsible-gaming state, and computed lifetime totals.

Identifiers

A player can have multiple identifiers — UCRM resolves the same person across signals:

IdentifierWhen it appears
external_idCasino's internal player id. Sent on every event.
emailSet during registration / via /identify
phoneE.164 — Twilio + Telegram require this
telegram_idTelegram bot integration
anonymous_ids[]Pre-signup tracking (web, mobile SDK)

Plus 0..N wallets in player_wallets (network + address — used by crypto-heavy operators as a strong identity signal).

Identity merge

When /identify arrives, UCRM:

  1. Looks up candidates by external_id → email → phone → telegram_id → wallet (in priority order)
  2. If exactly one candidate → merges traits + appends anonymous_id
  3. If zero candidates → creates new player
  4. If 2+ candidates with conflicting traits → marks status conflict for admin resolution

The full algorithm is documented in POST /v1/players/identify.

Computed totals

stream-processor maintains real-time totals on the players row:

  • total_deposited (BIGINT subunit, in tenant base currency)
  • total_withdrawn
  • total_wagered
  • total_won
  • ggr = wagered − won
  • bet_count, session_count
  • last_bet_at, last_deposit_at, last_seen_at

These are denominated in the tenant base currency with FX locked at event time (see Multi-currency).

Status

active — normal player
self_excluded — RG-blocked (CRM never messages, regardless of platform support)
banned — operator-banned
deleted — soft-deleted (deleted_at IS NOT NULL)
conflict — identity merge found 2+ candidates → admin reviews

Player profile

Visit a player from Players → click row. The detail page shows:

  • Identity strip: external_id + status pill + tier badge
  • AI summary placeholder (Phase 3 LLM-driven)
  • Predictive cards: lifetime value (sparkline), churn score, engagement
  • Identity table: emails / phones / wallets / anon ids
  • Money & activity: deposits / wagered / GGR (in tenant base + native wallet currency)
  • Segment memberships
  • Bonus grants
  • Messages timeline (last 25)
  • Event timeline (last 50)
  • Tier badge + history

Permissions

Player rows are always tenant-scoped via RLS. Cross-tenant lookups require SECURITY DEFINER helpers (used by webhook routing only — never returns sensitive payload).