Re-Engagement-E-Mails können abwandernde Nutzer zurückholen, bevor sie endgültig weg sind. Entscheidend sind Timing, Relevanz und der richtige Anreiz. So bauen Sie effektive Rückgewinnungskampagnen.
Re-Engagement-Trigger
Erkennung von Inaktivität
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' }
];
Personalisierte Trigger
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 };
}
Re-Engagement-Sequenz
Frühe Phase (7 Tage)
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`
}
});
Mittlere Phase (14 Tage)
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}`
}
});
Späte Phase (30 Tage)
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}`
}
});
Kritische Phase (60 Tage)
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`
}
});
Personalisierungsstrategien
Aktivitätsbasierte Inhalte
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'
};
}
Segmentspezifische Botschaften
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'
}
};
Timing-Optimierung
Beste Versandzeiten
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);
}
Frequency Capping
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'
]
};
Erfolgsmessung
Wichtigste Kennzahlen
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;
};
};
}
A/B-Tests
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'
}
];
Best Practices
- —Konsequent segmentieren - Verschiedene Nutzer brauchen unterschiedliche Botschaften
- —Inhalte personalisieren - Bezug auf ihre tatsächliche Nutzung nehmen
- —Anreize steigern - Sanft beginnen, den Wert über die Zeit erhöhen
- —Klare Grenzen setzen - Inaktive Nutzer nicht dauerhaft zuspammen
- —Rückkehr erleichtern - Mit einem Klick zurück, Kontext erhalten
- —Nach Feedback fragen - Verstehen, warum sie gegangen sind
- —Abmeldungen respektieren - Auf Wunsch sofort stoppen
Re-Engagement bedeutet, Nutzer an den Mehrwert zu erinnern, nicht sie zu bedrängen. Konzentrieren Sie sich darauf, was ihnen entgeht, nicht darauf, was Sie verlieren.