Casino
The lobby
Players browse games from a lobby with a rotating promotional hero, shelves, studio shelves, search, provider filtering, and favourites. The category rail and sidebar offer Hot, Favourites, Featured, High Roller, the game tags you create (Crash, Instant Win, Slots, Live Dealer, Game Shows and Table ship seeded) and New. "Hot", "popular", "new", "featured" and "high roller" are computed from activity, release date, your artwork and each game's minimum balance; the rest map to tags you control. The first shelf leads with its most-played game as a larger tile showing the live player count. How each shelf is ordered is on Rankings & Discovery.
Everything about the lobby is operator-editable. Games carry artwork (which you upload), tags (which you create, reorder and switch on or off), and an enabled flag. Merchandising the lobby is a backoffice task, not a deployment.
The lobby is a page you compose. The casino lobby, and the home page, are built in the backoffice Constructor from sections you add, order and configure, then publish as a new version (with preview and rollback; see Rankings & Discovery). The casino sections are:
| Section | What it shows |
|---|---|
| Hero row | The promotional hero: the featured game, the jackpot card and live tables |
| Registration banner | The sign-up banner for visitors, the welcome strip for signed-in players |
| Game shelf | One shelf, filled from a tag, from a collection (Hot, Popular, New, Featured, High Roller) or from a hand-picked list of up to 50 games in your order; optionally with a larger lead tile |
| Tag shelves | One shelf per lobby tag, or one per game studio, in your order |
| Studio row | The studio logos |
| Bets feed and Big wins | The live casino bet feed and the big-wins ticker |
Shelves leave out games with no artwork by default, and a shelf left empty is dropped. Pinning a game moves it to the front of a shelf. You can also build extra casino pages, each with its own address under the casino, from the same sections. The seeded layout reproduces the lobby as it was before the constructor, so nothing changes for players until you edit it.
Navigation is a list you order. The category chip rail and the casino sidebar are each a staff-ordered list of built-in entries, game tags and your own pages, each hideable and with a label per language (with AI translation). An entry with no playable games, and Favourites for a signed-out visitor, are hidden from the player automatically.
Signed-out visitors can open a game page: the frame shows the game's art with sign-in and create-account actions over it.
House edge per game
Every game has a house edge of 1 - RTP/100. A game resolves its RTP from, in
order: its own RTP, else the highest default among its tags, else an
operator-wide fallback. Defaults ship per category: slots 96, table 98.5, live
98, crash 97, instant win 96, game shows 95.5; the fallback is 96. The backoffice
has a card to edit the defaults, a Missing RTP filter on the games list, and a
CSV import for RTP. Each new round freezes the RTP it resolved to, so a later
edit never re-prices a round in flight. Bonus wagering weights play by this figure.
Launching a game
When a player opens a game, the platform:
- Checks the player may play — not suspended, not self-excluded, no active responsible-gaming block, and any verification your access rules require for casino play.
- Checks the account can fund it. Games carry a
minFundsfloor, compared in USD at the live rate so a EUR or crypto wallet is judged on its real value. The balance counted is cash plus live bonus balance, and a wallet holding only bonus money can play. Shortfalls are shown in the wallet's own currency. A player holding several currency wallets gets an account picker that shows every wallet, with the ones that cannot fund this game disabled and labelled with the reason. When exactly one wallet can fund the game there is no choice to make, so the game launches straight away on it. If no wallet qualifies, the game does not open and the player is told why — rather than launching into an error. A crypto wallet plays in a fiat shadow currency at a rate frozen per round, while the wallet itself stays in the coin; see Playing casino games with crypto. - Opens a session bound to that one wallet, and hands the player a game frame. Providers are told the balance as cash plus live bonus, floored to the provider's minor unit so the whole amount can be bet. Picking a wallet in the picker also makes it the player's active wallet in the header and bet slip.
A player has one active session at a time. Opening the same account elsewhere triggers a session takeover the player is shown, rather than two sessions silently competing for the same balance. Where a provider supports it, a player returning to a game — or using the lobby's Continue playing tile — resumes the open session. Providers whose launch links die when the game window closes (qooob) are marked non-resumable: every launch starts a fresh session and closes the old one, and such sessions are left off the Continue playing tile, so a player is never sent to a dead link.
How a round moves money
The platform uses the seamless wallet model, the industry standard: the game provider runs the game and decides every outcome; the platform holds the money and answers the provider's wallet calls. The platform never computes a game result.
A round runs in two phases:
Provider: "player staked 2.00 on round R"
└─► platform debits the wallet, opens round R as `pending`
Provider: "round R ended, pay 7.50"
└─► platform credits the wallet, closes round R as `settled`
Between those two calls the round is open, and the money is already gone from the player's balance. What happens if the second call never arrives — the provider crashes, the network drops — is the question that separates a real platform from a demo.
Stuck rounds
Every five minutes, a reconciliation sweep finds rounds left pending past a
timeout and asks the provider what actually happened. It never guesses:
- Provider says the round settled → the owed win is paid.
- Provider says the round was voided → the stake is refunded.
- Provider does not know yet → the round is parked as
reconcilingand retried next pass.
The sweep and the provider callbacks both decide a round's next state on the
locked round row, re-checking it after the money is locked. A late or racing
call that no longer fits the round's state is refused with no money moved: a
stake-only rollback on an already settled round is refused, a rollback that
reverses the win moves the round to refunded so a late win is rejected, and a
Pragmatic end-of-round on a still-pending round settles it as a zero win so the
stake goes to revenue. Pragmatic win-side callbacks still settle in-flight
rounds after the player self-excludes (which closes their sessions).
Every one of those actions is keyed on a stable idempotency reference derived from the round, so a sweep that runs twice, or races the provider's late callback, pays exactly once.
Why double payment cannot happen
Each money movement carries a globally unique reference. Replaying the same reference returns the original movement instead of moving money again. Crucially, replay is a strict full-field match — a retry that arrives with the same reference but a different amount is rejected as a conflict, not quietly treated as a duplicate. A provider bug cannot silently overwrite a settled round. Casino round references are namespaced by provider, and a retried win whose first response was lost (qooob) is answered as success with the current balance. OnlyPlay negative or unsafe amounts are rejected, and BetConstruct's combined withdraw-and-deposit call passes the same stake checks as a plain stake.
Jackpots
When a jackpot is switched on for the session's currency, the transaction that settles a round also posts the jackpot contribution and, on a hit, the payout, so the pool, the stake and the win can never disagree. Only cash-funded rounds take part. Jackpots ship switched off until staff turn on the global switch.
Live balance
Every round step (stake, win, rollback) pushes a balance update to the player's open pages, so the balance moves on the bet rather than only on the win. The game page no longer polls for it.
Feeds that follow casino play
The lobby's Big wins ticker and the casino bet feed show only wins at or above the operator's minimum win amount, read in USD and converted per currency (default $50), an operator setting.
Provider integrations
Five game-provider integrations ship, each with its own launch mechanism and authenticated callback surface:
| Provider | Model | Status |
|---|---|---|
| stake-engine | Self-hosted, included in the repo; a Stake Engine-compatible game server with one playable slot | Working end to end |
| OnlyPlay | Third-party studio, signed launch and catalog | Verified against the vendor's staging environment |
| qooob | Third-party aggregator — one integration fronting many studios | Running on the platform's staging environment |
| BetConstruct | Third-party aggregator, written to Casino Integration API 3.1.3 | Adapter complete; needs a commercial contract |
| Pragmatic Play | Third-party provider, signed launch and catalog | Adapter complete; needs a commercial contract |
Provider credentials are stored server-side and never reach the browser. Third-party callbacks are signature-verified; the self-hosted engine uses an API key.
Provider wallet callbacks leave an audit record, so a disputed bet or win can be traced to the exact provider message.
Providers are created in the backoffice. On the Game Providers page staff add an OnlyPlay or qooob provider directly (credentials, origin and config), then sync its catalog; a duplicate is refused. A failing provider is named in the catalog-sync job's error.
No demo catalog is seeded. A game catalog is operator data: you connect a provider in the backoffice and sync or enter its games.
Adding another provider means writing one adapter against a defined interface — the round lifecycle, settlement, bonus and jackpot logic are shared and do not change.
Scope & Roadmap
Implemented. Lobby with tags, favourites and operator-managed artwork; game launch with balance gating, a multi-currency account picker and direct launch when only one wallet qualifies; the full seamless round lifecycle with idempotent settlement with round transitions decided on the locked row; stuck-round reconciliation that queries the provider for truth; five provider adapters, with per-provider resume behaviour; creating OnlyPlay and qooob providers from the backoffice; per-game house edge with category defaults and CSV import; bonus-aware launch gating; live balance pushes on every round step; session takeover handling; a bundled playable slot on the self-hosted engine; a constructor-built lobby, casino pages and navigation lists; jackpots settled inside the round's own transaction.
Partial. OnlyPlay and qooob have run against staging but not yet under a production contract. BetConstruct and Pragmatic are written against published specs but have never run against the live vendor. Each needs a contract and a certification pass before it can be trusted in production.
Not built. Live dealer via a separate-wallet provider such as Evolution is designed on paper only — that model inverts wallet ownership and needs its own integration. There is no provable-fairness surface, and the bundled game engine is not lab-certified (see What You Still Need).