GhostGames Admin — Complete Knowledge Base

A full structural, functional and business-logic analysis of the GhostGames back-office (stg-admin.clkgame.com) — the operator console for a Korean-market online gambling platform covering sports betting, live casino, slots, minigames, an affiliate/agent hierarchy, and fiat + crypto cashiering.

11 top-level modules108 catalog entries~150 API endpoints 94 page permissions62 action permissionsNext.js App Router Analysed 19 Aug 2026

§Executive summary

What this system is, in one paragraph.

GhostGames Admin is the operator console (back office) for a white-label online gambling platform aimed at the Korean market. It is not a public website and has no marketing surface, no pricing page and no self-service signup — it is a pure internal tool whose "customers" are the operator's own staff and its affiliate network. The player-facing product lives on a separate host (stg-game.clkgame.com, linked from the header as "Site Home").

The console does five jobs: (1) move money — approve manual bank deposits and withdrawals, reconcile bank SMS messages, run a crypto cashier; (2) run the games — configure sports feed, markets, odds delays, casino/slot vendors and minigame odds, and watch every bet; (3) manage players — levels, limits, KYC-ish bank verification, blocks, IP controls, memos, and manual balance adjustment; (4) run the affiliate hierarchy — a five-tier agent tree with rolling and losing commission settled twice a month; (5) run the bonus economy — coupons, payback, comp points, attendance, referral, roulette and a "rolling challenge" leaderboard. Everything is wrapped in a fine-grained RBAC layer, an audit log, IP whitelists and TOTP two-factor auth.

5agent tiers
~110casino / slot vendors
49sports (incl. virtuals)
8member levels × 24 sub-types
5minigame providers
13real-time alert queues
How to read this document. Sections 1–8 answer the analysis brief. The Page catalog is the replication-grade reference: every route, its filters, its table columns, its actions and the API calls it makes. Use the search box there to jump to any screen.
Data handling. This knowledge base documents structure only. No member records, balances, account numbers, wallet addresses, API keys or personal data from the staging environment have been copied into it. Where a screen exposes secrets (notably the crypto-payment integration page), that fact is noted but the values are not reproduced.

1Content analysis & purpose

What the product is, who it serves, and what every piece of visible text is telling you.

1.1 Value proposition

The system's implicit promise to an operator is "run a full multi-vertical gambling site without building anything." Sports feed, casino aggregation, minigames, cashier, affiliate settlement, bonus engine, risk tooling and reporting all ship in one console. Configuration is exhaustive — nearly every commercial parameter (rollover ratios, bet limits per level, cancellation windows, payback rates, comp ratios, referral bonuses, promotion visibility) is editable in the UI rather than hard-coded, which is the signature of a platform built to be resold to multiple operators.

1.2 Who uses it

AudienceWhere they live in the productWhat they need
Super admin / operator ownerSettings, Admin Management, AnalyticsConfigure commercial rules, create staff, read P&L
Cashier / finance operatorFinance module, alert stripApprove deposits & withdrawals fast, match bank messages
PayCore operatorPaycore accounts, deposits, withdrawalsA restricted cashier identity with per-transaction min/max limits and its own audit trail
Risk / trading deskBetting Status, Sports Game Management, VIP & watch-listSpot high stakes and arbitrage, lock markets, delay odds, revert results
Customer supportContent module (inquiry, messages, top notice)Answer 1:1 tickets with templates, blast messages
Agent / affiliateAgents module (scoped view)See their sub-tree's members and revenue, request settlement

1.3 Product surface — what is actually on screen

Every page shares a three-band chrome:

  1. KPI band — Deposit (count, people), Withdrawal (count, people), Cash Profit, Live Betting amount + live-player count, total user Balance, total user Points, Casino Funds, Active Users. Refreshed from GET /backend/stat/header.
  2. Alert strip — 13 counters, each a deep link into a work queue: Deposit Application, Withdrawal Application, Member Registration, Inquiry, Account Inquiry, High Betting (Casino / Sports / Minigame), Casino Unprocessed, Minigame Unprocessed, Account Check Pending, Agent Withdrawal, Unmatched Deposit Message, Result Reversal, Admin Notice. Polled from GET /backend/stat/alert, which returns a {count, last_id} pair per queue so the client can fire a sound only for genuinely new items.
  3. Module bar — Content · Agents · Betting Status · Sports Game Management · Minigame · Finance · Analytics · Members · Coupon System · Crypto Payment · Settings, each a hover/click dropdown. Plus Site Home, language switcher (English / 한국어) and Logout.

Below the chrome, screens follow one of four templates: filter + table (about 70 % of pages), settings form, composer (message / coupon / bulk payment), or dashboard (KPI cards + chart). Table pages almost always carry a "• Search Filter" panel with a date range plus quick presets (Last week / This week / Next week / Yesterday / Today, or the monthly equivalents), one or more status/type selects, a search-field selector, and often an Excel export.

1.4 Policies, help text and rules surfaced in the UI

