在後端級別管理促銷和獎金
文章全文
1)為什麼把促銷帶到一個單獨的後端
貨幣不變量。獎金≠「平衡」:這是帶有條件的合同(vager,遊戲貢獻,最高投註/獲勝)。
更改速度。營銷團隊每天發布活動-需要聲明性規則引擎和回滾。
反Abuse/合規性。KYC/RG/AML,velocity,細分,「四只眼睛」對昂貴的離群值。
可觀察性和可報告性。SLO,促銷成本,對GGR/NGR/LTV的影響。
原則:促銷核心是具有自己的狀態機器的獨立服務,金錢只能通過錢包,相等地移動。
2)獎金類型和不變式
Deposit match (100%到X):捕獲存款後收取費用,vager X ×。
現金(虧損):根據時間/遊戲窗口計算,可能是sticky/non-sticky。
Free Spins/Free Bets:優惠券/代幣與自旋/投註價格,固定RTP池。
任務/任務:任務→進展→獎勵。
賽事/飛行活動:賽事貢獻,排名,獎金。
不變量:- Sticky:在滿足條件之前不能退出。
- Max bet/Max贏:從獎金中扣除利率/付款限制。
- 貢獻:遊戲貢獻(例如,slots=100%, live=10%)。
- Expiry:獎金和vager窗口的到期日。
3)獎金服務架構
管理(活動/規則)─Promo API ─Rules Engine/Eligibility
│
├─Bonus Ledger(Offers狀態)
├─Wagering引擎(進度)
├─Anti-Abuse (限制/frod/velocity)
└─Outbox (events) ─Kafka/Pulsar ─BI/DWH/CRM
Wallet/Ledger── Idempotent Commands ───┘規則引擎-聲明性條件(細分,地理/許可,通道,KYC/RG)。
4)數據模型(簡化)
`bonus_grant`
`wager_progress`- `grant_id, required_minor, contributed_minor, remaining_minor, last_update_at`
- `schema_id, rules: [{game_type:"slot", pct:100},{game_type:"live", pct:10}]`
「bonus_ledger_entry」(審核)
5)狀態機器和傳奇
5.1演示(issue)-傳奇
1.eligibility.檢查(段,RG/KYC, velocity)
2.grant.create (status=`issued`)
3.wallet.credit [bonus](平均值;在sticky-在獎勵子資產負債表)
4.activate (status=`active`)
5.emit `bonus.issued`
Rollback: 在第3步下降時→ 'grant。cancel「+事件」獎金。revoked`.
5.2 Vager進步
在'bet上。設置為"計算貢獻='stake_minor contribution_pct'(或根據win/loss規則)。
原子更新「wager_progress」;達到100%-「complete」。
5.3完成(消費)
complete → `wallet.convert_bonus_to_cash'(如非粘貼)或解除輸出限制。
emit `bonus.consumed`.
5.4到期/召回
根據「expires_at」或弗羅德規則→ 「revoke」(偶數),可以根據政策進行補償。
6)錢包合同(僅通過API,始終是偶數)
累積獎金
POST /v1/wallet/credit
Headers: X-Idempotency-Key: bonus_grant_123
{
"player_id":"p_001",  "amount":{"minor_units":100000,"currency":"EUR"},  "balance_type":"bonus",  "reference":{"grant_id":"gr_123","offer_id":"of_777"}
}
→ 200 {"status":"credited","entry_id":"e_9001"}滿足條件後轉換為緩存
POST /v1/wallet/convert
Headers: X-Idempotency-Key: bonus_convert_gr_123
{
"player_id":"p_001",  "from_balance":"bonus",  "to_balance":"cash",  "amount_minor":100000,  "reference":{"grant_id":"gr_123"}
}
→ 200 {"status":"converted","entry_id":"e_9010"}- 要求'bets。「authorize」被代碼「BONUS_MAX_BET_EXCEED」拒絕。
7)促銷服務API(基準)
創建Offer (admin)
POST /v1/offers
{
"name":"Welcome 100% up to 100€",  "type":"deposit_match",  "params":{"match_pct":100,"cap_minor":10000,"wager_x":20,"sticky":true,       "max_bet_minor":200,"max_win_minor":50000,"contribution_schema_id":"c_slot100_live10"},  "eligibility":{"brands":["A"],"regions":["EU"],"segment":"new_depositors"},  "schedule":{"start":"2025-10-20T00:00:00Z","end":"2025-11-30T23:59:59Z"}
}
→ 201 {"offer_id":"of_777"}發放獎金(runtime)
POST /v1/bonus/grants
Headers: X-Idempotency-Key: grant_p001_of777
{
"player_id":"p_001","offer_id":"of_777","trigger":"deposit_captured","amount_minor":10000
}
→ 200 {"grant_id":"gr_123","status":"active"}Vager進步(閱讀)
GET /v1/bonus/grants/gr_123/progress
→ 200 {"required_minor":200000,"contributed_minor":45000,"remaining_minor":155000,"pct":0.225}撤銷/撤銷
POST /v1/bonus/grants/gr_123/revoke
Headers: X-Idempotency-Key: revoke_gr_123
{ "reason":"fraud_velocity" }
→ 200 {"status":"revoked"}所有寫作呼叫均來自「X-Idempotency-Key」和「X-Trace-Id」。
8)反濫用和合規性
Velocity限制:發放/轉換/嘗試存款(Redis counters+TTL+Lua)。
觸發器:根據規則,一筆存款→一筆贈款。
細分和RG:排除自我釋放/限制;per品牌/地區許可證。
離岸沖突塊:同時只有一個歡迎獎金;優先次序。
異常檢測器:多個帳戶/設備/ASN,快速「重置」vager。
「四眼」大筆贈款和人工調整。
WORM審核所有規則/贈款/轉換更改。
9)可觀察性,度量和SLO
SLO(地標):- `grant.issue p95` (issue→credited) ≤ 300–500 мс.
- 從「bet」開始更新「wager_progress p95」 ≤ 200毫秒。settled`.
- 發生的「bonus.」事件發生在p95總線上≤ 2分鐘。
- 「損失/重復贈款/轉換」=0。
- Rate/latency по `issue/convert/revoke`, error-rate (business/4xx/5xx), `IDEMPOTENCY_MISMATCH`.
- Vager轉換,平均「時間完成」,逾期百分比。
- 促銷費用:隊列上的「promo_cost」(次要)和「promo_roi」。
- 反抽象:velocity觸發,max bet/win偏轉。
Tracing: OpenTelemetry在'trigger → grant → wallet鏈條上。credit → progress.update → convert`.
10)與RGS/遊戲集成
Free Spins/Free Bets優惠券-通過「entitlements」 API:代幣發行,rantime註銷,遙測使用。
Max bet/Win-Bets中的規則。authorize` и `bets.settle`;返回代碼「BONUS_RULE_VIOLATION」。
貢獻是'bet級別的方案。設置為"(通過'game_type/provider_id'),對方案進行反轉。
11) DWH/BI和報告
Outbox活動→ Lake(銅牌)→ Silver (dedoop, SCD2) → Gold店面:- `fact_bonus_grants`, `fact_wager_progress`, `fact_bonus_cost`, `fact_promo_roi`.
- SLA新鮮:Silver ≤ 15分鐘,Gold ≤ 30-60分鐘。
- 面板:轉換到離線/片段,時間到完成,貢獻到遊戲,數據表事件。
12)安全和居住權
mTLS + OAuth2 CC;scope’ы `promo:issue`, `promo:convert`, `promo:revoke`.
鑰匙/代幣-按品牌/地區簡短;Vault/HSM中的秘密。
PII隔離: 「player_id」是別名;RLS по `brand/region`.
發行限額和配額;防禦暴風雨。
13)支票單
平臺/操作員
- 所有現金交易都是通過「Idempotency-Key」通過Wallet進行的。
- 規則/可擴展性是可轉換的;移民事件的「雙重寫作」。
- 貢獻方案是集中的,由測試覆蓋。
- 包括Velocity和反氟化物;「四只眼睛」大量。
- Outbox/CDC,DLQ和「bonus.」的托管重播。
- SLO-dashbords, OpenTelemetry, WORM審核。
- 用於ROI和合規性(RG/AML)的DWH店面。
集成(RGS/錢包/CRM)
- 檢查max bet/win;返回業務錯誤代碼。
- 通過「trace_id」和「idempotency_key」。
- 觸發器和交付保證(webhooks已簽名)。
14)紅旗(反模式)
手動累積獎金直接進入資產負債表,繞過Wallet。
缺乏相容性→雙倍贈款/轉換。
Vager被認為是'bet。放置「而不是」bet的結果。settled`.
沒有貢獻方案,或者它們在提供商代碼中「縫合」。
沖突的offers同時激活。
沒有velocity/anti-frod和WORM審核。
「Bonus.」事件是繞過outbox/CDC發布的。
促銷指標與Ledger/BI不一致(沒有ROI店面)。
15)結果
可靠的後端促銷是合同和不變量而不是「增加平衡」。它將規則與金錢分開,根據實際結果計算進展,保證相等性和可觀察性,防止借貸並提供合規性。有了這樣的核心,市場營銷就迅速發展,玩家可以看到誠實的條件,財務和監管機構可以準確了解每個離職者的成本和影響。
