183 lines
6.5 KiB
Markdown
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 |
|