Files
2nd/10_Wiki/Topics/AI_and_ML/전자상거래 소비자 참여 및 보상 시스템 최적화.md
T
2026-05-10 22:08:15 +09:00

183 lines
6.5 KiB
Markdown

---
id: wiki-2026-0508-전자상거래-소비자-참여-및-보상-시스템-최적화
title: 전자상거래 소비자 참여 및 보상 시스템 최적화
category: 10_Wiki/Topics
status: verified
canonical_id: self
aliases: [E-commerce Engagement, Reward System Optimization, 보상 시스템]
duplicate_of: none
source_trust_level: A
confidence_score: 0.88
verification_status: applied
tags: [e-commerce, growth, rewards, personalization]
raw_sources: []
last_reinforced: 2026-05-10
github_commit: pending
tech_stack:
language: typescript
framework: Next.js/Node
---
# 전자상거래 소비자 참여 및 보상 시스템 최적화
## 매 한 줄
> **"매 reward 는 dopamine schedule 의 design"**. e-commerce engagement 는 LTV (lifetime value) 곡선의 변형 문제로, 매 variable-ratio reinforcement + loss-aversion + social proof 의 조합. 2026 현재 매 ML personalization (reinforcement learning bandits) 으로 매 user 마다 다른 reward 를 발사.
## 매 핵심
### 매 4대 lever
- **Frequency**: visit cadence — 매 daily login bonus, streak
- **Depth**: AOV (average order value) — 매 threshold reward, free shipping bar
- **Breadth**: category exploration — 매 cross-sell coupon
- **Retention**: churn prevention — 매 win-back, lapsed user offer
### 매 reward 분류
- **Hedonic**: tier badge, exclusive access — 매 status driver
- **Utilitarian**: point/coupon, cashback — 매 economic driver
- **Social**: referral, leaderboard — 매 viral driver
- **Surprise**: random box, lucky draw — 매 dopamine spike
### 매 응용
1. Subscription churn 감소 — predictive offer 발사.
2. Cart abandonment 회복 — personalized incentive.
3. New-user onboarding — 매 first-week reward sequence.
## 💻 패턴
### Multi-armed bandit reward selector
```typescript
class ContextualBandit {
private weights: Map<string, number[]> = new Map()
selectReward(userCtx: UserContext, candidates: Reward[]): Reward {
const arms = candidates.map(r => ({
reward: r,
score: this.predict(userCtx, r),
}))
// Thompson sampling
const sampled = arms.map(a => ({
...a,
sample: a.score + this.gaussianNoise(0.1),
}))
return sampled.sort((a, b) => b.sample - a.sample)[0].reward
}
update(userCtx: UserContext, reward: Reward, outcome: number) {
const key = this.featureKey(userCtx, reward)
const w = this.weights.get(key) ?? [0, 0]
w[0] += outcome
w[1] += 1
this.weights.set(key, w)
}
}
```
### LTV-aware coupon sizing
```typescript
function couponAmount(user: UserProfile, basket: Cart): number {
const ltvDecile = user.ltvPercentile
const marginalLTV = user.predictedLTV - user.realizedLTV
// 매 high-LTV / low-realized = 매 invest more
const cap = Math.min(marginalLTV * 0.15, basket.total * 0.25)
// 매 churn risk multiplier
const risk = 1 + user.churnProb * 0.5
return Math.round(cap * risk)
}
```
### Streak / habit loop
```typescript
class StreakEngine {
async onLogin(userId: string, now: Date) {
const last = await this.getLastLogin(userId)
const days = daysBetween(last, now)
let streak = days === 1 ? (await this.getStreak(userId)) + 1 : 1
if (streak > 0 && streak % 7 === 0) {
await this.grantReward(userId, { type: "weekly_streak", multiplier: streak / 7 })
}
await this.setStreak(userId, streak)
}
}
```
### Cart abandonment recovery
```typescript
async function abandonRecovery(cart: Cart, user: User) {
const elapsed = Date.now() - cart.lastUpdate
if (elapsed < 1000 * 60 * 30) return // 매 too early
const offer = await bandit.selectReward(user.context, [
{ type: "free_shipping" },
{ type: "5_percent_off" },
{ type: "loyalty_2x_points" },
])
await sendEmail(user.email, renderRecovery(cart, offer))
await sendPush(user.deviceTokens, renderPush(offer))
}
```
### Gamified tier progression
```typescript
type Tier = "bronze" | "silver" | "gold" | "platinum"
const TIER_THRESHOLDS: Record<Tier, number> = {
bronze: 0, silver: 500, gold: 2000, platinum: 10000,
}
function tierProgress(spend: number): { tier: Tier; progress: number; nextAt: number } {
const tiers: Tier[] = ["bronze", "silver", "gold", "platinum"]
let cur: Tier = "bronze"
for (const t of tiers) if (spend >= TIER_THRESHOLDS[t]) cur = t
const next = tiers[tiers.indexOf(cur) + 1]
if (!next) return { tier: cur, progress: 1, nextAt: spend }
const nextAt = TIER_THRESHOLDS[next]
return { tier: cur, progress: (spend - TIER_THRESHOLDS[cur]) / (nextAt - TIER_THRESHOLDS[cur]), nextAt }
}
```
### Referral viral loop
```typescript
async function referralReward(referrer: string, referee: string, firstOrder: Order) {
if (firstOrder.total < 30) return // 매 anti-fraud floor
await grantPoints(referrer, 500)
await grantCoupon(referee, { value: 10, expiresInDays: 30 })
await track("referral_completed", { referrer, referee, orderValue: firstOrder.total })
}
```
## 매 결정 기준
| 상황 | Reward type |
|---|---|
| New user (D0-D7) | Welcome bundle + first-purchase bonus |
| Active mid-LTV | Streak + tier progress |
| High-LTV at churn risk | Personalized win-back, hedonic perk |
| Low-LTV, high acquisition cost | Bundle / referral, no deep coupon |
| Cart abandonment | Free shipping (cheap) → coupon (expensive) escalate |
**기본값**: contextual bandit + LTV-capped budget + 매 hedonic + utilitarian mix.
## 🔗 Graph
- 부모: [[E-commerce_Platforms]] · [[Growth_Engineering]]
- 변형: [[하이브리드_수익화(Hybrid_Monetization)]] · [[부분_유료화(Free-to-Play)]]
- 응용: [[리텐션(Retention)]] · [[가차(Gacha)]]
- Adjacent: [[Nudge_Theory]] · [[FOMO (Fear of Missing Out)]] · [[Telemetry_Balancing]]
## 🤖 LLM 활용
**언제**: copy generation (개인화 message), reward strategy ideation, A/B test hypothesis.
**언제 X**: 매 real-time bandit decision (latency budget < 50ms) — pre-trained model 로.
## ❌ 안티패턴
- **All-or-nothing coupon**: 매 같은 coupon 모두에게 — margin 폭탄.
- **Streak punishment**: 매 1일 miss 로 reset — 매 user frustration.
- **Dark pattern reward**: 매 hidden cost / forced opt-in — 매 churn 가속.
- **Tier inflation**: 매 너무 빠른 tier-up — 매 status 의미 상실.
- **Reward 의 marginal cost 무시**: 매 LTV 보다 큰 reward — unit economics 붕괴.
## 🧪 검증 / 중복
- Verified (Reichheld Loyalty Effect, Hooked by Nir Eyal, Shopify rewards docs).
- 신뢰도 A.
## 🕓 Changelog
| 날짜 | 변경 |
|---|---|
| 2026-05-08 | Phase 1 |
| 2026-05-10 | Manual cleanup — e-commerce engagement & reward optimization |