Claude Code Plugins

Community-maintained marketplace

Feedback

gamification-mastery-skill

@Useforclaude/skills-claude
0
0

Master advanced gamification design and behavioral game mechanics. Use for points/badges/leaderboards systems, progression mechanics, reward schedules, habit formation loops, player types (Bartle taxonomy), achievement design, social dynamics, competition vs collaboration balance, variable reward schedules, loss aversion mechanics, onboarding flows, retention optimization, engagement loops, monetization through gamification, ethical gamification, anti-patterns to avoid, and building addictive (but healthy) product experiences using game psychology. Also use for Thai keywords "gamification", "เกมมิฟิเคชั่น", "คะแนน", "ตรา", "leaderboard", "ลีดเดอร์บอร์ด", "ระบบความก้าวหน้า", "progression", "ตารางรางวัล", "reward schedule", "สร้างนิสัย", "habit", "ประเภทผู้เล่น", "achievement", "ความสำเร็จ", "engagement", "มีส่วนร่วม", "retention", "รักษาผู้ใช้", "ทำให้ติดใจ", "เล่นสนุก".. Also use for Thai keywords "จิตวิทยา", "พฤติกรรม", "จิตวิทยาผู้บริโภค", "จิตวิทยาการตลาด", "พฤติกรรม", "การกระทำ", "ความประพฤติ", "พฤติกรรมผู้บริโภค", "ออกแบบ", "ดีไซน์", "การออกแบบ", "design

Install Skill

1Download skill
2Enable skills in Claude

Open claude.ai/settings/capabilities and find the "Skills" section

3Upload to Claude

Click "Upload skill" and select the downloaded ZIP file

Note: Please verify skill by going through its instructions before using it.

SKILL.md

name gamification-mastery-skill
description Master advanced gamification design and behavioral game mechanics. Use for points/badges/leaderboards systems, progression mechanics, reward schedules, habit formation loops, player types (Bartle taxonomy), achievement design, social dynamics, competition vs collaboration balance, variable reward schedules, loss aversion mechanics, onboarding flows, retention optimization, engagement loops, monetization through gamification, ethical gamification, anti-patterns to avoid, and building addictive (but healthy) product experiences using game psychology. Also use for Thai keywords "gamification", "เกมมิฟิเคชั่น", "คะแนน", "ตรา", "leaderboard", "ลีดเดอร์บอร์ด", "ระบบความก้าวหน้า", "progression", "ตารางรางวัล", "reward schedule", "สร้างนิสัย", "habit", "ประเภทผู้เล่น", "achievement", "ความสำเร็จ", "engagement", "มีส่วนร่วม", "retention", "รักษาผู้ใช้", "ทำให้ติดใจ", "เล่นสนุก".. Also use for Thai keywords "จิตวิทยา", "พฤติกรรม", "จิตวิทยาผู้บริโภค", "จิตวิทยาการตลาด", "พฤติกรรม", "การกระทำ", "ความประพฤติ", "พฤติกรรมผู้บริโภค", "ออกแบบ", "ดีไซน์", "การออกแบบ", "design"

Gamification Mastery Skill

Transform boring experiences into engaging games using advanced behavioral psychology and game design principles.


📋 Table of Contents

  1. What is Advanced Gamification?
  2. Core Gamification Frameworks
  3. Player Psychology & Motivation
  4. Game Mechanics Library
  5. Progression Systems
  6. Reward Schedules & Dopamine Engineering
  7. Social Dynamics & Competition
  8. Onboarding & First-Time Experience
  9. Retention Mechanics
  10. Monetization Through Gamification
  11. Analytics & Optimization
  12. Ethical Gamification
  13. Implementation Patterns
  14. Real-World Case Studies

What is Advanced Gamification?

Gamification = Applying game design elements to non-game contexts to increase engagement, motivation, and behavior change.

Basic Gamification (Points/Badges/Leaderboards):

❌ Add points to everything
❌ Generic badge system
❌ Public leaderboard
Result: Initial spike, then drop-off

Advanced Gamification (Behavioral Design):

✅ Understand player motivations (Bartle types)
✅ Design meaningful progression systems
✅ Use variable reward schedules (Skinner box)
✅ Balance intrinsic vs extrinsic motivation
✅ Create habit loops (trigger → action → reward)
✅ Ethical design (no dark patterns)

Result: Sustained engagement, genuine behavior change

Core Gamification Frameworks

Framework 1: Octalysis (Yu-kai Chou)

8 Core Drives:

    Epic Meaning          Accomplishment
         ╲                    ╱
          ╲                  ╱
           ⬣ ━━━━━━━━━━━━ ⬣
          ╱  ╲            ╱  ╲
         ╱    ╲          ╱    ╲
        ⬣      ⬣ ━━━━━ ⬣      ⬣
    Creativity  Ownership  Social   Scarcity
         ╲      ╱          ╲      ╱
          ╲    ╱            ╲    ╱
           ⬣ ━━              ━━ ⬣
         Unpredictability  Avoidance

1. Epic Meaning & Calling

  • Player believes they're doing something greater
  • Examples: Wikipedia contributors, open-source developers
  • Use when: Building communities, social impact apps

2. Development & Accomplishment

  • Progress, leveling up, mastering skills
  • Examples: LinkedIn profile strength, Duolingo streaks
  • Use when: Learning platforms, skill development

3. Empowerment of Creativity

  • Players express themselves, experiment
  • Examples: Minecraft, Roblox, customization systems
  • Use when: Creative tools, sandbox experiences

4. Ownership & Possession

  • Players feel they own something and want to improve it
  • Examples: Virtual items, collections, avatars
  • Use when: E-commerce, collecting mechanics

5. Social Influence & Relatedness

  • Competition, cooperation, social validation
  • Examples: Facebook likes, multiplayer games
  • Use when: Social platforms, team productivity

6. Scarcity & Impatience

  • Want something because can't have it (FOMO)
  • Examples: Limited editions, appointment mechanics
  • Use when: E-commerce, event-driven apps

7. Unpredictability & Curiosity

  • Variable rewards, mystery boxes, plot twists
  • Examples: Loot boxes, slot machines, Netflix autoplay
  • Use when: Content discovery, engagement loops

8. Loss & Avoidance

  • Don't want to lose progress or miss out
  • Examples: Snapchat streaks, expiring content
  • Use when: Habit formation, retention

Octalysis Scoring:

// Calculate Octalysis score for your feature
const octalysisScore = {
  epicMeaning: 6,        // 0-10 scale
  accomplishment: 8,
  creativity: 4,
  ownership: 7,
  social: 9,
  scarcity: 5,
  unpredictability: 6,
  lossAvoidance: 7
};

const totalScore = Object.values(octalysisScore).reduce((a, b) => a + b, 0);
const avgScore = totalScore / 8; // Aim for 6+ average

Framework 2: MDA Framework (Mechanics-Dynamics-Aesthetics)

Designer View:
Mechanics → Dynamics → Aesthetics

Player View:
Aesthetics ← Dynamics ← Mechanics

Mechanics = Rules and systems (points, levels, quests) Dynamics = Behavior that emerges from mechanics (competition, progression) Aesthetics = Emotional responses (fun, satisfaction, pride)

Example: Duolingo

  • Mechanics: XP points, daily streaks, leagues
  • Dynamics: Daily practice habit, competitive climbing
  • Aesthetics: Sense of progress, accomplishment, fear of losing streak

Framework 3: Self-Determination Theory (SDT)

3 Psychological Needs for Intrinsic Motivation:

    Autonomy          Competence         Relatedness
       │                   │                   │
       │                   │                   │
   Choice &           Progress &          Connection &
   Control            Mastery            Belonging
       │                   │                   │
       └───────────────────┴───────────────────┘
                           │
                   Intrinsic Motivation
                   (Sustainable Engagement)

Design Principles:

  1. Autonomy: Give players meaningful choices
  2. Competence: Provide clear feedback on progress
  3. Relatedness: Foster social connections

Example Implementation:

