Predicting activity and participation triggers
1) Task
It is necessary to predict when the player will most likely come in (or, conversely, may "go out") and what incentive will increase the chance of participating in the mission/qualifier/tournament, subject to honesty and Responsible Gaming (RG).
Key issues:- "When does he usually play?" (time patterns)
- "What triggers participation?" (content, format, reward, duration)
- "How not to overheat?" (touch frequency, RG constraints, economic budget)
2) Data signals
Behavior: rhythm of entrances (hours/days), length and pace of sessions, frequency of participation in events.
Content: favorite providers/genres, novelty, variety.
Economy promo: Reaction to past boosts/seasonal tokens/cosmetics.
Social signals: chat, clips, reactions (if any).
Context: device, channel, time zone, local holidays/events.
RG: time/deposit limits, signs of fatigue, "pause signals."
All features are aggregated, without PII in excess of the regulatory minimum.
3) Ficering (examples)
Seasonality/rhythm: one-hot hours 0-23, days of the week; autocorrelation of lags (ACF/PACF).
4) Model stack
1. Time series for activity:- Prophet/NeuralProphet, LSTM/Temporal Fusion Transformer for group patterns;
- simple cohort seasonal profiles for online.
- Cox/Weibull/RSF → time to next session; risk of "extinction" (churn-hazard).
- 3. Propensity of participation (P (join))
GBDT/TabTransformer - probability of participating in the quotation display.
4. Uplift Modeling (CATE):- Two-Model/T-Learner, X-Learner, DR-Learner to choose which trigger/content gives an increase.
- context bandit (LinUCB/Thompson) for online channel matching × content × time inside the mouths.
5) Types of participation triggers
Content: tournament format (sprint 20-30 minutes, marathon), favorite providers, "new of the week."
Temporary: "start in 15 minutes," "evening qualifier" - coincidence with the likely entry window.
Premium (cosmetics/tokens): without pay-to-win; rarities - common to all.
Social: online friends, community challenge, co-op tasks (ethical, no pressure).
Cross-missions: short warm-up mission → entrance to the qualifier.
6) Touch orchestration (channel × time × frequency)
Channels: in-app, push, email, web-inbox; priority in-app → push → email.
Timing: crossing p (active in the next 90-120 minutes) with the event schedule.
Frequency/cap: not more than N touches/week, M/day; strict cooldown between triggers.
Quiet mode: night user windows; "quiet" push → inbox card in the application.
7) Honesty, compliance, RG
No impact on RTP/odds. Triggers change the "path," not the expectation of winning.
Transparency: page "How we select notifications": activity windows, frequency limits, refusal to personalize - 1 click.
RG guards: with fatigue/limits - we reduce the frequency, offer a pause, do not call for long formats.
Unsubscribe/opt-out: respected instantly; "smart silence" after the complaint.
8) Anti-spam and anti-abuse
Rate limiting per user and channel.
Deduplication of meaning: do not send 2 similar reasons in a row.
Economic budget: cap on token/cosmetics emissions by season.
Fairness: The top value of the award is the same; personalization - about relevance.
9) KPI and control metrics
Hit Rate of the window: the proportion of touches that got into the active session ± Δ minutes.
Join Uplift: increase in participation vs control.
Retention uplift D7/D30 in target cohorts.
Fatigue: the rise in unsubscribes/mutes/complaints; Mute Rate RG metrics: reduction of extra-long sessions, proportion of soft pauses. Prize ROI/Emission to GGR - so that the promotional economy is sustainable. Incremental Revenue/User-week (if applicable and regulatory). 10) A/B patterns 1. Reminder windows: T-30/15/5 minutes before the start of the qualifier. 2. Format duration: sprint 20 min vs 35 min for evening slots. 3. Content type: Favorite provider vs "new of the week." 4. Channel: in-app vs push; push with deep links vs without. 5. Uplift policy: target only uplift-positive vs wide coverage. 6. Combo trigger: warm-up mission → tournament vs immediately tournament. 11) JSON templates 12) Pseudocode orchestration 13) UX patterns Lobby card: "Evening sprint 20 min, start in 15 min, Rare cosmetics." Time estimate: "≈20 -25 minutes" + difficulty indicator. Control options: "Remind me later," "Skip this topic," "Keep silent for a week." Quiet VFX: brief, non-invasive, no intrusive sound. 14) Implementation Plan 1. MVP (2-4 weeks): cohort activity windows + simple propensities; one channel (in-app), frequency cap, transparency screen. 2. v0. 9: survival-model of time before entry; push + inbox; basic uplift by 2-3 triggers. 3. v1. 0: contextual bandit, full-fledged calendar of events, emission budget, RG integration, honesty reports. 4. Next: personal "schedules of the week," cross-missions, geo-events, MLOps-drift automation. 15) Pre-release checklist Activity and trigger prediction is a time × content × channel under RG and honest constraints. Time series and survival give "when," propensities and uplift - "what to call," bandit - "how to adapt online." With strict frequency caps, transparency and a sustainable budget, promos get less noise, more participation and a predictable economy of the season.
Touch orchestrator solution:
json
{
"user_id": "u_29104", "next_active_window": {"start": "2025-10-24T17:00:00Z", "end": "2025-10-24T19:00:00Z", "p_active": 0. 72}, "p_join_by_trigger": {
"sprint_20min": 0. 41, "marathon_60min": 0. 18, "new_provider_event": 0. 36
}, "uplift_by_trigger": {
"sprint_20min": 0. 12, "new_provider_event": 0. 07
}, "rg_flags": {"fatigue": false, "limit_time": false}, "cooldowns": {"push": true, "in_app": false}
}json
{
"decision_id": "dec_2025_10_24_1630", "user_id": "u_29104", "touch": {
"channel": "in_app", "time": "2025-10-24T17:05:00Z", "trigger": "sprint_20min", "creative": "evening_sprint_card_v3"
}, "fairness": {"reward_cap_equivalent": true}, "rg": {"suggest_break": false}
}
python ctx = build_context(user_id)
p_active = activity_model. predict_window(ctx, horizon_hours=4)
p_join = propensity_model. score_triggers(ctx)
uplift = uplift_model. estimate(ctx, triggers=p_join. keys())
RG and frequency constraints if ctx. rg. fatigue or over_frequency_cap(user_id):
schedule_silent_inbox(user_id); exit()
window and trigger selection win = best_time_window (p_active, events_schedule)
trigger = argmax(uplift, mask=channel_caps(user_id))
touch = compose_touch(user_id, channel="in_app", window=win, trigger=trigger)
if economy_budget_ok(trigger) and not in_quiet_hours(user_id, touch. time):
deliver(touch); log(touch)