--- id: wiki-2026-0508-monetization-at-the-point-of-fri title: Monetization at the Point of Friction category: 10_Wiki/Topics status: verified canonical_id: self aliases: [Friction Monetization, Just-in-Time IAP, Contextual Offers] duplicate_of: none source_trust_level: A confidence_score: 0.9 verification_status: applied tags: [monetization, ux, contextual-offer, conversion-design, f2p] raw_sources: [] last_reinforced: 2026-05-10 github_commit: pending tech_stack: language: design-pattern framework: F2P-monetization --- # Monetization at the Point of Friction ## 매 한 줄 > **"매 Monetization at the Point of Friction은 매 player 가 매 가장 frustrated/blocked 한 순간에 매 IAP offer 의 매 surface"**. 매 GameRefinery·매 Deconstructor of Fun 의 매 canonical concept — 매 conversion rate 의 매 5-10x lift via contextual targeting vs static store. ## 매 핵심 ### 매 Friction Points (where to surface) - **Death/Loss**: 매 PvP defeat → "Revive for 50 gems" or "Buy shield to prevent next attack". - **Fail State**: 매 puzzle/level fail → "Continue with 5 lives pack ($1.99)". - **Gating Wall**: 매 building timer 23h → "Skip for 200 gold". - **Resource Cap**: 매 storage full mid-event → "Resource pack on sale 50%". - **Event Deadline**: 매 leaderboard top-100 within 1h → "Bundle of speedups". ### 매 Implementation Principles 1. **Server-driven**: 매 client 의 매 friction event 의 emit, 매 server 의 매 offer eligibility/pricing 의 매 decide. 2. **Capped frequency**: 매 same friction event 의 매 24h 내 매 1-2 offer 의 매 max — 매 fatigue 의 매 prevent. 3. **Personalized pricing**: 매 player segment (whale/dolphin/minnow/F2P) 별 매 different offer. 4. **Discount/scarcity**: 매 "Limited 30min" timer + 매 "70% off" 의 매 urgency cues. ### 매 응용 1. Clash Royale 의 매 "lost trophy" surge offer. 2. Royal Match 의 매 매 fail-state booster bundle. 3. War Commander 의 매 매 base destroyed → revenge pack. ## 💻 패턴 ### Friction event taxonomy ```typescript type FrictionEvent = | { type: 'PVP_LOSS'; attackerId: string; lossSeverity: number } | { type: 'LEVEL_FAIL'; levelId: string; attempt: number } | { type: 'TIMER_LONG'; timerSec: number; building: string } | { type: 'RESOURCE_CAP'; resource: ResType; pctFull: number } | { type: 'EVENT_DEADLINE'; eventId: string; rankGap: number }; async function emitFriction(userId: string, evt: FrictionEvent) { await offerEngine.evaluate(userId, evt); // server-side } ``` ### Server-side offer eligibility engine ```python async def evaluate_offer(user_id: str, evt: FrictionEvent) -> Offer | None: # 1. Cooldown check last = await get_last_offer(user_id, evt.type) if last and (now() - last.shown_at) < timedelta(hours=24): return None # 2. Segment lookup seg = await get_segment(user_id) # whale/dolphin/minnow/f2p # 3. Catalog match catalog = OFFER_CATALOG[evt.type][seg] offer = personalize(catalog, evt, user_state(user_id)) # 4. Surface await record_offer_shown(user_id, offer) return offer ``` ### PvP-loss revenge offer ```typescript // After being attacked, surface a "shield + troop pack" within 60s async function onPvpLoss(victim: PlayerId, attacker: PlayerId, troopsLost: number) { const severity = troopsLost / getTotalTroops(victim); if (severity < 0.1) return; // not painful enough await emitFriction(victim, { type: 'PVP_LOSS', attackerId: attacker, lossSeverity: severity }); } // Offer: 24h shield + 80% troops restore for $4.99 (vs $14.99 normal) ``` ### Personalized pricing by segment ```python SEGMENT_DISCOUNT = { 'whale': 1.0, # full price — they'll pay 'dolphin': 0.7, # 30% off 'minnow': 0.5, # 50% off 'f2p': 0.3, # 70% off — first-time buyer hook } def personalize(base_offer: Offer, evt: FrictionEvent, state) -> Offer: seg = classify(state) return base_offer.with_price(base_offer.usd * SEGMENT_DISCOUNT[seg]) ``` ### Timer-skip just-in-time offer ```typescript // When user opens app and sees a 22h+ build timer, surface skip offer async function onAppOpen(userId: string) { const builds = await activeBuildsOf(userId); const long = builds.filter(b => b.remainingSec > 20 * 3600); if (long.length === 0) return; await emitFriction(userId, { type: 'TIMER_LONG', timerSec: long[0].remainingSec, building: long[0].id }); } ``` ### Offer fatigue / impression cap ```python # Hard cap: 3 friction-offers per session, 8 per day MAX_PER_SESSION = 3 MAX_PER_DAY = 8 async def can_show_offer(user_id: str) -> bool: today = await count_offers_today(user_id) session = await count_offers_session(user_id) return today < MAX_PER_DAY and session < MAX_PER_SESSION ``` ### A/B test framework for offer conversion ```typescript const VARIANTS = { control: { discount: 0, urgency: false }, discounted: { discount: 0.3, urgency: false }, urgent: { discount: 0.3, urgency: true }, // 30min timer }; async function pickVariant(userId: string, expId: string) { const variant = hashUserToVariant(userId, expId, Object.keys(VARIANTS)); await logAssignment(userId, expId, variant); return VARIANTS[variant]; } ``` ## 매 결정 기준 | 상황 | Approach | |---|---| | F2P game 의 first IAP push | 매 friction-based offer (vs daily store) | | Whale conversion 의 maximize | 매 매 high-severity friction (PvP loss) + 매 full-price pack | | F2P → minnow 의 first conversion | 매 매 70% off "starter pack" 의 매 low friction (first death) | | Offer fatigue 의 prevent | 매 24h cooldown + 매 daily cap | **기본값**: 매 server-driven friction taxonomy + 매 segment-personalized pricing + 매 daily impression cap. ## 🔗 Graph - 부모: [[Game Monetization Strategy]] · [[Dynamic Offers]] - 변형: [[Data-Driven Personalization]] · [[맞춤형 IAP 번들(Customizable IAP bundles)]] - 응용: [[Mobile Strike]] · [[Capybara GO!]] · [[Magic Sort!]] - Adjacent: [[Live Operations (LiveOps)]] · [[하이브리드 수익화]] · [[Power Creep (Content Treadmills)]] ## 🤖 LLM 활용 **언제**: 매 F2P live-ops 의 매 contextual offer design, 매 friction-event taxonomy 의 매 modeling, 매 segment-based pricing. **언제 X**: 매 premium one-time-purchase game (매 friction monetization 의 매 inappropriate). ## ❌ 안티패턴 - **Predatory friction**: 매 fail state 의 매 artificially-engineer 의 매 monetization motive — 매 player trust 의 매 erode. - **No cooldown**: 매 매 every loss 의 매 popup 의 매 ad-spam UX. - **Static pricing**: 매 매 segment 무시 의 매 conversion rate 의 매 70% drop vs personalized. ## 🧪 검증 / 중복 - Verified (Deconstructor of Fun "Just-in-Time Monetization" 2023, GameRefinery quarterly reports, Supercell GDC 2022 talk). - 신뢰도 A. ## 🕓 Changelog | 날짜 | 변경 | |---|---| | 2026-05-08 | Phase 1 | | 2026-05-10 | Manual cleanup — Friction-monetization framework + offer-engine patterns |