// SDT-Based Feature Design
const feature = {
  autonomy: {
    choices: ['Multiple paths to goal', 'Customization options', 'Opt-in features'],
    implementation: 'Let users choose learning path in app'
  },
  competence: {
    feedback: ['Progress bars', 'Skill trees', 'Achievement unlocks'],
    implementation: 'Show mastery percentage for each skill'
  },
  relatedness: {
    social: ['Teams', 'Friends list', 'Shared goals'],
    implementation: 'Study groups with shared progress'
  }
};

Player Psychology & Motivation

Bartle's Player Types

        ACTING
          │
    ╔═════╪═════╗
    ║     │     ║
 W  ║ ACHIEVER  ║ P
 O  ║     │     ║ L
 R  ╠─────┼─────╣ A
 L  ║     │     ║ Y
 D  ║   EXPLORER║ E
    ║     │     ║ R
    ╚═════╪═════╝ S
          │
      INTERACTING

1. Achievers (40% of players)

  • Motivation: Complete goals, earn rewards, level up
  • Drives: Accomplishment, mastery, status
  • Design for them:
    • Clear goals and milestones
    • Visible progress bars
    • Achievements and trophies
    • Leaderboards (rank-based)
    • Completion percentages

Example Mechanics:

const achieverFeatures = {
  goals: [
    { id: 1, title: 'Complete 10 tasks', reward: 'Gold badge', progress: '7/10' },
    { id: 2, title: 'Reach level 5', reward: 'Unlock new feature', progress: '80%' }
  ],
  leaderboard: {
    position: 12,
    totalPlayers: 1000,
    message: 'You\'re in the top 2%! 🏆'
  }
};

2. Explorers (20% of players)

  • Motivation: Discover hidden content, learn how things work
  • Drives: Curiosity, mastery, novelty
  • Design for them:
    • Easter eggs and hidden features
    • Unlockable content areas
    • Complex systems to master
    • Discovery badges ("Found the secret room!")
    • Lore and world-building

Example Mechanics:

const explorerFeatures = {
  hiddenContent: [
    { trigger: 'Click logo 10 times', unlock: 'Developer console' },
    { trigger: 'Complete tutorial in <2 min', unlock: 'Speed demon badge' }
  ],
  discoveryLog: {
    found: 15,
    total: 50,
    recentDiscovery: 'Secret keyboard shortcut (Ctrl+Shift+D)'
  }
};

3. Socializers (20% of players)

  • Motivation: Make friends, interact, build relationships
  • Drives: Connection, collaboration, self-expression
  • Design for them:
    • Chat and messaging
    • Guilds/teams/clans
    • Gifting systems
    • Profile customization
    • Social graphs ("Friends who also use this")

Example Mechanics:

const socializerFeatures = {
  social: {
    friends: 23,
    onlineNow: 5,
    teamMembers: 8,
    recentActivity: [
      { user: 'Alex', action: 'completed same quest as you', time: '5m ago' }
    ]
  },
  gifting: {
    canSend: ['Bonus XP', 'Cosmetic items', 'Energy refills'],
    received: 'Sarah sent you +50 XP! 🎁'
  }
};

