--- id: wiki-2026-0508-live-operations-liveops title: Live Operations (LiveOps) category: 10_Wiki/Topics status: verified canonical_id: self aliases: [LiveOps, Live Service Operations, 라이브옵스] duplicate_of: none source_trust_level: A confidence_score: 0.9 verification_status: applied tags: [liveops, operations, f2p, monetization, retention] raw_sources: [] last_reinforced: 2026-05-10 github_commit: pending tech_stack: language: typescript framework: node --- # Live Operations (LiveOps) ## 매 한 줄 > **"매 game 의 매 launch ≠ ship — 매 ongoing service 의 매 continuous content + event + balance"**. 매 2010s Korean MMO 의 매 origin → 매 2020 Fortnite / Genshin / Royal Match 의 매 dominant model. 매 calendar + segment + offer + content 의 매 4-rail orchestration. ## 매 핵심 ### 매 4 rail - **Calendar**: 매 daily / weekly / monthly cadence + season pulse. - **Content**: 매 chapter / event / collab drop. - **Economy**: 매 sink / source / sale / 매 inflation control. - **Communication**: 매 patch note / community / push notification. ### 매 KPI - **DAU / WAU / MAU**. - **D1 / D7 / D30 retention**. - **ARPDAU + LTV**. - **Event participation rate**. ### 매 응용 1. Genshin Impact (41-day banner cycle). 2. Royal Match (daily-event empire). 3. Fortnite (chapter-season pulse). 4. Clash Royale (deck-rotation balance). ## 💻 패턴 ### Event scheduler ```typescript interface LiveEvent { id: string; startUtc: string; endUtc: string; segments: string[]; rewardTable: Reward[]; } function activeEvents(now: Date, all: LiveEvent[], userSeg: string): LiveEvent[] { return all.filter(e => new Date(e.startUtc) <= now && new Date(e.endUtc) >= now && e.segments.includes(userSeg) ); } ``` ### Segmentation engine ```typescript type Segment = 'newbie' | 'engaged' | 'whale' | 'churner' | 'returner'; function segmentUser(p: PlayerProfile, now: number): Segment { const daysSinceInstall = (now - p.installAt) / 86400_000; const daysSincePlay = (now - p.lastPlayAt) / 86400_000; if (daysSincePlay > 7) return 'churner'; if (daysSinceInstall < 7) return 'newbie'; if (p.lifetimeSpend > 500) return 'whale'; if (daysSincePlay < 1 && p.sessionCount30d > 20) return 'engaged'; return 'engaged'; } ``` ### Dynamic offer engine ```typescript interface Offer { id: string; priceUsd: number; contents: { id: string; qty: number }[]; expiresAt: number; } function generateOffer(seg: Segment, ctx: GameContext): Offer | null { if (seg === 'newbie' && ctx.justFailedHardLevel) return { id:'starter_boost', priceUsd:0.99, contents:[{id:'lives',qty:5}], expiresAt: Date.now()+15*60_000 }; if (seg === 'whale' && ctx.bannerEndsIn < 12*3600_000) return { id:'whale_finisher', priceUsd:99.99, contents:[{id:'gem',qty:8000}], expiresAt: ctx.bannerEnd }; return null; } ``` ### Hot-config / remote balance ```typescript interface LiveConfig { version: number; goldRatePerWin: number; bossHp: Record; bannerWeights: Record; } let CONFIG: LiveConfig = INITIAL; async function pollConfig(): Promise { const remote = await fetch('https://liveops/cfg').then(r => r.json()); if (remote.version > CONFIG.version) CONFIG = remote; } setInterval(pollConfig, 60_000); ``` ### A/B test harness ```typescript function variant(userId: string, exp: string): 'A' | 'B' { const h = hash(userId + exp) % 100; return h < 50 ? 'A' : 'B'; } function logExposure(userId: string, exp: string, v: 'A'|'B'): void { analytics.track('exp_exposure', { userId, exp, v, ts: Date.now() }); } ``` ### Push-notification scheduler ```typescript function maybePush(p: PlayerProfile, now: number): PushPayload | null { const idle = (now - p.lastPlayAt) / 3600_000; if (idle > 24 && idle < 72) return { title:'Energy is full!', body:'Come claim your gift.' }; if (p.activeEventEndsIn < 2*3600_000) return { title:'Event ends in 2h', body:'Last chance!' }; return null; } ``` ## 매 결정 기준 | 상황 | Approach | |---|---| | Mid-core RPG | 41-day banner + weekly event + daily quest | | Casual puzzle | Daily-event + streak + dynamic offer | | Competitive PvP | Short season (2-4w) + balance-patch cadence | | Sandbox MMO | Long expansion (6-12mo) + living-world events | **기본값**: weekly cadence + monthly content drop + 41-day major arc — 매 modern F2P template. ## 🔗 Graph - 부모: [[Game Monetization Strategy]] · [[Live Service]] - 응용: [[Genshin Impact]] · [[Fortnite]] - Adjacent: [[Dynamic Offers]] · [[Player Retention]] · [[Power Creep (Content Treadmills)]] ## 🤖 LLM 활용 **언제**: event calendar drafting, segment-rule design, offer copy generation. **언제 X**: 매 final balancing decision (designer + analyst 영역). ## ❌ 안티패턴 - **Over-eventing**: 매 too-many-overlapping event 의 매 player fatigue. - **Whale-only design**: 매 mid/low spender alienation. - **No-rollback**: 매 bad balance patch 의 매 hot-config rollback path 의 X. ## 🧪 검증 / 중복 - Verified (deconstructoroffun.com, GDC LiveOps talks 2022-2024, Adjust LiveOps report 2024). - 신뢰도 A. ## 🕓 Changelog | 날짜 | 변경 | |---|---| | 2026-05-08 | Phase 1 | | 2026-05-10 | Manual cleanup — full LiveOps 4-rail + scheduler/segment/offer code |