Les plateformes de gaming utilisent l'email pour stimuler l'engagement, célébrer les succès et faire revenir les joueurs. Voici comment concevoir des systèmes d'email pour le gaming efficaces qui améliorent l'expérience des joueurs.
Types d'emails pour le gaming
Les plateformes de gaming envoient :
- —Transactionnels (achats, sécurité du compte)
- —Notifications de succès et mises à jour de progression
- —Notifications sociales (activité des amis)
- —Campagnes de ré‑engagement
- —Annonces d'événements et de mises à jour
Notifications de succès
Célébrations des paliers
interface AchievementEmail {
player: {
username: string;
email: string;
level: number;
};
achievement: {
name: string;
description: string;
rarity: 'common' | 'rare' | 'epic' | 'legendary';
imageUrl: string;
unlockedAt: Date;
};
}
async function sendAchievementEmail(data: AchievementEmail) {
const rarityColors = {
common: '#9ca3af',
rare: '#3b82f6',
epic: '#8b5cf6',
legendary: '#f59e0b'
};
await sendEmail({
to: data.player.email,
subject: `🏆 Achievement Unlocked: ${data.achievement.name}`,
template: 'achievement-unlocked',
data: {
...data,
rarityColor: rarityColors[data.achievement.rarity],
shareUrl: `${baseUrl}/achievements/${data.achievement.id}/share`
}
});
}
Mises à jour de progression
// Weekly progress digest
interface ProgressDigest {
player: Player;
period: { start: Date; end: Date };
stats: {
hoursPlayed: number;
matchesPlayed: number;
winRate: number;
xpEarned: number;
levelProgress: number;
achievementsUnlocked: Achievement[];
};
comparison: {
vsLastWeek: {
hoursPlayed: number;
winRate: number;
};
vsAverage: {
percentile: number;
};
};
}
Notifications sociales
Activité des amis
// Batch friend notifications
async function sendFriendActivityDigest(player: Player) {
const activities = await getFriendActivities(player.id, {
since: subHours(new Date(), 24),
limit: 10
});
if (activities.length === 0) return;
await sendEmail({
to: player.email,
subject: `Your friends have been busy!`,
template: 'friend-activity-digest',
data: {
player,
activities: activities.map(a => ({
friend: a.friend.username,
action: formatActivity(a),
timestamp: a.timestamp
}))
}
});
}
function formatActivity(activity: FriendActivity): string {
switch (activity.type) {
case 'achievement':
return `unlocked "${activity.achievement.name}"`;
case 'level_up':
return `reached level ${activity.newLevel}`;
case 'high_score':
return `set a new high score in ${activity.game}`;
default:
return activity.description;
}
}
Invitations à des défis
await sendEmail({
to: challengedPlayer.email,
subject: `${challenger.username} challenged you!`,
template: 'challenge-invitation',
data: {
challenger: challenger.username,
game: challenge.game,
stakes: challenge.stakes,
expiresAt: challenge.expiresAt,
acceptUrl: `${baseUrl}/challenges/${challenge.id}/accept`,
declineUrl: `${baseUrl}/challenges/${challenge.id}/decline`
}
});
Campagnes de ré‑engagement
Reconquête des joueurs inactifs
const reEngagementSequence = [
{
daysInactive: 7,
template: 'miss-you-7d',
subject: 'Your squad misses you',
incentive: null
},
{
daysInactive: 14,
template: 'miss-you-14d',
subject: "Here's what you've missed",
incentive: { type: 'xp_boost', value: '2x XP for 24 hours' }
},
{
daysInactive: 30,
template: 'miss-you-30d',
subject: 'A gift is waiting for you',
incentive: { type: 'item', value: 'Exclusive returning player skin' }
},
{
daysInactive: 60,
template: 'miss-you-60d',
subject: 'We want you back',
incentive: { type: 'currency', value: '500 coins' }
}
];
async function processLapsedPlayers() {
for (const step of reEngagementSequence) {
const players = await getLapsedPlayers(step.daysInactive);
for (const player of players) {
if (await hasReceivedEmail(player.id, step.template)) continue;
await sendEmail({
to: player.email,
subject: step.subject,
template: step.template,
data: {
player,
incentive: step.incentive,
lastPlayed: player.lastActiveAt,
friendsOnline: await getOnlineFriendCount(player.id)
}
});
}
}
}
Annonces d'événements
interface GameEvent {
name: string;
type: 'seasonal' | 'tournament' | 'update' | 'limited';
startDate: Date;
endDate: Date;
rewards: Reward[];
requirements?: {
minLevel?: number;
prerequisite?: string;
};
}
async function announceEvent(event: GameEvent) {
// Segment by eligibility
const eligiblePlayers = await getEligiblePlayers(event.requirements);
for (const player of eligiblePlayers) {
await sendEmail({
to: player.email,
subject: `🎮 ${event.name} starts ${formatDate(event.startDate)}!`,
template: 'event-announcement',
data: {
event,
player,
personalizedRewards: getRelevantRewards(event.rewards, player)
}
});
}
}
Emails d'achat et de transaction
Confirmation d'achat dans le jeu
await sendEmail({
to: player.email,
subject: `Purchase confirmed: ${item.name}`,
template: 'purchase-confirmation',
data: {
player,
item: {
name: item.name,
type: item.type,
imageUrl: item.imageUrl
},
transaction: {
id: transaction.id,
amount: transaction.amount,
currency: transaction.currency,
paymentMethod: maskPaymentMethod(transaction.paymentMethod),
timestamp: transaction.timestamp
},
howToUse: getItemUsageInstructions(item.type)
}
});
Gestion des abonnements
// Battle pass or subscription emails
const subscriptionEmails = {
'subscription.started': {
subject: 'Welcome to Premium!',
template: 'subscription-welcome',
data: (sub) => ({
benefits: getPremiumBenefits(),
exclusiveContent: getExclusiveContent()
})
},
'subscription.renewing': {
subject: 'Your Premium renews soon',
template: 'subscription-renewal-reminder',
data: (sub) => ({
renewalDate: sub.renewsAt,
amount: sub.price,
manageUrl: `${baseUrl}/account/subscription`
})
},
'subscription.expired': {
subject: 'Your Premium has ended',
template: 'subscription-expired',
data: (sub) => ({
lostBenefits: getPremiumBenefits(),
resubscribeUrl: `${baseUrl}/premium`,
specialOffer: getWinBackOffer(sub.player)
})
}
};
Préférences de notification pour les joueurs
interface GamerNotificationPrefs {
// Transactional (can't disable)
purchases: true;
accountSecurity: true;
// Engagement (can disable)
achievements: boolean;
weeklyProgress: boolean;
friendActivity: boolean;
challengeInvites: boolean;
// Marketing (can disable)
eventAnnouncements: boolean;
newContent: boolean;
specialOffers: boolean;
// Timing preferences
digestFrequency: 'realtime' | 'daily' | 'weekly';
quietHours: {
enabled: boolean;
start: string; // "22:00"
end: string; // "08:00"
timezone: string;
};
}
Bonnes pratiques pour les emails de gaming
- —Célébrer les succès - Donnez aux joueurs le sentiment d'accomplissement
- —Utiliser des visuels du jeu - Inclure des illustrations de personnages et des images d'objets
- —Créer de l'urgence - Les événements à durée limitée stimulent l'engagement
- —Respecter les habitudes de jeu - N'envoyez pas d'emails pendant les heures de jeu typiques
- —Personnaliser le contenu - Faites référence à leur personnage, leur progression, leurs amis
- —Rendre partageable - Inclure le partage social pour les succès
Les emails de gaming doivent être perçus comme une extension de l'expérience de jeu, pas comme du spam marketing. Concentrez‑vous sur l'amélioration du parcours du joueur et la célébration de sa progression.