4. Killers (5% of players)

  • Motivation: Compete, dominate, win against others
  • Drives: Competition, status, power
  • Design for them:
    • PvP (player vs player) modes
    • Competitive leaderboards
    • Zero-sum rewards (only #1 gets prize)
    • Ranking systems
    • Bragging rights

Example Mechanics:

const killerFeatures = {
  pvp: {
    rank: 'Diamond',
    winsToday: 8,
    losses: 2,
    winRate: '80%'
  },
  leaderboard: {
    position: 3,
    pointsAhead: 120,
    pointsBehind: 50,
    message: 'Beat 2 players to reach #1! 👑'
  }
};

Design Tip: Support All Types

Feature Mix:
- 40% Achievement mechanics (goals, progress)
- 25% Social mechanics (teams, chat)
- 25% Exploration mechanics (discovery, unlocks)
- 10% Competition mechanics (PvP, ranks)

Intrinsic vs Extrinsic Motivation

Extrinsic (External rewards):

  • Points, badges, prizes
  • Fast results, but shallow engagement
  • Risk: Players game the system

Intrinsic (Internal satisfaction):

  • Mastery, autonomy, purpose
  • Slower build, but deep engagement
  • Sustainable long-term

Optimal Mix:

Beginner:    80% Extrinsic, 20% Intrinsic
             (Need quick wins to hook them)

Intermediate: 50% Extrinsic, 50% Intrinsic
              (Building genuine interest)

Advanced:     20% Extrinsic, 80% Intrinsic
              (Self-motivated mastery)

Example Transition:

// Duolingo's motivation shift
const motivationJourney = {
  day1: {
    extrinsic: 'You earned 10 XP! 🎉',
    intrinsic: '(none yet)'
  },
  week1: {
    extrinsic: '7-day streak! Keep it up! 🔥',
    intrinsic: 'Starting to understand Spanish patterns'
  },
  month3: {
    extrinsic: 'Top 3 in your league! 🏆',
    intrinsic: 'Can read Spanish news articles now!'
  },
  year1: {
    extrinsic: '365-day streak (rare badge)',
    intrinsic: 'Having actual conversations in Spanish ❤️'
  }
};

Game Mechanics Library

Core Mechanics (The Foundation)

1. Points

// Simple points
const pointSystems = {
  // Single currency
  basic: {
    xp: 1250,
    level: 5
  },

  // Multi-currency (better)
  advanced: {
    xp: 1250,          // Experience (progression)
    coins: 450,        // Soft currency (earned)
    gems: 12,          // Hard currency (purchased)
    energy: 18,        // Consumable resource
    reputation: 85     // Social currency
  }
};

// Point earning actions
const pointRules = {
  'complete_task': { xp: 10, coins: 5 },
  'daily_login': { xp: 5, coins: 2, energy: 10 },
  'invite_friend': { xp: 50, coins: 25, gems: 1 },
  'perfect_score': { xp: 25, coins: 15, reputation: 5 }
};

Design Principles:

  • Use multiple currencies (different purposes)
  • Make earning feel generous (not stingy)
  • Round numbers (100, not 97)
  • Show "+10 XP" animations

2. Levels & Experience

// Experience curve design
class LevelSystem {
  // Linear (boring)
  linearXP(level) {
    return level * 100; // 100, 200, 300, 400...
  }

  // Exponential (standard)
  exponentialXP(level) {
    return Math.floor(100 * Math.pow(level, 1.5));
    // Level 1: 100 XP
    // Level 2: 283 XP
    // Level 5: 1,118 XP
    // Level 10: 3,162 XP
  }

  // Logarithmic (gentle curve)
  logarithmicXP(level) {
    return Math.floor(100 * Math.log(level + 1) * level);
  }

  // Custom curve (most control)
  customXP(level) {
    const base = 100;
    const exponent = 1.8;
    const modifier = level < 10 ? 0.8 : 1.0; // Easier early levels
    return Math.floor(base * Math.pow(level, exponent) * modifier);
  }

  // Calculate current progress
  getProgress(currentXP, level) {
    const currentLevelXP = this.exponentialXP(level);
    const nextLevelXP = this.exponentialXP(level + 1);
    const xpInLevel = nextLevelXP - currentLevelXP;
    const xpProgress = currentXP - currentLevelXP;

    return {
      level: level,
      currentXP: currentXP,
      xpToNext: nextLevelXP - currentXP,
      percentComplete: (xpProgress / xpInLevel) * 100
    };
  }
}

Level-Up Rewards:

const levelRewards = {
  1: { coins: 0, unlock: 'Basic features' },
  2: { coins: 50, unlock: null },
  3: { coins: 75, unlock: null },
  5: { coins: 150, unlock: 'Advanced dashboard' },
  10: { coins: 500, unlock: 'Team features', badge: 'Veteran' },
  15: { coins: 1000, unlock: null },
  20: { coins: 2000, unlock: 'Pro tools', badge: 'Expert', title: 'Master' }
};

// Big rewards every 5 levels (dopamine spike!)

3. Badges & Achievements

Achievement Types:

const achievementTypes = {
  // 1. Completion achievements (do X)
  completion: [
    { id: 'first_task', name: 'First Steps', desc: 'Complete your first task' },
    { id: 'tasks_10', name: 'Getting Started', desc: 'Complete 10 tasks' },
    { id: 'tasks_100', name: 'Centurion', desc: 'Complete 100 tasks', rarity: 'rare' }
  ],

  // 2. Mastery achievements (get good at X)
  mastery: [
    { id: 'perfect_week', name: 'Perfectionist', desc: '7 days with 100% completion' },
    { id: 'speed_demon', name: 'Speed Demon', desc: 'Complete task in under 1 minute' }
  ],

  // 3. Collection achievements (collect all X)
  collection: [
    { id: 'all_badges', name: 'Collector', desc: 'Earn all bronze badges' },
    { id: 'all_themes', name: 'Fashionista', desc: 'Unlock all color themes' }
  ],

  // 4. Social achievements (interact with others)
  social: [
    { id: 'invite_5', name: 'Recruiter', desc: 'Invite 5 friends' },
    { id: 'team_win', name: 'Team Player', desc: 'Win a team challenge' }
  ],

  // 5. Hidden/secret achievements (discover)
  hidden: [
    { id: 'konami_code', name: '↑↑↓↓←→←→BA', desc: 'Found the secret!', hidden: true },
    { id: 'night_owl', name: 'Night Owl', desc: 'Use app at 3am', hidden: true }
  ],

  // 6. Time-based achievements (login streak)
  timeBased: [
    { id: 'streak_7', name: '🔥 Week Warrior', desc: '7-day login streak' },
    { id: 'streak_30', name: '🔥 Monthly Master', desc: '30-day login streak' },
    { id: 'streak_365', name: '🔥 Annual Legend', desc: '365-day streak', rarity: 'legendary' }
  ]
};

// Achievement rarity
const rarity = {
  common: { color: '#gray', earnedBy: '80%' },
  uncommon: { color: '#green', earnedBy: '50%' },
  rare: { color: '#blue', earnedBy: '20%' },
  epic: { color: '#purple', earnedBy: '5%' },
  legendary: { color: '#gold', earnedBy: '1%' }
};

Achievement Notification:

function unlockAchievement(userId, achievementId) {
  const achievement = getAchievement(achievementId);

  // Save to database
  await db.userAchievements.create({
    userId,
    achievementId,
    unlockedAt: new Date()
  });

  // Show celebration modal
  showNotification({
    type: 'achievement',
    title: '🏆 Achievement Unlocked!',
    name: achievement.name,
    description: achievement.description,
    rarity: achievement.rarity,
    xpReward: achievement.xp,
    animation: 'confetti'
  });

  // Award XP bonus
  addXP(userId, achievement.xp);
}

4. Leaderboards

Leaderboard Types:

const leaderboardTypes = {
  // 1. Global leaderboard (intimidating for new users)
  global: {
    scope: 'all_users',
    timeframe: 'all_time',
    metric: 'total_xp',
    problem: 'Top players untouchable, discourages beginners'
  },

  // 2. Friends leaderboard (better - social comparison)
  friends: {
    scope: 'friends_only',
    timeframe: 'this_week',
    metric: 'weekly_xp',
    benefit: 'Compete with people you know'
  },

  // 3. League system (best - balanced competition)
  leagues: {
    type: 'tiered',
    tiers: ['Bronze', 'Silver', 'Gold', 'Platinum', 'Diamond'],
    playersPerLeague: 50,
    promotion: 'Top 10 move up',
    demotion: 'Bottom 5 move down',
    benefit: 'Always competing with similar skill level'
  },

  // 4. Temporal leaderboards (fresh start)
  temporal: {
    daily: { resets: '24h', rewards: 'Small' },
    weekly: { resets: '7d', rewards: 'Medium' },
    monthly: { resets: '30d', rewards: 'Large' },
    benefit: 'Everyone can win if they start at reset'
  }
};

Duolingo-Style League System:

class LeagueSystem {
  leagues = ['Bronze', 'Silver', 'Gold', 'Sapphire', 'Ruby', 'Emerald', 'Amethyst', 'Pearl', 'Obsidian', 'Diamond'];

  async assignUserToLeague(userId) {
    const userLeague = await this.getUserCurrentLeague(userId);

    // Find or create a league with <50 players
    const league = await db.leagues.findOne({
      tier: userLeague,
      memberCount: { $lt: 50 },
      startDate: { $gte: this.getWeekStart() }
    });

    if (!league) {
      // Create new league
      return await db.leagues.create({
        tier: userLeague,
        members: [userId],
        startDate: new Date(),
        endDate: this.getWeekEnd()
      });
    }

    // Add to existing league
    await db.leagues.updateOne(
      { _id: league._id },
      { $push: { members: userId }, $inc: { memberCount: 1 } }
    );

    return league;
  }

  async processWeeklyResults() {
    const leagues = await db.leagues.find({ endDate: { $lte: new Date() } });

    for (const league of leagues) {
      const rankings = await this.getRankings(league._id);

      // Top 10 get promoted
      for (let i = 0; i < 10 && i < rankings.length; i++) {
        await this.promoteUser(rankings[i].userId);
      }

      // Bottom 5 get demoted
      const bottom5 = rankings.slice(-5);
      for (const user of bottom5) {
        await this.demoteUser(user.userId);
      }

      // Award prizes
      await this.awardPrizes(rankings);
    }
  }
}

Anti-Leaderboard Pattern (Inclusive):

// Instead of showing "You're #47 of 1000" (feels bad)
// Show personalized progress comparisons

const inclusiveRanking = {
  yourRank: 47,
  context: [
    'You beat 95% of users! 🎉',
    'You\'re in the top 5%!',
    'Only 46 people ahead of you'
  ],
  nearbyRivals: [
    { rank: 45, name: 'Alex', xp: 1205, diff: '+15 XP to beat' },
    { rank: 46, name: 'Sam', xp: 1195, diff: '+5 XP to beat' },
    { rank: 47, name: 'You', xp: 1190, diff: '—' },
    { rank: 48, name: 'Jordan', xp: 1180, diff: '−10 XP behind you' },
    { rank: 49, name: 'Chris', xp: 1170, diff: '−20 XP behind you' }
  ],
  message: 'Beat Alex to enter the top 45! 💪'
};

5. Progress Bars

Why Progress Bars Work:

  • Zeigarnik Effect: Incomplete tasks create tension
  • Endowed Progress Effect: Showing any progress (even fake) increases completion

Progress Bar Patterns:

// 1. Simple progress bar
const simpleProgress = {
  current: 7,
  total: 10,
  percent: 70,
  display: '7/10 tasks complete [▓▓▓▓▓▓▓░░░] 70%'
};

// 2. Multi-step progress (better - shows next step)
const multiStepProgress = {
  steps: [
    { id: 1, name: 'Create account', status: 'complete' },
    { id: 2, name: 'Add profile photo', status: 'complete' },
    { id: 3, name: 'Invite friends', status: 'current', progress: '2/5' },
    { id: 4, name: 'Complete tutorial', status: 'locked' }
  ],
  currentStep: 3,
  totalSteps: 4
};

// 3. Endowed progress (head start illusion)
const endowedProgress = {
  current: 2,  // Actually 2/10
  total: 10,
  display: '4/12 complete', // Show as 4/12 (started at 2)
  psychology: 'User feels 33% done instead of 20%',
  result: '+30% completion rate (proven in research)'
};

// 4. Segmented progress (goals feel closer)
const segmentedProgress = {
  // Instead of "0/1000 points"
  // Break into chunks: "0/100 (Bronze) → 100/250 (Silver) → 250/500 (Gold)"
  currentTier: 'Silver',
  tierProgress: {
    earned: 150,
    tierStart: 100,
    tierEnd: 250,
    percent: 33 // (150-100)/(250-100) = 50/150 = 33%
  },
  display: 'Silver Tier: 150/250 points (33%)',
  nextTier: 'Gold (unlock at 250 points)'
};

Goal Gradient Effect:

// People accelerate effort as they approach goal
const goalGradientBoost = {
  progress: 85, // 85% complete
  message: 'So close! Just 15% to go! 🎯',
  bonus: 'Complete today and earn 2x XP!',
  psychology: 'Near completion = increased motivation'
};

Progression Systems

Skill Trees & Unlock Paths

// Tree-based progression (player choice)
const skillTree = {
  root: {
    id: 'basics',
    name: 'Fundamentals',
    unlocked: true,
    completed: true,
    branches: ['combat', 'crafting', 'social']
  },

  combat: {
    id: 'combat',
    name: 'Combat Skills',
    requires: 'basics',
    unlocked: true,
    skills: [
      { id: 'attack_1', name: 'Basic Attack', level: 3, maxLevel: 5 },
      { id: 'defense_1', name: 'Shield Block', level: 2, maxLevel: 5, requires: 'attack_1' },
      { id: 'ultimate', name: 'Ultimate Strike', level: 0, maxLevel: 1, requires: ['attack_1:5', 'defense_1:3'] }
    ]
  },

  crafting: {
    id: 'crafting',
    name: 'Crafting Skills',
    requires: 'basics',
    unlocked: false, // Not unlocked yet
    skills: [...]
  }
};

// Unlock logic
function canUnlockSkill(userId, skillId) {
  const skill = getSkill(skillId);
  const userProgress = getUserProgress(userId);

  // Check prerequisites
  for (const req of skill.requires) {
    if (typeof req === 'string') {
      // Simple requirement: 'basics'
      if (!userProgress.completed.includes(req)) return false;
    } else {
      // Level requirement: 'attack_1:5'
      const [reqSkill, reqLevel] = req.split(':');
      if (userProgress.skills[reqSkill]?.level < parseInt(reqLevel)) return false;
    }
  }

  return true;
}

Prestige/Rebirth Systems

// Reset progress for permanent bonuses
const prestigeSystem = {
  currentPrestige: 2,
  level: 45, // Current level before prestige
  maxLevelBeforePrestige: 50,

  prestigeBonuses: {
    prestige_1: { xpBonus: 10, unlocks: ['Golden badge', 'Special avatar'] },
    prestige_2: { xpBonus: 25, unlocks: ['Exclusive title: "Twice Born"'] },
    prestige_3: { xpBonus: 50, unlocks: ['Legendary frame'] }
  },

  canPrestige: true, // Level 45 >= 50 required

  warning: '⚠️ Prestiging will reset your level to 1 but grant permanent +25% XP bonus and exclusive rewards.',

  confirmPrestige() {
    return {
      resetLevel: 1,
      keepPermanent: ['Achievements', 'Prestige bonuses', 'Cosmetics'],
      loseTemorary: ['Current level', 'Current XP', 'League position']
    };
  }
};

Reward Schedules & Dopamine Engineering

Variable Ratio Schedules (Most Addictive)

Skinner Box Principles:

// Fixed ratio (boring - predictable)
const fixedRatio = {
  rule: 'Every 10 actions = 1 reward',
  example: 'Buy 10 coffees, get 1 free',
  engagement: 'Low - too predictable'
};

// Variable ratio (addictive - unpredictable)
const variableRatio = {
  rule: 'Random reward after ~10 actions (could be 5, could be 15)',
  example: 'Slot machines, loot boxes',
  engagement: 'Very high - "maybe next time!"',
  dopamine: 'Highest spike - anticipation + surprise'
};

// Implementation
class VariableRewardSystem {
  giveReward(action, averageFrequency = 10) {
    // Variable ratio: randomize around average
    const chance = 1 / averageFrequency;
    const variance = 0.3; // ±30% variance
    const actualChance = chance * (1 + (Math.random() - 0.5) * variance);

    if (Math.random() < actualChance) {
      return this.selectReward();
    }
    return null;
  }

  selectReward() {
    // Tiered rewards (rarity creates excitement)
    const roll = Math.random();

    if (roll < 0.60) return { type: 'common', coins: 10 }; // 60%
    if (roll < 0.85) return { type: 'uncommon', coins: 25 }; // 25%
    if (roll < 0.95) return { type: 'rare', coins: 100 }; // 10%
    if (roll < 0.99) return { type: 'epic', coins: 500 }; // 4%
    return { type: 'legendary', coins: 5000 }; // 1%
  }
}

Daily Rewards & Login Bonuses

const dailyRewardSystem = {
  day1: { coins: 10, xp: 5 },
  day2: { coins: 15, xp: 10 },
  day3: { coins: 20, xp: 15, badge: 'Early Bird' },
  day4: { coins: 25, xp: 20 },
  day5: { coins: 30, xp: 25 },
  day6: { coins: 40, xp: 30 },
  day7: { coins: 100, xp: 50, item: 'Legendary chest', badge: 'Week Warrior' },
  // Week 2: Bigger rewards
  day14: { coins: 500, xp: 200, item: 'Epic bundle', badge: 'Fortnight Fighter' },
  day30: { coins: 2000, xp: 1000, item: 'Ultimate pack', badge: 'Monthly Master', title: 'Dedicated' }
};

// Escalating rewards = FOMO if you break streak
function calculateDailyReward(streakDays) {
  const baseCoins = 10;
  const baseXP = 5;

  // Escalate by 50% each day
  const coins = Math.floor(baseCoins * Math.pow(1.5, streakDays - 1));
  const xp = Math.floor(baseXP * Math.pow(1.5, streakDays - 1));

  // Special rewards every 7 days
  const bonus = streakDays % 7 === 0 ? {
    item: 'Weekly chest',
    multiplier: 2
  } : null;

  return { coins, xp, bonus, streakDays };
}

Streak Mechanics (Loss Aversion)

class StreakSystem {
  async checkStreak(userId) {
    const user = await db.users.findById(userId);
    const now = new Date();
    const lastLogin = new Date(user.lastLoginDate);

    const hoursSinceLastLogin = (now - lastLogin) / (1000 * 60 * 60);

    if (hoursSinceLastLogin < 24) {
      // Same day - no change
      return { streak: user.streakDays, status: 'maintained' };
    } else if (hoursSinceLastLogin < 48) {
      // Next day - increment streak
      user.streakDays += 1;
      user.lastLoginDate = now;
      await user.save();

      return { streak: user.streakDays, status: 'increased', reward: this.getDailyReward(user.streakDays) };
    } else {
      // Missed a day - streak broken
      const lostStreak = user.streakDays;
      user.streakDays = 1; // Reset to 1
      user.lastLoginDate = now;
      await user.save();

      // Offer streak freeze (purchased with gems)
      return {
        streak: 1,
        status: 'broken',
        lostStreak: lostStreak,
        canRecover: user.streakFreezes > 0,
        recoveryOffer: {
          cost: 50, // gems
          message: `💔 Your ${lostStreak}-day streak was broken! Use a Streak Freeze to recover it? (50 💎)`
        }
      };
    }
  }

  // Streak freeze mechanic (monetization)
  async useStreakFreeze(userId) {
    const user = await db.users.findById(userId);

    if (user.streakFreezes <= 0) {
      return { error: 'No streak freezes available' };
    }

    // Restore streak
    user.streakDays = user.lastStreakBeforeBreak || 1;
    user.streakFreezes -= 1;
    await user.save();

    return {
      success: true,
      streakRestored: user.streakDays,
      freezesRemaining: user.streakFreezes
    };
  }
}

Duolingo's Streak Guilt:

Day 50 streak: 🔥🔥🔥🔥🔥 50
Message: "Don't lose your 50-day streak! Practice now!"
Psychology: Loss aversion > gain seeking
Result: 30%+ daily retention

Social Dynamics & Competition

Cooperative vs Competitive Mechanics

Cooperative (Build Together):

const cooperativeMechanics = {
  // Team goals
  teamChallenge: {
    goal: 'Complete 1000 tasks as a team',
    progress: 650,
    members: 10,
    avgContribution: 65,
    topContributor: { name: 'Alex', tasks: 120 },
    reward: 'All members get Epic badge + 500 coins'
  },

  // Shared progress
  guildBuilding: {
    structure: 'Guild Hall',
    level: 3,
    progress: '2500/5000 resources',
    contributors: 'All 25 guild members',
    benefit: 'Level 4 unlocks +10% XP for all'
  },

  // Helping mechanics
  gifting: {
    canSend: ['Energy refills', 'Bonus XP', 'Cosmetic items'],
    cooldown: '24 hours per friend',
    limit: '5 gifts per day',
    incentive: 'Get 10% of what you give (incentivizes helping)'
  }
};

Competitive (Zero-Sum):

const competitiveMechanics = {
  // Direct PvP
  duel: {
    opponent: 'Random player at similar skill',
    stakes: '50 coins (winner takes all)',
    outcome: 'Win/loss affects rating'
  },

  // Leaderboard race
  weeklyRace: {
    position: 12,
    prize: 'Top 10 get exclusive badge',
    zeroSum: true, // Only 10 winners out of 1000
    pressure: 'High - creates urgency'
  },

  // Territory control
  kingOfHill: {
    currentKing: 'Alex',
    timeHeld: '2 hours',
    challenger: 'You',
    reward: '1 gem per hour as king',
    mechanic: 'Constantly trying to dethrone each other'
  }
};

Optimal Mix: Coopetition (Best of Both)

const coopetitionDesign = {
  structure: 'Teams compete, individuals cooperate',

  example: {
    teams: [
      { name: 'Red Team', members: 50, score: 12500 },
      { name: 'Blue Team', members: 50, score: 11800 }
    ],

    dynamics: {
      withinTeam: 'Cooperative (help teammates score)',
      betweenTeams: 'Competitive (beat other team)',
      individual: 'Personal leaderboard within team'
    },

    rewards: {
      teamWin: 'All Red Team members get 200 coins',
      topIndividual: 'Top 3 in team get bonus badge',
      participation: 'Everyone who contributed gets base XP'
    }
  },

  psychology: 'Competition creates excitement, cooperation prevents alienation'
};

Social Proof & FOMO

const socialProofMechanics = {
  // Activity feed
  recentActivity: [
    { user: 'Alex', action: 'reached level 10', time: '2m ago', reaction: '12 likes' },
    { user: 'Sarah', action: 'earned Legendary badge', time: '5m ago', reaction: '25 likes' },
    { user: 'Chris', action: 'completed Epic quest', time: '10m ago', reaction: '8 likes' }
  ],

  // "X people are doing this now"
  liveActivity: {
    message: '🔴 347 people are playing right now!',
    psychology: 'If others are doing it, I should too'
  },

  // Friend comparison
  friendProgress: {
    message: '5 of your friends completed today\'s challenge',
    cta: 'Don\'t fall behind!',
    psychology: 'Fear of missing out on shared experience'
  },

  // Scarcity
  limitedEvent: {
    name: 'Weekend Double XP',
    endsIn: '23:45:12',
    participants: '12,450 players joined',
    message: 'Limited time! Join before it ends!',
    psychology: 'Urgency + social validation = high conversion'
  }
};

Onboarding & First-Time Experience

The First 5 Minutes (Make or Break)

Onboarding Funnel:

100 signups
  ↓ (-40%) Skip tutorial
 60 start tutorial
  ↓ (-20%) Drop during tutorial
 48 complete tutorial
  ↓ (-30%) Don't return next day
 34 retained users

Goal: Maximize the 34 → aim for 60%+

Effective Onboarding Pattern:

const onboardingFlow = {
  // Step 1: Immediate value (within 30 seconds)
  step1_quickWin: {
    action: 'Complete first micro-task (10 seconds)',
    reward: '+10 XP, "First Steps" badge',
    feedback: '🎉 Great job! You earned your first badge!',
    psychology: 'Early win = dopamine = continued engagement'
  },

  // Step 2: Show progress (endowed progress)
  step2_progress: {
    display: 'Profile 30% complete',
    breakdown: [
      { task: 'Create account', status: 'done' },
      { task: 'First action', status: 'done' },
      { task: 'Add profile photo', status: 'current' },
      { task: 'Invite friend', status: 'locked' }
    ],
    psychology: 'Zeigarnik effect - want to complete what\'s started'
  },

  // Step 3: Personalization (investment)
  step3_customize: {
    prompt: 'Choose your avatar and theme',
    options: ['6 avatars', '5 color themes'],
    psychology: 'Customization = ownership = commitment'
  },

  // Step 4: Social connection
  step4_social: {
    prompt: 'Invite friends or join a public team?',
    benefit: 'Teams earn 2x XP on challenges!',
    psychology: 'Social bonds increase retention 40%+'
  },

  // Step 5: Set goal (commitment device)
  step5_goal: {
    prompt: 'What\'s your goal?',
    options: ['Casual (3x/week)', 'Regular (daily)', 'Hardcore (2x/day)'],
    followup: 'We\'ll remind you to stay on track!',
    psychology: 'Public commitment = higher completion'
  }
};

Interactive Tutorial (Not Boring):

// ❌ Bad: Wall of text
const badTutorial = {
  screen1: '17 paragraphs of instructions',
  screen2: 'Feature list (nobody reads)',
  screen3: 'TOS acceptance',
  result: '70% drop-off rate'
};

// ✅ Good: Learn by doing
const goodTutorial = {
  method: 'Progressive disclosure',
  steps: [
    {
      instruction: 'Tap the ⭐ to earn points',
      interaction: 'User taps star',
      feedback: '+10 points! ✨',
      tooltip: 'You can earn points by completing actions'
    },
    {
      instruction: 'Swipe left to see more',
      interaction: 'User swipes',
      feedback: 'Nice! You found the hidden feature 🎁',
      unlock: 'Badge: Explorer'
    }
  ],
  result: '85% completion rate'
};

Retention Mechanics

The Hook Model (Nir Eyal)

  ┌─────────────┐
  │   TRIGGER   │ ← External/Internal trigger
  └─────┬───────┘
        ↓
  ┌─────────────┐
  │   ACTION    │ ← Behavior in anticipation of reward
  └─────┬───────┘
        ↓
  ┌─────────────┐
  │   REWARD    │ ← Variable reward (dopamine)
  └─────┬───────┘
        ↓
  ┌─────────────┐
  │ INVESTMENT  │ ← User puts something in (increases likelihood of return)
  └─────┬───────┘
        ↓
     [LOOP BACK TO TRIGGER]

Example: Duolingo

const duolingoHook = {
  trigger: {
    external: 'Push notification: "Your streak is about to break! 🔥"',
    internal: 'Guilt/FOMO feeling → "I should practice"'
  },

  action: {
    behavior: 'Open app, start lesson',
    simplicity: 'One tap to start, lessons are 2-5 min',
    motivation: 'Don\'t lose 47-day streak!'
  },

  reward: {
    variable: 'Sometimes easy lesson, sometimes hard',
    feedback: '+10 XP, "Perfect lesson!" badge',
    surprise: 'Random "Legendary achievement" unlock',
    social: 'You passed Alex on the leaderboard! 🏆'
  },

  investment: {
    progress: '47-day streak (too valuable to lose)',
    data: 'Course 32% complete',
    reputation: 'Diamond league status',
    identity: '"I\'m a Spanish learner" (self-image)',
    nextTrigger: 'Tomorrow\'s streak notification already scheduled'
  }
};

Retention Curves & Re-Engagement

Typical Retention Drop:

Day 1:  100% (signup)
Day 2:   40% (60% churn!)
Day 7:   25%
Day 30:  15%
Day 90:  10%

Goal: Increase Day 7 retention from 25% to 40%+

Re-Engagement Tactics:

const reEngagementCampaign = {
  // Day 1 inactive: Gentle reminder
  day1: {
    channel: 'Push notification',
    message: 'Come back and earn your daily bonus! 🎁',
    incentive: 'Double XP for your next action'
  },

  // Day 3 inactive: Bigger incentive
  day3: {
    channel: 'Email + Push',
    message: 'We miss you! Here\'s 100 free coins 💰',
    incentive: 'Free coins (already added to account)',
    psychology: 'Endowment effect - "I have coins, better use them"'
  },

  // Day 7 inactive: Social pressure
  day7: {
    channel: 'Email',
    message: 'Your friend Alex just reached level 10!',
    incentive: 'Catch up with your friends',
    psychology: 'FOMO + social comparison'
  },

  // Day 14 inactive: Last resort
  day14: {
    channel: 'Email',
    message: 'Your 🔥 30-day streak will expire in 24 hours',
    incentive: 'One quick lesson saves your streak',
    psychology: 'Loss aversion (sunk cost fallacy)'
  },

  // Day 30+ inactive: Win-back campaign
  day30: {
    channel: 'Email',
    subject: 'We\'ve added new features you\'ll love',
    message: 'We added [specific feature based on user interest]',
    incentive: 'Fresh start bonus: 500 XP',
    cta: 'See what\'s new'
  }
};

Monetization Through Gamification

Monetization Patterns

1. Cosmetic Microtransactions (Ethical)

const cosmeticStore = {
  // Non-pay-to-win items
  items: [
    { id: 'avatar_1', name: 'Cool Shades Avatar', price: 100, currency: 'coins' },
    { id: 'theme_gold', name: 'Gold Theme', price: 500, currency: 'coins' },
    { id: 'badge_frame', name: 'Legendary Frame', price: 50, currency: 'gems' },
    { id: 'profile_bg', name: 'Animated Background', price: 200, currency: 'gems' }
  ],

  // Free currency (earned) vs Premium currency (purchased)
  currency: {
    coins: { earn: 'Playing the game', purchase: 'No' },
    gems: { earn: 'Rare achievements', purchase: 'Yes ($1 = 100 gems)' }
  },

  psychology: 'Self-expression, status signaling, no gameplay advantage'
};

2. Battle Pass / Season Pass

const battlePass = {
  price: 9.99, // USD per season (3 months)
  duration: 90, // days

  tiers: [
    // Free rewards (everyone)
    { tier: 1, free: '10 coins', premium: '50 coins + Exclusive badge' },
    { tier: 5, free: 'Common avatar', premium: 'Rare avatar + 100 gems' },
    { tier: 10, free: '50 coins', premium: '200 coins + Legendary frame' },
    // ... 50 tiers total
  ],

  mechanics: {
    earnXP: 'Complete daily/weekly challenges',
    tierUp: 'Every 1000 XP = 1 tier',
    catchUp: 'Can buy tier skips (100 gems = 1 tier)',
    fomo: 'Exclusive cosmetics ONLY available this season'
  },

  conversionRate: '15-25% of active players buy battle pass',

  psychology: {
    sunkcost: 'Paid $10 → must play to get value',
    fomo: 'Limited time rewards',
    progress: 'Visible progress bar → completion urge',
    value: '$10 for $50+ worth of items (perceived deal)'
  }
};

3. Energy Systems (Controversial)

const energySystem = {
  // Free users limited by energy
  freeUser: {
    maxEnergy: 5,
    rechargeRate: '1 energy per 30 minutes',
    actionCost: '1 energy per task',
    maxPlaytime: '~15 minutes per session',
    waitTime: '2.5 hours to full recharge'
  },

  // Monetization
  monetization: [
    { item: 'Energy refill', price: 50, currency: 'gems', gives: '5 energy' },
    { item: 'Premium pass', price: 9.99, benefit: 'Unlimited energy' }
  ],

  // Make waiting tolerable
  patience: {
    notification: 'Your energy is full! ⚡',
    alternative: 'Watch ad for +1 energy',
    earnMore: 'Invite friend = +10 max energy'
  },

  psychology: {
    impulse: 'In the middle of streak → pay to continue',
    value: '"Just $1 to keep playing now"',
    habit: 'Train users to return every 2-3 hours'
  },

  ethics: '⚠️ Predatory if overused. Limit frustration.'
};

4. Loot Boxes (Highly Regulated)

const lootBoxSystem = {
  // Random rewards (gambling mechanic)
  box: {
    price: 100, // gems
    contents: 'Random (1 of 50 possible items)',
    odds: {
      common: 0.60,    // 60%
      uncommon: 0.25,  // 25%
      rare: 0.10,      // 10%
      epic: 0.04,      // 4%
      legendary: 0.01  // 1%
    }
  },

  addictionMechanics: {
    nearMiss: 'Show "almost won legendary!" (false)',
    visual: 'Exciting opening animation',
    variable: 'Variable reward schedule (most addictive)',
    collection: '"Collect all 50!" (impossibly rare)'
  },

  legalIssues: {
    gambling: 'Many countries regulate as gambling',
    minors: 'Banned in Belgium, restricted in others',
    disclosure: 'Must show odds (required in China, US)',
    ethics: '⚠️ Preys on gambling addiction'
  },

  alternative: {
    name: 'Deterministic bundles',
    method: 'Show exactly what you get before purchase',
    example: '"Legendary bundle: Item A + Item B + Item C = $5"',
    ethics: '✅ Transparent, player knows value'
  }
};

Analytics & Optimization

Key Metrics (KPIs)

const gamificationMetrics = {
  // Engagement
  DAU: 'Daily Active Users',
  MAU: 'Monthly Active Users',
  DAU_MAU_ratio: 'Stickiness = DAU/MAU (aim for 20%+)',
  sessionLength: 'Average time per session (longer = better)',
  sessionsPerDay: 'How often users return (aim for 2+)',

  // Retention
  D1_retention: 'Day 1 retention (40%+ is good)',
  D7_retention: 'Day 7 retention (25%+ is good)',
  D30_retention: 'Day 30 retention (15%+ is good)',
  churnRate: 'Users who stop using (lower = better)',

  // Progression
  completionRate: '% who finish onboarding (aim for 80%+)',
  levelDistribution: 'How many users at each level',
  timeToLevel: 'How long to reach milestones',

  // Social
  inviteRate: '% of users who invite friends',
  viralCoefficient: 'New users per existing user (>1 = viral growth)',
  teamParticipation: '% in teams/guilds',

  // Monetization
  conversionRate: 'Free → paying users (2-5% typical)',
  ARPU: 'Average Revenue Per User',
  ARPPU: 'Average Revenue Per Paying User',
  LTV: 'Lifetime Value (revenue per user over lifetime)',

  // Feature usage
  featureAdoption: '% who use each gamification feature',
  achievementEarnRate: 'How often achievements unlock',
  leaderboardViews: 'How often users check leaderboard'
};

A/B Testing Gamification

// Test: Does daily reward increase retention?
const abTest = {
  hypothesis: 'Daily login rewards increase D7 retention',

  control: {
    group: 'A',
    users: 5000,
    feature: 'No daily rewards',
    D7_retention: '23%'
  },

  variant: {
    group: 'B',
    users: 5000,
    feature: 'Daily login rewards (escalating)',
    D7_retention: '31%'
  },

  result: {
    improvement: '+8% retention (31% vs 23%)',
    significance: 'p < 0.01 (statistically significant)',
    decision: '✅ Ship daily rewards to all users'
  }
};

// More test ideas
const testIdeas = [
  'Linear vs exponential XP curve',
  'Public vs private leaderboards',
  'Streak with vs without recovery option',
  'Single vs multi-currency economy',
  'Immediate vs delayed rewards',
  'Cooperative vs competitive challenges'
];

Ethical Gamification

Dark Patterns to Avoid ❌

const darkPatterns = {
  // 1. Infinite treadmill (no end)
  infiniteTreadmill: {
    problem: 'Players can never "win", must play forever',
    example: 'Ever-increasing levels with no end',
    fix: 'Provide completion milestones, prestige systems'
  },

  // 2. Predatory monetization
  predatory: {
    problem: 'Exploiting whales, gambling mechanics',
    example: 'Loot boxes, pay-to-win, aggressive pop-ups',
    fix: 'Ethical monetization (cosmetics, battle pass)'
  },

  // 3. FOMO manipulation
  fomo: {
    problem: 'Excessive fear of missing out, anxiety-inducing',
    example: 'Lose all progress if you miss one day',
    fix: 'Allow streak freezes, grace periods'
  },

  // 4. Social pressure
  socialPressure: {
    problem: 'Spamming friends, forced sharing',
    example: 'Must share on Facebook to continue',
    fix: 'Optional social features, no forced sharing'
  },

  // 5. Bait and switch
  baitSwitch: {
    problem: 'Advertise free, then paywall essential features',
    example: 'Free to start, then must pay to progress',
    fix: 'Transparent pricing, clear free vs paid'
  }
};

Ethical Gamification Checklist ✅

const ethicalGamification = {
  // 1. Transparent mechanics
  transparency: [
    'Show odds for random rewards',
    'Explain how points/XP work',
    'Clear pricing (no hidden costs)',
    'Honest progress indicators'
  ],

  // 2. Player agency
  agency: [
    'Opt-in to notifications',
    'Can disable competitive features',
    'No forced social sharing',
    'Can delete account and data'
  ],

  // 3. Respect time
  respectTime: [
    'No infinite grinds',
    'Completable in reasonable time',
    'Energy systems are generous',
    'Can take breaks without penalty'
  ],

  // 4. Healthy habits
  healthyHabits: [
    'Encourage breaks ("You\'ve played 2 hours, take a rest")',
    'Daily limits for minors',
    'No play-to-exhaustion mechanics',
    'Promote learning/growth, not just addiction'
  ],

  // 5. Fair monetization
  fairMonetization: [
    'No pay-to-win',
    'Cosmetic purchases only',
    'Free tier is genuinely usable',
    'No aggressive upselling'
  ]
};

Implementation Patterns

Database Schema

-- Users table
CREATE TABLE users (
  id UUID PRIMARY KEY,
  username VARCHAR(50) UNIQUE,
  email VARCHAR(255) UNIQUE,
  xp INTEGER DEFAULT 0,
  level INTEGER DEFAULT 1,
  coins INTEGER DEFAULT 0,
  gems INTEGER DEFAULT 0,
  streak_days INTEGER DEFAULT 0,
  last_login_date TIMESTAMP,
  created_at TIMESTAMP DEFAULT NOW()
);

-- Achievements
CREATE TABLE achievements (
  id SERIAL PRIMARY KEY,
  name VARCHAR(100),
  description TEXT,
  icon VARCHAR(255),
  xp_reward INTEGER,
  rarity VARCHAR(20), -- common, rare, epic, legendary
  hidden BOOLEAN DEFAULT FALSE,
  category VARCHAR(50)
);

-- User achievements (junction table)
CREATE TABLE user_achievements (
  user_id UUID REFERENCES users(id),
  achievement_id INTEGER REFERENCES achievements(id),
  unlocked_at TIMESTAMP DEFAULT NOW(),
  progress INTEGER DEFAULT 0, -- for progressive achievements
  PRIMARY KEY (user_id, achievement_id)
);

-- Leaderboards
CREATE TABLE leaderboard_entries (
  id SERIAL PRIMARY KEY,
  user_id UUID REFERENCES users(id),
  leaderboard_type VARCHAR(50), -- daily, weekly, monthly, all_time
  score INTEGER,
  rank INTEGER,
  period_start DATE,
  period_end DATE,
  updated_at TIMESTAMP DEFAULT NOW()
);

-- Activity log
CREATE TABLE activity_log (
  id BIGSERIAL PRIMARY KEY,
  user_id UUID REFERENCES users(id),
  action_type VARCHAR(50), -- task_complete, level_up, achievement_unlock
  xp_earned INTEGER,
  coins_earned INTEGER,
  metadata JSONB, -- flexible data
  created_at TIMESTAMP DEFAULT NOW()
);

-- Streaks
CREATE TABLE streaks (
  user_id UUID PRIMARY KEY REFERENCES users(id),
  current_streak INTEGER DEFAULT 0,
  longest_streak INTEGER DEFAULT 0,
  last_activity_date DATE,
  streak_freezes INTEGER DEFAULT 0, -- purchased freezes
  updated_at TIMESTAMP DEFAULT NOW()
);

-- Daily rewards
CREATE TABLE daily_rewards (
  user_id UUID REFERENCES users(id),
  claim_date DATE,
  day_number INTEGER, -- day 1, 2, 3...
  reward_type VARCHAR(50),
  reward_amount INTEGER,
  PRIMARY KEY (user_id, claim_date)
);

API Endpoints

// Express.js example

// Award XP
app.post('/api/xp/award', authenticate, async (req, res) => {
  const { amount, reason } = req.body;
  const userId = req.user.id;

  const result = await awardXP(userId, amount, reason);

  // Check for level up
  if (result.leveledUp) {
    await unlockLevelRewards(userId, result.newLevel);

    return res.json({
      xp: result.newXP,
      level: result.newLevel,
      leveledUp: true,
      rewards: result.rewards,
      message: `🎉 Level ${result.newLevel} reached!`
    });
  }

  res.json({
    xp: result.newXP,
    level: result.currentLevel,
    xpToNext: result.xpToNextLevel
  });
});

// Check/unlock achievement
app.post('/api/achievements/check', authenticate, async (req, res) => {
  const { achievementId } = req.body;
  const userId = req.user.id;

  const eligible = await checkAchievementEligibility(userId, achievementId);

  if (eligible) {
    await unlockAchievement(userId, achievementId);
    const achievement = await getAchievement(achievementId);

    return res.json({
      unlocked: true,
      achievement: achievement,
      xpReward: achievement.xp_reward
    });
  }

  res.json({ unlocked: false });
});

// Get leaderboard
app.get('/api/leaderboard/:type', authenticate, async (req, res) => {
  const { type } = req.params; // daily, weekly, monthly, friends
  const userId = req.user.id;

  const leaderboard = await getLeaderboard(type, userId);

  res.json({
    type: type,
    yourRank: leaderboard.yourRank,
    yourScore: leaderboard.yourScore,
    topPlayers: leaderboard.top10,
    nearby: leaderboard.nearbyPlayers, // +/- 2 ranks
    total: leaderboard.totalPlayers
  });
});

// Claim daily reward
app.post('/api/rewards/daily', authenticate, async (req, res) => {
  const userId = req.user.id;

  const result = await claimDailyReward(userId);

  if (result.error) {
    return res.status(400).json({ error: result.error });
  }

  res.json({
    dayNumber: result.dayNumber,
    reward: result.reward,
    streak: result.currentStreak,
    nextReward: result.nextDayReward
  });
});

React Component Examples

// Progress Bar Component
export function ProgressBar({ current, total, label }) {
  const percent = (current / total) * 100;

  return (
    <div className="progress-container">
      <div className="progress-label">
        {label} - {current}/{total}
      </div>
      <div className="progress-bar-bg">
        <div
          className="progress-bar-fill"
          style={{ width: `${percent}%` }}
        >
          {percent.toFixed(0)}%
        </div>
      </div>
    </div>
  );
}

// Achievement Unlock Modal
export function AchievementModal({ achievement, onClose }) {
  return (
    <div className="modal-overlay" onClick={onClose}>
      <div className="achievement-modal">
        <Confetti />
        <h2>🏆 Achievement Unlocked!</h2>
        <img src={achievement.icon} alt={achievement.name} />
        <h3>{achievement.name}</h3>
        <p>{achievement.description}</p>
        <div className="reward">+{achievement.xp_reward} XP</div>
        <button onClick={onClose}>Awesome!</button>
      </div>
    </div>
  );
}

// Leaderboard Component
export function Leaderboard({ data }) {
  return (
    <div className="leaderboard">
      <h2>🏆 Leaderboard</h2>

      <div className="your-rank">
        You are rank #{data.yourRank} with {data.yourScore} points
      </div>

      <table>
        <thead>
          <tr>
            <th>Rank</th>
            <th>Player</th>
            <th>Score</th>
          </tr>
        </thead>
        <tbody>
          {data.topPlayers.map((player, i) => (
            <tr key={player.id} className={player.id === data.userId ? 'you' : ''}>
              <td>
                {i === 0 && '🥇'}
                {i === 1 && '🥈'}
                {i === 2 && '🥉'}
                {i > 2 && `#${i + 1}`}
              </td>
              <td>{player.username}</td>
              <td>{player.score}</td>
            </tr>
          ))}
        </tbody>
      </table>
    </div>
  );
}

// Daily Reward Tracker
export function DailyRewardTracker({ streak, rewards }) {
  return (
    <div className="daily-rewards">
      <h3>🔥 {streak}-Day Streak</h3>
      <div className="rewards-grid">
        {rewards.map((reward, i) => (
          <div
            key={i}
            className={`reward-day ${i < streak ? 'claimed' : ''}`}
          >
            <div className="day">Day {i + 1}</div>
            <div className="icon">{reward.icon}</div>
            <div className="amount">{reward.amount}</div>
            {i === streak && <div className="next">Today!</div>}
          </div>
        ))}
      </div>
    </div>
  );
}

Real-World Case Studies

Case Study 1: Duolingo

Gamification Elements:

const duolingoGamification = {
  // Core loop
  coreLoop: {
    trigger: 'Daily streak reminder',
    action: 'Complete 5-minute lesson',
    reward: '+10 XP, maintain streak',
    investment: 'Progress saved, streak grows'
  },

  // Mechanics
  mechanics: {
    xp: 'Earn XP for correct answers',
    levels: 'Progress through course levels',
    streaks: 'Daily login streaks (loss aversion)',
    leagues: '10-tier competitive leagues (50 players each)',
    achievements: 'Unlock badges for milestones',
    leaderboards: 'Weekly league competition',
    hearts: 'Energy system (lose hearts on mistakes)',
    gems: 'Premium currency (buy streak freezes, hearts)'
  },

  // Results
  results: {
    DAU: '19.7 million (2023)',
    retention: 'Industry-leading (streaks increase D30 by 50%+)',
    monetization: '$500M revenue (2023)',
    conversionRate: '8% free → paid (Super Duolingo)'
  },

  // Key insights
  insights: [
    'Streaks are most powerful retention mechanic',
    'Leagues create daily engagement (check rank)',
    'Mascot (Duo owl) creates emotional connection',
    'Gentle notifications ("reminder") + aggressive ("streak about to break")',
    'Perfect balance: learning (intrinsic) + gamification (extrinsic)'
  ]
};

Case Study 2: Habitica

Gamification for Habit Building:

const habiticaGamification = {
  concept: 'Your life as an RPG game',

  mechanics: {
    avatar: 'Character that levels up as you complete real-life tasks',
    hp: 'Health points (lose HP if you fail tasks)',
    quests: 'Team up with friends to defeat bosses',
    pets: 'Collect and hatch pets',
    equipment: 'Earn gear to customize avatar',
    party: 'Join parties for accountability'
  },

  taskTypes: {
    habits: 'Click + or - (brush teeth, exercise)',
    dailies: 'Must complete daily (lose HP if you don\'t)',
    todos: 'One-time tasks',
    rewards: 'Spend gold on custom rewards'
  },

  psychology: {
    extrinsic: 'XP, gold, items',
    intrinsic: 'Actually building real habits',
    social: 'Party members lose HP if you fail (accountability)',
    loss: 'Lose HP and damage party if you don\'t complete dailies'
  },

  results: {
    users: '4+ million registered',
    retention: 'High for habit apps (social accountability)',
    effectiveness: 'Users report genuine habit formation'
  }
};

Case Study 3: Strava

Fitness Gamification:

const stravaGamification = {
  mechanics: {
    segments: 'Compete on specific route sections (KOM = King of Mountain)',
    achievements: 'Monthly challenges (run 100km, climb 5000m)',
    kudos: 'Social validation (likes for workouts)',
    clubs: 'Join running/cycling clubs',
    leaderboards: 'Segment leaderboards (all-time, age group, friends)',
    badges: 'Unlock badges for milestones'
  },

  socialDynamics: {
    following: 'Follow friends and pros',
    feed: 'Activity feed (see friends\' workouts)',
    challenges: 'Monthly challenges with prizes',
    clubs: 'Team leaderboards and events'
  },

  results: {
    users: '100+ million athletes',
    engagement: 'Users train harder to beat segment times',
    conversion: '~10% paid subscribers ($60/year)',
    network: 'Strong network effects (more friends = more engagement)'
  },

  insights: [
    'Segments create infinite replay value (always someone to beat)',
    'KOM/QOM status is powerful motivator',
    'Social validation (kudos) drives posting',
    'Monthly challenges create recurring engagement'
  ]
};

Case Study 4: Peloton

Connected Fitness Gamification:

const pelotonGamification = {
  mechanics: {
    liveLeaderboard: 'Real-time rank during class (1000+ riders)',
    outputScore: 'Total work output (kJ) as score',
    personalRecords: 'Track PRs (20-min, 30-min, etc.)',
    badges: 'Earn badges (100 rides, century club)',
    streaks: 'Weekly streak challenges',
    hashtags: 'Join hashtag groups (#RedditPeloton)'
  },

  competition: {
    liveRace: 'Compete in real-time during class',
    friends: 'Follow friends, see their metrics',
    ageGroup: 'Filter by age/gender for fair comparison',
    onDemand: 'Compete against all-time leaderboard'
  },

  social: {
    highFives: 'Send virtual high-fives during rides',
    community: 'Strong community (#PelotonFam)',
    tags: 'Join affinity groups',
    instructors: 'Para-social relationships with instructors'
  },

  results: {
    retention: 'Industry-leading 92% (hardware + gamification)',
    engagement: 'Avg 20+ workouts/month',
    revenue: '$3.6B (2021 peak)',
    nps: 'Net Promoter Score 70+ (cult-like following)'
  },

  insights: [
    'Live leaderboard creates urgency and competition',
    'Community is retention driver (not just gamification)',
    'Personal records tap into self-competition',
    'High-fives create positive social reinforcement'
  ]
};

Summary: Gamification Framework

Use this decision tree:

What is your goal?
│
├─ Increase engagement → Use streaks, daily rewards, progress bars
├─ Drive retention → Use loss aversion (streaks), social bonds (teams)
├─ Encourage learning → Use mastery mechanics, skill trees, achievements
├─ Build community → Use teams, leaderboards, cooperative challenges
├─ Monetization → Use cosmetics, battle pass, premium features
└─ Behavior change → Use habit loops (trigger-action-reward-investment)

Golden Rules:

  1. Start with psychology, not mechanics - Understand what motivates your users (Bartle types, SDT)
  2. Balance intrinsic + extrinsic - External rewards hook them, internal satisfaction keeps them
  3. Test everything - A/B test mechanics, don't assume
  4. Respect users - No dark patterns, ethical design
  5. Iterate based on data - Track metrics, optimize continuously

The Ultimate Gamification Stack:

  • Onboarding: Quick win → Endowed progress → Personalization → Social → Goal setting
  • Engagement: Daily rewards → Streaks → Challenges → Leaderboards
  • Progression: XP/Levels → Achievements → Skill trees → Prestige
  • Social: Teams → Competition → Cooperation → Gifting
  • Retention: Hook model → Loss aversion → Variable rewards → Investment
  • Monetization: Cosmetics → Battle pass → Premium features (no pay-to-win)

Master these, and you can gamify anything. 🎮


Resources & Further Reading

Books:

  • Hooked by Nir Eyal (habit formation)
  • The Gamification of Learning and Instruction by Karl Kapp
  • For the Win by Kevin Werbach & Dan Hunter
  • Actionable Gamification by Yu-kai Chou

Frameworks:

Tools:

  • Gamification platforms: Bunchball, Badgeville
  • Analytics: Mixpanel, Amplitude (track engagement metrics)
  • A/B testing: Optimizely, VWO

Communities:

  • Gamification subreddit: r/gamification
  • Indie Hackers (product gamification discussions)
  • Growth.Design (case studies on gamification)

Now go build something addictively engaging! 🚀