UCRM β User Manual
For CRM operators, retention managers, VIP managers, and compliance officers.
This guide walks you through the day-to-day work you do inside UCRM: finding players, launching campaigns, managing journeys, reading reports, and keeping your list healthy. No technical background required.
If you are looking for the developer or integrator documentation (API reference, adapter contract, deployment), open the Technical Documentation instead.
Table of Contents
- Welcome β what UCRM does for you
- Your first day β logging in and finding your way around
- The main dashboard β reading the numbers
- Working with players
- Segments β grouping players together
- Templates β your message library
- Campaigns β one-shot broadcasts
- Journeys β automated player flows
- The retention flow, explained
- Bonus codes
- Reports and CSV exports
- List quality β protecting your sender reputation
- Identity conflicts β catching multi-account players
- VIP tiers
- Costs tracker
- Multi-language player communication
- Compliance essentials
- A suggested weekly rhythm
- Troubleshooting β common questions
- Glossary in plain language
1. Welcome β what UCRM does for you
UCRM is where you get to know your players, talk to them, and see the results. Think of it as three things joined together:
- A player database that keeps a single, tidy record of every registered player β even when the same person has signed up with three different accounts. You can search, filter, and dig into individual player stories.
- A messaging cockpit that sends email, SMS, WhatsApp, Telegram, and push notifications. You write the message once; UCRM sends the right version, in the right language, to the right person, at the right time.
- A reporting layer that answers questions like "how many first-time deposits did we get last week?", "which players are about to lapse?", "what did our email campaigns actually earn us?".
UCRM does not run the casino. It doesn't hold player wallets, doesn't process deposits or bets, doesn't award bonuses directly. All of that stays with the gaming platform. UCRM sits alongside, watching what happens, and helping you talk to players about it.
Who uses UCRM day to day
- Retention / CRM managers β segmenting the list, launching campaigns, tuning journeys, reading the dashboard.
- VIP managers β tracking tier changes, per-player interventions.
- Compliance officers β GDPR exports, self-exclusion enforcement, audit trail review.
- Finance β cost tracking, revenue reports, campaign ROI.
Whichever role you play, you'll live mostly in the sidebar menu on the left of every page.
2. Your first day β logging in and finding your way around
Logging in
Open the admin console at your organisation's admin URL (typically https://app.casinocrm.io/). You'll be asked to sign in β UCRM uses Clerk for authentication, which means you log in with your work email and either a password, magic link, or single-sign-on (Google, Microsoft) depending on how your team configured it.
The first time you log in, someone with admin rights in your organisation needs to have invited you. If you see "Membership required" or a blank screen after login, ask your admin to add you under Settings β Team.
The top bar
Once logged in, the strip across the top of every page shows:
| Element | What it does |
|---|---|
| Organisation switcher (left) | If you belong to more than one organisation (e.g. you're a consultant working for two casinos), switch which one you're managing right now. Everything below reloads scoped to that org. |
| Project switcher | Some organisations have separate "dev" and "prod" projects, or one project per brand. Pick which one you're working with. Most operators only see one. |
| Display currency picker | Toggle whether numbers on the dashboard and reports show in EUR, USD, GBP, or your local currency. This only changes how numbers look β the underlying ledger keeps everything in the transaction's own currency. |
| User menu (right) | Your profile, sign-out, and team management shortcuts. |
The sidebar
Down the left is the main menu. Sections roughly grouped by daily importance:
- Dashboard β where you land after login. Live KPIs.
- Players β search and browse individuals.
- Segments β groups of players you can address as a whole.
- Templates β the emails and SMS you can send.
- Campaigns β one-shot sends to a segment.
- Journeys β automated multi-step player flows (welcome, retention, sunset).
- Reports β daily summaries, wagering, top players, bonus grants.
- List Quality β bounces, unsubscribes, suspicious addresses.
- Identity Conflicts β player clusters that look like multi-accounting.
- Bonus Codes β the promo codes your platform hands out.
- Providers β which email / SMS gateway sends what.
- Costs β a simple ledger for CRM spending.
- Audit β a log of every admin action.
- Settings β tenant configuration, VIP tiers, language & i18n, webhooks.
Common navigation shortcuts
- βK (Mac) or Ctrl+K (Windows) opens the command palette β start typing any player name, template, or journey and jump straight there.
- Any player id, template name, or campaign name is usually clickable and takes you to that thing's detail page.
- Every table has column-level filters at the top.
3. The main dashboard β reading the numbers
The dashboard is your morning coffee. Give it a minute every day and you'll catch problems before they become panics.
The four rows
Row 1 β Last 24 hours. Quick pulse: depositor count, deposit sum, withdrawal sum, first-time-depositor (FTD) count, net gaming revenue (NGR), daily active users (DAU). Compare these to the previous 24-hour period; the trend arrow tells you if you're up or down.
Row 2 β 30-day trends. For each KPI you get a sparkline. Hover to see a specific day's exact value. This is the row where you catch slow leaks β a small daily drop invisible on its own becomes obvious when you see 28 days of it.
Row 3 β Manager health metrics. Bounce rate over 7 days, unsubscribe rate, count of active journey runs, list quality issues open. If your bounce rate is climbing, your list has a problem before the ESP starts blocking you.
Row 4 β Recent activity. Latest deposits, latest signups, latest campaigns sent. Click any row to jump to the underlying detail.
What each number actually means
- Depositors β unique players who deposited at least once in the period. Not deposit count β same player depositing twice counts as one.
- Deposit sum β total money in.
- Withdrawal sum β total money out.
- FTD (First-Time Depositor) β a player making their very first deposit today. This is your acquisition health indicator.
- NGR (Net Gaming Revenue) β wagers minus wins, minus bonus costs. This is roughly your gross profit before operating costs. A day with NGR near zero or negative isn't necessarily bad β it can mean players hit lucky β but a week of it is a signal.
- GGR (Gross Gaming Revenue) β wagers minus wins, before bonus adjustment. Larger than NGR by the value of bonuses paid out.
- DAU β count of distinct players who did anything today (logged in, bet, deposited).
Everything is clickable
Every KPI tile drills down to the individual rows behind the number. Click "12 FTDs today" and you get a table of those 12 players β name, deposit amount, timestamp, country β and you can jump to any of them.
The "Include excluded" toggle
By default the dashboard hides players you've flagged as test, streamer, or fraud. That way your own accounts don't inflate the numbers. Turn the toggle on temporarily if you want to see the raw picture including those players (usually for fraud audits).
4. Working with players
Finding a player
Go to Players. The search box at the top accepts:
- Free text β matches on name, email, or phone
email:someone@example.comβ exact emailphone:+34612345678β exact phone (E.164 format works best)ext:gam_1234β the platform's own user idid:...β UCRM's internal player id
Below the search, the table has column filters β narrow by country, currency, KYC status, exclusion status, signup date range.
The player detail page
Click any player row and you open their detail page. It has several tabs / sections:
Header
- Full name, primary email + phone
- Country flag, VIP tier badge
- Signup date and days since signup
- Quick actions: Language, Exclude from stats, Merge, GDPR export, GDPR delete
Aggregates card
- Total deposited, total withdrawn, total wagered, total won
- NGR, deposit count, bet count
- First deposit amount and date
- Days since last deposit, days since last bet
- Session count last 30 days
Platform accounts β the two-layer identity picture
- Each row is a separate account this person holds on the gaming platform
- Shows external_id, first-seen email/phone/name, signup date on that account
- If you see multiple rows here, this Person merged several accounts. Fraud teams love this view.
Journey memberships β which automated flows this player is inside right now
- Active runs (still advancing)
- Completed runs (finished cleanly)
- Cancelled runs (self-excluded, deposited, or manually cancelled)
Recent sends β the last 20 messages we sent to this player
- Channel, template name, status (sent/delivered/opened/bounced), timestamp
- Click any row to see the actual rendered body
Event timeline β signups, deposits, bets, sessions, KYC changes β in chronological order
Editing the player's language
Every player has a Language field. Options:
- Auto (recommended default) β the system picks the language based on the player's currency and your tenant's currency-to-language map. Argentinian pesos player β Spanish, Brazilian reals β Portuguese, US dollar β English.
- A specific language (en, es, pt, cs, pl, de, fr, it) β overrides the automatic choice. Use when a player has explicitly asked to communicate in one language regardless of currency.
Once set, every campaign, journey message, and template preview uses that language.
Excluding from statistics
Sometimes you want a player kept in the database but excluded from dashboard numbers. Common reasons:
testβ your own testing account. Not a real player. Kept for engineers.streamerβ a Twitch / Kick / YouTube streamer whose numbers would distort your NGR (they wager hundreds of thousands, all comped).fraudβ an abuser you've caught but keeping in the DB to trace pattern.
Set from the player detail page. Also possible in bulk from the Players list (checkbox rows β Bulk actions β Exclude).
Important: excluded-from-stats players still receive messaging. If you want to stop messaging too, use Suppress in list quality (or set a self-exclusion for regulatory cases).
Merging two players
If you notice UCRM has two Persons that should be one (same real person, different signup account, but the deduplication didn't catch it because the email/phone were different), you can merge them manually.
- Open Player A β Merge button β paste Player B's id
- Confirm the preview (which one becomes the survivor, which one dissolves)
- Aggregates are summed. Platform accounts are re-parented. Journey runs are combined.
Merges are logged in the audit trail. They are reversible via engineering escalation but not through the UI.
GDPR β export and delete
- Export β produces a machine-readable bundle of everything UCRM knows about this player (aggregates, sends, events, audit entries). Delivered as a download or emailed to your data-protection officer.
- Delete β permanent hard delete. Every trace of personal data is removed; audit-log entries mentioning them are pseudonymised (the id stays for audit integrity, but names / emails / phones are nulled).
Both actions require a second confirmation. Both are logged in audit.
5. Segments β grouping players together
A segment is a saved question about your players. "All Argentinian players who haven't deposited in 30 days." "Players who deposited more than $500 this month." "VIPs who haven't logged in this week."
Segments are the raw material for campaigns and for triggering journeys.
Creating a segment
Segments β New segment. Give it a clear name and description β you'll thank yourself in three months when you're wondering why segment #47 exists.
Add rules one at a time:
- Choose a field (country, currency, deposit total, days since signup, KYC status, exclusion status, VIP tierβ¦)
- Choose an operator (equals, not equals, greater than, less than, is null, is in listβ¦)
- Type the value
Combine rules with AND (all must match) or OR (any matches). You can nest groups for complex logic.
The live count at the top updates as you type β a segment showing "0 players" is a signal something's wrong with your rules.
Useful segment recipes
"AR players never deposited" β for retention pushes to a specific geo
- currency = ARS
- total_deposited_native = 0
- excluded_from_stats is null
"Lapsed depositors 30-60d" β winback candidates
- first_deposit_at is not null (they've been a customer)
- days_since_last_deposit between 30 and 60
- excluded_from_stats is null
"VIP without login this week" β proactive VIP intervention
- vip_tier in [Gold, Platinum]
- days_since_last_login >= 7
- excluded_from_stats is null
"Fresh signups no KYC" β reminder push
- days_since_signup between 0 and 3
- kyc_status = "none"
- excluded_from_stats is null
Preview and export
Every segment has a Preview players button that shows the first 100 matches. Use this before firing a campaign to confirm you're targeting the right people.
The Export CSV button dumps the whole segment (email, name, phone, currency, key aggregates) for external analysis.
Freshness
Segments are re-evaluated every time they're used β the day of a campaign, at the moment of a journey trigger. There's no caching. Whatever the current player table says is what the segment returns.
6. Templates β your message library
A template is a reusable message: email, SMS, WhatsApp, Telegram, push, or webhook. You write it once, and campaigns and journeys reference it.
The template list
Templates shows every template you own. Filter by:
- Channel β email, SMS, etc.
- Status β draft, active, archived
- Category β welcome, deposit, bonus, retention, reactivation, VIP, promo, KYC, transactional, compliance, other
Category is used for filtering and for defaults; picking the right one is worth thirty seconds.
Creating a new template
Templates β New template:
- Give it a clear name β something like
Reactivation 7d β REACT7D (100% match $80). Future you will search this. - Pick a channel β this can't be changed later. If you want the same message on two channels, create two templates.
- If email: write a subject and a body (rich text editor with WYSIWYG toolbar; toggle to HTML source for direct editing).
- If SMS: write a body (plain text, keep under 160 characters if you want single-segment sending).
- Pick a category.
- Choose status = draft (still working on it) or active (ready to be used).
Merge tags β using variables
Inside your body and subject you can insert placeholders that get filled in per player:
{{first_name | default: "player"}}β the player's first name, or the word "player" if we don't know it{{event.amount_formatted}}β the amount from the triggering event (e.g. deposit sum){{current_tier_code}}β the player's current VIP tier{{bonus.max_bonus}}β the maximum bonus amount for the code being offered, in the player's currency{{bonus.min_deposit}}β the minimum deposit for that bonus{{bonus.wager}}β the wagering multiplier for that bonus
The "+ Variable" dropdown in the editor toolbar shows the full list. Unknown variables silently render as empty β always preview before sending.
Translations β reaching non-English players
Every email and SMS template has a Translations section. Add one variant per language: Spanish, Portuguese, Czech, Polish, German, French, Italian.
- Leave a language blank to fall back to the main body.
- The subject line has its own translation set, separate from the body.
- The right language is picked per-player at send time (see Multi-language player communication).
Preview and send-test
The right pane of the template detail page is a live preview β it renders the template with sample variable values. Below the preview is a Send test panel: type any email or phone, pick which provider to route through, force a language if you want, and hit Send to get the real message in your own inbox / phone.
Use send-test before every campaign launch. It costs pennies and catches typos.
Best practices for messages
- One clear call-to-action per message. If you say "deposit", also give the button, not just "log in".
- Subject line under 60 characters for mobile clients.
- Preheader β the little grey text that shows in Gmail's inbox preview. Set it explicitly; if you leave it out, Gmail picks whatever it finds first in your body.
- Don't use ALL CAPS or excessive exclamation marks β spam filters penalise them.
- Test dark mode β most inbox apps invert colours; check your template in Gmail dark mode via send-test.
- For SMS: no emojis (they force expensive Unicode encoding and double your cost). No shortened URLs from bit.ly / tinyurl (carriers block them). Use your real domain.
7. Campaigns β one-shot broadcasts
A campaign is a single send to a segment. Use campaigns for time-sensitive stuff: a weekend promo, a payment method announcement, a tournament kickoff. If you want a message that fires on some player behaviour (welcome on signup, 7 days after registrationβ¦), use a Journey instead.
The campaign lifecycle
draft β scheduled β sending β completed (or cancelled / errored).
Creating a campaign
Campaigns β New campaign. Give it a name. Then:
- Pick the segment β who receives it.
- Pick the template β what they receive.
- Pick the provider β which sending route to use (typically the default is fine).
- Set the schedule β "Send immediately" or a specific timestamp. Times are in your tenant's timezone.
- Save as draft.
Preflight β the crucial step before Send
Every campaign has a Preflight button. Always click it. It runs a dry-run and tells you:
- Recipient count β how many players match the segment right now.
- Estimated cost β for SMS, this uses per-segment GSM-7 vs Unicode detection and multiplies by provider rate.
- Warnings β recipients who would be blocked because they're on the suppression list, self-excluded, or would hit their daily frequency cap.
- Translation coverage β for multi-language templates, it tells you if any players' languages don't have a variant ("47 recipients would receive the English fallback because the
ptvariant is missing"). - Deliverability estimate β a rough guess based on your recent bounce/open rate.
If preflight is Red, fix the problem before sending. Common fixes:
- Missing translation β add the variant to the template, re-preflight
- Frequency cap warnings β check if you already sent to this segment recently
- Suppression warnings β these are correct; they're a subset that won't receive but the rest will
Sending
Send now or Schedule β the API queues one message per recipient. Delivery is rate-limited per provider so you don't get flagged for spamming. A campaign to 10,000 recipients typically finishes in 10-30 minutes depending on the throughput cap.
Reading campaign results
On the campaign detail page after sending, you get:
- Sent β attempted
- Delivered β successfully reached the provider (email/SMS accepted by ESP/carrier)
- Bounced β hard bounces (bad address) and soft bounces (temporary failure) shown separately
- Opened β for email, based on tracking pixel
- Clicked β for email, based on link tracking
- Unsubscribed β hit unsubscribe link
- Suppressed β blocked before sending because of suppression list
- Capped β blocked before sending because of frequency cap
Below the numbers is a per-recipient table you can filter and export. Click any row to see the actual delivery record.
Conversion, if you've wired it: how many recipients deposited within N days of receiving the campaign, and the value of those deposits. This is where ROI happens.
When not to use a campaign
- Anything that should fire on a specific player action β Journey (welcome, deposit confirmation, reactivation).
- Anything targeting a moving segment ("all AR players never deposited") over time β Journey with a segment trigger.
8. Journeys β automated player flows
A journey is an automatic multi-step message flow. Each player enters, advances through waits and conditions and sends, and eventually exits. Journeys are how your onboarding, retention, transactional, and VIP flows run without you touching them.
Anatomy of a journey
Every journey has:
- A trigger β the event that puts a player into the journey. Options:
signup,first_deposit,deposit_confirmed,withdrawal_confirmed,segment_entered,manual. - A graph β the sequence of steps. Each step is one of: wait (pause for N days/hours), condition (check a fact about the player, branch to true/false), send message (fire an email/SMS/etc.), webhook (call an external system), end (finish the flow).
- A status β draft, active, paused, archived.
Viewing your journeys
Journeys shows every journey with its trigger, node count, currently-running count, and status.
Common journeys on a typical tenant:
- Welcome β on signup β one send when a player registers.
- Deposit successful β transactional email confirming a deposit.
- Withdrawal confirmed β transactional email confirming a withdrawal.
- Reactivation β never deposited β the multi-touch retention flow (see next section).
Journey detail page
Click any journey to open its detail. You see:
- A visual graph of the flow with every step labelled β wait boxes, condition diamonds, send-message rectangles.
- A stats panel β currently active runs, completed runs, cancelled runs, delivery totals.
- A recent runs table β the last 100 players to enter, with their current step and next-wake time.
Pausing and resuming a journey
Big red Pause button. When paused:
- No new players enter the journey.
- Players already inside keep advancing normally. If you also want to freeze them, use Cancel all runs from the actions menu.
When you resume, new entries start again. Cancelled runs never restart automatically.
Editing a journey
The graph editor lets you drag-and-drop steps. Add a new wait, insert a send-message between two existing steps, wire a condition to skip the next step if the player has deposited. Small edits are safe; you can save changes any time.
Big changes (rearranging the whole flow) are safer in a copy β clone the journey, edit the copy, test with a small trigger, then swap once you're happy. Existing runs on the old graph will finish on the old graph; new entries will use the new one.
Adding a step
- Click the "+" between two existing nodes.
- Pick the step type (wait / condition / send message / webhook).
- Fill in the parameters (duration, template, providerβ¦).
- Save.
For a send_message step: pick the template first, then pick the provider (which sending route). The rest happens automatically.
For a condition step: pick a field (usually total_deposited), pick an operator (>, <, =, β¦), pick a value, then wire the "if true" and "if false" branches. Typical use: check if the player deposited before sending the next nudge β if yes, exit the journey; if no, continue.
Journey best practices
- Guard every send with a condition check for the outcome the journey is chasing. If you're trying to convert non-depositors, put a "check total_deposited > 0" node before each send-message so the flow exits as soon as they convert.
- Space sends by at least 24 hours unless you have a very specific reason. Multiple sends in one day feels spammy.
- Don't build 50-step monsters. If a flow has more than 15 nodes, split it into two journeys chained by segment entry.
- Name every step clearly in the "step id" field β future you or your colleague needs to read this and understand.
9. The retention flow, explained
The most complex live journey is "Reactivation β never deposited". It's the multi-touch nudge for players who registered but didn't fund the account. Here's exactly what it does, in plain language.
The timeline
| Day | Channel | What happens |
|---|---|---|
| 0 | β | Player registers. Journey run starts. |
| 3 | Winback β welcome bonus (never deposited) β "we've saved your $2,250 + 150 spins welcome bonus". | |
| 7 | Reactivation 7d β REACT7D β "100% match up to $80, use code REACT7D". | |
| 10 | SMS | REACT7D SMS reminder β 3 days after the email, we chase by text. |
| 14 | Reactivation 14d β REACT14D β "150% match up to $500, use code REACT14D" (bigger deal, second push). | |
| 17 | SMS | REACT14D SMS reminder β 3 days after the email. |
| 30 | Reactivation 30d β CHIP10 β "$10 free chip, no deposit needed, code CHIP10". | |
| 33 | SMS | CHIP10 SMS reminder β last friendly push. |
| 90 | Reactivation 90d β Sunset β "still interested? one last email". |
The deposit guard
Before every one of those sends, the journey runs a condition check: did the player deposit yet?
- Yes β exit the journey. No more messages. The player is now onboarding under the Welcome flow.
- No β continue to the next step.
That's why nobody who deposits keeps getting nudged. The instant a deposit event lands from the platform, the guard flips at the next step and the run ends cleanly.
Language handling
Every message in the flow has an English body and a Spanish body. The system picks based on the player's currency and language preference:
- Argentinian pesos player β automatically gets Spanish
- US dollar player β English
- Player who explicitly set Spanish β Spanish regardless of currency
You never have to think about this per player β it just happens.
Cost per player, full flow
- Email Γ 5 = free (bundled in your ESP subscription)
- SMS Γ 3 = ~$0.12 (EN, one segment each) or ~$0.24 (ES with accents, two Unicode segments each)
For a typical ~200 Argentinian player cohort, the SMS chase costs about $46 total for the whole 90-day flow.
Overriding the flow for a specific player
You can cancel a player's journey run from their detail page β Journey memberships β click the active run β Cancel run. Use this when you know a player has been in touch offline and shouldn't get automated nudges.
Turning the whole flow off
Journeys β Reactivation β never deposited β Pause. New signups won't enter; existing runs continue. To also stop existing runs, cancel them from the runs table.
10. Bonus codes
The Bonus Codes section holds your reference table of promotional codes: what each code offers, in what currency, with what conditions.
Why it exists as its own thing: templates reference codes by name (REACT7D, WELCOME2250, CHIP10) but the actual amount someone gets in Argentinian pesos versus US dollars is different. The bonus code table maps the code + currency pair to the specific offer.
The table
Each row has:
- Bonus type β a slug like
reactivation_7d,welcome_d1,reactivation_30d. This is what internal code references. - Currency β ISO code (USD, EUR, ARS, BRLβ¦).
- Code β the actual coupon string the player enters (
REACT7D). - Min deposit β what the player must deposit to trigger the bonus (0 for non-deposit chips).
- Max bonus β the ceiling on the bonus payout in this currency.
- Wager multiplier β the rollover requirement (e.g. 35Γ means the bonus + deposit must be wagered 35 times before withdrawal).
- Percentage β for match bonuses (100%, 150%). Blank for non-deposit chips.
- Non-deposit β true/false flag.
- Lifetime β how long the bonus stays claimable after issue.
Adding or updating a code
When your platform changes a bonus (raises the ceiling, changes the wager), update the corresponding row here. Templates that reference {{bonus.max_bonus}} will pick up the new number automatically on the next send.
Bonus Codes β New entry or click any existing row to edit.
If a bonus is offered in multiple currencies, you create one row per currency, all sharing the same code string but with different amounts.
Retiring a code
Set is_active = false on the row. The code stays in the DB for historical reference but new sends won't reference it. If you delete the row, historical send records lose their bonus context β usually you want deactivate, not delete.
11. Reports and CSV exports
Reports is where you answer questions about revenue, activity, and bonus economics over a date range.
The four main reports
| Report | Question it answers |
|---|---|
| Daily summary | For each day, how many depositors, total deposits, withdrawals, GGR, NGR? |
| Wagering | Per player, how much did they wager over the period? |
| Bonus grants | Per player, what bonuses were granted, redeemed, expired? |
| Top players | Sorted by NGR, deposit sum, or bet count β who are your best players over the period? |
Running a report
Pick the report β set the date range (default: last 7 days) β pick the currency you want amounts shown in β click Generate.
Small reports return immediately. Large reports (> 100k rows) queue in the background and email you a download link when ready.
Excluded players
By default reports exclude players flagged as test, streamer, or fraud. There's a checkbox to include them; use it for fraud audits or to see the raw picture.
The currency toggle
Every amount in a report is shown in the tenant's base currency (usually EUR) or your display currency choice (top bar). The underlying data is stored in the transaction's native currency and converted at the transaction's date FX rate.
Column headers include the currency code so there's no confusion: deposit_sum_eur, ngr_eur.
CSV export
Every report has an Export CSV button. The CSV mirrors the on-screen view: same columns, same filter, same currency. Open in Excel, Google Sheets, or feed to your BI tool.
Drill-down
Every summary tile is clickable. "Deposits = 47 EUR 12,340" β click β get the 47 individual deposit rows with player, amount, method, timestamp.
12. List quality β protecting your sender reputation
Your sender reputation is fragile. Every hard-bounce email you send hurts your ability to reach your good addresses. Every spam-flagged SMS burns your relationship with the carrier. List quality is where you spot problems early.
The dashboard
List Quality β Email or List Quality β SMS. Each panel shows:
- Bounce rate β hard vs soft, trending over 30 days
- Unsubscribe rate
- Frequency-cap hits β how often the daily-send cap fires; a rising number means your journeys are stacking too much on one player
- Suspicious address patterns β automatically-detected: disposable-domain emails, wrong-shape phone numbers per country, prefix families ("user1@β¦", "user2@β¦", "user3@β¦" all on same phone)
Reacting to issues
Every row has an action menu:
- Suppress β write a manual entry to the suppression list. Future sends to this address on this channel are blocked. Use for known-bad addresses.
- Mark OK β the row is real but flagged by our detector; mark it reviewed so it doesn't re-surface tomorrow.
- Open player β jump to the underlying player detail.
The suppression list
Any address that has been suppressed is blocked from receiving new messages, regardless of segment or journey. Suppression reasons:
bounce_hardβ the address doesn't exist (permanent block, never lift)unsubscribeβ the player clicked unsubscribe (never lift unless they explicitly re-opt-in)spam_complaintβ the player marked us as spam (never lift)stop_keywordβ SMSSTOPreply (never lift)manualβ you or a colleague added the entry manually (lift-able via list quality)
SMS-specific insights
- Reachability by country β share of your numbers passing the classifier's country + mobile check
- Unicode-forced share β how many of your recent SMS were forced to expensive Unicode (usually because of emojis or accented characters). High share β expensive SMS bill.
- Alphanumeric-sender-eligible destinations β countries where you can send from "TIKETABET" instead of a random phone number, greatly improving deliverability
Weekly rhythm
Give this 3 minutes on Monday morning. If nothing is red, move on. If anything jumps, deal with it before launching new campaigns that could compound the problem.
13. Identity conflicts β catching multi-account players
The Identity Conflicts page surfaces Persons whose account patterns look like multi-accounting β one real human with many registrations, usually to farm bonuses.
What clusters look like
Each cluster shows:
- Cluster size β how many platform accounts under one Person
- Shared identifier β the common signal (usually phone number, sometimes email domain pattern)
- Member accounts β table showing every account: external_id, email, phone, signup date, GGR, current balance
- Suspicion score β 1β10 scale, higher = more suspicious
Common patterns:
- Same phone, 31 accounts (real case: user "Shifatte" had 31 accounts sharing one phone, all with slightly-varied emails, all had wagered heavy bonus play with $0 real deposits)
- Same email prefix + shared phone ("user1@β¦", "user2@β¦", "user3@β¦" all on same number)
- Same device fingerprint (if your adapter provides it)
Reacting to a cluster
Two big buttons per cluster:
- Mark cluster as fraud β flips every member's
excluded_from_stats = 'fraud'. Removes them from dashboard and reports. Preserves the DB record for pattern matching. Adds an audit-log entry with your Clerk id. - Un-exclude (per member) β for false positives, restore a specific account to normal.
Fraud tag does NOT stop the platform. UCRM only affects CRM view + reports + our own messaging. If you want to freeze the player at the gaming platform, do that separately in the platform's admin.
When to review
- Immediately if the cluster is spending big and the pattern is obvious (bonus abuse: dozens of accounts, all $0 real deposits, all wagered heavy bonus play)
- Weekly for smaller clusters (5-10 accounts sharing an identifier β could be genuine family / shared device or could be low-scale fraud)
14. VIP tiers
Settings β VIP tiers lets you configure your loyalty ladder. Default seed: Bronze β Silver β Gold β Platinum.
What a tier holds
- Code β internal identifier (BRONZE, PLATINUM)
- Display name β the badge label
- Promotion threshold β the metric + comparison that promotes a player automatically (e.g.
total_deposited_base >= 500000= 5000 base currency) - Perks β free-text list rendered in the tier badge tooltip
- Bonus multiplier β how much the standard bonus max is scaled for this tier (default 1.0)
Auto-promotion
A background job runs nightly and promotes anyone who crossed a threshold. Demotions are always manual β regulatory sensitivity means we don't auto-strip status.
Using tiers in messages
Templates can reference {{current_tier_code}} and render tier-specific content. Segments can filter by vip_tier in [Gold, Platinum] to build VIP-only campaigns.
Manual tier change
Player detail page β VIP tier dropdown. Overrides auto-promotion until the player next crosses a threshold (then auto takes over again).
15. Costs tracker
Costs is a simple ledger for your CRM-related spending. Not a full accounting system β a place to log spend so you can pair it with revenue for ROI.
Adding a cost
Costs β New cost:
- Date the cost was incurred
- Amount + currency
- Vendor (Twilio, ElasticEmail, contractor nameβ¦)
- Category (SMS, email, hosting, tooling, contractor)
- Notes (invoice number, description)
- Attachment (invoice PDF, screenshot)
Amount is stored in native currency and converted to base currency at the entered-date FX rate. Attachments are stored server-side (up to 10 MB per file).
Reporting on costs
The Costs list aggregates by category / vendor / month. Use it to answer:
- What did SMS cost me last month?
- What's the total spend on this campaign's SMS chase?
16. Multi-language player communication
UCRM picks a message language per player, per send, using this order:
- The player's explicit language setting on their detail page (
Language = Spanish, for example) - The tenant's currency-to-language map β configured under Settings β Language & i18n (e.g. "ARS β Spanish", "BRL β Portuguese")
- The tenant default language β usually English
- English as final safety net
Configuring the currency-to-language map
Settings β Language & i18n shows:
- Default language β dropdown, applies to any player whose currency isn't in the map
- Currency β Language map β one row per currency you want to override
Example config:
| Currency | Language |
|---|---|
| ARS | Spanish (es) |
| BRL | Portuguese (pt) |
| USD | (not set β falls to default English) |
| EUR | (not set β falls to default English) |
Adding a translation to a template
Templates β click any template β Translations section (at the bottom of the editor) β for each language, write a subject + body variant. Leave a language blank to fall back to the main body.
How players end up with the right language
- Auto-mode (default) β currency-to-language map decides. Argentinian pesos β Spanish.
- Explicit override β on the player detail page, set Language to a specific value (English, Spanish, Portugueseβ¦). This wins over the map.
- Auto (null) β restores the map-based automatic behaviour.
You can override in bulk from the player list: checkbox multiple players β Bulk actions β Set language.
17. Compliance essentials
UCRM is designed to make regulatory life easier. Here's what you get for free.
GDPR β right to access
Player detail page β Export data β produces a JSON bundle with every piece of personal data UCRM holds about the player: their record, aggregates, all sends, all events, all audit entries mentioning them. Delivered as a download or emailed to your data-protection officer.
GDPR β right to erasure
Player detail page β Delete player β hard delete. Confirms twice. All personal data is removed; audit-log entries are pseudonymised so the trail stays intact but personal fields (name, email, phone) are nulled.
Self-exclusion (RG)
If a player self-excludes at the platform level (or via a UCRM API call from your integration), UCRM:
- Immediately writes suppression entries for every known contact address of that player
- Cancels any messages already in the queue for that player at worker pick-up
- Drops the player from journey runs at the next condition check
- Blocks new campaign targeting via the suppression check
Nothing needs to be done manually β the whole system honours self-exclusion end-to-end.
Audit log
Every admin mutation is logged. Audit in the sidebar shows the append-only log with filters by user, resource, date range. Never edited, never deleted. This is the trail regulators care about.
Fields per entry:
- When
- Which admin user (Clerk id)
- What resource (player, template, campaign, journeyβ¦)
- What action (create, update, delete, exclude, mergeβ¦)
- Before / after snapshot for updates
18. A suggested weekly rhythm
If you're new to UCRM and wondering "what should I actually do every week?", here's a starter routine.
Monday morning (10 minutes)
- Open the Dashboard. Note the 7-day trend. Anything red or dropping? Investigate.
- List Quality β Email and List Quality β SMS. Suppress obvious problem addresses. Mark OK anything that's a false positive.
- Identity Conflicts. Any new clusters? Skim them, flag anything abusive.
Wednesday (20 minutes)
- Reports β Daily summary β pull the last 7 days. Any day with wildly different NGR from the pattern? Dig in.
- Campaigns β review last week's sent campaigns. Which had good open / click / conversion? Which flopped? Note what to change next time.
- Journeys β glance at the active-runs count for each. Any stuck at zero (not triggering)? Any showing high error rate?
Friday (10 minutes)
- Plan the weekend / next week's campaigns. Preflight anything you'll send.
- Skim Audit log for the week. Any admin action that looks out of the ordinary?
- Update the Costs tracker with any new invoices.
Monthly
- Review VIP tier movements. Anyone promoted? Anyone stuck at Gold when they should be Platinum?
- Pull Top players report β say hello personally to the top 10 through your VIP manager.
- Review journey completion rates. Any journey with a rising cancel rate needs a copy tune-up.
19. Troubleshooting β common questions
"I sent a campaign but nobody received it"
- Check the campaign status on its detail page. Is it
sentorfailed? - If
failedβ click into the error message. Usually a provider config issue. - If
sentbut bounces high β your list has degraded. Run List Quality review first. - If
sentbut zero deliveries after 30 min β the provider is down. Check its status page.
"The dashboard number looks wrong"
- Verify the Include excluded toggle β you might be including or excluding fraud/test accounts unintentionally.
- Check the display currency β you might be looking at USD when your base is EUR.
- Check the date range β the default is 24 hours, sometimes you're expecting 7 days.
- Click into the tile to see the underlying rows β the drill-down explains the number.
"A player isn't getting our reactivation emails"
- Open their detail page. Do they show a Journey membership in the reactivation journey?
- If not: check if they meet the trigger criteria. Are they excluded from stats? Are they suppressed?
- If yes but no sends: look at the Recent sends tab. Any bounces or suppressions?
- Their
languageanddefault_currency_codeβ is there a template variant for that language?
"I need to stop all messaging right now"
Emergency stop:
- Journeys β pause every journey (bulk-select all, then Pause)
- Campaigns β cancel any scheduled campaigns
- Providers β set every provider to
paused
New sends stop within one minute. In-flight sends currently in the provider's queue may still land β those are outside UCRM's control once handed off.
"A player's phone / email is wrong"
Player detail β Edit section β correct the value β save. This updates the primary field. The platform account sub-table retains the historical value under first_phone / first_email for audit.
"How do I add a new admin user"
Top bar β user menu β Team β Invite member. They receive a Clerk invitation email. Once accepted, they show up in the team roster with default role basic_member β promote to admin if needed.
"Something broke at 3am and nobody knows what"
Audit log shows every admin action with a timestamp. Filter by the time window and by resource. If the change happened via API not admin, the log entry shows the API key that made it.
For system-level failures (provider outage, worker crash), open a ticket with your engineering team β they have the operational monitoring dashboards.
20. Glossary in plain language
Terms you'll see across UCRM, translated for humans.
- Adapter β the technical link between UCRM and your gaming platform. If it works, you never see it.
- Aggregate β a rolled-up total on a player (total_deposited, NGR, etc.) recalculated whenever a new event lands.
- Base currency β the currency you've picked for your tenant to keep consolidated totals in. Usually EUR.
- Bonus code map β the table that says "code REACT7D in Argentinian pesos means 100% match up to 136,000 ARS with a 35Γ wager".
- Campaign β one-shot broadcast to a segment.
- Channel β how a message travels: email, SMS, WhatsApp, Telegram, push, webhook.
- Condition β a decision step in a journey ("has the player deposited yet?").
- Cursor β for API paging; just a way to say "give me the next batch".
- Depositor β a player who has deposited at least once in the given period.
- Excluded from stats β a player kept in the DB but hidden from dashboards / reports (test account, streamer, or fraud).
- FTD β First-Time Depositor. Someone making their very first deposit.
- Frequency cap β the maximum number of messages a single player receives in 24 hours.
- GGR β Gross Gaming Revenue = wagers minus wins, before bonus cost.
- Guard β a condition step in a journey that decides whether to continue or exit.
- Identify β the action of telling UCRM "here's a player, either create or update their record". Usually done by the platform adapter, sometimes triggered manually.
- Journey β automated multi-step player flow.
- Journey run β one player's traversal of one journey. Multiple players in the same journey = multiple runs, each at its own step.
- KYC β Know Your Customer, the identity verification process.
- List quality β the collective health of your addressable player list.
- NGR β Net Gaming Revenue = GGR minus bonus payouts and chargebacks. Roughly your gross profit before OPEX.
- PlatformAccount β one row per source-platform account under a Person. The two-layer identity model gives you visibility into all accounts a real person holds.
- Person β the single deduplicated identity for a real human. Merged from as many PlatformAccounts as we've associated with them.
- Preflight β the pre-send dry-run that shows recipients, cost, warnings.
- Preheader β the little preview text in Gmail below the subject line.
- Provider β a configured route for sending messages (Twilio SMS, ElasticEmail, Telegram bot, etc.).
- Segment β a saved query defining a group of players.
- Send-test β a diagnostic send of one message to a chosen email/phone for preview.
- Subunit β the smallest whole-number denomination of a currency (cent for USD). UCRM stores all money in subunits to avoid decimal errors.
- Suppression β an entry that blocks all future sends to a specific address on a specific channel. Bounces, unsubscribes, and STOP replies all create suppressions.
- Tenant β one whole customer organisation inside UCRM. Multi-brand operators have one tenant per brand, or one tenant with multiple projects.
- Trigger β the event that puts a player into a journey (signup, first deposit, segment entry, manual).
- Wager multiplier β the rollover requirement on a bonus (35Γ means the bonus + deposit combined must be wagered 35 times before withdrawal).
Have a suggestion for this manual? Open an issue on the CRM squad's tracker or drop a note in the #crm channel. Version 2026-08-14.