License-aware tenant config
UCRM is license-agnostic. The same code path serves a Nevis crypto casino and a UK GamCom regulated sportsbook. License + verticals + KYC ownership + responsible-gaming features are per-tenant configuration — never hardcoded.
Supported licenses
| License | Suggested verticals | Suggested KYC | Suggested RG features |
|---|---|---|---|
| Nevis | casino | platform_owns | self_exclusion |
| Curaçao | casino | platform_owns | self_exclusion + deposit limits |
| MGA / Malta | casino, sportsbook | dual | full RG suite |
| UK GamCom | casino, sportsbook | dual | MGA + affordability_check + session_cooldown |
| CZ | casino | platform_owns | MGA + session_cooldown |
| Gibraltar | casino, sportsbook | dual | MGA-equivalent |
| Isle of Man | casino, sportsbook | dual | MGA-equivalent |
| Kahnawake | casino | platform_owns | Curaçao-level |
| Anjouan | casino | platform_owns | Nevis-level |
| Comoros | casino | platform_owns | Nevis-level |
These are recommendations. The operator can override anything per tenant — UCRM doesn't enforce regulatory compliance (that's your compliance team's job), but the defaults give you a sensible starting point.
Tenant configuration shape
{
"license_jurisdiction": "mga",
"verticals": ["casino", "sportsbook"],
"kyc_model": "dual",
"config": {
"rg_features": [
"self_exclusion",
"deposit_limit_daily",
"deposit_limit_weekly",
"loss_limit_daily",
"session_limit_minutes",
"reality_check"
],
"messaging": {
"quiet_hours": { "start": "22:00", "end": "09:00", "default_timezone": "Europe/Malta" },
"frequency_caps": {
"email": { "per_day": 1, "per_week": 5 },
"sms": { "per_day": 1, "per_week": 3 }
}
}
}
}
Effective capabilities
When a request hits an endpoint, UCRM computes effective capabilities = tenant.config ∩ adapter.capabilities. Examples:
- Sportsbook nav item in the sidebar shows when
tenant.verticalscontainssportsbook. - "Request KYC" admin button shows when
tenant.kyc_model = 'crm_owns' or 'dual'AND the project's adapter supportskyc.initiate. - Self-exclusion enforcement — even if the casino platform doesn't enforce on its side, CRM filters self-excluded players out of every campaign send. (Capability_mock pattern.)
When adapter doesn't support a feature
If your tenant wants deposit_limit_daily but the adapter you're using doesn't support it on the platform side, UCRM puts the feature in crm_only mode. The CRM still tracks the limit + suppresses sends accordingly, but doesn't propagate to the platform. The admin UI shows a "CRM-only" badge so operators understand the trade-off.