First tenant setup
This walkthrough takes you from fresh signup to first welcome bonus journey in about 15 minutes.
1. Sign up + create tenant
Go to app.casinocrm.io/sign-up. Clerk handles auth — pick a workspace name; it becomes your tenant.
2. Configure your tenant
Navigate to Settings → Tenant configuration. Three things to set:
| Field | What it does |
|---|---|
| License jurisdiction | Auto-suggests verticals + KYC model + RG features for your license. Pick the closest to yours; override below. |
| Verticals | Which products you run — casino, sportsbook, lottery, poker, esports, virtual_sports, bingo. Disabled verticals hide their reports + segments + journeys from the UI. |
| KYC model | platform_owns (your platform handles KYC, CRM mirrors webhooks) / crm_owns (CRM initiates, platform listens) / dual (mixed by KYC level) / none (no KYC tracked). |
Click Save configuration — capabilities cache invalidates within seconds.
3. Set up your first project
A project is a logical environment within a tenant (production / staging / dev). Every API call carries a project's API key. Most operators run a single project; multi-project comes into play when you want strict separation between staging events and production.
Navigate to Settings → Projects → Create project. Note the API key — you'll need it in step 5.
4. Add a messaging provider
Navigate to Providers → Add provider. Pick a channel + provider:
- Email → Postmark (server token + from address)
- SMS → Twilio (Account SID + Auth Token + from number or Messaging Service SID)
- Push → FCM (project_id + service-account JSON)
- Telegram → Grammy (bot token)
Save. The credentials are encrypted at rest with the project key.
5. Send your first event
Replace YOUR_API_KEY with the project key from step 3.
curl -X POST https://api.casinocrm.io/v1/events \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"event": "signup",
"external_id": "demo_player_001",
"anonymous_id": "anon_abc",
"timestamp": "2026-05-08T10:00:00Z",
"properties": {}
}'
You should see {"data":{"ingestion_id":"..."}}.
The event lands in ClickHouse + the player is upserted in Postgres. Visit Players in the admin to see it appear within ~5 seconds.
6. Identify the player
Tell UCRM "this anonymous_id is actually player+demo01@example.com":
curl -X POST https://api.casinocrm.io/v1/players/identify \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"external_id": "demo_player_001",
"anonymous_id": "anon_abc",
"traits": {
"email": "player+demo01@example.com",
"phone": "+15551234567"
}
}'
The player now has email + phone + can receive campaigns.
7. Create your first segment
Navigate to Segments → New segment → name it "All players" → leave the condition empty (matches everyone) → Save. UCRM materializes the membership; the GIN index on players.segment_ids[] makes campaign fan-out fast even on 1M-player tenants.
8. Author your first template
Navigate to Templates → New template → pick channel email, paste:
<p>Welcome, {{first_name | default: "player"}}!</p>
<p>Here's your free spin code: <strong>WELCOME10</strong></p>
Variables in {{double-curlies}} are Mustache-rendered against the player's traits.
9. Build your first journey
Navigate to Journeys → New journey → trigger signup → drop a wait 24h node → drop send_message (pick your template + provider) → connect to end.
Click Activate — UCRM listens for signup events on this project; every new signup walks the graph.
10. Watch it work
Trigger another signup event for demo_player_002. Within seconds you'll see:
- New player row in the Players list
- Journey run starting in Journeys → Runs
- After 24 hours of wait, the email sends; Campaigns → Recipients shows delivery status
You're operational. Next steps:
- Bonus engine — issue match bonuses with wagering rules.
- VIP tiers — auto-promote whales to Gold.
- Adapter integration — wire your casino platform's webhooks.