Verticals
A vertical is a casino product category — casino, sportsbook, lottery, poker, esports, virtual_sports, bingo. Tenant config picks which verticals are active; effective capabilities intersect tenant config with adapter support.
Why verticals matter
Different verticals have:
- Different canonical events. Casino settles instantly (
bet_placed+bet_settled); sportsbook settles hours-to-days later (sport_bet_placed→sport_bet_settledorsport_bet_voidedorsport_cashout). - Different reporting axes. Sportsbook GGR pivots by sport + bet_type; casino pivots by game category.
- Different player profiles. Some players are casino-only, some sportsbook-only, most are mixed.
Canonical events per vertical
Casino
bet_placed, bet_settled, bet_won, bet_lost
bet_settled is the canonical event we count for GGR + wagering progress; the others are auxiliary. properties.amount (stake), properties.payout (win), properties.game_id, properties.game_category (slots / live / table / crash / dice / sports / other).
Sportsbook
sport_bet_placed, sport_bet_settled, sport_bet_voided, sport_cashout
Two-phase lifecycle: sport_bet_placed then later one of sport_bet_settled / sport_bet_voided / sport_cashout. properties.sport (football / basketball / tennis / hockey / mma), properties.bet_type (single / accumulator / system), properties.odds (decimal), properties.event_ref (match identifier).
Player vertical activity
players.vertical_activity is a JSONB rollup keyed by vertical:
{
"casino": { "first_at": "2026-01-15T...", "last_at": "2026-05-08T...", "bet_count": 142 },
"sportsbook": { "first_at": "2026-03-02T...", "last_at": "2026-05-07T...", "bet_count": 18 }
}
Stream-processor maintains this on every bet_settled / sport_bet_settled. The admin UI uses key presence to render "casino-only / sportsbook-only / mixed" badges on the player row.
UI gating
The admin Sidebar receives tenant.verticals from the layout. Items with a requires predicate filter dynamically:
- Sportsbook nav item appears only when
tenant.verticalsincludessportsbook. - Same pattern for future per-vertical reports / segments.
If you operate casino-only today + add sportsbook tomorrow, just open Settings → Tenant configuration + check the box. The sidebar updates immediately; existing journeys/segments untouched.