Skip to content

Deposit bonuses

Purpose

The Deposit Bonuses screen is a specialized subset of promo-codes.md for first-deposit match offers — the welcome-bonus mechanism. Each deposit bonus carries: a base promo code, a match percentage, a max amount, a wagering requirement, and a game whitelist (which slots / house games count towards the wagering requirement). There is also a separate ST8 Bonuses screen for the ST8 slot provider's native free-spin offers.

Audience

Marketing (primary), customer support (eligibility checks), risk (wagering-requirement abuse audit).

Path in admin-fe

Screen URL Page
Deposit bonus list /deposit-bonuses ebit-admin-fe/src/app/(dashboard)/deposit-bonuses/page.tsx
Deposit bonus details (game whitelist) (in-page modal) components/pages/depositBonusDetails/
ST8 Bonuses (provider-native free spins) /st8-bonuses ebit-admin-fe/src/app/(dashboard)/st8-bonuses/page.tsx

Backing API endpoints

For first-deposit promo codes (game whitelist included):

Endpoint Source
PUT /admin/promo/deposit (create) apps/api/src/promo/controllers/admin-promo.controller.ts:92
PATCH /admin/promo/deposit/:id (update) apps/api/src/promo/controllers/admin-promo.controller.ts:102
GET /admin/promo/deposit/:id/games (list whitelist) apps/api/src/promo/controllers/admin-promo.controller.ts:116
POST /admin/promo/deposit/:id/games (upsert whitelist, 50/req) apps/api/src/promo/controllers/admin-promo.controller.ts:130

For ST8 native bonuses:

Endpoint Source
GET /admin/casino/slots/st8/bonuses/records apps/api/src/casino/slots/providers/st8/st8.admin.controller.ts:40
GET /admin/casino/slots/st8/bonuses apps/api/src/casino/slots/providers/st8/st8.admin.controller.ts:48
GET /admin/casino/slots/st8/bonuses/fetch apps/api/src/casino/slots/providers/st8/st8.admin.controller.ts:59
POST /admin/casino/slots/st8/bonuses/create apps/api/src/casino/slots/providers/st8/st8.admin.controller.ts:67
POST /admin/casino/slots/st8/bonuses/cancel apps/api/src/casino/slots/providers/st8/st8.admin.controller.ts:76

Frontend wiring: ebit-admin-fe/src/queries/promocodes/ (deposit codes), queries/st8-bonuses/ (ST8).

Key actions

Action Required permission API call DB tables touched Audit-logged?
List deposit bonuses promo.code.view GET /admin/promo (filter type=first-deposit) PromoCode yes
Create deposit bonus promo.code.edit PUT /admin/promo/deposit PromoCode, PromoFirstDeposit yes
Update deposit bonus promo.code.edit PATCH /admin/promo/deposit/:id same yes
List game whitelist promo.code.view GET /admin/promo/deposit/:id/games PromoGameWhitelist yes
Upsert whitelist (50 games per call) promo.code.edit POST /admin/promo/deposit/:id/games PromoGameWhitelist yes
Create an ST8 native bonus promo.code.edit POST /admin/casino/slots/st8/bonuses/create provider-side, St8Bonus yes
Cancel ST8 bonus promo.code.edit POST /admin/casino/slots/st8/bonuses/cancel provider-side, St8Bonus.canceledAt yes
Fetch ST8 bonus list from provider promo.code.view GET /admin/casino/slots/st8/bonuses/fetch provider HTTP yes

Filters and views

  • Status — active / inactive / expired.
  • Match % — 50, 100, 200.
  • Currency — USDT-base typically.
  • Date range.
  • Per-bonus drill-in — match details, wagering requirement multiplier, eligible games.

Common workflows

  1. Launch a 100% match welcome bonus. Marketing creates via PUT /admin/promo/deposit with match=100, max=200USD, wagering=20×, whitelist=top-15-slots. Backend writes PromoCode (type=first-deposit) and PromoFirstDeposit. Marketing then opens the whitelist modal, picks games, saves (chunked POST to /games).
  2. Adjust whitelist mid-campaign. Add a new slot to the eligible list. Open the bonus, click Whitelist, add the slot. Saves chunk via POST /admin/promo/deposit/:id/games.
  3. Cancel a player's ST8 free-spins. Player is suspected of multi-accounting. Open /st8-bonuses, find the player's bonus row, click Cancel. Backend calls ST8 provider API to cancel.
  4. Reconcile claimed bonuses. Marketing filters UserPromoCode claims for first-deposit codes, exports CSV, cross-references with deposits-history.md for matching deposits.
  5. A/B variant. Marketing creates two bonuses (50% vs 100% match). Different codes for different segments. Track conversion via dashboard.md FTD metric.

Edge cases / gotchas

  • Whitelist upsert is 50 games per request — see endpoint summary at admin-promo.controller.ts:131-145. Front-end chunks automatically.
  • Wagering requirement enforcement is server-side at bet-place and bet-settle. The admin only configures the multiplier.
  • First-deposit eligibility check is on Deposit.userId having no prior CONFIRMED deposits. Edge case: a player whose first deposit was refunded (Deposit.refunded=true) may or may not still be FTD-eligible; behavior is deterministic in promo-validator.service.ts. Verify with engineering before promising.
  • ST8 bonuses live on the provider's side. Cancelling here calls ST8's API. If ST8 is down, the cancel is queued and may fail — retry from this screen.
  • No "extend wagering window" button. If a player needs more time to clear wagering, you must update via PATCH /admin/promo/deposit/:id with a new expiry, which affects all claimants.
  • Bonus value is locked when claimed. Editing value post-claim does not retro-update.
  • Locale / region whitelisting is not on this screen. Geographic restrictions ride country-restrictions (not yet documented as a screen — code in admin.country.controller.ts).
  • Bonus interaction with rakeback — claimed bonuses do not contribute to rakeback. Codified in apps/api/src/rakeback/ services.
  • Parent screen: promo-codes.md
  • Country / geography filter: apps/api/src/country/admin.country.controller.ts (admin-fe /country-restrictions page)
  • Per-user claimed bonus: user-profile.md → Promo tab
  • KYC tier interaction with bonus eligibility: kyc-limits.md
  • Rakeback (alternative reward, not stackable): apps/api/src/rakeback/admin.rakeback.controller.ts
  • Deposit flow: flows/ → deposit
  • Audit: admin-logs.md

Sequence — launching a 100% match bonus

sequenceDiagram
    actor mkt as Marketing
    participant admin-fe
    participant api
    participant pg as Postgres
    mkt->>admin-fe: open /deposit-bonuses, click Create
    mkt->>admin-fe: fill { code, match=100, max=200, wagering=20x, expires }
    admin-fe->>api: PUT /admin/promo/deposit { ... }
    api->>api: PermissionGuard('promo.code.edit')
    api->>pg: INSERT PromoCode (type=first-deposit), INSERT PromoFirstDeposit
    api->>pg: INSERT AdminActionLog
    api-->>admin-fe: PromoCodeDto
    mkt->>admin-fe: open Whitelist, pick 30 slots, Save
    loop chunk by 50
        admin-fe->>api: POST /admin/promo/deposit/:id/games { games: [batch of 50] }
        api->>pg: UPSERT PromoGameWhitelist (50 rows)
        api-->>admin-fe: PaginatedDto<PromoGameWhitelistDto>
    end
    Note over admin-fe,pg: bonus is now live — player site exposes via /promo/code endpoint