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¶
- Launch a 100% match welcome bonus. Marketing creates via
PUT /admin/promo/depositwith match=100, max=200USD, wagering=20×, whitelist=top-15-slots. Backend writesPromoCode(type=first-deposit) andPromoFirstDeposit. Marketing then opens the whitelist modal, picks games, saves (chunked POST to/games). - 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. - 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. - Reconcile claimed bonuses. Marketing filters
UserPromoCodeclaims for first-deposit codes, exports CSV, cross-references with deposits-history.md for matching deposits. - 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.userIdhaving 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 inpromo-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/:idwith a new expiry, which affects all claimants. - Bonus value is locked when claimed. Editing
valuepost-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.
Cross-links¶
- Parent screen: promo-codes.md
- Country / geography filter:
apps/api/src/country/admin.country.controller.ts(admin-fe/country-restrictionspage) - 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