Les emails de réengagement peuvent récupérer des utilisateurs en churn avant qu’ils ne partent définitivement. La clé, c’est le bon timing, la pertinence et l’incitation adaptée. Voici comment construire des campagnes de reconquête efficaces.
Déclencheurs de réengagement
Détection d’inactivité
interface InactivityTrigger {
userId: string;
lastActiveAt: Date;
daysInactive: number;
previousEngagement: 'high' | 'medium' | 'low';
accountValue: number;
}
const reEngagementTiers = [
{ daysInactive: 7, tier: 'early', urgency: 'low' },
{ daysInactive: 14, tier: 'mid', urgency: 'medium' },
{ daysInactive: 30, tier: 'late', urgency: 'high' },
{ daysInactive: 60, tier: 'critical', urgency: 'critical' }
];
Déclencheurs personnalisés
async function getReEngagementContent(user: User, trigger: InactivityTrigger) {
// What did they use most?
const topFeatures = await getTopFeatures(user.id);
// What's new since they left?
const newFeatures = await getFeaturesSince(trigger.lastActiveAt);
// What did their peers accomplish?
const peerActivity = await getPeerHighlights(user.industry);
return { topFeatures, newFeatures, peerActivity };
}
Séquence de réengagement
Phase précoce (7 jours)
await sendEmail({
to: user.email,
subject: 'We noticed you haven\'t been around',
template: 're-engagement-early',
data: {
user,
lastActivity: trigger.lastActiveAt,
topFeature: content.topFeatures[0],
quickActionUrl: getQuickActionUrl(user),
unsubscribeUrl: `${baseUrl}/preferences`
}
});
Phase intermédiaire (14 jours)
await sendEmail({
to: user.email,
subject: 'Here\'s what you\'ve missed',
template: 're-engagement-mid',
data: {
user,
newFeatures: content.newFeatures,
peerHighlights: content.peerActivity,
incentive: {
type: 'extended_trial',
value: '7 extra days free'
},
returnUrl: `${baseUrl}/welcome-back?token=${token}`
}
});
Phase tardive (30 jours)
await sendEmail({
to: user.email,
subject: 'We want you back',
template: 're-engagement-late',
data: {
user,
offer: {
type: 'discount',
value: '50% off next month',
code: generateOfferCode(user.id),
expiresAt: addDays(new Date(), 7)
},
testimonial: await getRelevantTestimonial(user.industry),
returnUrl: `${baseUrl}/welcome-back?offer=${offerCode}`
}
});
Phase critique (60 jours)
await sendEmail({
to: user.email,
subject: 'Before you go...',
template: 're-engagement-critical',
data: {
user,
dataWarning: 'Your data will be deleted in 30 days',
exportUrl: `${baseUrl}/export?token=${exportToken}`,
lastChanceOffer: {
type: 'free_month',
value: 'One month free to try again'
},
feedbackUrl: `${baseUrl}/feedback/churned`
}
});
Stratégies de personnalisation
Contenu basé sur l’activité
async function getPersonalizedContent(user: User) {
const usage = await getUserUsagePatterns(user.id);
if (usage.primaryUseCase === 'reporting') {
return {
headline: 'Your reports are waiting',
feature: 'New dashboard templates',
cta: 'See your latest data'
};
}
if (usage.primaryUseCase === 'collaboration') {
return {
headline: 'Your team misses you',
feature: 'New commenting features',
cta: 'Catch up with your team'
};
}
return {
headline: 'We\'ve been improving',
feature: 'See what\'s new',
cta: 'Explore updates'
};
}
Messages spécifiques par segment
const segmentMessages = {
power_user: {
tone: 'We miss your expertise',
incentive: 'early_access',
focus: 'new_features'
},
casual_user: {
tone: 'Quick check-in',
incentive: 'simplicity',
focus: 'easy_wins'
},
trial_abandoned: {
tone: 'Give us another chance',
incentive: 'extended_trial',
focus: 'onboarding_help'
},
churned_paid: {
tone: 'We want to earn you back',
incentive: 'discount',
focus: 'value_proposition'
}
};
Optimisation du moment d’envoi
Meilleurs moments d’envoi
async function getOptimalSendTime(user: User): Promise<Date> {
// Use historical engagement data
const engagementHistory = await getUserEngagementTimes(user.id);
if (engagementHistory.length > 0) {
// Send when they typically engaged
return getNextOccurrence(engagementHistory.peakHour, user.timezone);
}
// Default to industry benchmarks
const industryDefaults = {
b2b: { day: 'tuesday', hour: 10 },
b2c: { day: 'saturday', hour: 11 },
default: { day: 'wednesday', hour: 9 }
};
const defaults = industryDefaults[user.industry] || industryDefaults.default;
return getNextOccurrence(defaults.hour, user.timezone, defaults.day);
}
Plafonnement de la fréquence
const reEngagementRules = {
maxEmailsPerSequence: 4,
minDaysBetweenEmails: 5,
stopConditions: [
'user_returned',
'user_unsubscribed',
'user_deleted_account',
'sequence_complete'
],
// Don't re-engage if:
exclusions: [
'received_re_engagement_last_90_days',
'marked_as_spam',
'bounced_email'
]
};
Mesurer le succès
Indicateurs clés
interface ReEngagementMetrics {
// Email performance
openRate: number;
clickRate: number;
// Business outcomes
returnRate: number; // % who came back
reactivationRate: number; // % who became active again
conversionRate: number; // % who converted (if applicable)
// By sequence stage
byStage: {
[stage: string]: {
sent: number;
returned: number;
returnRate: number;
};
};
}
Tests A/B
const reEngagementTests = [
{
name: 'subject_line_test',
variants: [
{ id: 'a', subject: 'We miss you' },
{ id: 'b', subject: 'Your account is waiting' },
{ id: 'c', subject: '{{user.name}}, come back?' }
],
metric: 'open_rate'
},
{
name: 'incentive_test',
variants: [
{ id: 'a', incentive: 'none' },
{ id: 'b', incentive: '20% discount' },
{ id: 'c', incentive: 'free month' }
],
metric: 'return_rate'
}
];
Bonnes pratiques
- —Segmenter de façon agressive - Différents utilisateurs ont besoin de messages différents
- —Personnaliser le contenu - Référencez leur utilisation réelle
- —Escalader les incitations - Commencez en douceur, augmentez la valeur au fil du temps
- —Fixer des limites claires - Ne spammez pas les utilisateurs inactifs indéfiniment
- —Faciliter le retour - Retour en un clic avec le contexte préservé
- —Demander des retours - Comprendre pourquoi ils sont partis
- —Respecter les désinscriptions - Arrêtez immédiatement quand on vous le demande
Le réengagement consiste à rappeler la valeur aux utilisateurs, pas à les importuner. Concentrez-vous sur ce qui leur manque, pas sur ce que vous perdez.