---
id: wiki-2026-0508-liveops
title: LiveOps
category: 10_Wiki/Topics
status: verified
canonical_id: self
aliases: [LiveOps, Live Operations, Live Service, GaaS]
duplicate_of: none
source_trust_level: A
confidence_score: 0.9
verification_status: applied
tags: [game-development, liveops, mobile-games, gaas, monetization, retention]
raw_sources: []
last_reinforced: 2026-05-10
github_commit: pending
tech_stack:
  language: Unity/Unreal/Backend
  framework: PlayFab/Firebase/Custom
---

# LiveOps

## 매 한 줄
> **"매 game 매 ship 의 끝 아닌, 매 시작"**. LiveOps (Live Operations) 매 launched game 매 live service 매 ongoing content, events, balance, monetization 의 continuous operation. 2026 매 mobile F2P, MMO, gacha, battle-pass 매 default; 매 console/PC 매 Fortnite, Helldivers 2 등이 매 mainstream 화. Data-driven, A/B-tested, calendar-planned.

## 매 핵심

### 매 LiveOps pillars
- **Content cadence**: 매 weekly events, 매 monthly seasons, 매 quarterly major.
- **Balance patches**: 매 telemetry-driven 매 buff/nerf.
- **Monetization**: 매 battle pass, 매 limited bundles, 매 events.
- **Retention loops**: 매 daily login, 매 streak, 매 timed events.
- **Community**: 매 Discord, 매 Reddit, 매 patch notes, 매 dev streams.

### 매 Telemetry → action loop
1. Collect (events, sessions, IAP, churn).
2. Analyze (cohort retention, ARPDAU, funnel).
3. Hypothesize (feature/event/balance change).
4. A/B test (segmented rollout).
5. Roll out (or roll back).

### 매 응용
1. **Mobile F2P**: 매 Clash Royale, Genshin, Royal Match — 매 textbook.
2. **Live-service shooter**: 매 Fortnite, Apex, Helldivers 2.
3. **MMO**: 매 FFXIV, WoW — 매 patch + expansion cycle.
4. **Gacha**: 매 Genshin, 매 Star Rail — 매 banner schedule 매 core.

## 💻 패턴

### Remote config (server-driven balance)
```csharp
// Unity + PlayFab
async Task ApplyRemoteBalance() {
    var cfg = await PlayFab.GetTitleData(new[] { "balance.json" });
    var balance = JsonConvert.DeserializeObject<Balance>(cfg["balance.json"]);
    GameTuning.SwordDamage   = balance.SwordDamage;
    GameTuning.GoldDropRate  = balance.GoldDropRate;
    GameTuning.BossHpScalar  = balance.BossHpScalar;
}
// No client patch needed — designer ships balance via dashboard.
```

### Event scheduling (calendar-driven)
```json
{
  "events": [
    { "id": "summer_2026", "start": "2026-06-15T00:00Z", "end": "2026-07-15T00:00Z",
      "modifiers": { "xp_mult": 2.0, "drop_table": "summer_pool" },
      "store": "summer_bundle" },
    { "id": "halloween_2026", "start": "2026-10-20T00:00Z", "end": "2026-11-05T00:00Z",
      "modifiers": { "skin_pack": "spooky" } }
  ]
}
```

### A/B test (server-segmented)
```python
def assign_variant(user_id: str, exp: str) -> str:
    h = hashlib.sha256(f"{exp}:{user_id}".encode()).digest()
    return "B" if h[0] % 2 else "A"

def starter_pack_price(user_id):
    v = assign_variant(user_id, "starter_price_v3")
    return 4.99 if v == "A" else 7.99   # measure conversion × revenue
```

### Battle pass logic
```typescript
interface BattlePass {
  seasonId: string;
  startUtc: string; endUtc: string;
  freeTrack: Reward[];   // 50 tiers
  premiumTrack: Reward[];
  xpPerTier: number;
  premiumPrice: { usd: 9.99 };
}

function tierFromXp(xp: number, bp: BattlePass): number {
  return Math.min(50, Math.floor(xp / bp.xpPerTier));
}
```

### Cohort retention SQL
```sql
WITH cohort AS (
  SELECT user_id, DATE(MIN(session_start)) AS d0
  FROM sessions GROUP BY user_id
)
SELECT
  d0,
  COUNT(*) AS n0,
  COUNT(DISTINCT CASE WHEN s.session_start::date = d0 + 1  THEN s.user_id END)::float / COUNT(*) AS d1,
  COUNT(DISTINCT CASE WHEN s.session_start::date = d0 + 7  THEN s.user_id END)::float / COUNT(*) AS d7,
  COUNT(DISTINCT CASE WHEN s.session_start::date = d0 + 30 THEN s.user_id END)::float / COUNT(*) AS d30
FROM cohort c LEFT JOIN sessions s USING (user_id)
GROUP BY d0 ORDER BY d0;
```

### Hot-fix flag system
```csharp
// Feature flag — disable broken feature without client patch
if (FeatureFlags.IsEnabled("new_pvp_mode") && !FeatureFlags.IsKilled("new_pvp_mode")) {
    ShowPvpEntry();
}
```

### Anti-cheat telemetry alert
```python
# Real-time anomaly detection on coin gain
def is_suspicious(user, gain, window):
    median = get_median_gain(user.cohort, window)
    return gain > median * 50  # >50× median = inspect
```

## 매 결정 기준
| 상황 | Approach |
|---|---|
| 매 mobile F2P launch | 매 LiveOps 매 day-1 plan, 매 6mo content roadmap |
| 매 single-player premium | 매 LiveOps 매 unnecessary (DLC enough) |
| 매 small indie | 매 lightweight events + Discord, 매 full LiveOps team 매 X |
| 매 MMO | 매 patch cycle + expansion + LiveOps 매 hybrid |
| 매 dying game | 매 sunset plan, 매 honest 매 player communication |

**기본값**: 매 remote config + event calendar + cohort retention dashboard 매 minimum viable LiveOps.

## 🔗 Graph
- 응용: [[Player-Retention]] · [[Game-Monetization]]
- Adjacent: [[Telemetry]] · [[Feature-Flags]]

## 🤖 LLM 활용
**언제**: 매 mobile/F2P design; 매 monetization strategy; 매 retention analysis; 매 event calendar planning.
**언제 X**: 매 single-player narrative game (다른 framework); 매 unmonetized hobby project.

## ❌ 안티패턴
- **Burnout-grind events**: 매 daily-mandatory events 매 churn 매 가속.
- **Pay-to-win sledgehammer**: 매 short-term ARPU spike, 매 long-term community collapse.
- **Silent nerf**: 매 patch notes 없이 매 weapon nerf — 매 trust 매 destroy.
- **No sunset plan**: 매 servers 매 갑작스럽 shut, 매 player data 매 lose.
- **Calendar-only, no story**: 매 events 매 mechanical 매 없이 narrative — 매 fatigue.

## 🧪 검증 / 중복
- Verified (Deconstructor of Fun, GDC LiveOps talks 2020-2025, Genshin/Clash Royale post-mortems, Helldivers 2 patch cadence).
- 신뢰도 A.

## 🕓 Changelog
| 날짜 | 변경 |
|---|---|
| 2026-05-08 | Phase 1 |
| 2026-05-10 | Manual cleanup — full content (LiveOps pillars, telemetry, battle pass) |