There is no legal/T&C surface in the admin, but operational rules are written into inline help. The most substantive:

  • Bank account verification — "Records exceeding 10 minutes without approval/rejection remain in pending status."
  • Login-failure blocking — "Members who failed login 3+ times within 30 minutes."
  • Attendance — "If an attendance streak exceeds 30 days, attendance after day 30 restarts from day 1."
  • Rolling challenge — resets Weekly (Mon 00:01), Biweekly (1st & 16th 00:01) or Monthly (1st 00:01); changes apply from the next round.
  • Market config — "Deactivation on this page takes priority over match-level market-type deactivation."
  • Casino min bet — "0 means no limit. Bets below this amount are rejected in the game BET callback."
  • Point conversion — rollover ratio expressed as an integer percentage where 300 = 3×.
  • Coupon revoke — "⚠️ This feature revokes coupons for multiple users at once. Use with caution."
  • Page banners — "Banners are auto-generated and only images can be edited."
  • Rolling Challenge feature flag — "When enabled, the Rolling Challenge settings page appears in the Content menu, and rolling points accrue on betting."
  • Notices & deposit notes accept markdown links in [label](https://example.com) form; message templates accept a {회원명} (member name) placeholder.

The public rulebook itself is authored here too — the Notice & Rules screen contains per-sport regulation documents (football, basketball, baseball, ice hockey, volleyball, American football, MMA/boxing, e-sports), plus platform rules such as "양방 베팅 강력 규제 안내" (strict arbitrage-betting regulation), "축 베팅 및 보험 베팅 안내" (arb/insurance betting), "게임별 롤링 안내" (per-game rolling), "회원 등급별 베팅/당첨 상한" (bet/win caps by member grade) and virtual-sports guidance.

2Functionality mapping

Every interactive pattern, navigation path, real-time feature and integration point.

2.1 Navigation model

A flat two-level menu: 11 modules → 4–18 leaf pages each, no third level. There are no breadcrumbs; the module bar is the only persistent wayfinding. Cross-navigation happens through three other channels, which matter more in daily use than the menu:

  • Alert deep links carry pre-applied query state, e.g. /betting/casino?status=BETTING and /finance/unprocessed-deposits?is_matched=false — the counter is a saved search, not just a badge.
  • Entity chips — a member chip [LV.2-C] id (nickname) or an agent chip id (name) Main Branch code appears in almost every table and opens the corresponding detail modal in place. This is the real navigation spine.
  • Modals — Member Detail, Agent Detail/Edit/Add-Sub, Market management, Bet detail, Adjust Money/Points, Manual Cash. No route change, so modal state is not linkable.

2.2 Interactive element inventory

PatternWhereNotes
Date-range picker + presets~60 pagesTwo dialog-based date buttons; presets differ by page (weekly set vs monthly set); betting pages use datetime with 00:00 / 23:59 defaults
Custom listbox (role=combobox)EverywhereNot native <select>; options render on open. Used for status, type, provider, agent, search-field
Search-field selector + free textMost tablese.g. Members: ID/Nickname · Nickname · ID · Name · Phone · Agent · Account Number · Wallet Address · Birth Date · By Level
Agent hierarchy pickerMembers, Analytics, Adjustments, MessagesTree from /backend/agents/hierarchy-tree/admin or /simple-tree/admin, with "Include Sub-agents" toggle
Page-size selectorMany tables20 / 50 / 100 items, with << < 1 2 3 > >> pager
Excel export≥12 pagesGated by the EXCEL_DOWNLOAD permission; member-list exports can additionally require a File Download Password
Excel importBulk payment, bulk message, bulk coupon issue"Excel Upload" / "Bulk Send via Excel" / "Excel Bulk Issue"
Bulk row operationsBulk withdrawals, coupon revoke, IP blocks, deposit messagesSelect All → Bulk Allow / Bulk Reject / Bulk Release / Bulk Delete / Mark All Matched
Drag-to-reorderInquiry templates, banners, popups, casino categoriesExplicit "Drag" handle or Move Up / Move Down
Rich composer with type tabsMessages, inquiry repliesText | Image/Link, optional image attach, button colour
Toggle / switchAll settings pagesActive / Operating / Enable, with immediate-effect warnings
Repeating rule rowsLevels, payback, referral, roulette, rolling challenge, multi-bet bonus"Add Level" / "Add Tier" / "Add Rule" then Save
Sound-alert engineGlobalPer-notification-type sound file, Play Mode = Once or "Repeat until clicked", repeat interval in seconds

2.3 Real-time & dynamic content

  • GET /backend/stat/header — KPI band; GET /backend/stat/alert — 13 work-queue counters with last-seen IDs; GET /backend/api/admin-notices/unread-count. All polled on an interval on every page.
  • GET /backend/stat/refresh-cash — manual "refresh cash" action behind the circular arrow in the KPI band.
  • Active session monitor (/backend/users/active-sessions) shows who is online right now with device, IP, last action and an "as of HH:MM:SS" stamp.
  • Top Notice pushes a one-line banner to currently-connected players, with a preview endpoint that resolves the audience before sending.
  • Live sports — ongoing matches carry live bet counts, staked amount and expected win per match, with a per-match Refresh.
  • Dashboard cards carry their own "Cards Updated: <timestamp>" line, i.e. a separate cache from the chart data.

2.4 Integration points

IntegrationDirectionEvidence in the console
Sports odds feed (third-party)inbound/backend/sports/feed/v2/matches-sorted-by-date/admin; "Source: Feed" as a result-reversal cause; per-sport/region/league/market/selection delay config; team name translation table
Casino / slot aggregatorbidirectional~110 brands from /backend/casino/game/brands; wallet callbacks — min-bet is enforced "in the game BET callback"; a dedicated Callback Failure Log stores request IP, raw body, error message and stack
Minigame providersinboundLotus, BET365, NEXT, Bogle, Token Game — round history + odds configured locally per game
CA-Payment (crypto PSP)bidirectionalPartner ID + API key + callback URL; console at console.ca-payment.com, API at api.ca-payment.com (stage stg-api.ca-payment.com), hosted checkout at pay.ca-payment.com; TRON, Ethereum, Bitcoin, Ripple; webhook signature verification
OnePayinbound"Auto Deposit Integration" — a list of labelled API keys that auto-match incoming deposits
TronScaninboundEnable + API key; on-chain confirmation of USDT/TRX deposits
Bank SMS / notification ingestioninboundDeposit Messages screen stores the raw message, parsed depositor and amount, and a match flag against a deposit request
SMS OTP provideroutboundSignup OTP toggle and password-change SMS verification; carrier field per member (LGU+, SKT, KT…)
PayCoreinternal sub-systemSeparate operator accounts with roles, per-transaction limits, scope, block/delete and their own action log

2.5 Automated processes

  • Auto level-up on deposit approval, by cumulative deposit tier (and separately by attendance days).
  • Auto deposit matching — OnePay / TronScan / bank-message matching, with an unmatched queue and a "Split Suspected" flag for deposits broken into pieces.
  • Bet settlement from the feed, with an audited result-reversal path (Feed · Single Edit · Bulk Edit · Data Refresh) that records the affected members.
  • Rolling-challenge rounds open/close on the configured cycle and hold an unpaid → paid state per round.
  • Scheduled top notices, scheduled banners/popups/events (start & end dates).
  • Login-failure auto-block and suspicious-IP detection.
  • Payback / attendance / referral accrual evaluated against condition sets rather than manually granted.

3Business logic & processes

The money model, the commission model, the bonus economy and the decision trees behind each queue.

3.1 Business model

This is B2B2C. The platform vendor licenses the stack to an operator; the operator recruits players through a five-tier affiliate tree and pays those affiliates a share of turnover and losses. Revenue for the operator is the classic gambling margin — bet amount − win amount per vertical — presented throughout as "Cash Profit", "Net Profit" and "Total Game Profit". There is no subscription, no cart and no price list anywhere in the product.

Money in

Manual bank transfer (dominant), auto-matched bank deposit (OnePay / bank SMS), and crypto (USDT/TRX via CA-Payment). Deposits carry an optional promotion/bonus selection and a game type, which determines the rollover applied.

Money out

Bank withdrawal (single or batched into a bank-form file) and crypto withdrawal. Two-stage gate: an operator first marks Withdrawal Allowed (rolling/rollover requirement satisfied) and only then approves. Both approve and reject are reversible (DEPOSIT_REVERSE / WITHDRAWAL_REVERSE).

3.2 The agent (affiliate) hierarchy

Five tiers observed on live records: Head Office → Main Branch → Sub Branch → Distributor → Distributor 1 (본사 / 부본사 / 총판 / 매장 in the domestic vocabulary). Each agent has a referral/signup code; members are permanently bound to the agent whose code they signed up with, and every table in the product carries an "Agent" column so any figure can be rolled up the tree.

Commission

Two components, both visible on /finance/agent-withdraw:

  • Rolling — a percentage of turnover, broken out per vertical: Slot · Casino (Baccarat / Blackjack / Roulette / Others) · Sports · Minigame.
  • Losing — a percentage of the sub-tree's net loss.

Settlement cycle

Semi-monthly. Columns are labelled Q1 (1st–15th) and Q2 (16th–end of month), tracked for both "Last Month" and "This Month". Agents then file a settlement request; /agents/settlement-transactions types it as Revenue Payment, Withdrawal or User Grant, records bank/account/depositor, amount, resulting balance, request and process time, status and a division field. An agent can also hold a balance and points and grant them to their own members — those grants are audited separately in /agents/member-money-history and /agents/member-point-history.

3.3 Deposit workflow (decision tree)

  1. Player submits a deposit request → lands in Deposit Application alert queue, status Pending.
  2. Player may first ask "which account do I send to?" → Deposit Account Request queue (Unanswered → Answered). The account issued depends on the member's level and level type — the platform keeps a distinct deposit account per level (and optionally per level-type letter), plus named "alias" accounts that can be pinned to specific members.
  3. Optionally the player must prove ownership: Bank Account Verification queue (Pending → Deposited / Rejected), which auto-ages: unhandled records over 10 minutes stay pending.
  4. Bank notification arrives → Deposit Messages. The system tries to match depositor name + amount to an open request. Unmatched rows are surfaced by their own alert counter; "Split Suspected" flags deposits chopped into several transfers.
  5. Operator (or PayCore operator, within their min/max limit) approves → Pending → In Progress → Approved (or Rejected, or later Approval reversed).
  6. On approval: balance credited, any selected promotion bonus applied with its own rollover and max payout, cumulative-deposit auto level-up re-evaluated, attendance credited if the amount clears the attendance minimum.

3.4 Withdrawal workflow (decision tree)

  1. Player requests withdrawal → Withdrawal Application queue. Statuses: Pending (Not Allowed), Pending (Allowed), In Progress, Approved, Rejected, Reversed.
  2. Gate 1 — rollover / rolling requirement. The row shows "Rolling Rate (Rolling / Rollover)". Rollover is configured globally (default ratio, e.g. 100 % = 1.0×) and can be overridden per game category (Slot / Live Casino / Sports / Minigame), per promotion, per coupon (Rollover %) and per member (Settlement tab of the member modal, including an "Unselected" common rate used when a deposit is made without picking a game type). Only when it is satisfied does an operator set Withdrawal Allowed.
  3. Gate 2 — approve or reject with a Rejection Reason. Withdrawal blocks also come from global rules: a blocked hour window, a minimum withdrawal amount, and a minimum interval between successive withdrawal requests.
  4. Payout is executed manually, individually or via Bulk Withdrawals → select bank → generate a Bank Form → Bulk Allow / Bulk Reject.
  5. Crypto withdrawals run the parallel CA-Payment path with statuses Ready / Processing / Complete / Failed / Rejected and an on-chain hash.

3.5 Bonus economy — six independent engines

EngineTriggerPayoutKey controls
Deposit promotionOn deposit, player picks a promoBonus moneyType, game type, target, bonus, max payout, rollover, period. Plus a "Milestone Promotion" tab and a visibility rule that can re-offer the first-deposit promo on every deposit until the player's first withdrawal.
PaybackPlayer claimsPointsFour game-type paybacks (Casino/Minigame/Slot daily, Sports weekly) paid as deposit × rate with per-level rate and cap; plus Weekly Net P&L payback, Monthly Deposit fixed-tier payback, and Daily/Weekly Net-Loss payback. Conditions: not payback-blocked, balance < 10,000 KRW and points < 10,000 P, no withdrawal today, no pending deposit/withdrawal request, no open sports bet, a same-day deposit for that game type, not already claimed this period, and a rate configured for the level.
CompContinuous, on turnoverPointsComp ratio % per level per game type; "no comp while a bonus is active" switch; a per-vendor "프로모션 콤프" flag; aggregated on the Promotion Comp Aggregation report.
AttendanceDaily login with a qualifying depositPointsMin deposit to record attendance, consecutive-day reward table, streak resets after day 30, optional auto level-up by attendance days.
Referral (player-to-player)Referee activityPointsSix stacked rules — first deposit, cumulative, level achieved, multi-bet, sports-miss consolation, and a periodic settlement bonus = (referee deposits − referee withdrawals) × ratio. Global gate: rule ON, referee joined with a code, both parties Approved, neither bonus-blocked.
Coupons & rouletteManual issue, event, or attendance streakMoney / pointsCoupon templates carry code, amount, rollover %, game restriction, expiry; issue by All / ID list / level / affiliate code; bulk revoke. Roulette pays by weighted probability per rank, with a "designated account ID" escape hatch that guarantees a given member a given tier.

A seventh, the Rolling Challenge, is a leaderboard: bets accrue points at a configurable rate per game type, rounds close weekly/biweekly/monthly, and a prize pool is split by rank bands, tracked per round as Active → Ended (Unpaid) → Paid.

3.6 Player lifecycle

Pending → Approved → (Blocked | Withdrawn), with Rejected as a terminal alternative to approval. Signup can require SMS OTP. Every member carries: level 1–8 (브론즈·실버·골드·플래티넘·다이아 + three unnamed), a level type letter A–X used as a routing/segmentation dimension (it selects which deposit account they are given), a test-user flag, colour tags (box colour / band colour) and free-text alias and memo. Staff accounts are flagged separately so they can be excluded from stats.

3.7 Risk & anti-abuse logic

  • High-bet threshold per vertical → dedicated queues plus a repeating sound alert.
  • VIP & watch-list tagging — separate betting views keyed on a member tag (/tag/VIP); members are visibly badged for arbitrage/shot-betting (양방/샷벳).
  • Bet caps per level: max bet and max win for slot, live casino, sports (plus per-selection max cumulative bet) and minigame; per-match cumulative bet cap; max bets per selection; min/max odds; single-selection odds deduction.
  • Odds delay configurable at sport, league, market-type and selection level, plus odds adjustment by total staked on a match, plus cross-betting rules and multi-folder bonus rules.
  • Manual market control — hide a match, lock (suspend) a match, manage individual markets, revert a result.
  • IP controls — login-failure auto-block (3 fails / 30 min), suspicious-IP detection, manual IP block list with reasons, plus IP whitelists for admins and agents with success/fail access counters.
  • Callback failure log for provider wallet errors, so lost bets can be reconciled.

4User experience & usage patterns

How the console is meant to be worked, and where it helps or hurts.

4.1 The daily loop

The product is designed around an alert-driven queue-clearing loop, not around browsing. A shift looks like:

  1. Land on Dashboard; glance at the KPI band and the 13-counter alert strip.
  2. A sound fires (per-type sound file, optionally repeating until acknowledged). Click the counter → land in a pre-filtered queue.
  3. Work the row: open the member chip modal to check balance, level, bank details, memo and history without leaving the page.
  4. Approve / reject / allow / answer. Counter decrements. Repeat.
  5. Periodically switch to Analytics or the agent settlement screens for the reporting half of the job.

Everything downstream of that loop — settings, sports configuration, bonus rules — is low-frequency, high-consequence work done by a different person.

4.2 Key use cases and their paths

Job to be donePath
Approve a depositAlert "Deposit Application" → /finance/deposits → row → approve
Reconcile an unmatched bank transferAlert → /finance/unprocessed-deposits?is_matched=false → inspect raw message → match or Mark All Matched
Release a withdrawal/finance/withdrawals → check Rolling/Rollover → set Withdrawal Allowed → approve (or batch via /finance/bulk-withdrawals)
Answer a player ticket/content/inquiry → pick one of 32 saved reply templates → send
Warn everyone online right now/content/top-notice → template → target (All / level / agent sub-tree / VIP) → optional exclude-blacklist → send
Investigate a suspicious winnerMember chip → Detail modal → Money/Point history → /betting/*/members/login-history → IP block
Cap a hot market/sports/games/ongoing → Manual Lock or Markets → market-level suspend
Pay an affiliate/finance/agent-withdraw (Q1/Q2 revenue) → /agents/settlement-transactions → approve
Run a promotion/settings/deposit-promo → add promo → /content/banners + /content/popups + /content/events/content/message/send
Onboard a new staff member/settings/admin-management → Create Admin → assign page + action permissions → set scope agent → /settings/admin-ip-whitelist → TOTP

4.3 Onboarding & getting started

There is effectively none for operators — no tour, no empty-state guidance beyond "No data available / No registered data" and "🔍 No search results — please change your search conditions". The single genuine documentation surface in the product is the Crypto Payment → Integration Guide, a developer-facing partner guide with a table of contents, architecture steps, network list, quick-start, fee structure, environment variables, cURL examples and a REST endpoint reference. Its presence (and its "Partner" framing) is strong evidence the crypto cashier is a separately-sold product embedded into this console.

4.4 Accessibility & responsive design

  • Reasonable ARIA foundations: <nav aria-label="Main menu">, aria-haspopup/aria-expanded on menu buttons, role="combobox" + role="option" on custom selects, role="dialog" on modals, real <label> elements and semantic <table> markup.
  • Responsive: the module bar is hidden md:flex, so a separate mobile menu exists; controls carry dual heights (h-[36px] md:h-[32px]) for touch vs pointer. In practice the data tables are far too wide for a phone — /analytics/games/slot alone has ~60 columns.
  • Weak points: very low-contrast tertiary text, no visible skip link, colour-only status encoding in several tables, custom listboxes that need keyboard testing, and a dense 13-item alert strip rendered at ~11 px.

4.5 Personalisation

Per-admin: page and action permissions, an agent scope (scope_root_agent_id) that limits every query to a sub-tree, IP whitelist, TOTP, and per-notification alert sounds. Per-agent: their own scoped view of members, revenue and settlement. Per-member: level, level type, colour tags, memo, per-member rollover overrides and event restrictions. Language is a per-session toggle (English / 한국어).

5Technical architecture

Stack, conventions and observable engineering decisions.

5.1 Stack

FrameworkNext.js (App Router) — assets under /_next/static/chunks/, a main-app bundle, and route-group chunks such as app/(admin)/layout-<hash>.js. React client components (no __NEXT_DATA__, so not the pages router).
StylingTailwind CSS with CSS custom properties (border-[#243358], text-[13.5px], border-[var(--primary)]). Design tokens: navy #1a2744 chrome, #243358 borders.
IconsLucide (class="lucide lucide-chevron-down").
UI primitivesRadix-style headless components — role="combobox" + aria-haspopup="listbox", dialog-based date pickers, role="dialog" modals (shadcn/ui conventions).
i18nKey-based translation with dot-notation namespaces (pages.agents.withdraw.table.memo). Menu labels are authored in Korean and translated to English at render.
APISingle origin. All business calls go to /backend/* (reverse-proxied to the API service); a small number of Next.js route handlers live at /api/* (/api/client-ip, /api/header/notifications, /api/admin-notices/unread-count).
AuthCookie/session based (fetches use ambient credentials). /admin/signin → optional /admin/signin/verify-totp → session; /admin/signout. GET /backend/admin/me/permissions is fetched on every page load and returns role, page permissions, action permissions and the agent scope root.
Environmentsstg-admin.clkgame.com (this console) · stg-game.clkgame.com (player site) · api.ca-payment.com / stg-api.ca-payment.com (crypto PSP). The stg- prefix implies matching production hosts.

5.2 API conventions

  • Resource-oriented, kebab-case paths grouped by domain: /backend/users/*, /backend/transactions/*, /backend/agents/*, /backend/sports/*, /backend/admin/sports/config/*, /backend/casino/*, /backend/casino-config/*, /backend/minigames/admin/*, /backend/stat/*, /backend/global-config/*, /backend/campaigns/*, /backend/message/*, /backend/referral/*, /backend/roulette/*, /backend/crypto-payment/*, /backend/security/*.
  • Sub-resource configuration is path-parameterised by entity id, e.g. /backend/admin/sports/config/market-configs/{sportId}, /backend/transactions/bank/level-bank-info/{level}/type-configs, /backend/minigames/admin/stats/{gameCode}.
  • Filters are query parameters and are URL-addressable — the alert strip relies on this (?status=BETTING, ?is_matched=false).
  • Audit is first-class: the audit log stores HTTP method (POST/PUT/PATCH/DELETE) plus before and after snapshots per category.

5.3 Security posture

Strong

  • TOTP two-factor per admin (OTP column shows Set / Not Set).
  • IP whitelisting with groups, for both admins and agents, with success/failure counters.
  • 94 page + 62 action permissions, plus an agent scope that constrains data, not just menus.
  • Full before/after audit trail across 29 categories.
  • A separate, limit-boxed PayCore operator identity with its own action log — least privilege for cashiers.
  • Optional password gate on member-list file downloads; masked withdrawal password fields; separate MEMBER_PHONE_VIEW permission.
  • Player-side: login-failure blocking, suspicious-IP detection, SMS OTP on signup and password change.

Worth reviewing

  • The crypto integration page renders a live API key and both wallet addresses in plain text on screen — no reveal-on-click, no masking.
  • Third-party API keys (OnePay, TronScan) are entered and stored through the same settings form.
  • Permission checks are enforced client-side for menu visibility; server-side enforcement per endpoint should be verified independently.
  • An admin-facing /api/client-ip endpoint is called on every page load.
  • Callback error logs persist raw request bodies, which may contain provider credentials or tokens.

5.4 Performance & SEO

Code-split per route group with hashed chunks; heavy reference data (agent tree, brand list, level list, sports list) is fetched per page rather than cached globally, so most screens issue 6–10 XHRs on load, five of which are the same chrome calls every time. SEO is irrelevant and correctly ignored — the app is behind auth, with no meta description, canonical or structured data. Dashboard cards are separately cached from chart data (they carry their own "Cards Updated" timestamp).

6Content structure & information architecture

The hierarchy, the tone, and the state of localisation.

6.1 Hierarchy

#ModulePagesPurpose
1Content12Everything the player reads: 1:1 inquiries, messages, notices & rules, events, popups, banners, top notice, rolling challenge
2Agents8Affiliate tree, permissions, IP whitelist, login history, daily sales, settlement, member grants
3Betting Status7Sports & casino bet history, VIP/watch-list views, high-bet queues, callback failure log
4Sports Game Management7Ongoing/finished matches, result reversal, market types, market categories, region/league, teams
5Minigame5Game list, odds & limits, bet history, high-bet history, round results
6Finance12Deposits, withdrawals, bulk ops, deposit messages, account requests, bank verification, referral payouts, PayCore, comp aggregation
7Analytics9Daily sales, per-member profit, signup stats, per-vertical revenue, charts
8Members13Member list, live sessions, change logs, money/point ledgers, adjustments, dormancy, login history, IP blocks, referral, ranking, roulette
9Coupon System4Issued coupons, templates, manual issue, bulk revoke
10Crypto Payment6Account/API info, integration guide, stats, deposits, withdrawals, invoices
11Settings18Cashier rules, banks & accounts, levels, sports, casino, promotions, attendance, referral, payback, roulette, my-page fields, maintenance, audit log, admins, login log, IP whitelist, alerts, system

Plus 4 unmenued routes: /dashboard, /admin-notices, /admin/signin, /admin/signin/verify-totp.

6.2 Key landing pages

  • /dashboard — the default landing page and the only true summary screen.
  • /members/list — the operational centre of gravity; almost every investigation starts or ends here.
  • /finance/deposits and /finance/withdrawals — the two highest-traffic work queues.
  • /settings/basic — the highest-consequence configuration screen (cashier limits, rollover, blocked hours, auto-deposit keys).

6.3 Tone of voice

Terse, imperative, operator-to-operator. Section headings use a bullet prefix ("• Search Filter", "• Filter", "• Team List"). Help text is one line of consequence-first instruction — "Deactivated vendors are hidden from users", "Changes take effect only after pressing the Save button", "Set to 0 for no limit". Destructive actions get an emoji warning (⚠️). There is no marketing language anywhere, and no personality: this is a tool, and it reads like one.

6.4 Localisation — the weakest part of the product

Korean is the source language; English is a translation layer, and it is incomplete. Confirmed gaps:

  • broken /crypto-payment/integration-guide — most section headings render as raw i18n keys (pages.cryptoPayment.integrationGuide.introduction.features.realtime.title). The whole guide is effectively unreadable in English.
  • broken /finance/promo-comp-stats — the entire page is still Korean in English mode (검색 필터 / 조회기간 / 집계기준 / 게임사 / 콤프 지급액).
  • partial /agents/settlement-transactions — one column header renders the literal key pages.agents.withdraw.table.memo.
  • partial Analytics game tables keep the Korean total column 일별합계 and Korean sport and vendor names in English mode.
  • partial Sports configuration screens (market types, region/league) list all 49 sports in Korean only.
  • Domain data is intentionally bilingual — team management explicitly stores "Team Name (Original)" and "Team Name (Korean)" with a translation workflow.

6.5 Content freshness signals

Dashboard cards carry an explicit "Cards Updated: <date, time>" stamp; the active-session monitor prints "as of HH:MM:SS"; alert counters carry last-seen IDs; every notice/event/popup/banner row shows created, start and end dates; every ledger row shows "Created At"; audit entries show before/after with a timestamp. Freshness is well instrumented — nothing important on screen is undated.

7Competitive context

Where this sits in its market and what distinguishes it.

7.1 Category

This is a Korean-language online-casino/sportsbook platform back office of the kind sold to operators as a turnkey ("솔루션") package. Its DNA is visible in the vocabulary: 본사/부본사/총판/매장 agent tiers, 롤링 (rolling) and 루징 (losing) commission, 콤프 (comp), 페이백 (payback), 양방 (arbitrage/two-way betting) as a bannable offence, 홀짝 (odd/even) and 파워볼 (Powerball) minigames, 미니게임 as a first-class vertical. These are conventions of that specific market, not of Western iGaming.

7.2 Differentiators observed

  • Depth of configurability — bet caps, comp ratios, rollover and payback are all per-level and per-vertical, and rollover can additionally be overridden per promotion, per coupon and per individual member.
  • Level-type routing (A–X) — a second segmentation axis beyond level that determines which bank account a player is given. This is unusual and operationally clever: it lets an operator spread deposits across many accounts and quarantine cohorts.
  • PayCore — a purpose-built restricted cashier role with per-transaction floors and ceilings, its own statistics and its own action log. Most competitors just hand a cashier a scoped admin login.
  • Integrated crypto PSP with an in-product partner integration guide and REST reference.
  • Six stacked referral rule types and a seven-engine bonus economy — more granular than typical.
  • Result-reversal auditing that names the cause (Feed / Single Edit / Bulk Edit / Data Refresh) and the affected members — a direct answer to the biggest dispute source in this market.

7.3 Compliance & regulatory posture

There is essentially none. The console contains no responsible-gambling tooling — no deposit limits set by the player, no loss limits, no session-time limits, no self-exclusion, no reality checks, no age verification, no AML/KYC document workflow, no source-of-funds fields, no jurisdiction or licence configuration, no GDPR-style data-subject tooling. The only identity check is a bank-account ownership confirmation, and the only "exclusion" mechanism is an operator-initiated block. That combination — plus manual bank transfers, alias accounts rotated per member, and a domestic-Korean feature set — is characteristic of a platform operating outside a licensed regime rather than one built for a regulated market. Anyone evaluating this system commercially should treat that as the headline finding.

7.4 Partnerships & supply chain

~110 casino and slot brands (Evolution, Pragmatic Play, PG Soft, NetEnt, Play'n GO, Habanero, Nolimit City, Red Tiger, Relax, Quickspin, Big Time Gaming, Thunderkick, CQ9, KA Gaming, JDB, Spade, Vivo, BetGames, Ezugi, Yeebet, Lucky Streak and many more) reached through one aggregator; five minigame providers (Lotus, BET365 virtuals, NEXT, Bogle, Token Game); one sports odds feed; CA-Payment for crypto; OnePay and TronScan for automated deposit confirmation.

8Actionable insights

8.1 The whole system in five sentences

An operator logs in with a password and a TOTP code from a whitelisted IP. A permission profile decides which of ~100 screens they see and which of 62 actions they may perform, and an agent scope decides whose data they see at all. Their day is driven by 13 alert counters that deep-link into pre-filtered work queues — mostly approving money in and money out, answering tickets, and watching for oversized bets. Behind that, a configuration layer sets every commercial parameter of the business: bet and win caps per member level, rollover requirements per game category, comp and payback rates, six referral rules, coupon templates and affiliate commission split into rolling and losing and settled twice a month. Everything a human changes is captured before-and-after in an audit log.

8.2 Complete feature list

Player operations

  • Member CRUD, approval queue, bulk update, Excel import/export
  • 8 levels × 24 level types; auto level-up by cumulative deposit or attendance days
  • Per-member bet/win caps, comp ratios, rollover overrides, event restrictions, void-bet config
  • Manual money & point adjustment with reason
  • Money ledger (11 transaction types) and point ledger (9 types)
  • Info-change and bank-change audit trails with processor IP
  • Live session monitor; login history with device/OS/browser/country
  • Dormancy reports (no login / no bet, 7–180 days)
  • Ranking, per-member profit, referral signup tracking, roulette history
  • IP block list, login-failure auto-block, suspicious-IP detection

Cashier

  • Deposit & withdrawal queues with 6–8 statuses and reversal
  • Two-stage withdrawal gate (allowed → approved) with rejection reasons
  • Bulk withdrawal processing with bank-form generation
  • Bank-message ingestion, auto-matching, split-deposit detection
  • Per-level and per-alias deposit accounts, member-pinned accounts, bank on/off states
  • Bank-account ownership verification queue with 10-minute ageing
  • PayCore restricted operator accounts with min/max limits and audit
  • Crypto cashier: deposits, withdrawals, invoices, wallet balances, hosted checkout
  • Bulk money/point payment by level, ID list or affiliate code

Gaming

  • Sports: 49 sports, region/league/team management with Korean translations
  • Market type & market category management with per-level activation and delay
  • Match control: hide, lock, per-market suspend, refresh, result reversal with audit
  • Betting rules: min/max stake, per-match cumulative cap, max bets per selection, odds bounds, cancellation windows & daily cancel limit
  • Multi-folder bonus rules, odds adjustment by staked volume, cross-betting rules, pre-match display window
  • Casino: ~110 vendors, per-vendor activation/maintenance, category merchandising (인기/추천/잭팟), min bet enforced in the BET callback
  • Minigames: 5 providers, per-game odds table, bet close time, max bets per round, min/max bet, max win, round results
  • High-bet and VIP/watch-list surveillance queues per vertical
  • Provider callback failure log

Growth & content

  • Deposit promotions + milestone promotions + visibility rules
  • Coupon templates, targeted issue, Excel bulk issue, bulk revoke
  • Payback: 4 game-type engines + weekly net P&L + monthly deposit tiers + daily/weekly net loss
  • Comp points with per-level per-vertical ratios and a bonus-conflict switch
  • Attendance streaks with reward table and auto level-up
  • Six referral bonus rules + referral settlement
  • Roulette with weighted probability and guaranteed-winner override
  • Rolling Challenge leaderboard with rounds and prize bands
  • Notices & per-sport rulebooks, events, popups, main/page banners, top notice
  • 1:1 inquiries with 32 reply templates; targeted messaging with templates and Excel blast

Affiliate

  • 5-tier agent tree with codes, sub-agent creation, per-agent permissions
  • Rolling commission per vertical + losing commission
  • Semi-monthly (Q1/Q2) settlement periods
  • Settlement request workflow (Revenue Payment / Withdrawal / User Grant)
  • Agent balance & points with member-grant audit
  • Agent IP whitelist and login history; daily sales by agent

Platform

  • 94 page permissions + 62 action permissions + agent scoping
  • Admin management, TOTP, IP whitelist groups, file-download password
  • Audit log across 29 categories with before/after snapshots
  • Per-notification sound alerts with repeat-until-acknowledged
  • Per-game-type and system-wide maintenance mode
  • My-page field visibility control; signup SMS OTP; password-change SMS OTP
  • Bilingual UI (Korean / English)

8.3 Gaps, bugs and improvement opportunities

SeverityFindingWhere
highLive API key and both crypto wallet addresses rendered in plaintext on screen, with no masking or reveal-on-demand/crypto-payment/integration
highNo responsible-gambling, KYC/AML, age-verification or self-exclusion tooling of any kindplatform-wide
highIntegration guide is unusable in English — most headings render as raw i18n keys/crypto-payment/integration-guide
mediumAn entire page is untranslated (Korean only in English mode)/finance/promo-comp-stats
medium/analytics/overview is referenced in the route bundle but returns 404 — a dead link waiting to be exposedAnalytics
mediumTypo route /membesr/list present in the compiled bundle alongside /members/listbuild artefact
medium"Invalid Date" rendered as the first row of the signup statistics table/analytics/signup
mediumUntranslated column key pages.agents.withdraw.table.memo shipped to production UI/agents/settlement-transactions
mediumTwo different agent-settlement screens share the label "출금 관리 / Withdrawal Management" (/finance/withdrawals vs /finance/bulk-withdrawals) — ambiguous menuFinance
lowModal state (member detail, market management) is not URL-addressable, so operators cannot share a link to a specific recordglobal
lowFive identical chrome API calls fire on every navigation; reference data (agent tree, brands, levels) is re-fetched per pageglobal
lowTables of 40–60 columns have no column chooser, freeze-pane or saved viewsAnalytics, Members
lowNo breadcrumbs, no global search, no keyboard shortcuts for queue triage — the highest-frequency workflow is mouse-onlyglobal
lowContrast on tertiary text and the 11 px alert strip is below WCAG AAglobal
lowRoulette "designated account ID" guarantees a specific member a specific prize — legitimate for seeding, but a fairness risk that should be audit-logged prominently/settings/roulette

8.4 Replication blueprint

To rebuild this system, the minimum viable domain model is:

Core entitiesadmin (role, page_permissions[], action_permissions[], scope_root_agent_id, otp_secret, ip_whitelist[]) · agent (parent_id, tier, code, balance, points, rolling_rates{slot,baccarat,blackjack,roulette,other,sports,minigame}, losing_rate) · member (agent_id, level_id, level_type, status, tags[], colours, memo, bank_account, wallet, rollover_overrides) · level (comp ratios and bet/win caps per vertical) · transaction (money & point ledgers, typed) · deposit_request / withdraw_request (status machine + allowed flag + processor + reversal) · deposit_message (raw, parsed, matched) · bank / deposit_account (by level and level type, plus aliases) · sports_match / market / selection (+ delay and activation per level of the tree) · ticket (sports) / game_history (casino) / minigame_bet · coupon_template / coupon · promotion · payback_config · referral_rule · roulette_rule · rolling_challenge_round · audit_log (category, method, before, after, admin, ip).

Critical invariants — every balance mutation writes a ledger row with before/after; every admin mutation writes an audit row with before/after; every member is bound to exactly one agent and every query is filterable by the agent sub-tree; withdrawal cannot be approved until the rollover requirement is satisfied; the alert endpoint must return both a count and a last-seen id per queue so the client can distinguish new work from a stale badge.

8.5 If you own this product, do these five things first

  1. Mask the crypto API key and wallet addresses; move third-party keys to a secret store with reveal-on-permission and rotation.
  2. Fix the three localisation failures (integration guide, comp-stats page, settlement memo key) — they make the English build look unfinished.
  3. Remove or implement /analytics/overview and the /membesr/list typo route.
  4. Give the queue-clearing loop keyboard support and URL-addressable record modals — it is 80 % of daily usage and it is the slowest part.
  5. Decide deliberately about responsible-gambling and KYC tooling. Its total absence is the single largest structural gap and the one that determines which markets this platform can legally serve.

Page catalog — all 108 routes

Every screen with its filters, table columns, actions and API calls. Type to filter; click a row to expand.

API index

Every backend call observed, grouped by domain. All are same-origin under /backend/* unless noted.

Global calls fired on every page load

GET /backend/admin/me/permissions · GET /api/client-ip · GET /backend/api/admin-notices/unread-count · GET /backend/stat/header · GET /backend/stat/alert

Alert payload shape — GET /backend/stat/alert

{ id,
  deposit, deposit_id,
  withdraw, withdraw_id,
  user, user_id,
  inquiry, inquiry_id,
  account_inquiry, account_inquiry_id,
  casino, casino_id,
  minigame, minigame_id,
  highbet_casino, highbet_casino_id,
  highbet_sports, highbet_sports_id,
  highbet_minigame, highbet_minigame_id,
  bank_account_request_uncompleted, bank_account_request_uncompleted_id,
  agent_withdraw, agent_withdraw_id,
  unmatched_deposit_message, unmatched_deposit_message_id,
  sports_revert, sports_revert_id }

External API — CA-Payment (crypto PSP)

Base https://api.ca-payment.com (stage https://stg-api.ca-payment.com). Auth header Authorization: <API_KEY>. Env vars CRYPTO_PAYMENT_API_KEY, CRYPTO_PAYMENT_BASE_URL. Webhook target <your-domain>/crypto-payment/webhook with signature verification.

POST /customer/create · GET /customer/list · GET /customer/{id} · POST /invoice/issue · GET /invoice/detail · POST /invoice/cancel · GET /transaction · POST /transaction/withdraw · GET /transaction/detail/{id}

🔐Permission model

GET /backend/admin/me/permissions returns { id, account_id, nickname, role, page_permissions[], action_permissions[], scope_root_agent_id }. Roles observed: SUPER_ADMIN, SUPERVISOR, "Senior Admin". scope_root_agent_id restricts all data to one agent sub-tree.

Page permissions (94)

Action permissions (62)

Enumerations

Every controlled vocabulary found in the UI — useful for schema design and for writing test fixtures.

AGlossary

TermKoreanMeaning in this system
Rolling롤링Turnover-based commission paid to agents, and turnover-based requirement placed on players. The two senses share a word — read the context.
Rollover롤오버Multiple of a deposit/bonus a player must stake before withdrawing. Expressed as an integer percent (300 = 3×). Set globally, per game category, per promotion, per coupon, per member.
Losing루징Commission paid to an agent as a share of their sub-tree's net losses.
Comp콤프Loyalty points accrued on turnover, at a per-level per-vertical ratio.
Payback페이백Points rebate — by game-type deposit, by net P&L, by deposit tier, or by net loss.
Yangbang양방Arbitrage / two-way betting. Explicitly regulated; members are badged for it.
Shot bet샷벳Sudden oversized stake, typically to abuse a limit or a bonus. A watch-list tag.
Minigame미니게임Fast-cycle betting products (Powerball, odd/even, ladder, graph, virtual racing) — a first-class vertical in this market.
Holjjak홀짝Odd/even minigame.
Head Office / Main Branch / Sub Branch / Distributor본사 / 부본사 / 총판 / 매장The five affiliate tiers.
Level type등급 타입A–X letter attached to a member alongside the numeric level; selects which deposit account they are issued.
Q1 / Q21차 / 2차Semi-monthly settlement halves: 1st–15th and 16th–month end.
PayCore페이코어The restricted cashier-operator sub-system with per-transaction limits and its own audit trail.
Deposit message입금메세지Raw bank notification ingested and matched against an open deposit request.
Result reversal결과번복A settled market being re-settled; audited with cause and affected members.
Rolling Challenge롤링챌린지Turnover leaderboard with recurring rounds and a ranked prize pool.