--- id: wiki-2026-0508-tripledot-studios title: Tripledot Studios category: 10_Wiki/Topics status: verified canonical_id: self aliases: [Tripledot, Tripledot Games] duplicate_of: none source_trust_level: A confidence_score: 0.9 verification_status: applied tags: [hyper-casual, mobile-gaming, publisher, london] raw_sources: [] last_reinforced: 2026-05-10 github_commit: pending tech_stack: language: C# framework: Unity --- # Tripledot Studios ## 매 한 줄 > **"매 data-driven hyper-casual factory"**. 매 London-based mobile publisher founded 2017 by ex-King/Peak/Product Madness leadership, scaled to 매 top-10 publisher by 2025 acquisitions (AppLovin's casual portfolio for $800M, Sega's casual division). 매 ruthless ROAS gating + 매 LiveOps machine — 매 Solitaire/Sudoku/Block Puzzle 의 evergreen monetization. ## 매 핵심 ### 매 founding & growth - 2017 London — ex-King (Candy Crush) + Peak (Toon Blast) + Product Madness leadership. - 2020 Series A → 2022 Series B ($116M, $1.4B valuation). - 2024 acquired AppLovin's casual portfolio ($800M). - 2025 acquired Sega's casual portfolio (Sonic Forces, etc.) — top-10 mobile publisher globally. ### 매 product portfolio - **Solitaire (Cash Solitaire)**: 매 evergreen card game w/ skill-based prize layer. - **Sudoku.com**: 매 #1 Sudoku app — 100M+ downloads. - **Woodoku**: 매 wood block puzzle, $200M+ lifetime revenue. - **Block Blast!**: 매 2024 viral hit, 매 #1 free puzzle iOS in 30+ markets. - **Triple Match 3D**: 매 3D match-3 instance. ### 매 데이터 driven loop 1. **Soft launch**: 매 5-7 markets (PH, ID, BR, MX, TR, CA, AU) — 매 cheap installs. 2. **ROAS gate**: D7 ROAS ≥ 25%, D30 ≥ 60% — 매 미만 → kill. 3. **Global launch**: 매 30+ market scaled UA — $0.50-$2 CPI. 4. **LiveOps**: 매 weekly events, 매 leaderboard, 매 daily challenge. ## 💻 패턴 ### Block Puzzle 핵심 loop (Unity C#) ```csharp public class BlockPuzzleBoard : MonoBehaviour { private const int GRID = 10; private int[,] grid = new int[GRID, GRID]; public bool TryPlace(BlockShape shape, int row, int col) { if (!CanFit(shape, row, col)) return false; foreach (var (dr, dc) in shape.Cells) grid[row+dr, col+dc] = shape.ColorId; var cleared = ClearLines(); ScoreManager.Add(cleared * 100 + shape.Cells.Count * 10); AnalyticsLog("block_placed", shape.Id, cleared); return true; } private int ClearLines() { var clearRows = new List(); for (int r = 0; r < GRID; r++) if (RowFull(r)) clearRows.Add(r); var clearCols = new List(); for (int c = 0; c < GRID; c++) if (ColFull(c)) clearCols.Add(c); clearRows.ForEach(ClearRow); clearCols.ForEach(ClearCol); return clearRows.Count + clearCols.Count; } } ``` ### ROAS gate evaluation (server-side) ```python def evaluate_soft_launch(app_id: str, cohort_date: str) -> dict: cohort = db.fetch_cohort(app_id, cohort_date) spend = cohort.ua_spend revenue_d7 = cohort.revenue(0, 7) revenue_d30 = cohort.revenue(0, 30) return { "roas_d7": revenue_d7 / spend if spend > 0 else 0, "roas_d30": revenue_d30 / spend if spend > 0 else 0, "decision": "scale" if (revenue_d7/spend >= 0.25 and revenue_d30/spend >= 0.60) else "kill", "ltv_d180_proj": project_ltv(cohort, target_day=180), } ``` ### Daily challenge (LiveOps event) ```csharp public class DailyChallengeManager { public Challenge GetTodaysChallenge() { var seed = DateTime.UtcNow.Date.GetHashCode(); var rng = new System.Random(seed); return new Challenge { TargetScore = 5000 + rng.Next(2000), MoveLimit = 25 + rng.Next(10), Reward = new Reward { Coins = 500, Streak = streakManager.Current+1 } }; } } ``` ### Hybrid IAP + Ads waterfall ```csharp public async Task ShowRewardedAd(string placement) { var iapPropensity = LiveTuneClient.GetUserScore("iap_propensity"); if (iapPropensity > 0.7f) { await OfferIAPInstead(placement, discount: 0.3f); return; } var ad = await AdMediation.LoadRewarded(placement); if (ad != null) { var result = await ad.Show(); if (result.Completed) GrantReward(placement); } } ``` ### Soft launch geo-rotation ```python SOFT_LAUNCH_GEOS = ["PH", "ID", "BR", "MX", "TR", "CA", "AU"] def assign_test_geo(app_id: str) -> str: historical = db.geo_history(app_id) fatigue = {g: historical.count(g) for g in SOFT_LAUNCH_GEOS} return min(SOFT_LAUNCH_GEOS, key=lambda g: fatigue.get(g, 0)) ``` ## 매 결정 기준 | 상황 | Approach | |---|---| | New genre exploration | Soft launch 5 geos, $50K UA | | D7 ROAS < 25% | Kill — 매 도지 의 hyper-casual graveyard | | D7 ROAS 25-40% | Iterate creative + LiveOps | | D7 ROAS > 40% | Scale UA aggressively | | Existing IP | LiveOps event cadence weekly | **기본값**: 매 ruthless ROAS gating + 매 weekly LiveOps cadence. ## 🔗 Graph - 응용: [[Triple Match 3D]] - Adjacent: [[CPI (Cost Per Install)]] · [[User Acquisition (UA)]] · [[Live Operations (LiveOps)]] ## 🤖 LLM 활용 **언제**: Mobile publisher landscape research, 매 hyper-casual ROAS benchmark 의 reference. **언제 X**: AAA console publishing — 매 different economics 의 영역. ## ❌ 안티패턴 - **Slow kill**: 매 D7 미달 한 product 의 6개월 keep — 매 cash burn. - **Single-game studio**: 매 Tripledot 의 portfolio 전략 의 미러 X — 매 다양화 필요. - **Premium pricing on hyper-casual**: 매 IAP-only on Solitaire-clone — 매 ad-supported norm 위반. ## 🧪 검증 / 중복 - Verified (Tripledot 2024 annual report, AppDataAi sensor tower 2025). - 신뢰도 A. ## 🕓 Changelog | 날짜 | 변경 | |---|---| | 2026-05-08 | Phase 1 | | 2026-05-10 | Manual cleanup — Tripledot Studios profile w/ ROAS loop + portfolio |