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:
| Identifier | When it appears |
|---|---|
external_id | Casino's internal player id. Sent on every event. |
email | Set during registration / via /identify |
phone | E.164 — Twilio + Telegram require this |
telegram_id | Telegram 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:
- Looks up candidates by
external_id→ email → phone → telegram_id → wallet (in priority order) - If exactly one candidate → merges traits + appends
anonymous_id - If zero candidates → creates new player
- If 2+ candidates with conflicting traits → marks status
conflictfor 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_withdrawntotal_wageredtotal_wonggr= wagered − wonbet_count,session_countlast_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).